diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 818e88c..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -NavinfoVivo \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index b15943a..cb0c65a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,11 +6,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' //apply plugin: 'realm-android' android { - namespace 'com.navinfo.vivo' + namespace 'com.navinfo.volvo' compileSdk 32 defaultConfig { - applicationId "com.navinfo.vivo" + applicationId "com.navinfo.volvo" minSdk 24 targetSdk 32 versionCode 1 @@ -44,6 +44,7 @@ android { } buildFeatures { viewBinding true + dataBinding true } } @@ -58,6 +59,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' + implementation 'com.google.code.gson:gson:2.10' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' @@ -75,4 +77,8 @@ 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' } \ No newline at end of file diff --git a/app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt similarity index 86% rename from app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt index f16bf01..5d650bd 100644 --- a/app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo +package com.navinfo.volvo import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.navinfo.vivo", appContext.packageName) + assertEquals("com.navinfo.volvo", appContext.packageName) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ee1abf..deae353 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.NavinfoVivo" + android:theme="@style/Theme.NavinfoVolvo" tools:targetApi="31"> ): String { + return gson.toJson(list) + } + + @TypeConverter + fun stringToObject(json: String?): List { + val listType: Type = object : TypeToken>() {}.type + return gson.fromJson(json, listType) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt similarity index 84% rename from app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt rename to app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt index d356ad3..7c299ad 100644 --- a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt @@ -1,8 +1,10 @@ -package com.navinfo.vivo.db.dao.entity +package com.navinfo.volvo.db.dao.entity import androidx.room.Entity import androidx.room.PrimaryKey +import androidx.room.TypeConverters +@TypeConverters(AttachmentConvert::class) @Entity(tableName = "message") class Message( @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt similarity index 69% rename from app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt rename to app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt index b2329ee..c1a5569 100644 --- a/app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt @@ -1,7 +1,6 @@ -package com.navinfo.vivo.db.dao.entity +package com.navinfo.volvo.db.dao.entity import androidx.room.PrimaryKey -import java.net.IDN class User( @PrimaryKey() 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/vivo/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt similarity index 91% rename from app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt index 1ce55d1..9dda29c 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.dashboard +package com.navinfo.volvo.ui.dashboard import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentDashboardBinding +import com.navinfo.volvo.databinding.FragmentDashboardBinding class DashboardFragment : Fragment() { diff --git a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt similarity index 88% rename from app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt rename to app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt index d040254..647da35 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.dashboard +package com.navinfo.volvo.ui.dashboard import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData diff --git a/app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt similarity index 56% rename from app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt index 51b0759..9988424 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.home +package com.navinfo.volvo.ui.home import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,11 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentHomeBinding +import androidx.navigation.Navigation +import com.navinfo.volvo.R +import com.navinfo.volvo.databinding.FragmentHomeBinding +import com.navinfo.volvo.db.dao.entity.Message +import com.navinfo.volvo.ui.message.ObtainMessageViewModel class HomeFragment : Fragment() { @@ -24,13 +28,20 @@ class HomeFragment : Fragment() { ): 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.textHome + 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) { - textView.text = it + } return root } diff --git a/app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt similarity index 89% rename from app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt rename to app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt index 3e57040..a816b95 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.home +package com.navinfo.volvo.ui.home import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData 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..bb7f275 --- /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.path = picUrl + } + } + this.msgLiveData.postValue(this.msgLiveData.value) + } + + // 更新消息附件中的录音文件 + fun updateMessageAudio(audioUrl: String) { + for (attachment in this.msgLiveData.value!!.attachment) { + if (attachment.attachmentType == attachmentType.AUDIO) { + attachment.path = 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/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt similarity index 91% rename from app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt index 924ccc8..80b8a27 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.notifications +package com.navinfo.volvo.ui.notifications import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentNotificationsBinding +import com.navinfo.volvo.databinding.FragmentNotificationsBinding class NotificationsFragment : Fragment() { diff --git a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt similarity index 87% rename from app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt rename to app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt index 4f0881c..92a3e47 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.notifications +package com.navinfo.volvo.ui.notifications import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData 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/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 06ea6ca..9012e8f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize"> + android:layout_height="match_parent"> - - - + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:overScrollMode="never" + android:scrollbars="none"> + + + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:startIconDrawable="@drawable/ic_baseline_mail_24"> + android:layout_height="wrap_content" /> - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 2b4cd1d..4da7628 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -7,19 +7,30 @@ + tools:layout="@layout/fragment_home" > + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 12394cb..aada80e 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,6 +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 e307879..146ed17 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ -