package com.example.livestreaming; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.ClipData; import android.content.ClipboardManager; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.net.Uri; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AlertDialog; import com.bumptech.glide.Glide; import com.example.livestreaming.BuildConfig; import com.example.livestreaming.databinding.ActivityProfileBinding; import com.example.livestreaming.ShareUtils; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomsheet.BottomSheetDialog; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class ProfileActivity extends AppCompatActivity { private ActivityProfileBinding binding; private static final String PREFS_NAME = "profile_prefs"; private static final String KEY_NAME = "profile_name"; private static final String KEY_BIO = "profile_bio"; private static final String KEY_LEVEL = "profile_level"; private static final String KEY_FANS_BADGE = "profile_fans_badge"; private static final String KEY_BADGE = "profile_badge"; private static final String KEY_AVATAR_RES = "profile_avatar_res"; private static final String KEY_AVATAR_URI = "profile_avatar_uri"; private static final String KEY_BIRTHDAY = "profile_birthday"; private static final String KEY_GENDER = "profile_gender"; private static final String KEY_LOCATION = "profile_location"; private static final String BIO_HINT_TEXT = "填写个人签名更容易获得关注,点击此处添加"; private ActivityResultLauncher editProfileLauncher; public static void start(Context context) { Intent intent = new Intent(context, ProfileActivity.class); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityProfileBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 注册编辑资料页面的结果监听 editProfileLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 当从EditProfileActivity返回时,立即刷新所有数据 loadProfileFromPrefs(); loadAndDisplayTags(); loadProfileInfo(); } ); loadProfileFromPrefs(); loadAndDisplayTags(); loadProfileInfo(); setupEditableAreas(); setupAvatarClick(); setupNavigationClicks(); setupProfileTabs(); BottomNavigationView bottomNavigation = binding.bottomNavInclude.bottomNavigation; bottomNavigation.setSelectedItemId(R.id.nav_profile); // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNavigation); bottomNavigation.setOnItemSelectedListener(item -> { int id = item.getItemId(); if (id == R.id.nav_home) { startActivity(new Intent(this, MainActivity.class)); finish(); return true; } if (id == R.id.nav_friends) { startActivity(new Intent(this, FishPondActivity.class)); finish(); return true; } if (id == R.id.nav_wish_tree) { WishTreeActivity.start(this); finish(); return true; } if (id == R.id.nav_messages) { MessagesActivity.start(this); finish(); return true; } return true; }); } private void loadProfileFromPrefs() { String n = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_NAME, null); if (!TextUtils.isEmpty(n)) binding.name.setText(n); String bio = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_BIO, null); if (!TextUtils.isEmpty(bio) && !BIO_HINT_TEXT.equals(bio)) { binding.bioText.setText(bio); binding.bioText.setTextColor(0xFF111111); } else { binding.bioText.setText(BIO_HINT_TEXT); binding.bioText.setTextColor(0xFF999999); } String avatarUri = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_AVATAR_URI, null); if (!TextUtils.isEmpty(avatarUri)) { Glide.with(this) .load(Uri.parse(avatarUri)) .circleCrop() .error(R.drawable.ic_account_circle_24) .into(binding.avatar); } else { int avatarRes = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getInt(KEY_AVATAR_RES, 0); if (avatarRes != 0) { Glide.with(this) .load(avatarRes) .circleCrop() .error(R.drawable.ic_account_circle_24) .into(binding.avatar); } else { binding.avatar.setImageResource(R.drawable.ic_account_circle_24); } } // 等级/称号/徽章:保持固定显示(例如“月亮/星耀/至尊”),不从本地缓存覆盖。 } private void setupEditableAreas() { binding.name.setOnClickListener(v -> showEditDialog("编辑昵称", binding.name.getText() != null ? binding.name.getText().toString() : "", text -> { binding.name.setText(text); getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putString(KEY_NAME, text).apply(); })); binding.bioText.setOnClickListener(v -> { String current = binding.bioText.getText() != null ? binding.bioText.getText().toString() : ""; String initial = BIO_HINT_TEXT.equals(current) ? "" : current; showEditDialog("编辑签名", initial, text -> { if (TextUtils.isEmpty(text) || BIO_HINT_TEXT.equals(text)) { binding.bioText.setText(BIO_HINT_TEXT); binding.bioText.setTextColor(0xFF999999); getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().remove(KEY_BIO).apply(); } else { binding.bioText.setText(text); binding.bioText.setTextColor(0xFF111111); getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putString(KEY_BIO, text).apply(); } }); }); } private void setupAvatarClick() { binding.avatar.setOnClickListener(v -> { AvatarViewerDialog dialog = AvatarViewerDialog.create(this); // 优先从SharedPreferences读取最新的头像信息(因为ImageView可能还在加载中) String avatarUri = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_AVATAR_URI, null); int avatarRes = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getInt(KEY_AVATAR_RES, 0); if (!TextUtils.isEmpty(avatarUri)) { // 使用URI加载,确保能正确显示 dialog.setAvatarUri(Uri.parse(avatarUri)); } else if (avatarRes != 0) { dialog.setAvatarResId(avatarRes); } else { // 如果都没有,尝试从ImageView获取Drawable Drawable drawable = binding.avatar.getDrawable(); if (drawable != null) { dialog.setAvatarDrawable(drawable); } else { dialog.setAvatarResId(R.drawable.ic_account_circle_24); } } dialog.show(); }); } private void setupNavigationClicks() { binding.topActionSearch.setOnClickListener(v -> TabPlaceholderActivity.start(this, "定位/发现")); binding.topActionClock.setOnClickListener(v -> WatchHistoryActivity.start(this)); binding.topActionMore.setOnClickListener(v -> TabPlaceholderActivity.start(this, "更多")); binding.copyIdBtn.setOnClickListener(v -> { String idText = binding.idLine.getText() != null ? binding.idLine.getText().toString() : ""; if (TextUtils.isEmpty(idText)) return; String digits = idText.replaceAll("\\D+", ""); if (TextUtils.isEmpty(digits)) return; ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if (cm != null) { cm.setPrimaryClip(ClipData.newPlainText("id", digits)); Toast.makeText(this, "已复制:" + digits, Toast.LENGTH_SHORT).show(); } }); binding.following.setOnClickListener(v -> FollowingListActivity.start(this)); binding.followers.setOnClickListener(v -> FansListActivity.start(this)); binding.likes.setOnClickListener(v -> LikesListActivity.start(this)); binding.action1.setOnClickListener(v -> TabPlaceholderActivity.start(this, "公园勋章")); binding.action2.setOnClickListener(v -> WatchHistoryActivity.start(this)); binding.action3.setOnClickListener(v -> startActivity(new Intent(this, MyFriendsActivity.class))); binding.editProfile.setOnClickListener(v -> { Intent intent = new Intent(this, EditProfileActivity.class); editProfileLauncher.launch(intent); }); binding.shareHome.setOnClickListener(v -> { // TabPlaceholderActivity.start(this, "分享主页"); String idText = binding.idLine.getText() != null ? binding.idLine.getText().toString() : ""; String digits = !TextUtils.isEmpty(idText) ? idText.replaceAll("\\D+", "") : ""; if (TextUtils.isEmpty(digits)) digits = "24187196"; String url = "https://live.example.com/u/" + digits; ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if (cm != null) { cm.setPrimaryClip(ClipData.newPlainText("profile_url", url)); Toast.makeText(this, "主页链接已复制", Toast.LENGTH_SHORT).show(); } }); binding.shareHome.setOnClickListener(v -> showShareProfileDialog()); binding.addFriendBtn.setOnClickListener(v -> TabPlaceholderActivity.start(this, "加好友")); } private void setupProfileTabs() { showTab(0); binding.profileTabs.addOnTabSelectedListener(new com.google.android.material.tabs.TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(com.google.android.material.tabs.TabLayout.Tab tab) { if (tab == null) return; showTab(tab.getPosition()); } @Override public void onTabUnselected(com.google.android.material.tabs.TabLayout.Tab tab) { } @Override public void onTabReselected(com.google.android.material.tabs.TabLayout.Tab tab) { if (tab == null) return; showTab(tab.getPosition()); } }); binding.worksPublishBtn.setOnClickListener(v -> Toast.makeText(this, "发布功能待接入", Toast.LENGTH_SHORT).show()); binding.likedGoBrowseBtn.setOnClickListener(v -> startActivity(new Intent(this, MainActivity.class))); binding.favGoBrowseBtn.setOnClickListener(v -> startActivity(new Intent(this, MainActivity.class))); binding.profileEditFromTab.setOnClickListener(v -> { Intent intent = new Intent(this, EditProfileActivity.class); editProfileLauncher.launch(intent); }); } private void showTab(int index) { // 标签页顺序:0-作品, 1-收藏, 2-赞过 binding.tabWorks.setVisibility(index == 0 ? View.VISIBLE : View.GONE); binding.tabFavorites.setVisibility(index == 1 ? View.VISIBLE : View.GONE); binding.tabLiked.setVisibility(index == 2 ? View.VISIBLE : View.GONE); // "资料"标签页已移除 } private interface OnTextSaved { void onSaved(String text); } private void showEditDialog(String title, String initialValue, OnTextSaved onSaved) { EditText editText = new EditText(this); editText.setText(initialValue != null ? initialValue : ""); editText.setSelection(editText.getText() != null ? editText.getText().length() : 0); editText.setTextColor(0xFF111111); editText.setHintTextColor(0xFF999999); if ("编辑签名".equals(title)) { editText.setHint(BIO_HINT_TEXT); } int pad = (int) (16 * getResources().getDisplayMetrics().density); editText.setPadding(pad, pad, pad, pad); new AlertDialog.Builder(this) .setTitle(title) .setView(editText) .setNegativeButton("取消", null) .setPositiveButton("保存", (d, w) -> { String t = editText.getText() != null ? editText.getText().toString().trim() : ""; if (onSaved != null) onSaved.onSaved(t); }) .show(); } @Override protected void onResume() { super.onResume(); if (binding != null) { loadProfileFromPrefs(); loadAndDisplayTags(); loadProfileInfo(); BottomNavigationView bottomNav = binding.bottomNavInclude.bottomNavigation; bottomNav.setSelectedItemId(R.id.nav_profile); // 更新未读消息徽章 UnreadMessageManager.updateBadge(bottomNav); } } private void loadAndDisplayTags() { String location = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_LOCATION, ""); String gender = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_GENDER, ""); String birthday = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_BIRTHDAY, ""); // 设置所在地标签 - 支持"省份-城市"格式 if (!TextUtils.isEmpty(location)) { // 将"省份-城市"格式转换为"省份·城市"显示 String displayLocation = location.replace("-", "·"); binding.tagLocation.setText("IP:" + displayLocation); binding.tagLocation.setVisibility(View.VISIBLE); } else { binding.tagLocation.setText("IP:广西"); binding.tagLocation.setVisibility(View.VISIBLE); } // 设置性别标签 if (!TextUtils.isEmpty(gender)) { if (gender.contains("男")) { binding.tagGender.setText("男"); } else if (gender.contains("女")) { binding.tagGender.setText("女"); } else { binding.tagGender.setText("H"); } binding.tagGender.setVisibility(View.VISIBLE); } else { binding.tagGender.setText("H"); binding.tagGender.setVisibility(View.VISIBLE); } // 计算并设置年龄标签 if (!TextUtils.isEmpty(birthday)) { int age = calculateAge(birthday); if (age > 0) { binding.tagAge.setText(age + "岁"); binding.tagAge.setVisibility(View.VISIBLE); } else { binding.tagAge.setVisibility(View.GONE); } } else { binding.tagAge.setVisibility(View.GONE); } // 计算并设置星座标签 if (!TextUtils.isEmpty(birthday)) { String constellation = calculateConstellation(birthday); if (!TextUtils.isEmpty(constellation)) { binding.tagConstellation.setText(constellation); binding.tagConstellation.setVisibility(View.VISIBLE); } else { binding.tagConstellation.setVisibility(View.GONE); } } else { binding.tagConstellation.setVisibility(View.GONE); } } private void loadProfileInfo() { String name = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_NAME, "爱你"); String location = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_LOCATION, "广西"); String bio = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_BIO, null); if (binding.profileInfoLine1 != null) { binding.profileInfoLine1.setText("昵称:" + name); } if (binding.profileInfoLine2 != null) { String locationText = !TextUtils.isEmpty(location) ? location : "广西"; binding.profileInfoLine2.setText("地区:" + locationText); } if (binding.profileInfoLine3 != null) { String bioText = (!TextUtils.isEmpty(bio) && !BIO_HINT_TEXT.equals(bio)) ? bio : "填写个人签名更容易获得关注"; binding.profileInfoLine3.setText("签名:" + bioText); } } private int calculateAge(String birthdayStr) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); Date birthDate = sdf.parse(birthdayStr); if (birthDate == null) return 0; Calendar birth = Calendar.getInstance(); birth.setTime(birthDate); Calendar now = Calendar.getInstance(); int age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR); if (now.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) { age--; } return age; } catch (ParseException e) { return 0; } } private String calculateConstellation(String birthdayStr) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); Date birthDate = sdf.parse(birthdayStr); if (birthDate == null) return ""; Calendar cal = Calendar.getInstance(); cal.setTime(birthDate); int month = cal.get(Calendar.MONTH) + 1; // Calendar.MONTH 从0开始 int day = cal.get(Calendar.DAY_OF_MONTH); // 星座计算 if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) { return "白羊座"; } else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) { return "金牛座"; } else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) { return "双子座"; } else if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) { return "巨蟹座"; } else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) { return "狮子座"; } else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) { return "处女座"; } else if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) { return "天秤座"; } else if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) { return "天蝎座"; } else if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) { return "射手座"; } else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) { return "摩羯座"; } else if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) { return "水瓶座"; } else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) { return "双鱼座"; } return ""; } catch (ParseException e) { return ""; } } private void loadAndDisplayTags() { String location = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_LOCATION, ""); String gender = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_GENDER, ""); String birthday = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_BIRTHDAY, ""); // 设置所在地标签 - 支持"省份-城市"格式 if (!TextUtils.isEmpty(location)) { // 将"省份-城市"格式转换为"省份·城市"显示 String displayLocation = location.replace("-", "·"); binding.tagLocation.setText("IP:" + displayLocation); binding.tagLocation.setVisibility(View.VISIBLE); } else { binding.tagLocation.setText("IP:广西"); binding.tagLocation.setVisibility(View.VISIBLE); } // 设置性别标签 if (!TextUtils.isEmpty(gender)) { if (gender.contains("男")) { binding.tagGender.setText("男"); } else if (gender.contains("女")) { binding.tagGender.setText("女"); } else { binding.tagGender.setText("H"); } binding.tagGender.setVisibility(View.VISIBLE); } else { binding.tagGender.setText("H"); binding.tagGender.setVisibility(View.VISIBLE); } // 计算并设置年龄标签 if (!TextUtils.isEmpty(birthday)) { int age = calculateAge(birthday); if (age > 0) { binding.tagAge.setText(age + "岁"); binding.tagAge.setVisibility(View.VISIBLE); } else { binding.tagAge.setVisibility(View.GONE); } } else { binding.tagAge.setVisibility(View.GONE); } // 计算并设置星座标签 if (!TextUtils.isEmpty(birthday)) { String constellation = calculateConstellation(birthday); if (!TextUtils.isEmpty(constellation)) { binding.tagConstellation.setText(constellation); binding.tagConstellation.setVisibility(View.VISIBLE); } else { binding.tagConstellation.setVisibility(View.GONE); } } else { binding.tagConstellation.setVisibility(View.GONE); } } private void loadProfileInfo() { String name = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_NAME, "爱你"); String location = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_LOCATION, "广西"); String bio = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(KEY_BIO, null); if (binding.profileInfoLine1 != null) { binding.profileInfoLine1.setText("昵称:" + name); } if (binding.profileInfoLine2 != null) { String locationText = !TextUtils.isEmpty(location) ? location : "广西"; binding.profileInfoLine2.setText("地区:" + locationText); } if (binding.profileInfoLine3 != null) { String bioText = (!TextUtils.isEmpty(bio) && !BIO_HINT_TEXT.equals(bio)) ? bio : "填写个人签名更容易获得关注"; binding.profileInfoLine3.setText("签名:" + bioText); } } private int calculateAge(String birthdayStr) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); Date birthDate = sdf.parse(birthdayStr); if (birthDate == null) return 0; Calendar birth = Calendar.getInstance(); birth.setTime(birthDate); Calendar now = Calendar.getInstance(); int age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR); if (now.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) { age--; } return age; } catch (ParseException e) { return 0; } } private String calculateConstellation(String birthdayStr) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); Date birthDate = sdf.parse(birthdayStr); if (birthDate == null) return ""; Calendar cal = Calendar.getInstance(); cal.setTime(birthDate); int month = cal.get(Calendar.MONTH) + 1; // Calendar.MONTH 从0开始 int day = cal.get(Calendar.DAY_OF_MONTH); // 星座计算 if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) { return "白羊座"; } else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) { return "金牛座"; } else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) { return "双子座"; } else if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) { return "巨蟹座"; } else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) { return "狮子座"; } else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) { return "处女座"; } else if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) { return "天秤座"; } else if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) { return "天蝎座"; } else if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) { return "射手座"; } else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) { return "摩羯座"; } else if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) { return "水瓶座"; } else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) { return "双鱼座"; } return ""; } catch (ParseException e) { return ""; } } /** * 显示分享个人主页对话框 */ private void showShareProfileDialog() { // 获取用户ID String idText = binding.idLine.getText() != null ? binding.idLine.getText().toString() : ""; String digits = !TextUtils.isEmpty(idText) ? idText.replaceAll("\\D+", "") : ""; if (TextUtils.isEmpty(digits)) { digits = "24187196"; // 默认ID } // 直接生成分享链接 String shareLink = ShareUtils.generateProfileShareLink(digits); ShareUtils.shareLink(this, shareLink, "个人主页", "来看看我的主页吧"); } }