更新代码

This commit is contained in:
squallzhjch 2022-12-27 16:01:57 +08:00
parent 062bd2de0d
commit e4f8cd1949
36 changed files with 625 additions and 155 deletions

2
.idea/misc.xml generated

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

@ -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
@ -74,4 +74,6 @@ 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'
implementation 'com.google.code.gson:gson:2.10'
implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
}

@ -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)
}
}

@ -4,16 +4,17 @@
<application
android:allowBackup="true"
android:configChanges="locale"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
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">
<activity
android:name=".MainActivity"
android:name="com.navinfo.volvo.MainActivity"
android:exported="true"
android:label="@string/app_name">
<intent-filter>

@ -1,4 +0,0 @@
package com.navinfo.vivo.db.dao.entity
class Attachment {
}

@ -1,44 +0,0 @@
package com.navinfo.vivo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "message")
class Message(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
/**
*标题
*/
var title: String,
/**
* 信息内容
*/
var message: String,
/**
* 操作时间
*/
var optionDate: String,
/**
* 发送时间
*/
var sendDate: String,
/**
* 信息状态
*/
var status: Int,
/**
* 发送者ID
*/
var fromId: String,
/**
* 接收者ID
*/
var toId: String,
/**
* 附件列表
*/
var attachment: MutableList<Attachment>
) {
}

@ -1,42 +0,0 @@
package com.navinfo.vivo.ui.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.navinfo.vivo.databinding.FragmentHomeBinding
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val homeViewModel =
ViewModelProvider(this).get(HomeViewModel::class.java)
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = binding.root
val textView: TextView = binding.textHome
homeViewModel.text.observe(viewLifecycleOwner) {
textView.text = it
}
return root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

@ -1,13 +0,0 @@
package com.navinfo.vivo.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class HomeViewModel : ViewModel() {
private val _text = MutableLiveData<String>().apply {
value = "This is home Fragment"
}
val text: LiveData<String> = _text
}

@ -1,4 +1,4 @@
package com.navinfo.vivo
package com.navinfo.volvo
import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
@ -7,7 +7,8 @@ import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import com.navinfo.vivo.databinding.ActivityMainBinding
import com.navinfo.volvo.R
import com.navinfo.volvo.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {

@ -1,4 +1,4 @@
package com.navinfo.vivo.db.dao;
package com.navinfo.volvo.db.dao;
import android.content.Context;
@ -10,7 +10,9 @@ import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper;
import com.navinfo.vivo.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;
import com.tencent.wcdb.database.SQLiteCipherSpec;
import com.tencent.wcdb.database.SQLiteDatabase;
@ -23,7 +25,7 @@ import com.tencent.wcdb.repair.BackupKit;
import com.tencent.wcdb.repair.RecoverKit;
import com.tencent.wcdb.room.db.WCDBDatabase;
@Database(entities = {Message.class}, version = 1, exportSchema = false)
@Database(entities = {Message.class, Attachment.class, User.class}, version = 1, exportSchema = false)
public abstract class MapLifeDataBase extends RoomDatabase {
// marking the instance as volatile to ensure atomic access to the variable
/**

@ -1,10 +1,10 @@
package com.navinfo.vivo.db.dao
package com.navinfo.volvo.db.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.navinfo.vivo.db.dao.entity.Message
import com.navinfo.volvo.db.dao.entity.Message
@Dao
interface MessageDao {

@ -0,0 +1,41 @@
package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverter
import com.google.gson.reflect.TypeToken
import com.navinfo.volvo.tools.GsonUtil
@Entity(tableName = "Attachment")
data class Attachment(
@PrimaryKey()
var id: String
)
class AttachmentConverters() {
@TypeConverter
fun stringToAttachment(value: String): Attachment {
val type = object : TypeToken<Attachment>() {
}.type
return GsonUtil.getInstance().fromJson(value, type)
}
@TypeConverter
fun attachmentToString(attachment: Attachment): String {
return GsonUtil.getInstance().toJson(attachment)
}
@TypeConverter
fun listToString(list: MutableList<Attachment>): String {
return GsonUtil.getInstance().toJson(list)
}
@TypeConverter
fun stringToList(value: String): MutableList<Attachment> {
val type = object : TypeToken<MutableList<Attachment>>() {
}.type
return GsonUtil.getInstance().fromJson(value, type)
}
}

@ -0,0 +1,46 @@
package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverters
@Entity(tableName = "message")
@TypeConverters(AttachmentConverters::class)
data class Message @JvmOverloads constructor(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
var netId: String = "",
/**
*标题
*/
var title: String = "",
/**
* 信息内容
*/
var message: String = "",
/**
* 操作时间
*/
var optionDate: String = "",
/**
* 发送时间
*/
var sendDate: String = "",
/**
* 信息状态
*/
var status: Int = 1,
/**
* 发送者ID
*/
var fromId: String = "",
/**
* 接收者ID
*/
var toId: String = "",
/**
* 附件列表
*/
var attachment: MutableList<Attachment> = mutableListOf()
)

@ -1,13 +1,13 @@
package com.navinfo.vivo.db.dao.entity
package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.net.IDN
class User(
@Entity(tableName = "User")
data class User(
@PrimaryKey()
val id:String,
var name:String,
var nickname:String,
) {
}
)

@ -0,0 +1,44 @@
package com.navinfo.volvo.tools
import android.content.Context
class DisplayUtil {
companion object {
/**
* 获取屏幕宽度
*/
fun getScreenWidth(context: Context): Int {
return context.resources.displayMetrics.widthPixels
}
/**
* 获取屏幕高度
*/
fun getScreenHeight(context: Context): Int {
return context.resources.displayMetrics.heightPixels
}
/**
* 获取屏幕分辨率
*/
fun getScreenRatio(context: Context): String {
return getScreenHeight(context).toString() + "X" + getScreenWidth(context).toString()
}
/**
* dp转px
*/
fun dip2px(context: Context, dipValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (dipValue * scale + 0.5f).toInt()
}
/**
* px转dp
*/
fun px2dip(context: Context, pxValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (pxValue / scale + 0.5f).toInt()
}
}
}

@ -0,0 +1,13 @@
package com.navinfo.volvo.tools
import com.google.gson.Gson
class GsonUtil {
companion object {
fun getInstance() = InstanceHelper.gson
}
object InstanceHelper {
val gson: Gson = Gson()
}
}

@ -0,0 +1,54 @@
package com.navinfo.volvo.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.navinfo.volvo.R
import com.navinfo.volvo.db.dao.entity.Message
class MessageAdapter : RecyclerView.Adapter<MessageAdapter.MyViewHolder>() {
var itemList: MutableList<Message> = mutableListOf()
fun addItem(message: Message) {
itemList.add(message)
notifyItemInserted(itemList.size - 1)
}
fun setItem(messageList: MutableList<Message>){
itemList = messageList
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.adapter_message, parent, false)
var viewHolder = MyViewHolder(view)
viewHolder.itemView.setOnClickListener {
}
return viewHolder
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val message = itemList[position]
holder.toName.text = message.fromId
holder.messageText.text = message.message
holder.sendTime.text = message.sendDate
}
override fun getItemCount(): Int {
return itemList.size
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var image: ImageView = itemView.findViewById(R.id.message_head_icon)
var toName: TextView = itemView.findViewById(R.id.message_to_username)
var sendTime: TextView = itemView.findViewById(R.id.message_send_time)
var status: TextView = itemView.findViewById(R.id.message_status)
var messageText: TextView = itemView.findViewById(R.id.message_text)
}
}

@ -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() {

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.dashboard
package com.navinfo.volvo.ui.dashboard
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

@ -0,0 +1,92 @@
package com.navinfo.volvo.ui.home
import android.os.Bundle
import android.view.Display
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 androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
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.yanzhenjie.recyclerview.*
import com.yanzhenjie.recyclerview.SwipeRecyclerView.LoadMoreListener
class HomeFragment : Fragment(), OnItemClickListener, OnItemMenuClickListener {
private var _binding: FragmentHomeBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val homeViewModel =
ViewModelProvider(this).get(HomeViewModel::class.java)
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = binding.root
val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview
recyclerview.adapter = null //先设置null否则会报错
//创建菜单选项
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
var mSwipeMenuCreator =
SwipeMenuCreator { _, rightMenu, position ->
//添加菜单自动添加至尾部
var deleteItem = SwipeMenuItem(context)
deleteItem.height = DisplayUtil.dip2px(context!!, 60f)
deleteItem.width = DisplayUtil.dip2px(context!!, 80f)
deleteItem.background = context!!.getDrawable(R.color.red)
deleteItem.text = context!!.getString(R.string.delete)
rightMenu.addMenuItem(deleteItem)
//分享
var shareItem = SwipeMenuItem(context)
shareItem.height = DisplayUtil.dip2px(context!!, 60f)
shareItem.width = DisplayUtil.dip2px(context!!, 80f)
shareItem.background = context!!.getDrawable(R.color.gray)
shareItem.text = context!!.getString(R.string.share)
shareItem.setTextColor(R.color.white)
rightMenu.addMenuItem(shareItem)
}
val layoutManager = LinearLayoutManager(context)
val adapter = MessageAdapter()
recyclerview.layoutManager = layoutManager
recyclerview.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation))
recyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
recyclerview.setOnItemClickListener(this)
recyclerview.useDefaultLoadMore()
recyclerview.setLoadMoreListener {
}
recyclerview.adapter = adapter
homeViewModel.getMessageList().observe(viewLifecycleOwner, Observer { contacts ->
adapter.setItem(contacts)
})
return root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onItemClick(view: View?, adapterPosition: Int) {
}
override fun onItemClick(menuBridge: SwipeMenuBridge?, adapterPosition: Int) {
}
}

@ -0,0 +1,34 @@
package com.navinfo.volvo.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.navinfo.volvo.db.dao.entity.Message
class HomeViewModel : ViewModel() {
private val messageList: LiveData<MutableList<Message>> =
MutableLiveData<MutableList<Message>>().apply {
value = mutableListOf<Message>()
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
}
fun getMessageList(): LiveData<MutableList<Message>> {
return messageList
}
}

@ -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() {

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.notifications
package com.navinfo.volvo.ui.notifications
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

@ -0,0 +1,187 @@
package com.navinfo.volvo.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.view.*
import android.widget.Scroller
import androidx.core.view.forEach
import androidx.recyclerview.widget.RecyclerView
import java.lang.Math.abs
class SlideRecyclerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RecyclerView(context, attrs, defStyleAttr) {
//系统最小移动距离
private val mTouchSlop = ViewConfiguration.get(context).scaledTouchSlop
//最小有效速度
private val mMinVelocity = 600
//增加手势控制,双击快速完成侧滑
private var isDoubleClick = false
private var mGestureDetector: GestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent?): Boolean {
e?.let { event ->
getSelectItem(event)
mItem?.let {
val deleteWith = it.getChildAt(it.childCount - 1).width
//触发移动至完全展开deleteWidth
if (it.scrollX == 0) {
mScroller.startScroll(0, 0, deleteWith, 0)
} else {
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
}
isDoubleClick = true
invalidate()
return true
}
}
//不进行拦截,只作为工具判断下双击
return false
}
})
//使用速度控制器,增加侧滑速度判定滑动成功,
//VelocityTracker 由native实现需要及时释放内存
private var mVelocityTracker: VelocityTracker? = null
//流畅滑动
private var mScroller = Scroller(context)
//当前选中item
private var mItem: ViewGroup? = null
//上次按下的横坐标
private var mLastX = 0f
//当前RecyclerView被上层ViewGroup分发到事件所有事件都会通过dispatchTouchEvent给到
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
mGestureDetector.onTouchEvent(ev)
return super.dispatchTouchEvent(ev)
}
//viewGroup对子控件的事件拦截一旦拦截后续事件序列不会再调用onInterceptTouchEvent
override fun onInterceptTouchEvent(e: MotionEvent?): Boolean {
e?.let {
when (e.action) {
MotionEvent.ACTION_DOWN -> {
getSelectItem(e)
mLastX = e.x
}
MotionEvent.ACTION_MOVE -> {
//移动控件
return moveItem(e)
}
// MotionEvent.ACTION_UP -> {
// stopMove(e)
// }
}
}
return super.onInterceptTouchEvent(e)
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(e: MotionEvent?): Boolean {
e?.let {
when (e.action) {
MotionEvent.ACTION_MOVE -> {
moveItem(e)
mLastX = e.x
}
MotionEvent.ACTION_UP -> {
stopMove()
}
}
}
return super.onTouchEvent(e)
}
//活动结束
//判断一下结束的位置,补充或恢复位置
private fun stopMove() {
mItem?.let {
//如果移动过半,判定左划成功
val deleteWidth = it.getChildAt(it.childCount - 1).width
//如果整个移动过程速度大于600也判定滑动成功
//注意如果没有拦截ACTION_MOVE,mVelocityTracker是没有初始化的
var velocity = 0f
mVelocityTracker?.let { tracker ->
tracker.computeCurrentVelocity(1000)
velocity = tracker.xVelocity
}
//判断结束情况,移动过半或者向左速度很快都展开
if ((abs(it.scrollX) >= deleteWidth / 2f) || (velocity < -mMinVelocity)) {
//触发移动至完全展开
mScroller.startScroll(it.scrollX, 0, deleteWidth - it.scrollX, 0)
invalidate()
} else {
//如果移动未过半应恢复状态
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
invalidate()
}
}
//清除状态
mLastX = 0f
//mVeloctityTracker由native实现需要及时释放
mVelocityTracker?.apply {
clear()
recycle()
}
mVelocityTracker = null
}
//移动Item
//绝对值小于删除按钮长度随便移动,大于则不移动
@SuppressLint("Recycle")
private fun moveItem(e: MotionEvent): Boolean {
mItem?.let {
val dx = mLastX - e.x
//最小的移动距离应该舍弃onInterceptTouchEvent不拦截onTouchEvent内才更新mLastX
// if (abs(dx) > mTouchSlop) {
//检查mItem移动后应该在【-deleteLength0】内
val deleteWith = it.getChildAt(it.childCount - 1).width
if ((it.scrollX + dx) <= deleteWith && (it.scrollX + dx) >= 0) {
//触发移动
it.scrollBy(dx.toInt(), 0)
//触发速度计算
//这里Rectycle不存在问题一旦返回true就会拦截事件就会到达ACTION_UP去回收
mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain()
mVelocityTracker!!.addMovement(e)
return true
// }
}
}
return false
}
//获取点击位置
//通过点击的y坐标除以Item高度得出
private fun getSelectItem(e: MotionEvent) {
val frame = Rect()
mItem = null
forEach {
if (it.visibility != GONE) {
it.getHitRect(frame)
if (frame.contains(e.x.toInt(), e.y.toInt())) {
mItem = it as ViewGroup
}
}
}
}
//流畅地滑动
override fun computeScroll() {
if (mScroller.computeScrollOffset()) {
mItem?.scrollBy(mScroller.currX, mScroller.currY)
postInvalidate()
}
}
}

@ -4,7 +4,7 @@
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
@ -22,7 +22,7 @@
android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/message_head_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/message_to_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="问候对象"
android:ellipsize="end"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintLeft_toRightOf="@id/message_head_icon"
app:layout_constraintTop_toTopOf="@id/message_head_icon" />
<TextView
android:id="@+id/message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="信息内容"
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
app:layout_constraintLeft_toRightOf="@id/message_head_icon" />
<TextView
android:id="@+id/message_send_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:text="日期"
app:layout_constraintTop_toTopOf="@id/message_head_icon"
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:id="@+id/message_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="状态"
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.dashboard.DashboardFragment">
tools:context="com.navinfo.volvo.ui.dashboard.DashboardFragment">
<TextView
android:id="@+id/text_dashboard"

@ -1,22 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/home_message_recyclerview"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.home.HomeFragment">
tools:context=".ui.home.HomeFragment"
>
<TextView
android:id="@+id/text_home"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.yanzhenjie.recyclerview.SwipeRecyclerView>

@ -7,19 +7,19 @@
<fragment
android:id="@+id/navigation_home"
android:name="com.navinfo.vivo.ui.home.HomeFragment"
android:name="com.navinfo.volvo.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.navinfo.vivo.ui.dashboard.DashboardFragment"
android:name="com.navinfo.volvo.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.navinfo.vivo.ui.notifications.NotificationsFragment"
android:name="com.navinfo.volvo.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
</navigation>

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>

@ -0,0 +1,8 @@
<resources>
<string name="app_name">NavinfoVolvo</string>
<string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string>
<string name="delete">删除</string>
<string name="share">分享</string>
</resources>

@ -7,4 +7,6 @@
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="red">#FFFF0000</color>
<color name="gray">#5E5E5E</color>
</resources>

@ -1,6 +1,8 @@
<resources>
<string name="app_name">NavinfoVivo</string>
<string name="app_name">NavinfoVolvo</string>
<string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string>
<string name="delete">Del</string>
<string name="share">Share</string>
</resources>

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>

@ -1,4 +1,4 @@
package com.navinfo.vivo
package com.navinfo.volvo
import org.junit.Test

@ -24,5 +24,5 @@ dependencyResolutionManagement {
mavenCentral()
}
}
rootProject.name = "NavinfoVivo"
rootProject.name = "NavinfoVolvo"
include ':app'