diff --git a/app/build.gradle b/app/build.gradle index 1399f55..434d437 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-android' + id 'kotlin-parcelize' id 'kotlin-kapt' id 'dagger.hilt.android.plugin' // id 'com.google.dagger.hilt.android' @@ -61,14 +62,17 @@ dependencies { 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' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1" implementation "androidx.lifecycle:lifecycle-common-java8:2.4.1" + //导航 implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' @@ -76,7 +80,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' - //room + //room 数据库相关 implementation 'com.tencent.wcdb:room:1.1-19' // 代替 room-runtime,同时也不需要再引用 wcdb-android api 'androidx.sqlite:sqlite:2.2.0' implementation 'androidx.room:room-runtime:2.4.3' @@ -86,6 +90,10 @@ dependencies { kapt 'android.arch.persistence.room:compiler:1.1.1'// compiler 需要用 room 的 kapt 'androidx.room:room-compiler:2.4.3' kapt 'androidx.room:room-ktx:2.4.3' + //分页加载 + implementation "androidx.room:room-paging:2.4.3" + implementation "androidx.paging:paging-runtime-ktx:3.1.1" + androidTestImplementation "android.arch.persistence.room:testing:1.1.1" // implementation "android.arch.lifecycle:extensions:1.1.1" // annotationProcessor "android.arch.lifecycle:compiler:1.1.1" @@ -96,6 +104,8 @@ dependencies { implementation 'me.rosuh:AndroidFilePicker:0.8.2' // 时间选择器 https://github.com/Gredicer/datetimepicker implementation 'com.github.Gredicer:datetimepicker:V1.0.0' + + //带侧滑的自定义列表 implementation 'com.yanzhenjie.recyclerview:x:1.3.2' // implementation 'androidx.appcompat:appcompat:1.5.1' diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..380cd07 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..d3e5748 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.navinfo.volvo", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2f39eef..d539e1e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ android:configChanges="locale" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/volvo_logo_small" android:requestLegacyExternalStorage="true" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" @@ -34,6 +34,7 @@ android:name=".ui.message.MessageActivity" android:exported="false" android:label="@string/title_activity_second" + android:screenOrientation="portrait" android:theme="@style/Theme.NavinfoVolvo.NoActionBar"> + @Update(onConflict = OnConflictStrategy.REPLACE) + fun update(message: GreetingMessage) + + + @Query("SELECT count(id) FROM GreetingMessage WHERE read = 0") + fun countUnreadByFlow(): Flow + + /** + * 分页查询 + */ + @Query("SELECT * FROM GreetingMessage order by sendDate DESC") + fun findAllByDataSource(): PagingSource + + /** + * 检查某条数据是否存在 + */ + @Query("SELECT id From GreetingMessage WHERE id = :id LIMIT 1") + fun getMessageId(id: Long): Long + + @Transaction + suspend fun insertOrUpdate(list: List) { + for (message in list) { + val id = getMessageId(message.id) + if (id == 0L) { + insert(message) + }else{ + update(message) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/database/entity/GreetingMessage.kt b/app/src/main/java/com/navinfo/volvo/database/entity/GreetingMessage.kt index 325af6b..be3297f 100644 --- a/app/src/main/java/com/navinfo/volvo/database/entity/GreetingMessage.kt +++ b/app/src/main/java/com/navinfo/volvo/database/entity/GreetingMessage.kt @@ -1,15 +1,15 @@ package com.navinfo.volvo.database.entity +import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.TypeConverters -import org.jetbrains.annotations.NotNull @Entity(tableName = "GreetingMessage") @TypeConverters(AttachmentConverters::class) data class GreetingMessage @JvmOverloads constructor( @PrimaryKey(autoGenerate = true) - var uuid:Long = 0, + var uuid: Long = 0, var id: Long = 0, var searchValue: String? = "", var createBy: String? = "", @@ -35,10 +35,10 @@ data class GreetingMessage @JvmOverloads constructor( var sendVins: String? = "", var sendType: String? = "", var del: String? = "", - var version: String? = "", + var version: String? = "1", // /** // * 附件列表 // */ -// var attachment: MutableList = mutableListOf() -) { -} +// var attachment: MutableList = mutableListOf(), + var read: Boolean = false, +) diff --git a/app/src/main/java/com/navinfo/volvo/di/module/DatabaseModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/DatabaseModule.kt index 2a302b3..424cd1f 100644 --- a/app/src/main/java/com/navinfo/volvo/di/module/DatabaseModule.kt +++ b/app/src/main/java/com/navinfo/volvo/di/module/DatabaseModule.kt @@ -5,6 +5,7 @@ import androidx.room.Room import com.navinfo.volvo.database.AppDatabase import com.navinfo.volvo.database.dao.GreetingMessageDao import com.navinfo.volvo.database.dao.UserDao +import com.navinfo.volvo.utils.SystemConstant import com.tencent.wcdb.database.SQLiteCipherSpec import com.tencent.wcdb.room.db.WCDBOpenHelperFactory import dagger.Module @@ -31,7 +32,7 @@ class DatabaseModule { .writeAheadLoggingEnabled(true) // enable WAL mode, remove if not needed .asyncCheckpointEnabled(true); // enable asynchronous checkpoint, remove if not needed - return Room.databaseBuilder(context, AppDatabase::class.java, "NavinfoVolvoDb") + return Room.databaseBuilder(context, AppDatabase::class.java, "${SystemConstant.ROOT_PATH}/NavinfoVolvoDb.db") // [WCDB] Specify open helper to use WCDB database implementation instead // of the Android framework. diff --git a/app/src/main/java/com/navinfo/volvo/di/module/DatabaseRepositoryModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/DatabaseRepositoryModule.kt new file mode 100644 index 0000000..e14a35a --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/di/module/DatabaseRepositoryModule.kt @@ -0,0 +1,15 @@ +package com.navinfo.volvo.di.module + +import com.navinfo.volvo.repository.database.DatabaseRepository +import com.navinfo.volvo.repository.database.DatabaseRepositoryImp +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@InstallIn(SingletonComponent::class) +@Module +abstract class DatabaseRepositoryModule { + @Binds + abstract fun bingDatabaseRepository(databaseRepositoryImp: DatabaseRepositoryImp): DatabaseRepository +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/di/module/NetworkDataModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/NetworkDataModule.kt deleted file mode 100644 index 367df08..0000000 --- a/app/src/main/java/com/navinfo/volvo/di/module/NetworkDataModule.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.navinfo.volvo.di.module - -import com.navinfo.volvo.repository.NetworkDataSource -import com.navinfo.volvo.repository.NetworkDataSourceImp -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent - -@InstallIn(SingletonComponent::class) -@Module -abstract class NetworkDataModule { - @Binds - abstract fun bindNetworkData(networkDataSourceImp: NetworkDataSourceImp): NetworkDataSource -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/di/module/NetworkRepositoryModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/NetworkRepositoryModule.kt new file mode 100644 index 0000000..df1d17f --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/di/module/NetworkRepositoryModule.kt @@ -0,0 +1,15 @@ +package com.navinfo.volvo.di.module + +import com.navinfo.volvo.repository.network.NetworkRepository +import com.navinfo.volvo.repository.network.NetworkRepositoryImp +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@InstallIn(SingletonComponent::class) +@Module +abstract class NetworkRepositoryModule { + @Binds + abstract fun bindNetworkRepository(networkRepositoryImp: NetworkRepositoryImp): NetworkRepository +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/di/module/NetworkUtilModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/NetworkUtilModule.kt index f7acb9a..6e0212e 100644 --- a/app/src/main/java/com/navinfo/volvo/di/module/NetworkUtilModule.kt +++ b/app/src/main/java/com/navinfo/volvo/di/module/NetworkUtilModule.kt @@ -4,7 +4,7 @@ import android.app.Application import android.content.Context import com.google.gson.Gson import com.navinfo.volvo.Constant -import com.navinfo.volvo.repository.service.NetworkService +import com.navinfo.volvo.repository.network.NetworkService import com.navinfo.volvo.tools.GsonUtil import dagger.Lazy import dagger.Module @@ -15,7 +15,6 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -101,4 +100,5 @@ class NetworkUtilModule { fun provideNetworkService(retrofit: Retrofit): NetworkService { return retrofit.create(NetworkService::class.java) } + } diff --git a/app/src/main/java/com/navinfo/volvo/di/module/ViewModelModule.kt b/app/src/main/java/com/navinfo/volvo/di/module/ViewModelModule.kt index 49a7be3..ec45c18 100644 --- a/app/src/main/java/com/navinfo/volvo/di/module/ViewModelModule.kt +++ b/app/src/main/java/com/navinfo/volvo/di/module/ViewModelModule.kt @@ -3,8 +3,10 @@ package com.navinfo.volvo.di.module import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.navinfo.volvo.di.key.ViewModelKey -import com.navinfo.volvo.ui.fragments.home.MessageViewModel +import com.navinfo.volvo.ui.MainActivityViewModel +import com.navinfo.volvo.ui.fragments.home.HomeViewModel import com.navinfo.volvo.ui.fragments.login.LoginViewModel +import com.navinfo.volvo.ui.fragments.message.ObtainMessageViewModel import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -18,6 +20,11 @@ abstract class ViewModelModule { @Binds abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory + @IntoMap + @Binds + @ViewModelKey(MainActivityViewModel::class) + abstract fun bindMainViewModel(viewModel: MainActivityViewModel): ViewModel + @IntoMap @Binds @ViewModelKey(LoginViewModel::class) @@ -25,6 +32,13 @@ abstract class ViewModelModule { @IntoMap @Binds - @ViewModelKey(MessageViewModel::class) - abstract fun bindMessageFragmentViewModel(viewModel: MessageViewModel): ViewModel + @ViewModelKey(HomeViewModel::class) + abstract fun bindMessageFragmentViewModel(viewModel: HomeViewModel): ViewModel + + @IntoMap + @Binds + @ViewModelKey(ObtainMessageViewModel::class) + abstract fun bindObtainMessageFragmentViewModel(viewModel: ObtainMessageViewModel): ViewModel + + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/model/LoginUser.kt b/app/src/main/java/com/navinfo/volvo/model/LoginUser.kt new file mode 100644 index 0000000..1c55d05 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/model/LoginUser.kt @@ -0,0 +1,9 @@ +package com.navinfo.volvo.model + +/** + * 登录用户信息 + */ +data class LoginUser( + var name: String, + var password: String +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/model/VolvoModel.kt b/app/src/main/java/com/navinfo/volvo/model/VolvoModel.kt new file mode 100644 index 0000000..7228905 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/model/VolvoModel.kt @@ -0,0 +1,3 @@ +package com.navinfo.volvo.model + +data class VolvoModel(val version: String, val model: String, val num:String) diff --git a/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepository.kt b/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepository.kt new file mode 100644 index 0000000..eb9fe90 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepository.kt @@ -0,0 +1,12 @@ +package com.navinfo.volvo.repository.database + +import androidx.paging.PagingData +import com.navinfo.volvo.database.entity.GreetingMessage +import kotlinx.coroutines.flow.Flow + +/** + * 数据库操作接口 + */ +interface DatabaseRepository { + fun getMessageByPaging(): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepositoryImp.kt b/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepositoryImp.kt new file mode 100644 index 0000000..fcbba0d --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/repository/database/DatabaseRepositoryImp.kt @@ -0,0 +1,26 @@ +package com.navinfo.volvo.repository.database + +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.PagingData +import com.navinfo.volvo.database.AppDatabase +import com.navinfo.volvo.database.dao.GreetingMessageDao +import com.navinfo.volvo.database.entity.GreetingMessage +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class DatabaseRepositoryImp @Inject constructor( + private val messageDao: GreetingMessageDao, + private val database: AppDatabase +) : DatabaseRepository { + companion object { + const val PAGE_SIZE = 20 + } + + override fun getMessageByPaging(): Flow> { + return Pager(PagingConfig(PAGE_SIZE)) { + messageDao.findAllByDataSource() + }.flow + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/repository/NetworkDataSource.kt b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepository.kt similarity index 76% rename from app/src/main/java/com/navinfo/volvo/repository/NetworkDataSource.kt rename to app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepository.kt index dddf32f..b03fde5 100644 --- a/app/src/main/java/com/navinfo/volvo/repository/NetworkDataSource.kt +++ b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepository.kt @@ -1,10 +1,13 @@ -package com.navinfo.volvo.repository +package com.navinfo.volvo.repository.network import com.navinfo.volvo.http.DefaultResponse import com.navinfo.volvo.model.messagelist.NetworkMessageListPost import com.navinfo.volvo.model.messagelist.NetworkMessageListResponse import com.navinfo.volvo.util.NetResult -interface NetworkDataSource { +/** + * 网络访问接口 + */ +interface NetworkRepository { suspend fun getCardList(message: NetworkMessageListPost): NetResult> } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/repository/NetworkDataSourceImp.kt b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepositoryImp.kt similarity index 75% rename from app/src/main/java/com/navinfo/volvo/repository/NetworkDataSourceImp.kt rename to app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepositoryImp.kt index 2d662bb..5fd1e2f 100644 --- a/app/src/main/java/com/navinfo/volvo/repository/NetworkDataSourceImp.kt +++ b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkRepositoryImp.kt @@ -1,13 +1,10 @@ -package com.navinfo.volvo.repository +package com.navinfo.volvo.repository.network -import com.navinfo.volvo.database.AppDatabase import com.navinfo.volvo.database.dao.GreetingMessageDao import com.navinfo.volvo.di.scope.IoDispatcher -import com.navinfo.volvo.database.entity.GreetingMessage import com.navinfo.volvo.http.DefaultResponse import com.navinfo.volvo.model.messagelist.NetworkMessageListPost import com.navinfo.volvo.model.messagelist.NetworkMessageListResponse -import com.navinfo.volvo.repository.service.NetworkService import com.navinfo.volvo.tools.GsonUtil import com.navinfo.volvo.util.NetResult import kotlinx.coroutines.CoroutineDispatcher @@ -17,11 +14,11 @@ import okhttp3.RequestBody.Companion.toRequestBody import javax.inject.Inject -class NetworkDataSourceImp @Inject constructor( +class NetworkRepositoryImp @Inject constructor( private val netWorkService: NetworkService, private val messageDao: GreetingMessageDao, @IoDispatcher private val ioDispatcher: CoroutineDispatcher -) : NetworkDataSource { +) : NetworkRepository { override suspend fun getCardList(message: NetworkMessageListPost): NetResult> = withContext(ioDispatcher) { @@ -31,9 +28,9 @@ class NetworkDataSourceImp @Inject constructor( val result = netWorkService.queryCardListByApp(stringBody) if (result.isSuccessful) { val body = result.body() - val list: MutableList = - listOf(body!!.data!!.rows) as MutableList - messageDao.insert(*list.map { it }.toTypedArray()) + if(body!!.data != null && body.data!!.rows != null){ + messageDao.insertOrUpdate(body.data!!.rows) + } NetResult.Success(body) } else { NetResult.Success(null) diff --git a/app/src/main/java/com/navinfo/volvo/repository/service/NetworkService.kt b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkService.kt similarity index 90% rename from app/src/main/java/com/navinfo/volvo/repository/service/NetworkService.kt rename to app/src/main/java/com/navinfo/volvo/repository/network/NetworkService.kt index 208ce28..b211c41 100644 --- a/app/src/main/java/com/navinfo/volvo/repository/service/NetworkService.kt +++ b/app/src/main/java/com/navinfo/volvo/repository/network/NetworkService.kt @@ -1,4 +1,4 @@ -package com.navinfo.volvo.repository.service +package com.navinfo.volvo.repository.network import com.navinfo.volvo.http.DefaultResponse import com.navinfo.volvo.model.messagelist.NetworkMessageListResponse diff --git a/app/src/main/java/com/navinfo/volvo/ui/BaseActivity.kt b/app/src/main/java/com/navinfo/volvo/ui/BaseActivity.kt new file mode 100644 index 0000000..77c1577 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/BaseActivity.kt @@ -0,0 +1,11 @@ +package com.navinfo.volvo.ui + +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import javax.inject.Inject + +abstract class BaseActivity : AppCompatActivity() { + @Inject + lateinit var viewModelFactoryProvider: ViewModelProvider.Factory +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt b/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt index 86b1b8a..e4fce06 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt @@ -1,10 +1,12 @@ package com.navinfo.volvo.ui import android.content.DialogInterface +import android.content.Intent import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity +import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController @@ -28,20 +30,23 @@ import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions import com.navinfo.volvo.R import com.navinfo.volvo.databinding.ActivityMainBinding +import com.navinfo.volvo.ui.message.MessageActivity import com.navinfo.volvo.utils.SystemConstant import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch @AndroidEntryPoint -class MainActivity : AppCompatActivity() { +class MainActivity : BaseActivity() { private lateinit var binding: ActivityMainBinding + private val viewModel by viewModels { viewModelFactoryProvider } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - setupNavigation() + XXPermissions.with(this) // 申请单个权限 @@ -61,6 +66,7 @@ class MainActivity : AppCompatActivity() { } // 在SD卡创建项目目录 createRootFolder() + setupNavigation() } override fun onDenied(permissions: MutableList, never: Boolean) { @@ -84,16 +90,29 @@ class MainActivity : AppCompatActivity() { val navController = findNavController(R.id.nav_host_fragment_activity_main) val appBarConfiguration = AppBarConfiguration( setOf( - R.id.navigation_message, R.id.navigation_dashboard, R.id.navigation_notifications, + R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, ) ) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) + + lifecycleScope.launch { + viewModel.getUnreadCount().collect { + runOnUiThread { + if (it == 0L) { + navView.removeBadge(R.id.navigation_home) + } else { + var badge = navView.getOrCreateBadge(R.id.navigation_home); + badge.number = it.toInt() + } + } + } + } + navController.addOnDestinationChangedListener { controller, destination, arguments -> - if (destination.id == R.id.navigation_message + if (destination.id == R.id.navigation_home || destination.id == R.id.navigation_dashboard || destination.id == R.id.navigation_notifications - || destination.id == R.id.navigation_obtain_message ) { runOnUiThread { navView.visibility = View.VISIBLE @@ -106,6 +125,11 @@ class MainActivity : AppCompatActivity() { } } } + binding.newMessageFab.setOnClickListener { +// val intent: Intent = Intent(this@MainActivity, MessageActivity::class.java) +// startActivity(intent) + navController.navigate(R.id.navigation_obtain_message) + } } override fun onSupportNavigateUp() = diff --git a/app/src/main/java/com/navinfo/volvo/ui/MainActivityViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/MainActivityViewModel.kt new file mode 100644 index 0000000..b0ffafe --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/MainActivityViewModel.kt @@ -0,0 +1,17 @@ +package com.navinfo.volvo.ui + +import androidx.lifecycle.ViewModel +import androidx.paging.PagingData +import com.navinfo.volvo.database.dao.GreetingMessageDao +import com.navinfo.volvo.database.entity.GreetingMessage +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class MainActivityViewModel @Inject constructor( + private val messageDao: GreetingMessageDao, +) : ViewModel() { + + + fun getUnreadCount(): Flow = messageDao.countUnreadByFlow() + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt b/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt deleted file mode 100644 index cb7525c..0000000 --- a/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt +++ /dev/null @@ -1,54 +0,0 @@ -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.database.entity.GreetingMessage - -class MessageAdapter : RecyclerView.Adapter() { - - var itemList: MutableList = mutableListOf() - - fun addItem(message: GreetingMessage) { - itemList.add(message) - notifyItemInserted(itemList.size - 1) - } - - fun setItem(messageList: MutableList){ - 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.toWho - holder.messageText.text = message.name - 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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/BaseFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt similarity index 85% rename from app/src/main/java/com/navinfo/volvo/ui/BaseFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt index bf288d6..b112973 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.volvo.ui +package com.navinfo.volvo.ui.fragments import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeAdapter.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeAdapter.kt new file mode 100644 index 0000000..398faf6 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeAdapter.kt @@ -0,0 +1,81 @@ +package com.navinfo.volvo.ui.fragments.home + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.paging.PagingDataAdapter +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.navinfo.volvo.R +import com.navinfo.volvo.database.entity.GreetingMessage +import com.navinfo.volvo.databinding.AdapterHomeBinding + +class HomeAdapter(fragment: Fragment) : + PagingDataAdapter(DiffCallback()) { + + val fragment = fragment +// var itemList = ArrayList() +// +// fun addItem(message: GreetingMessage) { +// itemList.add(message) +// notifyItemInserted(itemList.size - 1) +// } +// +// fun setItems(messageList: List) { +// itemList.clear() +// itemList.addAll(messageList) +// notifyDataSetChanged() +// } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { + val mDataBinding: AdapterHomeBinding = + DataBindingUtil.inflate( + LayoutInflater.from(fragment.context), + R.layout.adapter_home, + parent, + false + ) + return MyViewHolder(mDataBinding) + } + + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + holder.onBind(position) + } + +// override fun getItemCount(): Int { +// return itemList.size +// } + + inner class MyViewHolder(private val mDataBinding: AdapterHomeBinding) : + RecyclerView.ViewHolder(mDataBinding.root) { + fun onBind(position: Int) { + var row = getItem(position) + mDataBinding.greetingMessage = row + Glide.with(fragment) + .asBitmap().fitCenter() + .load(row!!.imageUrl) + .placeholder(R.mipmap.volvo_logo_small) + .error(R.mipmap.volvo_logo_small) + .into(mDataBinding.messageHeadIcon) + } + + } + + class DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: GreetingMessage, newItem: GreetingMessage): Boolean { + return oldItem.uuid == newItem.uuid + } + + override fun areContentsTheSame( + oldItem: GreetingMessage, + newItem: GreetingMessage + ): Boolean { + return oldItem == newItem + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt similarity index 72% rename from app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt index 33b9dc2..d78a6e7 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt @@ -4,50 +4,47 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.databinding.DataBindingUtil import androidx.fragment.app.viewModels -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope 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.BaseFragment -import com.navinfo.volvo.ui.adapter.MessageAdapter -import com.navinfo.volvo.ui.fragments.message.ObtainMessageViewModel +import com.navinfo.volvo.ui.fragments.BaseFragment import com.yanzhenjie.recyclerview.* import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch @AndroidEntryPoint -class MessageFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListener { +class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListener { private var _binding: FragmentHomeBinding? = null - // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! - private val viewModel by viewModels { viewModelFactoryProvider } + private val viewModel by viewModels { viewModelFactoryProvider } + + private lateinit var messageAdapter: HomeAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { -// val homeViewModel = -// ViewModelProvider(this)[MessageViewModel::class.java] -// val obtainMessageViewModel = -// ViewModelProvider(requireActivity()).get(ObtainMessageViewModel::class.java) - _binding = FragmentHomeBinding.inflate(inflater, container, false) val root: View = binding.root initView() return root } - private fun initView() { - val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview +// mDataBinding.homeViewModel = viewModel + messageAdapter = HomeAdapter(this) + val recyclerview: SwipeRecyclerView = binding.homeRecyclerview recyclerview.adapter = null //先设置null,否则会报错 //创建菜单选项 //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单 @@ -71,28 +68,32 @@ class MessageFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickList 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.useDefaultLoadMore() +// recyclerview.setLoadMoreListener { +// +// } + lifecycleScope.launch { + viewModel.messageList.collectLatest { + messageAdapter.submitData(it) + } } - recyclerview.adapter = adapter -// homeViewModel.getMessageList().observe(viewLifecycleOwner, Observer { contacts -> -// adapter.setItem(contacts) -// }) +// messageAdapter.withLoadStateFooter( +// footer = RecLoadStateAdapter { messageAdapter.retry() } +// ) + +// messageAdapter.withLoadStateHeader() + recyclerview.adapter = messageAdapter + } override fun onStart() { super.onStart() - getMessageList() - } - - private fun getMessageList() { - viewModel.getMessageList() + viewModel.getNetMessageList() } diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt new file mode 100644 index 0000000..ac68d39 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt @@ -0,0 +1,57 @@ +package com.navinfo.volvo.ui.fragments.home + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.paging.PagingData +import com.navinfo.volvo.database.dao.GreetingMessageDao +import com.navinfo.volvo.database.entity.GreetingMessage +import com.navinfo.volvo.model.messagelist.NetworkMessageListPost +import com.navinfo.volvo.repository.database.DatabaseRepository +import com.navinfo.volvo.repository.network.NetworkRepository +import com.navinfo.volvo.util.NetResult +import com.navinfo.volvo.util.asLiveData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch +import javax.inject.Inject + +class HomeViewModel @Inject constructor( + private val netRepository: NetworkRepository, + private val dataRepository: DatabaseRepository +) : ViewModel() { + + private val _isLoading = MutableLiveData() + val isLoading = _isLoading.asLiveData() + +// private val _messageList = MutableLiveData>() +// val messageList = _messageList.asLiveData() + + + val messageList: Flow> + get() = dataRepository.getMessageByPaging() + + + fun getNetMessageList() { + _isLoading.postValue(true) + viewModelScope.launch { + val messagePost = NetworkMessageListPost(who = "", toWho = "") + when (val result = netRepository.getCardList(messagePost)) { + is NetResult.Success -> { + _isLoading.value = false +// if (result.data != null) { +// val list = (result.data.data as NetworkMessageListResponse).rows +// _messageList.value = list +// } + } + + is NetResult.Error -> { + _isLoading.value = false + } + is NetResult.Loading -> { + _isLoading.postValue(true) + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageViewModel.kt deleted file mode 100644 index c65fd8f..0000000 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/MessageViewModel.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.navinfo.volvo.ui.fragments.home - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.navinfo.volvo.database.entity.GreetingMessage -import com.navinfo.volvo.model.messagelist.NetworkMessageListPost -import com.navinfo.volvo.model.messagelist.NetworkMessageListResponse -import com.navinfo.volvo.repository.NetworkDataSource -import com.navinfo.volvo.util.NetResult -import com.navinfo.volvo.util.asLiveData -import kotlinx.coroutines.launch -import javax.inject.Inject - -class MessageViewModel @Inject constructor( - private val repository: NetworkDataSource -) : ViewModel() { - - private val _isLoading = MutableLiveData() - val isLoading = _isLoading.asLiveData() - - private val _messageList = MutableLiveData>() - val messageList = _messageList.asLiveData() - - fun getMessageList() { - _isLoading.postValue(true) - viewModelScope.launch { - val messagePost = NetworkMessageListPost(who = "北京测试", toWho = "volvo测试") - when (val result = repository.getCardList(messagePost)) { - is NetResult.Success -> { - _isLoading.value = false - if (result.data != null) { - val list = (result.data.data as NetworkMessageListResponse).rows - _messageList.value = list - } - } - - is NetResult.Error -> { - _isLoading.value = false - } - is NetResult.Loading -> { - _isLoading.postValue(true) - } - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/RecLoadStateAdapter.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/RecLoadStateAdapter.kt new file mode 100644 index 0000000..034840f --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/RecLoadStateAdapter.kt @@ -0,0 +1,51 @@ +//package com.navinfo.volvo.ui.fragments.home +// +//import android.view.LayoutInflater +//import android.view.View +//import android.view.ViewGroup +//import androidx.core.view.isVisible +//import androidx.paging.LoadState +//import androidx.paging.LoadStateAdapter +//import androidx.recyclerview.widget.RecyclerView +//import com.example.picsapp.R +//import com.example.picsapp.databinding.LoadStateViewBinding +// +//class RecLoadStateAdapter( +// private val retry: () -> Unit +//) : LoadStateAdapter() { +// +// override fun onCreateViewHolder(parent: ViewGroup, loadState: LoadState): LoadStateViewHolder { +// +// val binding = LoadStateViewBinding +// .inflate(LayoutInflater.from(parent.context), parent, false) +// +// return LoadStateViewHolder(binding) +// } +// +// override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) { +// holder.onBind(loadState) +// +// } +// +// +// +// inner class LoadStateViewHolder(private val binding: LoadStateViewBinding) : RecyclerView.ViewHolder(binding.root){ +// fun onBind(loadState: LoadState) { +// val progress = binding.loadStateProgress +// val btnRetry = binding.loadStateRetry +// val txtErrorMessage = binding.loadStateErrorMessage +// +// btnRetry.isVisible = loadState !is LoadState.Loading +// txtErrorMessage.isVisible = loadState !is LoadState.Loading +// progress.isVisible = loadState is LoadState.Loading +// +// if (loadState is LoadState.Error){ +// txtErrorMessage.text = loadState.error.localizedMessage +// } +// +// btnRetry.setOnClickListener { +// retry.invoke() +// } +// } +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt index 35250a0..e921ce5 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt @@ -4,14 +4,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment +import androidx.databinding.DataBindingUtil import androidx.fragment.app.viewModels -import androidx.navigation.Navigation -import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import com.navinfo.volvo.R import com.navinfo.volvo.databinding.FragmentLoginBinding -import com.navinfo.volvo.ui.BaseFragment +import com.navinfo.volvo.ui.fragments.BaseFragment import dagger.hilt.android.AndroidEntryPoint @@ -19,11 +17,8 @@ import dagger.hilt.android.AndroidEntryPoint class LoginFragment : BaseFragment() { // private var loginViewModel:LoginViewModel by viewModel(get()) - private var viewBinding: FragmentLoginBinding? = null + private lateinit var viewBinding: FragmentLoginBinding - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = viewBinding!! private val viewModel by viewModels { viewModelFactoryProvider } @@ -32,20 +27,21 @@ class LoginFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { + viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) + viewBinding.lifecycleOwner = this + initView() + return viewBinding.root + } + + private fun initView() { + viewBinding.loginFragmentRegisterButton.setOnClickListener { - viewBinding = FragmentLoginBinding.inflate(inflater, container, false) - val root: View = binding.root - binding.loginFragmentRegisterButton.setOnClickListener { } - binding.loginFragmentLoginButton.setOnClickListener { + viewBinding.loginFragmentLoginButton.setOnClickListener { +// viewModel.login(viewBinding.loginFragmentUserLayout) findNavController().navigate(R.id.action_login_to_home) } - return root } - override fun onDestroyView() { - viewBinding = null - super.onDestroyView() - } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt index ef6d19a..8f47282 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt @@ -6,14 +6,12 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.navinfo.volvo.database.AppDatabase import com.navinfo.volvo.database.entity.User +import com.navinfo.volvo.util.SharedPreferenceHelper import javax.inject.Inject -class LoginViewModel @Inject constructor(private val dataBase: AppDatabase) : ViewModel() { +class LoginViewModel @Inject constructor(private val sharedPreferenceHelper: SharedPreferenceHelper) : ViewModel() { - private val _user = MutableLiveData().apply { - - } - val user: LiveData = _user +// val user: LiveData = _user fun liveDataOnclick(view: View) { diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt index 0f015bb..75ff708 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt @@ -2,7 +2,6 @@ package com.navinfo.volvo.ui.fragments.message import android.content.DialogInterface import android.graphics.Paint -import android.net.Uri import android.os.Bundle import android.text.TextUtils import android.view.LayoutInflater @@ -17,18 +16,13 @@ import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy import com.easytools.tools.DateUtils -import com.easytools.tools.DeviceUtils import com.easytools.tools.DisplayUtils import com.easytools.tools.FileIOUtils -import com.easytools.tools.FileUtils import com.easytools.tools.ResourceUtils import com.easytools.tools.ToastUtils import com.elvishew.xlog.XLog @@ -51,6 +45,7 @@ import com.navinfo.volvo.database.entity.AttachmentType import com.navinfo.volvo.database.entity.GreetingMessage import com.navinfo.volvo.databinding.FragmentObtainMessageBinding import com.navinfo.volvo.http.DownloadCallback +import com.navinfo.volvo.model.VolvoModel import com.navinfo.volvo.ui.markRequiredInRed import com.navinfo.volvo.util.PhotoLoader import com.navinfo.volvo.utils.EasyMediaFile @@ -62,8 +57,8 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.io.FileInputStream -import java.io.FileOutputStream import java.util.* +import kotlin.streams.toList //@RuntimePermissions @@ -81,6 +76,7 @@ class ObtainMessageFragment: Fragment() { private val dateSendFormat = "yyyy-MM-dd HH:mm:ss" private val dateShowFormat = "yyyy-MM-dd HH:mm" + private var startRecordTime = System.currentTimeMillis() // This property is only valid between onCreateView and // onDestroyView. @@ -186,13 +182,12 @@ class ObtainMessageFragment: Fragment() { binding.imgAudioDelete.setOnClickListener { obtainMessageViewModel.updateMessageAudio("") } - - val sendToArray = mutableListOf("绑定车辆1(LYVXFEFEXNL754427)") + val sendToArray = mutableListOf(VolvoModel("XC60", "智雅", "LYVXFEFEXNL754427")) binding.edtSendTo.adapter = ArrayAdapter(requireContext(), - android.R.layout.simple_dropdown_item_1line, android.R.id.text1, sendToArray) + android.R.layout.simple_dropdown_item_1line, android.R.id.text1, sendToArray.stream().map { it -> "${it.version} ${it.model} ${it.num}" }.toList()) binding.edtSendTo.onItemSelectedListener = object: OnItemSelectedListener { override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) { - obtainMessageViewModel.getMessageLiveData().value?.toWho = sendToArray[p2] + obtainMessageViewModel.getMessageLiveData().value?.toWho = sendToArray[p2].num } override fun onNothingSelected(p0: AdapterView<*>?) { @@ -326,10 +321,15 @@ class ObtainMessageFragment: Fragment() { MotionEvent.ACTION_DOWN-> { // 申请权限 recorderLifecycleObserver.initAndStartRecorder() - ToastUtils.showToast("开始录音!") + startRecordTime = System.currentTimeMillis() false } MotionEvent.ACTION_UP -> { + if (System.currentTimeMillis() - startRecordTime<2000) { + ToastUtils.showToast("录音时间太短!") + recorderLifecycleObserver.stopAndReleaseRecorder() + return + } val recorderAudioPath = recorderLifecycleObserver.stopAndReleaseRecorder() if (File(recorderAudioPath).exists()) { obtainMessageViewModel.updateMessageAudio(recorderAudioPath) @@ -556,9 +556,12 @@ class ObtainMessageFragment: Fragment() { val cal = Calendar.getInstance() cal.time = Date() cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE)+1) - if (cal.time.time < sendDate.time) { // 发送时间设置小于当前时间1分钟前,Toast提示用户并自动设置发送时间 + if (sendDate.time < cal.time.time) { // 发送时间设置小于当前时间1分钟后,Toast提示用户并自动设置发送时间 messageData?.sendDate = DateUtils.date2Str(cal.time, dateSendFormat) ToastUtils.showToast("自动调整发送时间为1分钟后发送") + messageData.version = "1" // 立即发送 + } else { + messageData.version = "0" // 预约发送 } // 开始网络提交数据 @@ -588,6 +591,7 @@ class ObtainMessageFragment: Fragment() { val confirmCallback = object: ObtainMessageViewModel.MyConfirmCallback { override fun onSucess() { + findNavController().navigate(R.id.navigation_home) } } diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt index f352210..3ef2925 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt @@ -23,9 +23,10 @@ import okhttp3.RequestBody import java.io.File import java.io.FileInputStream import java.util.* +import javax.inject.Inject -class ObtainMessageViewModel: ViewModel() { +class ObtainMessageViewModel @Inject constructor(): ViewModel() { private val msgLiveData: MutableLiveData by lazy { MutableLiveData() } @@ -232,7 +233,8 @@ class ObtainMessageViewModel: ViewModel() { "mediaUrl" to message?.mediaUrl, "who" to message?.who, "toWho" to message?.toWho, - "sendDate" to message?.sendDate + "sendDate" to message?.sendDate, + "version" to message?.version ) val result = NavinfoVolvoCall.getApi().insertCardByApp(insertData as Map) XLog.d("insertCardByApp:${result.code}") @@ -264,7 +266,8 @@ class ObtainMessageViewModel: ViewModel() { "mediaUrl" to message?.mediaUrl, "who" to message?.who, "toWho" to message?.toWho, - "sendDate" to message?.sendDate + "sendDate" to message?.sendDate, + "version" to message?.version ) val result = NavinfoVolvoCall.getApi().updateCardByApp(updateData as Map) XLog.d("updateCardByApp:${result.code}") diff --git a/app/src/main/res/drawable/shape_circular.xml b/app/src/main/res/drawable/shape_circular.xml new file mode 100644 index 0000000..dcbbd79 --- /dev/null +++ b/app/src/main/res/drawable/shape_circular.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_home.xml b/app/src/main/res/layout/adapter_home.xml new file mode 100644 index 0000000..7a24c31 --- /dev/null +++ b/app/src/main/res/layout/adapter_home.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_message.xml b/app/src/main/res/layout/adapter_message.xml deleted file mode 100644 index 0137030..0000000 --- a/app/src/main/res/layout/adapter_message.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - \ 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 5f95163..9660c83 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,10 +1,39 @@ - - + tools:context=".ui.fragments.home.HomeFragment"> + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index 30aec55..6829329 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -1,78 +1,90 @@ - + xmlns:tools="http://schemas.android.com/tools"> + + + - - - + android:layout_height="match_parent" + tools:context="com.navinfo.volvo.ui.fragments.login.LoginFragment"> - + + - + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + android:scrollbarAlwaysDrawHorizontalTrack="true" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.4"> - + + - - + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + app:layout_constraintTop_toBottomOf="@id/login_fragment_user_layout"> - + + - + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_obtain_message.xml b/app/src/main/res/layout/fragment_obtain_message.xml index e90f9a4..9abef07 100644 --- a/app/src/main/res/layout/fragment_obtain_message.xml +++ b/app/src/main/res/layout/fragment_obtain_message.xml @@ -365,7 +365,7 @@ android:layout_height="wrap_content" style="@style/Widget.Material3.Button.ElevatedButton" app:icon="@drawable/ic_baseline_access_time_24" - android:text="现在" + android:text="选择时间" android:padding="@dimen/default_widget_padding"> + 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 7166394..83fe244 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -12,7 +12,7 @@ tools:layout="@layout/fragment_login"> @@ -48,5 +48,16 @@ android:id="@+id/navigation_obtain_message" android:name="com.navinfo.volvo.ui.fragments.message.ObtainMessageFragment" android:label="问候编辑" - tools:layout="@layout/fragment_obtain_message" /> + tools:layout="@layout/fragment_obtain_message" > + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6f9bd6f..3e0fd35 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,9 +1,18 @@ - NavinfoVolvo - Home + VolvoMessage + 问候 Dashboard Notifications 删除 分享 我的 + SecondActivity + + First Fragment + Second Fragment + Next + Previous + + Hello first fragment + Hello second fragment. Arg: %1$s \ 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 547a263..744bd08 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,4 +9,5 @@ #FFFFFFFF #FFFF0000 #5E5E5E + #D2CACA \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 919f896..1c985c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - NavinfoVolvo - Home + VolvoMessage + Message Dashboard Notifications Del