From 879ec1ae04b37eb7bf9357903d10acc860d84d5b Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期二, 15 四月 2025 03:02:18 +0800
Subject: [PATCH] 1

---
 app/src/main/res/layout/activity_phone_login.xml                                 |   24 ++++++
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt |    2 
 app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt                |    7 +
 app/src/main/res/layout/activity_invitation_main.xml                             |   50 +++++++++++-
 app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt               |    9 ++
 app/src/main/java/com/example/firstapp/database/request/SmsLoginRequest.kt       |    1 
 app/src/main/java/com/example/firstapp/activity/PhoneLoginActivity.kt            |   17 ++-
 app/src/main/java/com/example/firstapp/database/response/UserInfo.kt             |    3 
 app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt       |   92 +++++++++++++++++++---
 9 files changed, 177 insertions(+), 28 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/activity/PhoneLoginActivity.kt b/app/src/main/java/com/example/firstapp/activity/PhoneLoginActivity.kt
index 8432373..8931e27 100644
--- a/app/src/main/java/com/example/firstapp/activity/PhoneLoginActivity.kt
+++ b/app/src/main/java/com/example/firstapp/activity/PhoneLoginActivity.kt
@@ -31,7 +31,7 @@
         binding.apply {
             // 设置上次登录的手机号
             etPhone.setText(PreferencesManager.getLastLoginPhone())
-            
+
             btnBack.setOnClickListener {
                 startActivity(Intent(this@PhoneLoginActivity, LoginActivity::class.java))
                 finish()
@@ -43,21 +43,26 @@
                     viewModel.sendVerificationCode(phone)
                     startCountDown()
                 } else {
-                    Toast.makeText(this@PhoneLoginActivity,
-                        "请输入正确的手机号", Toast.LENGTH_SHORT).show()
+                    Toast.makeText(
+                        this@PhoneLoginActivity,
+                        "请输入正确的手机号", Toast.LENGTH_SHORT
+                    ).show()
                 }
             }
 
             btnLogin.setOnClickListener {
                 val phone = etPhone.text.toString()
                 val code = etCode.text.toString()
+                val invite = etInvite.text.toString()
                 if (phone.length == 11 && code.length == 6) {
                     // 保存登录的手机号
                     PreferencesManager.saveLastLoginPhone(phone)
-                    viewModel.login(phone, code)
+                    viewModel.login(phone, code, invite)
                 } else {
-                    Toast.makeText(this@PhoneLoginActivity,
-                        "请输入完整信息", Toast.LENGTH_SHORT).show()
+                    Toast.makeText(
+                        this@PhoneLoginActivity,
+                        "请输入完整信息", Toast.LENGTH_SHORT
+                    ).show()
                 }
             }
         }
diff --git a/app/src/main/java/com/example/firstapp/database/request/SmsLoginRequest.kt b/app/src/main/java/com/example/firstapp/database/request/SmsLoginRequest.kt
index d76dce6..be8a8b5 100644
--- a/app/src/main/java/com/example/firstapp/database/request/SmsLoginRequest.kt
+++ b/app/src/main/java/com/example/firstapp/database/request/SmsLoginRequest.kt
@@ -4,4 +4,5 @@
     val username: String,
     val smsCode: String,
     val userType: String,
+    var intevailCode: String
 )
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
index dcea53b..5fd4b5b 100644
--- a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
+++ b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
@@ -8,5 +8,6 @@
     val contactTel: String,
     val memberOvertime: String,
     val memberOverDate: String,
-    val isMember: Boolean
+    val isMember: Boolean,
+    val intervialcode: String
 )
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
index 55d957f..353707d 100644
--- a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -1,13 +1,19 @@
 package com.example.firstapp.ui.invitation
 
+import android.content.ClipData
+import android.content.ClipboardManager
 import android.content.Context
+import android.content.Intent
+import android.net.Uri
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
 import android.text.Html
 import android.util.TypedValue
 import android.view.View
+import android.widget.Button
 import android.widget.TextView
+import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearSmoothScroller
@@ -16,6 +22,7 @@
 import com.example.firstapp.adapter.InvitationAdapter
 import com.example.firstapp.adapter.InvitationRecordAdapter
 import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.utils.PreferencesManager
 import kotlin.math.abs
 
 class InvitationActivity : AppCompatActivity() {
@@ -51,6 +58,26 @@
 
         //启动轮播
         startAutoScroll()
+
+        //分享
+        val btnInvite = findViewById<Button>(R.id.btnInvite)
+        btnInvite.setOnClickListener {
+            shareImageToWechat()
+        }
+
+        //邀请码
+        val invitationCodeText = findViewById<TextView>(R.id.invitationCodeText)
+        invitationCodeText.text = "A1B2"
+        //invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
+        findViewById<Button>(R.id.copyButton).setOnClickListener {
+            val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+            val clip = ClipData.newPlainText(
+                "邀请码",
+                invitationCodeText.text.toString().replace(" ", "") // 复制时去掉空格
+            )
+            clipboard.setPrimaryClip(clip)
+            Toast.makeText(this, "已复制邀请码", Toast.LENGTH_SHORT).show()
+        }
     }
 
     private fun initViews() {
@@ -64,12 +91,12 @@
         addRecordListener()
     }
 
-    private fun addSuccessListener(){
+    private fun addSuccessListener() {
         recyclerSuccessView.viewTreeObserver.addOnGlobalLayoutListener {
             if (recyclerSuccessView.childCount > 0) {
                 // 计算预期高度(60dp转px)
                 val expectedHeight = dpToPx(60f)
-                if(itemHeight!= expectedHeight){
+                if (itemHeight != expectedHeight) {
                     // 修正所有item的高度
                     for (i in 0 until recyclerSuccessView.childCount) {
                         recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight
@@ -106,12 +133,12 @@
         }
     }
 
-    private fun addRecordListener(){
+    private fun addRecordListener() {
         recyclerRecordView.viewTreeObserver.addOnGlobalLayoutListener {
             if (recyclerSuccessView.childCount > 0) {
                 // 计算预期高度(60dp转px)
                 val expectedHeight = dpToPx(60f)
-                if(itemHeight!= expectedHeight){
+                if (itemHeight != expectedHeight) {
                     // 修正所有item的高度
                     for (i in 0 until recyclerSuccessView.childCount) {
                         recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight
@@ -184,11 +211,11 @@
         data.clear()
         data.addAll(
             listOf(
-                InvitationRecord("H****e", "获得了1天会员","已注册"),
-                InvitationRecord("U****r", "获得了2天会员","已注册"),
-                InvitationRecord("A****e", "获得了免广告特权","已注册"),
-                InvitationRecord("B****e", "获得了3天会员","已注册"),
-                InvitationRecord("C****o", "获得了4天会员","已注册")
+                InvitationRecord("H****e", "获得了1天会员", "已注册"),
+                InvitationRecord("U****r", "获得了2天会员", "已注册"),
+                InvitationRecord("A****e", "获得了免广告特权", "已注册"),
+                InvitationRecord("B****e", "获得了3天会员", "已注册"),
+                InvitationRecord("C****o", "获得了4天会员", "已注册")
             )
         )
         adapter.notifyDataSetChanged()
@@ -198,14 +225,50 @@
         recorddata.clear()
         recorddata.addAll(
             listOf(
-                InvitationRecord("M****e", "","未注册"),
-                InvitationRecord("Q****r", "","已注册"),
-                InvitationRecord("W****e", "","未注册"),
-                InvitationRecord("E****e", "","未注册"),
-                InvitationRecord("R****o", "","已注册")
+                InvitationRecord("M****e", "", "未注册"),
+                InvitationRecord("Q****r", "", "已注册"),
+                InvitationRecord("W****e", "", "未注册"),
+                InvitationRecord("E****e", "", "未注册"),
+                InvitationRecord("R****o", "", "已注册")
             )
         )
         recordadapter.notifyDataSetChanged()
+    }
+
+    // 分享资源图片到微信
+    private fun shareImageToWechat() {
+        try {
+            // 获取资源图片的URI
+            val imageUri = Uri.parse("android.resource://${packageName}/${R.drawable.location}")
+
+            val intent = Intent().apply {
+                action = Intent.ACTION_SEND
+                type = "image/*"
+                putExtra(Intent.EXTRA_STREAM, imageUri)
+                flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
+                setPackage("com.tencent.mm") // 指定微信包名
+            }
+
+            // 创建选择器,即使微信不可用也能选择其他应用
+            val chooserIntent = Intent.createChooser(intent, "分享邀请图片")
+
+            // 检查是否有应用能处理这个Intent
+            if (intent.resolveActivity(packageManager) != null) {
+                startActivity(chooserIntent)
+            } else {
+                Toast.makeText(this, "未找到可分享的应用", Toast.LENGTH_SHORT).show()
+            }
+        } catch (e: Exception) {
+            Toast.makeText(this, "分享失败: ${e.message}", Toast.LENGTH_SHORT).show()
+        }
+    }
+
+    private fun formatInvitationCode(code: String): String {
+        return if (code.length > 2) {
+            code.chunked(2).joinToString(" ")
+        } else {
+            code
+        }
     }
 
     private val scrollRunnable = object : Runnable {
@@ -301,6 +364,7 @@
     private fun pxToDp(px: Int, context: Context): Int {
         return (px / (context.resources.displayMetrics.density)).toInt()
     }
+
     private fun dpToPx(dp: Float): Int {
         return (dp * resources.displayMetrics.density).toInt()
     }
diff --git a/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt b/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
index 92f03e9..1dbc3c0 100644
--- a/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
+++ b/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
@@ -52,20 +52,21 @@
         }
     }
 
-    fun login(phone: String, code: String) {
+    fun login(phone: String, code: String, invite: String) {
         viewModelScope.launch {
             _isLoading.value = true
             try {
                 val request = SmsLoginRequest(
                     username = phone,
                     smsCode = code,
+                    intevailCode = invite,
                     userType = "customer"
                 )
                 //HttpServletRequest request这是后端 Spring 框架中的一个特殊参数,
                 //用于获取 HTTP 请求的相关信息(如请求头、Cookie 等),它会由 Spring 框架自动注入,不需要客户端显式传递。
                 val response = RetrofitClient.apiService.verifyCode(request)
                 if (response.code == "0" && response.data != null) {
-                    saveToken(response.data.value,phone)  // 这里获取的是 access_token
+                    saveToken(response.data.value, phone)  // 这里获取的是 access_token
                     _loginState.value = true
                 } else {
                     _loginMessage.value = response.msg.ifEmpty { "登录失败" }
@@ -87,7 +88,7 @@
         }
     }
 
-    private fun saveToken(token: String,phone:String) {
+    private fun saveToken(token: String, phone: String) {
         // TODO: 实现token存储逻辑
         // 可能还需要存储 refresh_token
         PreferencesManager.saveToken(token)
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 d3ae414..7362c83 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
@@ -311,6 +311,8 @@
                 currentUserInfo = response.data
                 val userInfo = response.data
 
+                // 本地保存我的邀请码
+                PreferencesManager.setInviteCode(userInfo.intervialcode);
                 // 设置头像
                 Glide.with(this)
                     .load(userInfo.cover)
diff --git a/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt b/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
index b9636a9..932bdd3 100644
--- a/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
+++ b/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
@@ -10,6 +10,7 @@
     private const val KEY_FIRST_INSTALL = "first_install"
     private const val LAST_LOGIN_PHONE = "last_login_phone"
     private const val PREF_LAST_CHECK_TIME_PREFIX = "last_check_time_"
+    private const val KEY_INVITE = "user_invite"
 
     private lateinit var preferences: SharedPreferences
 
@@ -64,4 +65,12 @@
     fun setLastCheckTime(categoryId: Int, time: Long) {
         preferences.edit().putLong(PREF_LAST_CHECK_TIME_PREFIX + categoryId, time).apply()
     }
+
+    fun getInviteCode(): String {
+        return preferences.getString(KEY_INVITE, "") ?: ""
+    }
+
+    fun setInviteCode(invite: String) {
+        preferences.edit().putString(KEY_INVITE, invite).apply()
+    }
 } 
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml
index e92d712..88a6273 100644
--- a/app/src/main/res/layout/activity_invitation_main.xml
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -63,7 +63,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginBottom="20dp"
-                    app:cardCornerRadius="8dp">
+                    app:cardCornerRadius="18dp">
 
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/invitationsuccessRecyclerView"
@@ -75,9 +75,10 @@
 
                 <!-- 邀请按钮区域 -->
                 <Button
+                    android:id="@+id/btnInvite"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="26dp"
+                    android:layout_marginBottom="10dp"
                     android:backgroundTint="#FF0000"
                     android:insetTop="0dp"
                     android:insetBottom="0dp"
@@ -86,6 +87,47 @@
                     android:textColor="#FFFFFF"
                     android:textSize="16sp"
                     app:cornerRadius="10dp" />
+
+                <!-- 邀请码区域 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="50dp"
+                    android:layout_marginBottom="8dp"
+                    app:cardCornerRadius="8dp"
+                    app:cardPreventCornerOverlap="true"
+                    app:cardElevation="0dp"
+                    app:cardBackgroundColor="#FFFFFF">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="horizontal"
+                        android:paddingStart="16dp"
+                        android:paddingEnd="16dp"
+                        android:gravity="center_vertical">
+
+                        <TextView
+                            android:id="@+id/invitationCodeText"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:text="A1B2"
+                            android:textAlignment="center"
+                            android:textColor="#000000"
+                            android:textSize="30sp" />
+
+                        <Button
+                            android:id="@+id/copyButton"
+                            android:layout_width="wrap_content"
+                            android:layout_height="40dp"
+                            android:text="复制邀请码"
+                            android:textColor="#FF0000"
+                            android:backgroundTint="#FFFFFF"
+                            android:textSize="12sp"
+                            android:paddingStart="12dp"
+                            android:paddingEnd="12dp"/>
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
 
                 <!-- 邀请任务表格区域 -->
                 <androidx.cardview.widget.CardView
@@ -178,7 +220,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:padding="6dp"
-                                android:text="免广告特权 (7天)"
+                                android:text="15天会员"
                                 android:textAlignment="center"
                                 android:textColor="#333333"
                                 android:textSize="12sp" />
@@ -208,7 +250,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:padding="6dp"
-                                android:text="7天会员"
+                                android:text="30天会员"
                                 android:textAlignment="center"
                                 android:textColor="#333333"
                                 android:textSize="12sp" />
diff --git a/app/src/main/res/layout/activity_phone_login.xml b/app/src/main/res/layout/activity_phone_login.xml
index cfb7880..833feb5 100644
--- a/app/src/main/res/layout/activity_phone_login.xml
+++ b/app/src/main/res/layout/activity_phone_login.xml
@@ -85,6 +85,30 @@
             android:layout_width="match_parent"
             android:layout_height="1dp"
             android:background="#EEEEEE" />
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:layout_marginTop="16dp">
+
+            <EditText
+                android:id="@+id/etInvite"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:hint="邀请码"
+                android:inputType="phone"
+                android:maxLength="11"
+                android:textSize="16sp"
+                android:padding="12dp"/>
+
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="#EEEEEE" />
     </LinearLayout>
 
     <Button

--
Gitblit v1.9.3