From c6adb1c42a76001de0978e99f73cd6f5678c685e Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期四, 13 三月 2025 09:22:17 +0800 Subject: [PATCH] add: 隐私协议+如何使用 --- app/src/main/java/com/example/firstapp/database/response/ContentResponse.kt | 20 ++++++ app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 19 ++++++ app/src/main/res/values/themes.xml | 6 ++ app/src/main/java/com/example/firstapp/activity/ContentDetailActivity.kt | 84 ++++++++++++++++++++++++++++ app/src/main/AndroidManifest.xml | 4 + app/src/main/res/layout/activity_content_detail.xml | 22 +++++++ app/src/main/res/xml/network_security_config.xml | 5 + app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 8 ++ 8 files changed, 166 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31faa7c..f471d9e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -107,6 +107,10 @@ <activity android:name=".activity.PickupActivity" android:exported="false"/> + <activity + android:name=".activity.ContentDetailActivity" + android:theme="@style/Theme.ContentDetail" + android:exported="false" /> </application> diff --git a/app/src/main/java/com/example/firstapp/activity/ContentDetailActivity.kt b/app/src/main/java/com/example/firstapp/activity/ContentDetailActivity.kt new file mode 100644 index 0000000..f82b1c0 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/activity/ContentDetailActivity.kt @@ -0,0 +1,84 @@ +package com.example.firstapp.activity + +import android.os.Bundle +import android.webkit.WebView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import com.example.firstapp.R +import com.example.firstapp.database.service.RetrofitClient +import kotlinx.coroutines.launch + +class ContentDetailActivity : AppCompatActivity() { + private lateinit var webView: WebView + private lateinit var toolbar: androidx.appcompat.widget.Toolbar + + companion object { + const val EXTRA_CONTENT_TYPE = "content_type" + const val EXTRA_TITLE = "title" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_content_detail) + + // 初始化视图 + webView = findViewById(R.id.webView) + toolbar = findViewById(R.id.toolbar) + + // 设置标题 + val title = intent.getStringExtra(EXTRA_TITLE) ?: "内容详情" + toolbar.title = title + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + toolbar.setNavigationOnClickListener { finish() } + + // 获取内容类型 + val contentType = intent.getStringExtra(EXTRA_CONTENT_TYPE) + if (contentType != null) { + loadContent(contentType) + } else { + Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show() + finish() + } + } + + private fun loadContent(type: String) { + lifecycleScope.launch { + try { + val response = RetrofitClient.apiService.getContentByType(type) + if (response.code == 200 && response.data != null) { + // 构建HTML内容 + val htmlContent = """ + <!DOCTYPE html> + <html> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <style> + body { + padding: 16px; + font-size: 16px; + line-height: 1.5; + } + </style> + </head> + <body> + ${response.data.content} + </body> + </html> + + + + + """.trimIndent() + + webView.loadDataWithBaseURL(null, htmlContent, "text/html", "UTF-8", null) + } else { + Toast.makeText(this@ContentDetailActivity, "获取内容失败", Toast.LENGTH_SHORT).show() + } + } catch (e: Exception) { + Toast.makeText(this@ContentDetailActivity, "网络错误", Toast.LENGTH_SHORT).show() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/response/ContentResponse.kt b/app/src/main/java/com/example/firstapp/database/response/ContentResponse.kt new file mode 100644 index 0000000..9cfa6a5 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/database/response/ContentResponse.kt @@ -0,0 +1,20 @@ +package com.example.firstapp.database.response + +data class ContentResponse( + val code: Int, + val msg: String, + val data: ContentData? +) + +data class ContentData( + val id: Long, + val type: String, + val title: String, + val content: String, + val version: String, + val status: Int, + val createTime: String, + val updateTime: String, + val creator: String?, + val updater: String? +) \ No newline at end of file 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 0df8e04..8ee56c7 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,10 +2,11 @@ import com.example.firstapp.database.entity.ApiResponse import com.example.firstapp.database.entity.KeywordConfig -import com.example.firstapp.database.entity.KeywordEntity +import com.example.firstapp.database.response.ContentResponse import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.http.GET +import retrofit2.http.Query /** * API调用接口 @@ -14,12 +15,15 @@ @GET("keywords") suspend fun getKeywords():ApiResponse<List<KeywordConfig>> //异步挂起 + + @GET("cloudContent/getByType") + suspend fun getContentByType(@Query("type") type: String): ContentResponse } // 创建Retrofit实例(单例) object RetrofitClient{ - private const val BASE_URL ="http://47.96.225.205:9009/cloud/" + private const val BASE_URL ="http://192.168.1.213: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/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt index dbaa57e..66b1abe 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.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.example.firstapp.R +import com.example.firstapp.activity.ContentDetailActivity import com.example.firstapp.databinding.FragmentNotificationsBinding import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2 import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther @@ -74,6 +75,16 @@ // 分享给好友 binding.shareToFriends.setOnClickListener { shareToWechat() + } + + // 隐私协议 + binding.privacyPolicy.setOnClickListener { + startContentActivity("privacy_policy", "隐私协议") + } + + // 如何使用 + binding.howToUse.setOnClickListener { + startContentActivity("user_guide", "使用说明") } } @@ -137,6 +148,14 @@ } } + private fun startContentActivity(type: String, title: String) { + val intent = Intent(requireContext(), ContentDetailActivity::class.java).apply { + putExtra(ContentDetailActivity.EXTRA_CONTENT_TYPE, type) + putExtra(ContentDetailActivity.EXTRA_TITLE, title) + } + startActivity(intent) + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/res/layout/activity_content_detail.xml b/app/src/main/res/layout/activity_content_detail.xml new file mode 100644 index 0000000..db80873 --- /dev/null +++ b/app/src/main/res/layout/activity_content_detail.xml @@ -0,0 +1,22 @@ +<?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" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <androidx.appcompat.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + android:elevation="4dp" + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> + + <WebView + android:id="@+id/webView" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index b91897b..e65a1fe 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -25,4 +25,10 @@ <item name="fullscreenBackgroundColor">@color/light_blue_600</item> <item name="fullscreenTextColor">@color/light_blue_A200</item> </style> + + <style name="Theme.ContentDetail" parent="Theme.MaterialComponents.Light.NoActionBar"> + <!-- 其他属性保持不变 --> + <item name="windowActionBar">false</item> + <item name="windowNoTitle">true</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 8da54fa..f0f1944 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -2,6 +2,11 @@ <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">47.96.225.205</domain> + <domain includeSubdomains="true">192.168.1.213</domain> <!-- 可添加其他域名或IP(如192.168.0.101) --> +<!-- 如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:--> +<!-- <trust-anchors>--> +<!-- <certificates src="@raw/my_custom_cert"/> <!– 证书放在 res/raw 目录 –>--> +<!-- </trust-anchors>--> </domain-config> </network-security-config> -- Gitblit v1.9.3