diff --git a/.idea/gradle.xml b/.idea/gradle.xml index fed8fa3..400aa4d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -8,7 +8,7 @@ - + diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 0000000..f24df79 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 4d86ddb..3f00f82 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,11 @@ +<<<<<<< HEAD + +======= +>>>>>>> e4f8cd19496660f3dc11140134950097331d4957 diff --git a/app/build.gradle b/app/build.gradle index f317370..9fc9f50 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,6 +44,7 @@ android { } buildFeatures { viewBinding true + dataBinding true } } @@ -52,6 +53,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' + implementation "androidx.compose.material3:material3:1.0.0-alpha04" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' @@ -74,6 +76,10 @@ dependencies { // implementation "android.arch.lifecycle:extensions:1.1.1" // annotationProcessor "android.arch.lifecycle:compiler:1.1.1" implementation 'com.tencent.wcdb:wcdb-android:1.1-19' + // 文件选择器 https://github.com/rosuH/AndroidFilePicker/blob/master/README_CN.md + implementation 'me.rosuh:AndroidFilePicker:0.8.2' + // 时间选择器 https://github.com/Gredicer/datetimepicker + implementation 'com.github.Gredicer:datetimepicker:V1.0.0' implementation 'com.google.code.gson:gson:2.10' implementation 'com.yanzhenjie.recyclerview:x:1.3.2' } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/MainActivity.kt b/app/src/main/java/com/navinfo/volvo/MainActivity.kt index edad14a..7e56e08 100644 --- a/app/src/main/java/com/navinfo/volvo/MainActivity.kt +++ b/app/src/main/java/com/navinfo/volvo/MainActivity.kt @@ -29,9 +29,7 @@ class MainActivity : AppCompatActivity() { // menu should be considered as top level destinations. val appBarConfiguration = AppBarConfiguration( setOf( - R.id.navigation_home, - R.id.navigation_dashboard, - R.id.navigation_notifications + R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, R.id.navigation_obtain_message ) ) setupActionBarWithNavController(navController, appBarConfiguration) diff --git a/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java b/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java index a0bbcc6..4c5b98a 100644 --- a/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java +++ b/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java @@ -10,6 +10,7 @@ import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteOpenHelper; +import com.navinfo.volvo.db.dao.entity.Message; import com.navinfo.volvo.db.dao.entity.Attachment; import com.navinfo.volvo.db.dao.entity.Message; import com.navinfo.volvo.db.dao.entity.User; diff --git a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt index 9d981e8..0a64f2d 100644 --- a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt @@ -9,9 +9,15 @@ import com.navinfo.volvo.tools.GsonUtil @Entity(tableName = "Attachment") data class Attachment( @PrimaryKey() - var id: String + var id: String, + var pathUrl: String, + var attachmentType: AttachmentType ) +enum class AttachmentType { + PIC, AUDIO +} + class AttachmentConverters() { @TypeConverter fun stringToAttachment(value: String): Attachment { diff --git a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt index 81048d6..77ad8dd 100644 --- a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt @@ -43,4 +43,4 @@ data class Message @JvmOverloads constructor( * 附件列表 */ var attachment: MutableList = mutableListOf() -) \ No newline at end of file +) diff --git a/app/src/main/java/com/navinfo/volvo/ui/ViewExtend.kt b/app/src/main/java/com/navinfo/volvo/ui/ViewExtend.kt new file mode 100644 index 0000000..bcea92a --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/ViewExtend.kt @@ -0,0 +1,13 @@ +package com.navinfo.volvo.ui + +import android.graphics.Color +import androidx.core.text.buildSpannedString +import androidx.core.text.color +import com.google.android.material.textfield.TextInputLayout + +fun TextInputLayout.markRequiredInRed() { + hint = buildSpannedString { + append(hint)// Mind the space prefix. + color(Color.RED) { append(" *") } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt index 6218058..89df690 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt @@ -14,6 +14,7 @@ import com.navinfo.volvo.R import com.navinfo.volvo.databinding.FragmentHomeBinding import com.navinfo.volvo.tools.DisplayUtil import com.navinfo.volvo.ui.adapter.MessageAdapter +import com.navinfo.volvo.ui.message.ObtainMessageViewModel import com.yanzhenjie.recyclerview.* import com.yanzhenjie.recyclerview.SwipeRecyclerView.LoadMoreListener @@ -32,10 +33,21 @@ class HomeFragment : Fragment(), OnItemClickListener, OnItemMenuClickListener { ): View { val homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java) + val obtainMessageViewModel = ViewModelProvider(requireActivity()).get(ObtainMessageViewModel::class.java) _binding = FragmentHomeBinding.inflate(inflater, container, false) val root: View = binding.root +// val textView: TextView = binding.tvNewMessage +// textView.setOnClickListener { +// val message = Message(1, "新建标题", "", "", "", 0, "1", "2", mutableListOf()) +// obtainMessageViewModel.setCurrentMessage(message) +// // 跳转到新建Message的Fragment +// Navigation.findNavController(it).navigate(R.id.home_2_obtain_message) +// } +// homeViewModel.text.observe(viewLifecycleOwner) { +// +// } val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview recyclerview.adapter = null //先设置null,否则会报错 //创建菜单选项 diff --git a/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt new file mode 100644 index 0000000..d90d8cf --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageFragment.kt @@ -0,0 +1,68 @@ +package com.navinfo.volvo.ui.message + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.gredicer.datetimepicker.DateTimePickerFragment +import com.navinfo.volvo.databinding.FragmentObtainMessageBinding +import com.navinfo.volvo.ui.markRequiredInRed + +class ObtainMessageFragment: Fragment() { + private var _binding: FragmentObtainMessageBinding? = null + private val obtainMessageViewModel by lazy { + ViewModelProvider(requireActivity()).get(ObtainMessageViewModel::class.java) + } + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentObtainMessageBinding.inflate(inflater, container, false) + val root: View = binding.root + + obtainMessageViewModel?.getMessageLiveData()?.observe( + viewLifecycleOwner, Observer { + // 初始化界面显示内容 + if(it.title!=null) + binding.tvMessageTitle?.setText(it.title) + if (it.sendDate!=null) { + binding.btnSendTime.setText(it.sendDate) + } + } + ) + initView() + return root + } + + fun initView() { + // 设置问候信息提示的红色星号 + binding.tiLayoutTitle.markRequiredInRed() + // 设置点击按钮选择发送时间 + binding.btnSendTime.setOnClickListener { + val dialog = DateTimePickerFragment.newInstance().mode(0) + dialog.listener = object : DateTimePickerFragment.OnClickListener { + override fun onClickListener(selectTime: String) { + obtainMessageViewModel.updateMessageSendTime(selectTime) + } + + } + dialog.show(parentFragmentManager, "SelectSendTime") + } + + // 点击按钮选择拍照 + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageViewModel.kt new file mode 100644 index 0000000..2ce11d2 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/message/ObtainMessageViewModel.kt @@ -0,0 +1,66 @@ +package com.navinfo.volvo.ui.message + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import com.navinfo.volvo.db.dao.entity.Message +import com.navinfo.volvo.db.dao.entity.AttachmentType + +class ObtainMessageViewModel: ViewModel() { + private val msgLiveData: MutableLiveData by lazy { + MutableLiveData() + } + + fun setCurrentMessage(msg: Message) { + msgLiveData.postValue(msg) + } + + fun getMessageLiveData(): MutableLiveData { + return msgLiveData + } + + // 更新消息标题 + fun updateMessageTitle(title: String) { + this.msgLiveData.value?.title = title + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新消息附件中的照片文件 + fun updateMessagePic(picUrl: String) { + for (attachment in this.msgLiveData.value!!.attachment) { + if (attachment.attachmentType == AttachmentType.PIC) { + attachment.pathUrl = picUrl + } + } + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新消息附件中的录音文件 + fun updateMessageAudio(audioUrl: String) { + for (attachment in this.msgLiveData.value!!.attachment) { + if (attachment.attachmentType == AttachmentType.AUDIO) { + attachment.pathUrl = audioUrl + } + } + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新发送人 + fun updateMessageSendFrom(sendFrom: String) { + this.msgLiveData.value?.fromId = sendFrom + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新接收人 + fun updateMessageSendTo(sendTo: String) { + this.msgLiveData.value?.toId = sendTo + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新发件时间 + fun updateMessageSendTime(sendTime: String) { + this.msgLiveData.value?.sendDate = sendTime + this.msgLiveData.postValue(this.msgLiveData.value) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_access_time_24.xml b/app/src/main/res/drawable/ic_baseline_access_time_24.xml new file mode 100644 index 0000000..bdf91f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_access_time_24.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_baseline_audio_file_24.xml b/app/src/main/res/drawable/ic_baseline_audio_file_24.xml new file mode 100644 index 0000000..5496fb8 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_audio_file_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_camera_24.xml b/app/src/main/res/drawable/ic_baseline_camera_24.xml new file mode 100644 index 0000000..4a77cd1 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_camera_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_fiber_manual_record_24.xml b/app/src/main/res/drawable/ic_baseline_fiber_manual_record_24.xml new file mode 100644 index 0000000..57fc55c --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_fiber_manual_record_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_image_search_24.xml b/app/src/main/res/drawable/ic_baseline_image_search_24.xml new file mode 100644 index 0000000..d797b73 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_image_search_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_mail_24.xml b/app/src/main/res/drawable/ic_baseline_mail_24.xml new file mode 100644 index 0000000..f0abc2d --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_mail_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/selector_bg_4_round_corner.xml b/app/src/main/res/drawable/selector_bg_4_round_corner.xml new file mode 100644 index 0000000..497f712 --- /dev/null +++ b/app/src/main/res/drawable/selector_bg_4_round_corner.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_4_round_corner.xml b/app/src/main/res/drawable/shape_bg_4_round_corner.xml new file mode 100644 index 0000000..a03b6b2 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_4_round_corner.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_4_round_corner_default.xml b/app/src/main/res/drawable/shape_bg_4_round_corner_default.xml new file mode 100644 index 0000000..d65ddff --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_4_round_corner_default.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index fe20242..00517f6 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -6,7 +6,5 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.home.HomeFragment" - > - - \ No newline at end of file + tools:context=".ui.home.HomeFragment"> + diff --git a/app/src/main/res/layout/fragment_obtain_message.xml b/app/src/main/res/layout/fragment_obtain_message.xml new file mode 100644 index 0000000..dac93b0 --- /dev/null +++ b/app/src/main/res/layout/fragment_obtain_message.xml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index 20bcbb4..9274e30 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -17,8 +17,14 @@ android:id="@+id/navigation_notifications" android:icon="@drawable/ic_notifications_black_24dp" android:title="@string/title_notifications" /> + + + + + + android:id="@+id/navigation_obtain_message" + android:icon="@drawable/ic_baseline_mail_24" + android:title="消息" /> + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 03b33bb..2926c8f 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -10,10 +10,10 @@ android:name="com.navinfo.volvo.ui.home.HomeFragment" android:label="@string/title_home" tools:layout="@layout/fragment_home" > - + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e00c2dd..eba9395 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,7 @@ 16dp 16dp + 12dp + 18sp + 6dp \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..229464f --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 65e85fc..146ed17 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ -