diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2eba624..1aeaa6b 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -71,4 +71,6 @@ dependencies {
implementation("com.google.mlkit:face-detection:16.1.5")
// 图形绘制库(绘制人脸框)
implementation("com.github.bumptech.glide:glide:4.15.1")
+ //Glide 依赖
+ implementation("com.github.bumptech.glide:glide:4.16.0")
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4e1da14..5ed700b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,6 +1,7 @@
+
@@ -18,6 +19,12 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DefenseApplication">
+
+
@@ -44,8 +51,7 @@
android:exported="false" />
-
+ android:exported="false" />
\ No newline at end of file
diff --git a/app/src/main/java/com/example/defenseapplication/adapter/DeviceAdapter.kt b/app/src/main/java/com/example/defenseapplication/adapter/DeviceAdapter.kt
index ed86fb8..4dedce7 100644
--- a/app/src/main/java/com/example/defenseapplication/adapter/DeviceAdapter.kt
+++ b/app/src/main/java/com/example/defenseapplication/adapter/DeviceAdapter.kt
@@ -11,7 +11,9 @@ data class DeviceUi(
val isOnline: Boolean
)
-class DeviceAdapter : RecyclerView.Adapter() {
+class DeviceAdapter(
+ private val onItemClick: (DeviceUi) -> Unit = {}
+) : RecyclerView.Adapter() {
private val items = mutableListOf()
@@ -44,6 +46,9 @@ class DeviceAdapter : RecyclerView.Adapter() {
binding.tvDeviceStatus.text = "\u25CF 离线"
binding.tvDeviceStatus.setTextColor(binding.root.context.getColor(R.color.red))
}
+ binding.root.setOnClickListener {
+ onItemClick(item)
+ }
}
}
}
diff --git a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt
index 2f0e7bc..856ea9c 100644
--- a/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt
+++ b/app/src/main/java/com/example/defenseapplication/home/HomeMenuFragment.kt
@@ -1,5 +1,6 @@
package com.example.defenseapplication.home
+import android.content.Intent
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable
@@ -16,13 +17,15 @@ import com.example.defenseapplication.adapter.DeviceAdapter
import com.example.defenseapplication.adapter.DeviceUi
import com.example.defenseapplication.adapter.FamilyAdapter
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
+import com.example.defenseapplication.view.DefenseDialogs
+import com.example.defenseapplication.view.showDefenseDialog
class HomeMenuFragment : Fragment() {
// ViewBinding
private var _binding: HomeMenuFragmentBinding? = null
private val binding get() = _binding!!
private val familyAdapter by lazy { FamilyAdapter(::onFamilySelected) }
- private val deviceAdapter by lazy { DeviceAdapter() }
+ private val deviceAdapter by lazy { DeviceAdapter(::onDeviceClicked) }
private var isFamilyExpanded = false
private var currentFamily = "我的家庭"
@@ -63,6 +66,10 @@ class HomeMenuFragment : Fragment() {
startColor = Color.parseColor("#EBDCED"),
endColor = Color.parseColor("#CAF4FF")
)
+ binding.message.setOnClickListener {
+ val intent = Intent(requireContext(), MessageActivity::class.java)
+ startActivity(intent)
+ }
}
private fun initView() {
@@ -115,6 +122,13 @@ class HomeMenuFragment : Fragment() {
deviceAdapter.submitList(familyDeviceMap[currentFamily].orEmpty())
}
+ private fun onDeviceClicked(device: DeviceUi) {
+ if (device.isOnline) return
+ showDefenseDialog(
+ config = DefenseDialogs.deviceOfflineConfig()
+ )
+ }
+
private fun dpToPx(dp: Int): Int {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
diff --git a/app/src/main/java/com/example/defenseapplication/home/MessageActivity.kt b/app/src/main/java/com/example/defenseapplication/home/MessageActivity.kt
new file mode 100644
index 0000000..ee66bc2
--- /dev/null
+++ b/app/src/main/java/com/example/defenseapplication/home/MessageActivity.kt
@@ -0,0 +1,92 @@
+package com.example.defenseapplication.home
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.example.defenseapplication.adapter.MessageListAdapter
+import com.example.defenseapplication.adapter.MessageListItem
+import com.example.defenseapplication.databinding.MessageActivityBinding
+
+class MessageActivity : AppCompatActivity() {
+ private lateinit var binding: MessageActivityBinding
+ private val messageAdapter by lazy { MessageListAdapter() }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ binding = MessageActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
+ val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+ insets
+ }
+ initView()
+ }
+
+ private fun initView() {
+ binding.ivBack.setOnClickListener { finish() }
+ binding.rvMessageList.layoutManager = LinearLayoutManager(this)
+ binding.rvMessageList.adapter = messageAdapter
+ messageAdapter.submitList(buildMockData())
+ }
+
+ private fun buildMockData(): List {
+ return listOf(
+ MessageListItem.Header("今天"),
+ MessageListItem.Message(
+ time = "15:54",
+ title = "有人入侵",
+ dateTime = "2026-05-06 15:54:25",
+ unread = true
+ ),
+ MessageListItem.Message(
+ time = "12:54",
+ title = "有人入侵",
+ dateTime = "2026-05-06 15:54:25",
+ unread = true
+ ),
+ MessageListItem.Message(
+ time = "11:54",
+ title = "有人入侵",
+ dateTime = "2026-05-06 15:54:25",
+ unread = true
+ ),
+ MessageListItem.Header("05-05"),
+ MessageListItem.Message(
+ time = "15:54",
+ title = "设备故障",
+ dateTime = "2026-05-06 15:54:25",
+ unread = false
+ ),
+ MessageListItem.Message(
+ time = "08:07",
+ title = "设备离线",
+ dateTime = "2026-05-06 15:54:25",
+ unread = false
+ ),
+ MessageListItem.Message(
+ time = "08:07",
+ title = "到期提醒",
+ dateTime = "2026-05-06 15:54:25",
+ unread = false
+ ),
+ MessageListItem.Message(
+ time = "11:54",
+ title = "有人入侵",
+ dateTime = "2026-05-06 15:54:25",
+ unread = false
+ ),
+ MessageListItem.Message(
+ time = "11:54",
+ title = "有人入侵",
+ dateTime = "2026-05-06 15:54:25",
+ unread = false
+ )
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt b/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt
index 94415df..76511e9 100644
--- a/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt
+++ b/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt
@@ -1,12 +1,15 @@
package com.example.defenseapplication.home
+import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import com.bumptech.glide.Glide
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.PersonalFragmentBinding
+import com.example.defenseapplication.personal.PersonalProfileActivity
class PersonalFragment : Fragment() {
// ViewBinding
@@ -19,6 +22,14 @@ class PersonalFragment : Fragment() {
savedInstanceState: Bundle?
): View {
_binding = PersonalFragmentBinding.inflate(inflater, container, false)
+ Glide.with(this)
+ .load(R.mipmap.ic_launcher_round)
+ .circleCrop()
+ .into(binding.ivAvatar)
+ binding.headerLayout.setOnClickListener {
+ val intent= Intent(requireContext(), PersonalProfileActivity::class.java)
+ startActivity(intent)
+ }
return binding.root
}
diff --git a/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt b/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt
new file mode 100644
index 0000000..9665030
--- /dev/null
+++ b/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt
@@ -0,0 +1,47 @@
+package com.example.defenseapplication.personal
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import com.bumptech.glide.Glide
+import com.example.defenseapplication.R
+import com.example.defenseapplication.databinding.PersonalProfileActivityBinding
+
+class PersonalProfileActivity : AppCompatActivity() {
+ private lateinit var binding: PersonalProfileActivityBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ binding = PersonalProfileActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
+ val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+ insets
+ }
+
+ initView()
+ }
+
+ private fun initView() {
+ binding.ivBack.setOnClickListener { finish() }
+
+ // 默认展示数据(后续可接你的用户信息接口/数据库)
+ Glide.with(this)
+ .load(R.mipmap.ic_launcher_round)
+ .circleCrop()
+ .into(binding.ivAvatar)
+
+ binding.tvNickname.text = "这里是我的昵称"
+ binding.tvPhone.text = "13589898989"
+
+ // 点击行可跳转到“修改昵称/修改手机号”等页面
+ //binding.itemAvatar.setOnClickListener { /* TODO */ }
+ //binding.itemNickname.setOnClickListener { /* TODO */ }
+ //binding.itemPhone.setOnClickListener { /* TODO */ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/defenseapplication/view/DialogFragment.kt b/app/src/main/java/com/example/defenseapplication/view/DialogFragment.kt
new file mode 100644
index 0000000..67b6551
--- /dev/null
+++ b/app/src/main/java/com/example/defenseapplication/view/DialogFragment.kt
@@ -0,0 +1,255 @@
+package com.example.defenseapplication.view
+
+import android.app.Dialog
+import android.os.Bundle
+import android.text.InputType
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.WindowManager
+import android.widget.LinearLayout
+import android.widget.EditText
+import android.widget.TextView
+import androidx.core.os.bundleOf
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentManager
+import com.example.defenseapplication.R
+
+class CustomDialogFragment : androidx.fragment.app.DialogFragment() {
+
+ data class Config(
+ val title: String,
+ val message: String = "",
+ val positiveText: String = "确定",
+ val negativeText: String? = "取消",
+ val cancelOnTouchOutside: Boolean = true,
+ val showInput: Boolean = false,
+ val inputHint: String = "",
+ val inputText: String = "",
+ val inputType: Int = InputType.TYPE_CLASS_TEXT
+ )
+
+ private var onPositiveClick: ((String) -> Unit)? = null
+ private var onNegativeClick: (() -> Unit)? = null
+ private lateinit var config: Config
+
+ fun setOnPositiveClick(block: (String) -> Unit): CustomDialogFragment = apply {
+ onPositiveClick = block
+ }
+
+ fun setOnNegativeClick(block: () -> Unit): CustomDialogFragment = apply {
+ onNegativeClick = block
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ config = Config(
+ title = requireArguments().getString(ARG_TITLE).orEmpty(),
+ message = requireArguments().getString(ARG_MESSAGE).orEmpty(),
+ positiveText = requireArguments().getString(ARG_POSITIVE_TEXT).orEmpty(),
+ negativeText = requireArguments().getString(ARG_NEGATIVE_TEXT),
+ cancelOnTouchOutside = requireArguments().getBoolean(ARG_CANCEL_ON_TOUCH_OUTSIDE),
+ showInput = requireArguments().getBoolean(ARG_SHOW_INPUT),
+ inputHint = requireArguments().getString(ARG_INPUT_HINT).orEmpty(),
+ inputText = requireArguments().getString(ARG_INPUT_TEXT).orEmpty(),
+ inputType = requireArguments().getInt(ARG_INPUT_TYPE)
+ )
+ isCancelable = config.cancelOnTouchOutside
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ return super.onCreateDialog(savedInstanceState).apply {
+ setCanceledOnTouchOutside(config.cancelOnTouchOutside)
+ }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ return inflater.inflate(R.layout.dialog_custom, container, false)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ dialog?.window?.let { window ->
+ window.setLayout(
+ (resources.displayMetrics.widthPixels * 0.88f).toInt(),
+ WindowManager.LayoutParams.WRAP_CONTENT
+ )
+ window.setBackgroundDrawableResource(android.R.color.transparent)
+ }
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val tvTitle = view.findViewById(R.id.tv_title)
+ val tvMessage = view.findViewById(R.id.tv_message)
+ val etInput = view.findViewById(R.id.et_input)
+ val btnNegative = view.findViewById(R.id.btn_negative)
+ val btnPositive = view.findViewById(R.id.btn_positive)
+ val dividerCenter = view.findViewById(R.id.v_divider_center)
+
+ tvTitle.text = config.title
+ tvMessage.text = config.message
+ tvMessage.visibility = if (config.message.isBlank()) View.GONE else View.VISIBLE
+
+ etInput.visibility = if (config.showInput) View.VISIBLE else View.GONE
+ etInput.hint = config.inputHint
+ etInput.setText(config.inputText)
+ etInput.inputType = config.inputType
+
+ btnPositive.text = config.positiveText
+
+ val hasNegative = !config.negativeText.isNullOrBlank()
+ btnNegative.visibility = if (hasNegative) View.VISIBLE else View.GONE
+ dividerCenter.visibility = if (hasNegative) View.VISIBLE else View.GONE
+ if (hasNegative) {
+ btnNegative.text = config.negativeText
+ } else {
+ btnPositive.layoutParams = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ }
+
+ btnNegative.setOnClickListener {
+ onNegativeClick?.invoke()
+ dismissAllowingStateLoss()
+ }
+ btnPositive.setOnClickListener {
+ onPositiveClick?.invoke(etInput.text?.toString().orEmpty())
+ dismissAllowingStateLoss()
+ }
+ }
+
+ companion object {
+ private const val ARG_TITLE = "arg_title"
+ private const val ARG_MESSAGE = "arg_message"
+ private const val ARG_POSITIVE_TEXT = "arg_positive_text"
+ private const val ARG_NEGATIVE_TEXT = "arg_negative_text"
+ private const val ARG_CANCEL_ON_TOUCH_OUTSIDE = "arg_cancel_on_touch_outside"
+ private const val ARG_SHOW_INPUT = "arg_show_input"
+ private const val ARG_INPUT_HINT = "arg_input_hint"
+ private const val ARG_INPUT_TEXT = "arg_input_text"
+ private const val ARG_INPUT_TYPE = "arg_input_type"
+
+ fun newInstance(config: Config): CustomDialogFragment {
+ return CustomDialogFragment().apply {
+ arguments = bundleOf(
+ ARG_TITLE to config.title,
+ ARG_MESSAGE to config.message,
+ ARG_POSITIVE_TEXT to config.positiveText,
+ ARG_NEGATIVE_TEXT to config.negativeText,
+ ARG_CANCEL_ON_TOUCH_OUTSIDE to config.cancelOnTouchOutside,
+ ARG_SHOW_INPUT to config.showInput,
+ ARG_INPUT_HINT to config.inputHint,
+ ARG_INPUT_TEXT to config.inputText,
+ ARG_INPUT_TYPE to config.inputType
+ )
+ }
+ }
+ }
+}
+
+object DefenseDialogs {
+ private const val DEFAULT_TAG = "custom_dialog_fragment"
+
+ fun showDialog(
+ activity: FragmentActivity,
+ config: CustomDialogFragment.Config,
+ tag: String = DEFAULT_TAG,
+ onPositiveClick: (String) -> Unit = {},
+ onNegativeClick: () -> Unit = {}
+ ): CustomDialogFragment {
+ return CustomDialogFragment.newInstance(config)
+ .setOnPositiveClick(onPositiveClick)
+ .setOnNegativeClick(onNegativeClick)
+ .also { it.show(activity.supportFragmentManager, tag) }
+ }
+
+ fun showDialog(
+ fragment: Fragment,
+ config: CustomDialogFragment.Config,
+ tag: String = DEFAULT_TAG,
+ onPositiveClick: (String) -> Unit = {},
+ onNegativeClick: () -> Unit = {}
+ ): CustomDialogFragment {
+ return CustomDialogFragment.newInstance(config)
+ .setOnPositiveClick(onPositiveClick)
+ .setOnNegativeClick(onNegativeClick)
+ .also { it.show(fragment.parentFragmentManager, tag) }
+ }
+
+ fun intrusionAlertConfig(deviceName: String, timeText: String): CustomDialogFragment.Config {
+ return CustomDialogFragment.Config(
+ title = "入侵告警",
+ message = "${timeText}有人入侵\n【${deviceName}】",
+ positiveText = "去看一下",
+ negativeText = "取消"
+ )
+ }
+
+ fun warmPromptConfig(deviceName: String, runDays: Int): CustomDialogFragment.Config {
+ return CustomDialogFragment.Config(
+ title = "温馨提示",
+ message = "【${deviceName}】设备已经运行\n${runDays}天请及时维护",
+ positiveText = "知道了",
+ negativeText = null
+ )
+ }
+
+ fun deviceOfflineConfig(): CustomDialogFragment.Config {
+ return CustomDialogFragment.Config(
+ title = "设备离线",
+ message = "设备已离线,请检查设备的WIF及电\n源情况",
+ positiveText = "知道了",
+ negativeText = null
+ )
+ }
+
+ fun strikeDistanceConfig(defaultDistance: String): CustomDialogFragment.Config {
+ return CustomDialogFragment.Config(
+ title = "打击距离",
+ message = "",
+ positiveText = "确定",
+ negativeText = "取消",
+ showInput = true,
+ inputHint = "请输入打击距离",
+ inputText = defaultDistance,
+ inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
+ )
+ }
+}
+
+fun FragmentActivity.showDefenseDialog(
+ config: CustomDialogFragment.Config,
+ tag: String = "custom_dialog_fragment",
+ onPositiveClick: (String) -> Unit = {},
+ onNegativeClick: () -> Unit = {}
+): CustomDialogFragment {
+ return DefenseDialogs.showDialog(this, config, tag, onPositiveClick, onNegativeClick)
+}
+
+fun Fragment.showDefenseDialog(
+ config: CustomDialogFragment.Config,
+ tag: String = "custom_dialog_fragment",
+ onPositiveClick: (String) -> Unit = {},
+ onNegativeClick: () -> Unit = {}
+): CustomDialogFragment {
+ return DefenseDialogs.showDialog(this, config, tag, onPositiveClick, onNegativeClick)
+}
+
+fun FragmentManager.showDefenseDialog(
+ config: CustomDialogFragment.Config,
+ tag: String = "custom_dialog_fragment",
+ onPositiveClick: (String) -> Unit = {},
+ onNegativeClick: () -> Unit = {}
+): CustomDialogFragment {
+ return CustomDialogFragment.newInstance(config)
+ .setOnPositiveClick(onPositiveClick)
+ .setOnNegativeClick(onNegativeClick)
+ .also { it.show(this, tag) }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_face_manage.xml b/app/src/main/res/drawable/bg_face_manage.xml
new file mode 100644
index 0000000..eb0a1b1
--- /dev/null
+++ b/app/src/main/res/drawable/bg_face_manage.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_pwd_manager.xml b/app/src/main/res/drawable/bg_pwd_manager.xml
new file mode 100644
index 0000000..150ba0f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_pwd_manager.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_user_manage.xml b/app/src/main/res/drawable/bg_user_manage.xml
new file mode 100644
index 0000000..4c092f5
--- /dev/null
+++ b/app/src/main/res/drawable/bg_user_manage.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_white.xml b/app/src/main/res/drawable/bg_white.xml
new file mode 100644
index 0000000..a25eed3
--- /dev/null
+++ b/app/src/main/res/drawable/bg_white.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/face_manage.png b/app/src/main/res/drawable/face_manage.png
new file mode 100644
index 0000000..0d27cdf
Binary files /dev/null and b/app/src/main/res/drawable/face_manage.png differ
diff --git a/app/src/main/res/drawable/phone.png b/app/src/main/res/drawable/phone.png
new file mode 100644
index 0000000..f15597e
Binary files /dev/null and b/app/src/main/res/drawable/phone.png differ
diff --git a/app/src/main/res/drawable/pwd_manager.png b/app/src/main/res/drawable/pwd_manager.png
new file mode 100644
index 0000000..61b8b29
Binary files /dev/null and b/app/src/main/res/drawable/pwd_manager.png differ
diff --git a/app/src/main/res/drawable/right_back.png b/app/src/main/res/drawable/right_back.png
new file mode 100644
index 0000000..276374d
Binary files /dev/null and b/app/src/main/res/drawable/right_back.png differ
diff --git a/app/src/main/res/drawable/round_bg.xml b/app/src/main/res/drawable/round_bg.xml
new file mode 100644
index 0000000..0e6e053
--- /dev/null
+++ b/app/src/main/res/drawable/round_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/switch_family.png b/app/src/main/res/drawable/switch_family.png
new file mode 100644
index 0000000..a9d1ed6
Binary files /dev/null and b/app/src/main/res/drawable/switch_family.png differ
diff --git a/app/src/main/res/drawable/user_manage.png b/app/src/main/res/drawable/user_manage.png
new file mode 100644
index 0000000..9a5490b
Binary files /dev/null and b/app/src/main/res/drawable/user_manage.png differ
diff --git a/app/src/main/res/layout/dialog_custom.xml b/app/src/main/res/layout/dialog_custom.xml
new file mode 100644
index 0000000..64434ac
--- /dev/null
+++ b/app/src/main/res/layout/dialog_custom.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/home_menu_fragment.xml b/app/src/main/res/layout/home_menu_fragment.xml
index 762db27..bfebc08 100644
--- a/app/src/main/res/layout/home_menu_fragment.xml
+++ b/app/src/main/res/layout/home_menu_fragment.xml
@@ -45,7 +45,7 @@
@@ -57,6 +57,7 @@
android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/personal_fragment.xml b/app/src/main/res/layout/personal_fragment.xml
index 9cee5d9..ff339db 100644
--- a/app/src/main/res/layout/personal_fragment.xml
+++ b/app/src/main/res/layout/personal_fragment.xml
@@ -3,12 +3,224 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:background="@color/white"
+ android:orientation="vertical"
tools:context=".home.PersonalFragment">
-
+ android:background="@drawable/bg_personal_header_gradient"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ android:paddingHorizontal="16dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="18dp">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/personal_profile_activity.xml b/app/src/main/res/layout/personal_profile_activity.xml
new file mode 100644
index 0000000..0d4435e
--- /dev/null
+++ b/app/src/main/res/layout/personal_profile_activity.xml
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index b6b0314..65904ee 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -11,5 +11,7 @@
#000000
#999999
#99000000
+ #E7E7E7
+ #F9F9F9
\ No newline at end of file