163 lines
7.4 KiB
Java
163 lines
7.4 KiB
Java
package com.example.livestreaming;
|
||
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.content.SharedPreferences;
|
||
import android.os.Bundle;
|
||
import android.view.View;
|
||
import android.widget.Switch;
|
||
import android.widget.Toast;
|
||
|
||
import androidx.appcompat.app.AppCompatActivity;
|
||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||
|
||
import com.example.livestreaming.databinding.ActivityNotificationSettingsBinding;
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
|
||
/**
|
||
* 通知设置页面
|
||
* 支持各类通知开关和免打扰设置
|
||
*/
|
||
public class NotificationSettingsActivity extends AppCompatActivity {
|
||
|
||
private static final String PREFS_NAME = "notification_settings";
|
||
private static final String KEY_SYSTEM_NOTIFICATIONS = "system_notifications";
|
||
private static final String KEY_FOLLOW_NOTIFICATIONS = "follow_notifications";
|
||
private static final String KEY_COMMENT_NOTIFICATIONS = "comment_notifications";
|
||
private static final String KEY_MESSAGE_NOTIFICATIONS = "message_notifications";
|
||
private static final String KEY_LIVE_NOTIFICATIONS = "live_notifications";
|
||
private static final String KEY_DND_ENABLED = "dnd_enabled";
|
||
private static final String KEY_DND_START_HOUR = "dnd_start_hour";
|
||
private static final String KEY_DND_END_HOUR = "dnd_end_hour";
|
||
|
||
private ActivityNotificationSettingsBinding binding;
|
||
private MoreAdapter adapter;
|
||
private SharedPreferences prefs;
|
||
|
||
public static void start(Context context) {
|
||
Intent intent = new Intent(context, NotificationSettingsActivity.class);
|
||
context.startActivity(intent);
|
||
}
|
||
|
||
@Override
|
||
protected void onCreate(Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
binding = ActivityNotificationSettingsBinding.inflate(getLayoutInflater());
|
||
setContentView(binding.getRoot());
|
||
|
||
prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
|
||
|
||
binding.backButton.setOnClickListener(v -> finish());
|
||
binding.titleText.setText("通知设置");
|
||
|
||
adapter = new MoreAdapter(item -> {
|
||
if (item == null) return;
|
||
if (item.getType() != MoreItem.Type.ROW) return;
|
||
handleItemClick(item);
|
||
});
|
||
|
||
binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||
binding.recyclerView.setAdapter(adapter);
|
||
|
||
refreshItems();
|
||
}
|
||
|
||
private void handleItemClick(MoreItem item) {
|
||
String title = item.getTitle() != null ? item.getTitle() : "";
|
||
|
||
if ("免打扰".equals(title)) {
|
||
showDoNotDisturbDialog();
|
||
}
|
||
}
|
||
|
||
private void refreshItems() {
|
||
// TODO: 接入后端接口 - 获取用户通知设置
|
||
// 接口路径: GET /api/users/{userId}/notification/settings
|
||
// 请求参数:
|
||
// - userId: 用户ID(从token中获取)
|
||
// 返回数据格式: ApiResponse<NotificationSettings>
|
||
// NotificationSettings对象应包含: systemEnabled, followEnabled, commentEnabled,
|
||
// messageEnabled, liveEnabled, dndEnabled, dndStartHour, dndEndHour等字段
|
||
// 首次加载时从接口获取,后续可从本地缓存读取
|
||
List<MoreItem> items = new ArrayList<>();
|
||
|
||
// 系统通知开关
|
||
items.add(MoreItem.section("系统通知"));
|
||
boolean systemEnabled = prefs.getBoolean(KEY_SYSTEM_NOTIFICATIONS, true);
|
||
items.add(MoreItem.row("系统通知", systemEnabled ? "已开启" : "已关闭", R.drawable.ic_notifications_24));
|
||
|
||
// 消息提醒
|
||
items.add(MoreItem.section("消息提醒"));
|
||
boolean followEnabled = prefs.getBoolean(KEY_FOLLOW_NOTIFICATIONS, true);
|
||
boolean commentEnabled = prefs.getBoolean(KEY_COMMENT_NOTIFICATIONS, true);
|
||
boolean messageEnabled = prefs.getBoolean(KEY_MESSAGE_NOTIFICATIONS, true);
|
||
boolean liveEnabled = prefs.getBoolean(KEY_LIVE_NOTIFICATIONS, true);
|
||
|
||
items.add(MoreItem.row("关注提醒", followEnabled ? "已开启" : "已关闭", R.drawable.ic_people_24));
|
||
items.add(MoreItem.row("评论提醒", commentEnabled ? "已开启" : "已关闭", R.drawable.ic_chat_24));
|
||
items.add(MoreItem.row("私信提醒", messageEnabled ? "已开启" : "已关闭", R.drawable.ic_chat_24));
|
||
items.add(MoreItem.row("开播提醒", liveEnabled ? "已开启" : "已关闭", R.drawable.ic_notifications_24));
|
||
|
||
// 免打扰
|
||
items.add(MoreItem.section("免打扰"));
|
||
boolean dndEnabled = prefs.getBoolean(KEY_DND_ENABLED, false);
|
||
if (dndEnabled) {
|
||
int startHour = prefs.getInt(KEY_DND_START_HOUR, 22);
|
||
int endHour = prefs.getInt(KEY_DND_END_HOUR, 8);
|
||
items.add(MoreItem.row("免打扰", String.format("%02d:00 - %02d:00", startHour, endHour), R.drawable.ic_notifications_24));
|
||
} else {
|
||
items.add(MoreItem.row("免打扰", "未开启", R.drawable.ic_notifications_24));
|
||
}
|
||
|
||
adapter.submitList(items);
|
||
}
|
||
|
||
private void showDoNotDisturbDialog() {
|
||
// 简单的免打扰设置对话框
|
||
boolean currentEnabled = prefs.getBoolean(KEY_DND_ENABLED, false);
|
||
int startHour = prefs.getInt(KEY_DND_START_HOUR, 22);
|
||
int endHour = prefs.getInt(KEY_DND_END_HOUR, 8);
|
||
|
||
String message = "免打扰功能说明:\n\n" +
|
||
"• 开启后,在指定时间段内不会收到通知\n" +
|
||
"• 当前设置:" + (currentEnabled ?
|
||
String.format("已开启 (%02d:00 - %02d:00)", startHour, endHour) : "未开启") + "\n" +
|
||
"• 紧急通知仍会显示\n\n" +
|
||
"(此功能待完善)";
|
||
|
||
new android.app.AlertDialog.Builder(this)
|
||
.setTitle("免打扰设置")
|
||
.setMessage(message)
|
||
.setPositiveButton("开启", (dialog, which) -> {
|
||
// TODO: 接入后端接口 - 更新通知设置
|
||
// 接口路径: PUT /api/users/{userId}/notification/settings
|
||
// 请求参数:
|
||
// - userId: 用户ID(从token中获取)
|
||
// - systemEnabled (可选): 系统通知开关
|
||
// - followEnabled (可选): 关注提醒开关
|
||
// - commentEnabled (可选): 评论提醒开关
|
||
// - messageEnabled (可选): 私信提醒开关
|
||
// - liveEnabled (可选): 开播提醒开关
|
||
// - dndEnabled (可选): 免打扰开关
|
||
// - dndStartHour (可选): 免打扰开始时间(小时,0-23)
|
||
// - dndEndHour (可选): 免打扰结束时间(小时,0-23)
|
||
// 返回数据格式: ApiResponse<{success: boolean}>
|
||
// 更新成功后,同步更新本地缓存和界面显示
|
||
prefs.edit().putBoolean(KEY_DND_ENABLED, true).apply();
|
||
refreshItems();
|
||
Toast.makeText(this, "免打扰已开启", Toast.LENGTH_SHORT).show();
|
||
})
|
||
.setNeutralButton(currentEnabled ? "关闭" : "取消", (dialog, which) -> {
|
||
if (currentEnabled) {
|
||
prefs.edit().putBoolean(KEY_DND_ENABLED, false).apply();
|
||
refreshItems();
|
||
Toast.makeText(this, "免打扰已关闭", Toast.LENGTH_SHORT).show();
|
||
}
|
||
})
|
||
.show();
|
||
}
|
||
}
|
||
|