Skip to content

Commit

Permalink
Merge pull request #12 from hongui/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
hongui committed Mar 13, 2023
2 parents c623ad5 + d3ffdae commit 6a85d8f
Show file tree
Hide file tree
Showing 48 changed files with 1,196 additions and 1,189 deletions.
15 changes: 9 additions & 6 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ android {
applicationId "com.mob.lee.fastair"
minSdk 21
targetSdk 33
versionCode 9
versionName "1.5.0"
versionCode 11
versionName "1.6.0"
multiDexEnabled true
}

Expand Down Expand Up @@ -71,18 +71,21 @@ dependencies {
implementation 'androidx.fragment:fragment-ktx:1.5.5'
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.10'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-runtime:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.0'
implementation 'androidx.lifecycle:lifecycle-runtime:2.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation 'androidx.preference:preference-ktx:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation 'androidx.room:room-runtime:2.5.0'
implementation 'androidx.room:room-ktx:2.5.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0'

ksp 'androidx.room:room-compiler:2.5.0'

testImplementation 'junit:junit:4.13.2'
testImplementation "com.google.truth:truth:1.1.3"
}
17 changes: 8 additions & 9 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:name=".base.App"
Expand Down Expand Up @@ -45,7 +45,6 @@

<service android:name=".service.MessageService" />
<service android:name=".service.FileService" />
<service android:name=".service.ScanService" />

<provider
android:name="androidx.core.content.FileProvider"
Expand Down
42 changes: 18 additions & 24 deletions app/src/main/java/com/mob/lee/fastair/ContainerActivity.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.mob.lee.fastair

import android.content.Intent
import android.net.wifi.p2p.WifiP2pManager
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import com.mob.lee.fastair.p2p.P2PManager
import com.mob.lee.fastair.service.FileService
import com.mob.lee.fastair.p2p.failedReason
import com.mob.lee.fastair.utils.errorToast
import com.mob.lee.fastair.viewmodel.DeviceViewModel
import com.mob.lee.fastair.viewmodel.HomeViewModel
Expand All @@ -27,28 +26,23 @@ class ContainerActivity : AppCompatActivity() {

handleIntent(intent)

if(null==savedInstanceState) {
P2PManager.connectLiveData.observe(this, Observer {
if (false == it) {
errorToast(R.string.disconnected)
mNavController.popBackStack(R.id.homeFragment, true)

try {
val intent = Intent(this, FileService::class.java)
stopService(intent)
}catch (e:Exception){
e.printStackTrace()
}

val viewModel: DeviceViewModel by viewModels()
viewModel.run {
init(this@ContainerActivity)
discover(object : WifiP2pManager.ActionListener {
override fun onSuccess() {
}
})

P2PManager.p2pInfoLiveData.observe(this, Observer {
it?.let {
val viewModel:DeviceViewModel by viewModels()
viewModel.saveInfo(this, it)
override fun onFailure(reason: Int) {
errorToast(failedReason(reason))
}
})
connectState.observe(this@ContainerActivity) {
if (!it) {
errorToast(R.string.disconnected)
mNavController.popBackStack(R.id.homeFragment,false)
}
}
}
}

Expand All @@ -57,11 +51,11 @@ class ContainerActivity : AppCompatActivity() {
handleIntent(intent)
}

fun handleIntent(intent: Intent?){
fun handleIntent(intent: Intent?) {
val data = intent?.clipData
if (null != data) {
val v:HomeViewModel by viewModels()
v.parseClipData(this,data).observe(this){
val v: HomeViewModel by viewModels()
v.parseClipData(this, data).observe(this) {
mNavController.navigate(R.id.beforeFragment)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ open class AppListAdapter<D>(val layout: Int) : RecyclerView.Adapter<AppViewHold

fun update(pos:Int,data:D?){
data?:return
if(originData.isNullOrEmpty()){
add(data)
return
}
originData[pos]=data
notifyItemChanged(pos)
}
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/java/com/mob/lee/fastair/adapter/PageAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.mob.lee.fastair.adapter

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
Expand All @@ -27,7 +26,6 @@ class PageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
viewPager?:return
tabs?:return
val adapter = PageAdapter(fragment)
viewPager.offscreenPageLimit = 1
viewPager.adapter = adapter

val mediator = TabLayoutMediator(tabs, viewPager) { tab, position ->
Expand Down
19 changes: 11 additions & 8 deletions app/src/main/java/com/mob/lee/fastair/adapter/RecordAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,16 @@ class RecordAdapter(val action: (Record) -> Unit) : AppListAdapter<History>(R.la
holder.text(R.id.item_history_title, record.name)
holder.text(R.id.item_history_date, record.date.formatDate("MM/dd/yy HH:mm"))
when (state) {
is ProcessState -> {
progress.progress(state.percentage())
is TransmitState -> {
progress.progress(state.percentage()*100)
holder.text(R.id.item_history_speed, "${speed(state.alreadyTransmited,state.duration)}MB/S")
}

is SuccessState -> {
progress.updateState(CircleProgress.SUCCESS)
if(state.needShowSpeed()) {
holder.text(R.id.item_history_speed, "${state.speed}MB/S")
}
}

else -> {
Expand Down Expand Up @@ -89,20 +93,19 @@ class RecordAdapter(val action: (Record) -> Unit) : AppListAdapter<History>(R.la
val target = File("${origin.parent}${File.separator}${input}.${origin.extension}")
if (File(path).renameTo(target)) {
val rec = record.copy(path = target.absolutePath)
update(pos, rec to SuccessState())
update(pos, rec to SuccessState(rec))
action(rec)
}
}
}
}

fun update(state: State, record: Record?) {
record ?: return
fun update(record: Record,state:State) {
val index = itemCount - 1
if (state is StartState) {
if(state is StartRecordState) {
add(record to state)
} else {
update(index, record to state)
}else{
update(index,record to state)
}
}
}
21 changes: 6 additions & 15 deletions app/src/main/java/com/mob/lee/fastair/base/AppService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ package com.mob.lee.fastair.base
import android.app.Service
import android.content.Intent
import android.os.IBinder
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.ViewModelStoreOwner
import com.mob.lee.fastair.viewmodel.AppViewModel
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlin.coroutines.CoroutineContext

/**
Expand All @@ -16,8 +16,8 @@ import kotlin.coroutines.CoroutineContext
* @CreateDate: 2020/6/19 11:24
* @Description: 无
*/
open class AppService : Service(), CoroutineScope, ViewModelStoreOwner {
override val coroutineContext: CoroutineContext = SupervisorJob() + Dispatchers.Main.immediate
open class AppService : Service(), CoroutineScope {
override val coroutineContext: CoroutineContext = SupervisorJob() + Dispatchers.Main
private val mViewModelStore by lazy {
ViewModelStore()
}
Expand All @@ -28,15 +28,6 @@ open class AppService : Service(), CoroutineScope, ViewModelStoreOwner {

override fun onDestroy() {
super.onDestroy()
mViewModelStore.clear()
coroutineContext.cancel()
coroutineContext.cancelChildren()
}

override fun getViewModelStore(): ViewModelStore = mViewModelStore

inline fun <reified D : AppViewModel> viewModel(): D {
val viewModel = ViewModelProvider(this).get(D::class.java)
return viewModel
}
}
11 changes: 7 additions & 4 deletions app/src/main/java/com/mob/lee/fastair/fragment/BeforeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import androidx.recyclerview.widget.RecyclerView
import com.mob.lee.fastair.R
import com.mob.lee.fastair.adapter.FileAdapter
import com.mob.lee.fastair.base.AppFragment
import com.mob.lee.fastair.p2p.P2PManager
import com.mob.lee.fastair.viewmodel.BeforeViewModel
import com.mob.lee.fastair.viewmodel.DeviceViewModel

class BeforeFragment : AppFragment() {
override val layout: Int = R.layout.before_fragment
Expand All @@ -20,7 +20,7 @@ class BeforeFragment : AppFragment() {

view<RecyclerView>(R.id.rv_before_content)?.run {
layoutManager = LinearLayoutManager(mParent)
viewModel.waitRecords(mParent).observe{ data ->
viewModel.waitRecords(mParent).observe { data ->
adapter = FileAdapter {
viewModel.toggle(it)
}.apply { add(data.data) }
Expand All @@ -30,8 +30,11 @@ class BeforeFragment : AppFragment() {

view<View>(R.id.btn_before_action)?.setOnClickListener {
viewModel.submit(mParent).observe {
P2PManager.withConnectNavigation(this,R.id.transferFragment){
putInt("target",R.id.transferFragment)
activityViewModel<DeviceViewModel>().withConnectNavigation(
this,
R.id.transferFragment
) {
putInt("target", R.id.transferFragment)
}
}
}
Expand Down
33 changes: 16 additions & 17 deletions app/src/main/java/com/mob/lee/fastair/fragment/ChatFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mob.lee.fastair.R
import com.mob.lee.fastair.adapter.MessageAdapter
import com.mob.lee.fastair.io.state.MessageState
import com.mob.lee.fastair.model.Message
import com.mob.lee.fastair.service.BinderImpl
import com.mob.lee.fastair.service.MessageService
Expand All @@ -23,29 +24,29 @@ import com.mob.lee.fastair.utils.errorToast
* Created by Andy on 2017/6/7.
*/
class ChatFragment : ConnectFragment() {
var mConnect : ServiceConnection? = null
var mService : MessageService? = null
lateinit var mAdapter : MessageAdapter
var mConnect: ServiceConnection? = null
var mService: MessageService? = null
lateinit var mAdapter: MessageAdapter
override val layout: Int = R.layout.fragment_chat

override fun setting() {
title(R.string.chat)

mAdapter = MessageAdapter()
val chatContent=view<RecyclerView>(R.id.chatContent)
val chatInput=view<EditText>(R.id.chatInput)
val chatSend=view<TextView>(R.id.chatSend)
val chatContent = view<RecyclerView>(R.id.chatContent)
val chatInput = view<EditText>(R.id.chatInput)
val chatSend = view<TextView>(R.id.chatSend)
chatContent?.layoutManager = LinearLayoutManager(mParent)
chatContent?.adapter = mAdapter

chatInput?.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s : Editable?) {
override fun afterTextChanged(s: Editable?) {
}

override fun beforeTextChanged(s : CharSequence?, start : Int, count : Int, after : Int) {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}

override fun onTextChanged(s : CharSequence?, start : Int, before : Int, count : Int) {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
chatSend?.isEnabled = !TextUtils.isEmpty(s)
}
})
Expand All @@ -68,26 +69,24 @@ class ChatFragment : ConnectFragment() {
intent.putExtras(it)
}
mConnect = object : ServiceConnection {
override fun onServiceDisconnected(name : ComponentName?) {
context?.errorToast("连接断开")
override fun onServiceDisconnected(name: ComponentName?) {
}

override fun onServiceConnected(name : ComponentName?, service : IBinder?) {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
if (null == service) {
return
}
val binder = service as BinderImpl
mService = binder.mService as MessageService
mService?.mMessageListener = {
val msg = it.obj as? String
msg?.let {
mAdapter.add(Message(it, Message.OTHER))
mService?.mMessageListener = {state->
if(state is MessageState){
mAdapter.add(Message(state.msg, Message.OTHER))
chatContent?.smoothScrollToPosition(mAdapter.getItemCount())
}
}
}
}
context?.startService(intent)

context?.bindService(intent, mConnect!!, Context.BIND_AUTO_CREATE)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ package com.mob.lee.fastair.fragment

import com.mob.lee.fastair.R
import com.mob.lee.fastair.base.AppFragment
import com.mob.lee.fastair.p2p.P2PManager
import com.mob.lee.fastair.viewmodel.DeviceViewModel

abstract class ConnectFragment : AppFragment() {

override fun setting() {
if (!P2PManager.isConnected()) {
if (!activityViewModel<DeviceViewModel>().isConnected()) {
navigation(R.id.discoverFragment)
} else {
super.setting()
Expand Down
Loading

0 comments on commit 6a85d8f

Please sign in to comment.