diff --git a/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java b/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java index 8c383ec9..fa9ff602 100644 --- a/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java +++ b/Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java @@ -261,9 +261,6 @@ public class LiveRoomController { // ========== 关注主播接口 ========== - @Autowired - private com.zbkj.service.service.FollowRecordService followRecordService; - @ApiOperation(value = "开始直播") @PostMapping("/room/{id}/start") public CommonResult> startLive(@PathVariable Integer id) { diff --git a/android-app/app/src/main/java/com/example/livestreaming/DrawGuessActivity.java b/android-app/app/src/main/java/com/example/livestreaming/DrawGuessActivity.java index bbc09036..e6cbad19 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/DrawGuessActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/DrawGuessActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityDrawGuessBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class DrawGuessActivity extends AppCompatActivity { + private static final String CATEGORY = "你画我猜"; private ActivityDrawGuessBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, DrawGuessActivity.class); @@ -25,15 +31,29 @@ public class DrawGuessActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) {} + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); - - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { @@ -61,6 +81,28 @@ public class DrawGuessActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -68,9 +110,8 @@ public class DrawGuessActivity extends AppCompatActivity { if (binding != null) { BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_friends); - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/FindGameActivity.java b/android-app/app/src/main/java/com/example/livestreaming/FindGameActivity.java index 8c499787..aef3b326 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/FindGameActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/FindGameActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityFindGameBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class FindGameActivity extends AppCompatActivity { + private static final String CATEGORY = "找人玩游戏"; private ActivityFindGameBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, FindGameActivity.class); @@ -25,15 +31,29 @@ public class FindGameActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) {} + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); - - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { @@ -61,6 +81,28 @@ public class FindGameActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -68,9 +110,8 @@ public class FindGameActivity extends AppCompatActivity { if (binding != null) { BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_friends); - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/KTVTogetherActivity.java b/android-app/app/src/main/java/com/example/livestreaming/KTVTogetherActivity.java index 129e9b9b..c694a6dd 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/KTVTogetherActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/KTVTogetherActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityKtvTogetherBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class KTVTogetherActivity extends AppCompatActivity { + private static final String CATEGORY = "一起KTV"; private ActivityKtvTogetherBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, KTVTogetherActivity.class); @@ -25,15 +31,29 @@ public class KTVTogetherActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) {} + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); - - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { @@ -61,6 +81,28 @@ public class KTVTogetherActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -68,9 +110,8 @@ public class KTVTogetherActivity extends AppCompatActivity { if (binding != null) { BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_friends); - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/OnlineDatingActivity.java b/android-app/app/src/main/java/com/example/livestreaming/OnlineDatingActivity.java index 9ffe696c..9af42a8c 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/OnlineDatingActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/OnlineDatingActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityOnlineDatingBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class OnlineDatingActivity extends AppCompatActivity { + private static final String CATEGORY = "在线处对象"; private ActivityOnlineDatingBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, OnlineDatingActivity.class); @@ -25,11 +31,31 @@ public class OnlineDatingActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + // 发布动态按钮 + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + // 发布成功,添加到列表顶部 + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) { + // 发布失败 + } + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); @@ -61,6 +87,29 @@ public class OnlineDatingActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + // 加载该分类的动态 + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -70,7 +119,8 @@ public class OnlineDatingActivity extends AppCompatActivity { bottomNav.setSelectedItemId(R.id.nav_friends); // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + // 刷新动态列表 + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/PeaceEliteActivity.java b/android-app/app/src/main/java/com/example/livestreaming/PeaceEliteActivity.java index 60250ac9..e7c6f9e1 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/PeaceEliteActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/PeaceEliteActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityPeaceEliteBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class PeaceEliteActivity extends AppCompatActivity { + private static final String CATEGORY = "和平精英"; private ActivityPeaceEliteBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, PeaceEliteActivity.class); @@ -25,15 +31,29 @@ public class PeaceEliteActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) {} + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); - - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { @@ -61,6 +81,28 @@ public class PeaceEliteActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -68,9 +110,8 @@ public class PeaceEliteActivity extends AppCompatActivity { if (binding != null) { BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_friends); - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/TableGamesActivity.java b/android-app/app/src/main/java/com/example/livestreaming/TableGamesActivity.java index 338b53dd..b8e8b103 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/TableGamesActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/TableGamesActivity.java @@ -3,15 +3,21 @@ package com.example.livestreaming; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; import com.example.livestreaming.databinding.ActivityTableGamesBinding; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.List; + public class TableGamesActivity extends AppCompatActivity { + private static final String CATEGORY = "桌子游戏"; private ActivityTableGamesBinding binding; + private PostAdapter postAdapter; public static void start(Context context) { Intent intent = new Intent(context, TableGamesActivity.class); @@ -25,15 +31,29 @@ public class TableGamesActivity extends AppCompatActivity { setContentView(binding.getRoot()); setupUI(); + setupRecyclerView(); + loadPosts(); } private void setupUI() { binding.backButton.setOnClickListener(v -> finish()); + binding.fabPublish.setOnClickListener(v -> { + PublishPostHelper.showPublishDialog(this, CATEGORY, new PublishPostHelper.PublishCallback() { + @Override + public void onSuccess(Post post) { + postAdapter.addPost(post); + binding.recyclerPosts.scrollToPosition(0); + updateEmptyView(); + } + + @Override + public void onError(String error) {} + }); + }); + BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_friends); - - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { @@ -61,6 +81,28 @@ public class TableGamesActivity extends AppCompatActivity { return true; }); } + + private void setupRecyclerView() { + postAdapter = new PostAdapter(); + binding.recyclerPosts.setLayoutManager(new LinearLayoutManager(this)); + binding.recyclerPosts.setAdapter(postAdapter); + } + + private void loadPosts() { + List posts = PostManager.getPostsByCategory(this, CATEGORY); + postAdapter.setPosts(posts); + updateEmptyView(); + } + + private void updateEmptyView() { + if (postAdapter.getItemCount() == 0) { + binding.emptyView.setVisibility(View.VISIBLE); + binding.recyclerPosts.setVisibility(View.GONE); + } else { + binding.emptyView.setVisibility(View.GONE); + binding.recyclerPosts.setVisibility(View.VISIBLE); + } + } @Override protected void onResume() { @@ -68,9 +110,8 @@ public class TableGamesActivity extends AppCompatActivity { if (binding != null) { BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_friends); - // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); + loadPosts(); } } } - diff --git a/android-app/app/src/main/java/com/example/livestreaming/WishTreeActivity.java b/android-app/app/src/main/java/com/example/livestreaming/WishTreeActivity.java index 7edb8589..aeed6cb5 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/WishTreeActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/WishTreeActivity.java @@ -1,11 +1,19 @@ package com.example.livestreaming; +import android.app.Dialog; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.view.View; +import android.view.Window; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import com.example.livestreaming.databinding.ActivityWishTreeBinding; @@ -20,101 +28,149 @@ import java.util.TimeZone; public class WishTreeActivity extends AppCompatActivity { private ActivityWishTreeBinding binding; - private final Handler handler = new Handler(Looper.getMainLooper()); private Runnable timerRunnable; + private SharedPreferences prefs; + private String[] wishes = new String[7]; public static void start(Context context) { - Intent intent = new Intent(context, WishTreeActivity.class); - context.startActivity(intent); - } - - @Override - protected void onStart() { - super.onStart(); - startBannerCountdown(); - } - - @Override - protected void onStop() { - super.onStop(); - stopBannerCountdown(); - } - - private void startBannerCountdown() { - stopBannerCountdown(); - timerRunnable = new Runnable() { - @Override - public void run() { - updateBannerTimer(); - handler.postDelayed(this, 1000); - } - }; - handler.post(timerRunnable); - } - - private void stopBannerCountdown() { - if (timerRunnable != null) { - handler.removeCallbacks(timerRunnable); - timerRunnable = null; - } - } - - private void updateBannerTimer() { - if (binding == null) return; - try { - long now = System.currentTimeMillis(); - TimeZone tz = TimeZone.getDefault(); - Calendar c = Calendar.getInstance(tz); - c.setTimeInMillis(now); - c.set(Calendar.HOUR_OF_DAY, 0); - c.set(Calendar.MINUTE, 0); - c.set(Calendar.SECOND, 0); - c.set(Calendar.MILLISECOND, 0); - c.add(Calendar.DAY_OF_MONTH, 1); - long nextMidnight = c.getTimeInMillis(); - long diff = Math.max(0, nextMidnight - now); - - long totalSeconds = diff / 1000; - long hours = totalSeconds / 3600; - long minutes = (totalSeconds % 3600) / 60; - long seconds = totalSeconds % 60; - - SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); - fmt.setTimeZone(tz); - String current = fmt.format(new Date(now)); - String remain = String.format(Locale.getDefault(), "%02d:%02d:%02d", hours, minutes, seconds); - binding.bannerTimer.setText(current + " " + remain); - } catch (Exception ignored) { - } + context.startActivity(new Intent(context, WishTreeActivity.class)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // TODO: 接入后端接口 - 获取愿望树相关数据 - // 接口路径: GET /api/wish_tree/info - // 请求参数: - // - userId: 当前用户ID(从token中获取,可选) - // 返回数据格式: ApiResponse - // WishTreeInfo对象应包含: totalWishes, todayWishes, userWishCount, nextResetTime等字段 - // 用于显示愿望树统计信息和倒计时 binding = ActivityWishTreeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - startBannerCountdown(); + prefs = getSharedPreferences("wishes", MODE_PRIVATE); + loadWishes(); - BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; - bottomNavigation.setSelectedItemId(R.id.nav_wish_tree); - - // 更新未读消息徽章 - UnreadMessageManager.updateBadge(bottomNavigation); - - bottomNavigation.setOnItemSelectedListener(item -> { - int id = item.getItemId(); - if (id == R.id.nav_wish_tree) { - return true; + startBannerCountdown(); + setupBottomNav(); + setupWishCards(); + setupMakeWishButton(); + } + + private void loadWishes() { + for (int i = 0; i < 7; i++) { + wishes[i] = prefs.getString("wish_" + i, ""); + } + updateWishCards(); + } + + private void saveWish(int index, String wish) { + wishes[index] = wish; + prefs.edit().putString("wish_" + index, wish).apply(); + updateWishCards(); + } + + private void updateWishCards() { + TextView[] cards = { + binding.wishCard1, binding.wishCard2, binding.wishCard3, + binding.wishCard4, binding.wishCard5, binding.wishCard6, binding.wishCard7 + }; + for (int i = 0; i < cards.length; i++) { + if (wishes[i] != null && !wishes[i].isEmpty()) { + String text = wishes[i].length() > 8 ? wishes[i].substring(0, 8) + "..." : wishes[i]; + cards[i].setText(text); + } else { + cards[i].setText(""); } + } + } + + private void setupWishCards() { + TextView[] cards = { + binding.wishCard1, binding.wishCard2, binding.wishCard3, + binding.wishCard4, binding.wishCard5, binding.wishCard6, binding.wishCard7 + }; + for (int i = 0; i < cards.length; i++) { + final int index = i; + cards[i].setOnClickListener(v -> onWishCardClick(index)); + } + binding.addWishCard.setOnClickListener(v -> showMakeWishConfirmDialog(-1)); + } + + private void onWishCardClick(int index) { + if (wishes[index] != null && !wishes[index].isEmpty()) { + showViewWishDialog(index); + } else { + showMakeWishConfirmDialog(index); + } + } + + private void showMakeWishConfirmDialog(int index) { + new AlertDialog.Builder(this) + .setTitle("许愿确认") + .setMessage("是否要在这里许下心愿?") + .setNegativeButton("取消", null) + .setPositiveButton("进行许愿", (d, w) -> showMakeWishInputDialog(index)) + .show(); + } + + private void showMakeWishInputDialog(int index) { + View view = getLayoutInflater().inflate(R.layout.dialog_make_wish, null); + EditText input = view.findViewById(R.id.editWish); + + new AlertDialog.Builder(this) + .setTitle("写下你的心愿") + .setView(view) + .setNegativeButton("取消", null) + .setPositiveButton("确认", (d, w) -> { + String wish = input.getText().toString().trim(); + if (!wish.isEmpty()) { + int saveIndex = index >= 0 ? index : findEmptySlot(); + if (saveIndex >= 0) { + saveWish(saveIndex, wish); + showSuccessDialog(); + } else { + Toast.makeText(this, "心愿牌已满", Toast.LENGTH_SHORT).show(); + } + } + }) + .show(); + } + + private int findEmptySlot() { + for (int i = 0; i < wishes.length; i++) { + if (wishes[i] == null || wishes[i].isEmpty()) return i; + } + return -1; + } + + private void showSuccessDialog() { + Dialog dialog = new Dialog(this); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(R.layout.dialog_wish_success); + dialog.show(); + handler.postDelayed(dialog::dismiss, 1500); + } + + private void showViewWishDialog(int index) { + new AlertDialog.Builder(this) + .setTitle("我的心愿") + .setMessage(wishes[index]) + .setPositiveButton("关闭", null) + .setNegativeButton("删除心愿", (d, w) -> { + saveWish(index, ""); + Toast.makeText(this, "心愿已删除", Toast.LENGTH_SHORT).show(); + }) + .show(); + } + + private void setupMakeWishButton() { + binding.btnMakeWish.setOnClickListener(v -> showMakeWishConfirmDialog(-1)); + } + + private void setupBottomNav() { + BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; + bottomNav.setSelectedItemId(R.id.nav_wish_tree); + UnreadMessageManager.updateBadge(bottomNav); + + bottomNav.setOnItemSelectedListener(item -> { + int id = item.getItemId(); + if (id == R.id.nav_wish_tree) return true; if (id == R.id.nav_home) { startActivity(new Intent(this, MainActivity.class)); finish(); @@ -139,14 +195,62 @@ public class WishTreeActivity extends AppCompatActivity { }); } + @Override + protected void onStart() { + super.onStart(); + startBannerCountdown(); + } + + @Override + protected void onStop() { + super.onStop(); + stopBannerCountdown(); + } + + private void startBannerCountdown() { + stopBannerCountdown(); + timerRunnable = () -> { + updateBannerTimer(); + handler.postDelayed(timerRunnable, 1000); + }; + handler.post(timerRunnable); + } + + private void stopBannerCountdown() { + if (timerRunnable != null) { + handler.removeCallbacks(timerRunnable); + timerRunnable = null; + } + } + + private void updateBannerTimer() { + if (binding == null) return; + try { + long now = System.currentTimeMillis(); + TimeZone tz = TimeZone.getDefault(); + Calendar c = Calendar.getInstance(tz); + c.setTimeInMillis(now); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + c.add(Calendar.DAY_OF_MONTH, 1); + long diff = Math.max(0, c.getTimeInMillis() - now); + long h = diff / 3600000; + long m = (diff % 3600000) / 60000; + long s = (diff % 60000) / 1000; + SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); + fmt.setTimeZone(tz); + binding.bannerTimer.setText(fmt.format(new Date(now)) + " " + String.format(Locale.getDefault(), "%02d:%02d:%02d", h, m, s)); + } catch (Exception ignored) {} + } + @Override protected void onResume() { super.onResume(); if (binding != null) { - BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; - bottomNav.setSelectedItemId(R.id.nav_wish_tree); - // 更新未读消息徽章 - UnreadMessageManager.updateBadge(bottomNav); + binding.bottomNavInclude.bottomNavigation.setSelectedItemId(R.id.nav_wish_tree); + UnreadMessageManager.updateBadge(binding.bottomNavInclude.bottomNavigation); } } } diff --git a/android-app/app/src/main/res/layout/activity_draw_guess.xml b/android-app/app/src/main/res/layout/activity_draw_guess.xml index ae501c1e..86c57cdf 100644 --- a/android-app/app/src/main/res/layout/activity_draw_guess.xml +++ b/android-app/app/src/main/res/layout/activity_draw_guess.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_find_game.xml b/android-app/app/src/main/res/layout/activity_find_game.xml index 40fbe118..5dfd1367 100644 --- a/android-app/app/src/main/res/layout/activity_find_game.xml +++ b/android-app/app/src/main/res/layout/activity_find_game.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_ktv_together.xml b/android-app/app/src/main/res/layout/activity_ktv_together.xml index e71a3274..d6503104 100644 --- a/android-app/app/src/main/res/layout/activity_ktv_together.xml +++ b/android-app/app/src/main/res/layout/activity_ktv_together.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_online_dating.xml b/android-app/app/src/main/res/layout/activity_online_dating.xml index c0b47e59..f020f44b 100644 --- a/android-app/app/src/main/res/layout/activity_online_dating.xml +++ b/android-app/app/src/main/res/layout/activity_online_dating.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_peace_elite.xml b/android-app/app/src/main/res/layout/activity_peace_elite.xml index 50d1c44b..5ea5a3f5 100644 --- a/android-app/app/src/main/res/layout/activity_peace_elite.xml +++ b/android-app/app/src/main/res/layout/activity_peace_elite.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_table_games.xml b/android-app/app/src/main/res/layout/activity_table_games.xml index 29b06eee..2c3bb964 100644 --- a/android-app/app/src/main/res/layout/activity_table_games.xml +++ b/android-app/app/src/main/res/layout/activity_table_games.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FFFFFF"> + android:background="#F5F5F5"> + + + + + + + + + + + + - diff --git a/android-app/app/src/main/res/layout/activity_wish_tree.xml b/android-app/app/src/main/res/layout/activity_wish_tree.xml index cc4a16fc..3f046e0d 100644 --- a/android-app/app/src/main/res/layout/activity_wish_tree.xml +++ b/android-app/app/src/main/res/layout/activity_wish_tree.xml @@ -3,15 +3,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/white"> + android:background="#1A0A1E"> + android:paddingBottom="60dp"> + + app:layout_constraintTop_toTopOf="parent" + app:tint="#FFFFFF" /> + app:layout_constraintTop_toTopOf="parent" + app:tint="#FFFFFF" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +