From 5004917d66f1a286b80191184c3df62842a7113f Mon Sep 17 00:00:00 2001 From: maxinyu Date: Wed, 29 Apr 2026 15:11:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 10 +- .../adapter/DeviceAdapter.kt | 7 +- .../home/HomeMenuFragment.kt | 16 +- .../home/MessageActivity.kt | 92 +++++++ .../home/PersonalFragment.kt | 11 + .../personal/PersonalProfileActivity.kt | 47 ++++ .../defenseapplication/view/DialogFragment.kt | 255 ++++++++++++++++++ app/src/main/res/drawable/bg_face_manage.xml | 5 + app/src/main/res/drawable/bg_pwd_manager.xml | 5 + app/src/main/res/drawable/bg_user_manage.xml | 5 + app/src/main/res/drawable/bg_white.xml | 5 + app/src/main/res/drawable/face_manage.png | Bin 0 -> 626 bytes app/src/main/res/drawable/phone.png | Bin 0 -> 432 bytes app/src/main/res/drawable/pwd_manager.png | Bin 0 -> 648 bytes app/src/main/res/drawable/right_back.png | Bin 0 -> 265 bytes app/src/main/res/drawable/round_bg.xml | 6 + app/src/main/res/drawable/switch_family.png | Bin 0 -> 595 bytes app/src/main/res/drawable/user_manage.png | Bin 0 -> 651 bytes app/src/main/res/layout/dialog_custom.xml | 92 +++++++ .../main/res/layout/home_menu_fragment.xml | 3 +- app/src/main/res/layout/message_activity.xml | 50 ++++ app/src/main/res/layout/personal_fragment.xml | 220 ++++++++++++++- .../res/layout/personal_profile_activity.xml | 161 +++++++++++ app/src/main/res/values/colors.xml | 2 + 25 files changed, 985 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/example/defenseapplication/home/MessageActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt create mode 100644 app/src/main/java/com/example/defenseapplication/view/DialogFragment.kt create mode 100644 app/src/main/res/drawable/bg_face_manage.xml create mode 100644 app/src/main/res/drawable/bg_pwd_manager.xml create mode 100644 app/src/main/res/drawable/bg_user_manage.xml create mode 100644 app/src/main/res/drawable/bg_white.xml create mode 100644 app/src/main/res/drawable/face_manage.png create mode 100644 app/src/main/res/drawable/phone.png create mode 100644 app/src/main/res/drawable/pwd_manager.png create mode 100644 app/src/main/res/drawable/right_back.png create mode 100644 app/src/main/res/drawable/round_bg.xml create mode 100644 app/src/main/res/drawable/switch_family.png create mode 100644 app/src/main/res/drawable/user_manage.png create mode 100644 app/src/main/res/layout/dialog_custom.xml create mode 100644 app/src/main/res/layout/message_activity.xml create mode 100644 app/src/main/res/layout/personal_profile_activity.xml 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 0000000000000000000000000000000000000000..0d27cdf4d999d1ec69277df4009f9a03e6aeed2b GIT binary patch literal 626 zcmV-&0*(ENP)A6-QXOaat?eF`kt6*N!@t_qz<_UYP(DYdV0%d=k^KEHHzMVG#Y7|XXb2d89 zNDmYU6vo@z7DaHAqJ>T!Ek1y@1;;EdU97|=L5MzqS{#JpptB%8f`d;{P$-B?+o=T? z(M<;-Amop~n_EfZHJtC}obP<+yMIKE&vBfpWm#Rzk&zhVkkgi=tdEPlOQ9Q54-3i^VCzUTX3U{`I$} zcZOz6{VqXoEFfzXnV>NMbbG1&nBtOcA-p@WL)SN>^X*Q6zwIJ6*S81 z?r!v2eU1SFY_t@SJ29A1ObZy1E&OJHFp{N?wMoQMPse!8a;IpFzbBX8uyl{xSKCR*z zZ$B_nFc(!rzG<{H2)oJ!Q!e+JUS7Ci5vMAB=0jL-wf~nvs|(uIR=>eN00030|35;5 iwg3PC21!IgR09B}8>}&%eUkYA0000w|KJ4T5DOss_ zzq(7eOghveae@2aa`xV!PzSDQd*xaDfgbq(|C)JM3Xs7D@(DA;Vf}Q&Sud|K0!0`+ MUHx3vIVCg!02 + + + + + \ 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 0000000000000000000000000000000000000000..a9d1ed61b4f9cc1069dd7cee03c7ef13c251c8a7 GIT binary patch literal 595 zcmV-Z0<8UsP)>!;6eURug6Q3w)tgsA^wLC%3VPWD zQBe>t9z+DSsF$848*&j^H8t*zZ^fqj=VccPg%&!zVP|INd%u0N%Np2V+XloAcyo+s zreThktlI0cRa>66YORuG&doII>Db3t4Y4PfZq!eUfma4GPGT2`L4zziB5zAe&-Nh3 z;s6vnw*iLwNF3zPm8*!ckkH#-Y?v968E-8RPX_W(8VPWciB3r2DG(G-stqFn^Mh00 zAXv~URZ;E!LR}(PB*0a63>MW!-`&{jBJyr&==XJRO&7-klCVbrX@$kK2AYXO;kv)l z6L4zr*3PnJK7tsJ)vOQuWdMmYfbqW6Gz*BZo`Agr2kw$Qr`O7|16;F>9i!DdpB_Gt zh25^}dbNOZt3E-ns1vB!x10ozSJSy0_lBkxF+1x>n|Wy)ALduSW`i0nfR1xH*x1d9 z!enaX*!^FhWz_-B0m#s{pQ@{GX#pZU;p^%q^0AW6zwFp_KTr3BeivNow*C*a01&na z+Cg^&Z(Ln6fujOcAaYaXU5I*TZmddcOADx^bNed8x&EM6hx1olX`%1Pb0KmH^5@5w z_Q^tjcH*C>vS;11oDHB6XhCT{|zi$aHY=Dv5{z2`jM$G|#&n+Aa! z9JocDX>Ln)^EZi$f)9xCnt|2;gs^XIHQpy#YamM>^QnPs+dIV%4szYIVLk*fJ$b>6BO~0PcsH~L zvwv_0jJHmK2(w@ym!;>5+r9?_HZbw@CBDkpOwQPNuXs1K217$M+n>Q%5jicmLKcqZ zGSprcVC+bntW z5RY?xJjMGvdiZdA7dOUYY&rrLTIqYJ9>;9PeK9x{ZK5~MoD-`W$Qx)%rg_xdifPlp zkC2V=Iunz-Blsr|?@_#)k0_DWGc*-#p=;4*`lQB{@HI%@1?L%h3_KZYBs>OkQ+~^p?5ja{L2?oTZSxqY zY`KzY+eWk8jMp+&LK4btni-ER#_?P)70Yauj<12r&1dPA2%NY6BW&3?uw)>zXkqWv zIJU`SYb#{vi^>Z^RRgE6P@wrjmVVytp^1Ba^s88u_v}p85CaWr(9ouAe1l~G00960 lpET$D00006Nkl + + + + + + + + + + + + + + + + + + + + + + \ 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