diff --git a/app/build.gradle b/app/build.gradle index ffe0742..bdd3f0c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 } @@ -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" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 08d72ec..e200532 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,19 +2,19 @@ - - - + + + - - + + - - + + - + - (val layout: Int) : RecyclerView.Adapter diff --git a/app/src/main/java/com/mob/lee/fastair/adapter/RecordAdapter.kt b/app/src/main/java/com/mob/lee/fastair/adapter/RecordAdapter.kt index eea6f70..b6d39e3 100644 --- a/app/src/main/java/com/mob/lee/fastair/adapter/RecordAdapter.kt +++ b/app/src/main/java/com/mob/lee/fastair/adapter/RecordAdapter.kt @@ -27,12 +27,16 @@ class RecordAdapter(val action: (Record) -> Unit) : AppListAdapter(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 -> { @@ -89,20 +93,19 @@ class RecordAdapter(val action: (Record) -> Unit) : AppListAdapter(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) } } } \ No newline at end of file diff --git a/app/src/main/java/com/mob/lee/fastair/base/AppService.kt b/app/src/main/java/com/mob/lee/fastair/base/AppService.kt index d627c42..5f2c853 100644 --- a/app/src/main/java/com/mob/lee/fastair/base/AppService.kt +++ b/app/src/main/java/com/mob/lee/fastair/base/AppService.kt @@ -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 /** @@ -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() } @@ -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 viewModel(): D { - val viewModel = ViewModelProvider(this).get(D::class.java) - return viewModel } } \ No newline at end of file diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/BeforeFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/BeforeFragment.kt index 52f4e51..7c9a281 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/BeforeFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/BeforeFragment.kt @@ -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 @@ -20,7 +20,7 @@ class BeforeFragment : AppFragment() { view(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) } @@ -30,8 +30,11 @@ class BeforeFragment : AppFragment() { view(R.id.btn_before_action)?.setOnClickListener { viewModel.submit(mParent).observe { - P2PManager.withConnectNavigation(this,R.id.transferFragment){ - putInt("target",R.id.transferFragment) + activityViewModel().withConnectNavigation( + this, + R.id.transferFragment + ) { + putInt("target", R.id.transferFragment) } } } diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/ChatFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/ChatFragment.kt index 62f1a45..8734450 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/ChatFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/ChatFragment.kt @@ -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 @@ -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(R.id.chatContent) - val chatInput=view(R.id.chatInput) - val chatSend=view(R.id.chatSend) + val chatContent = view(R.id.chatContent) + val chatInput = view(R.id.chatInput) + val chatSend = view(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) } }) @@ -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) } diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/ConnectFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/ConnectFragment.kt index 1b87551..fda8d96 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/ConnectFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/ConnectFragment.kt @@ -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().isConnected()) { navigation(R.id.discoverFragment) } else { super.setting() diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/DiscoverFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/DiscoverFragment.kt index badca24..c05d9b5 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/DiscoverFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/DiscoverFragment.kt @@ -2,6 +2,7 @@ package com.mob.lee.fastair.fragment import android.Manifest import android.net.wifi.p2p.WifiP2pDevice +import android.net.wifi.p2p.WifiP2pManager import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -9,10 +10,12 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.widget.TextView +import androidx.core.view.MenuProvider 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.service.ScanService +import com.mob.lee.fastair.p2p.failedReason +import com.mob.lee.fastair.service.FileService +import com.mob.lee.fastair.service.MessageService import com.mob.lee.fastair.utils.dialog import com.mob.lee.fastair.utils.errorToast import com.mob.lee.fastair.utils.successToast @@ -23,71 +26,81 @@ import com.mob.lee.fastair.viewmodel.DeviceViewModel * Created by Andy on 2017/8/11. */ class DiscoverFragment : AppFragment() { - var stopDiscover = false override val layout: Int = R.layout.fragment_discover val viewModel by lazy { - viewModel() + activityViewModel() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel.registerPermission(this) } + override fun setting() { - setHasOptionsMenu(true) title(R.string.discover_device, true) - val discoverView=view(R.id.discoverView) - val deviceStatus=view(R.id.device_status) - P2PManager.devicesLiveData.observe({ lifecycle }) { - if (null == discoverView || null == it) { - return@observe - } - if (stopDiscover) { - return@observe - } - discoverView.removeAllViews() + val discoverView = view(R.id.discoverView) + val deviceStatus = view(R.id.device_status) + viewModel.devices.observe { + discoverView?.removeAllViews() for (device in it) { - if(null==device) continue val view = LayoutInflater.from(context).inflate(R.layout.item_scan, null) val name = view?.findViewById(R.id.item_scan_name) name?.text = device.deviceName view?.setOnClickListener { - stopDiscover = true - context?.successToast("正在建立连接,请稍后...") - P2PManager.connect(mParent!!, device) - viewModel.saveDevice(context, device) + viewModel.connect(device, object : WifiP2pManager.ActionListener { + override fun onSuccess() { + requireContext().successToast(R.string.connect_success) + } + + override fun onFailure(reason: Int) { + requireContext().errorToast(failedReason(reason)) + } + + }) } - discoverView.addView(view) + discoverView?.addView(view) } } - P2PManager.connectLiveData.observe{ + viewModel.connectState.observe { if (true == it) { + viewModel.stopDiscover() jump() } } - P2PManager.currentDevice.observe { - val status=when(it?.status){ - WifiP2pDevice.AVAILABLE->R.string.device_status_available - WifiP2pDevice.CONNECTED->R.string.device_status_connected - WifiP2pDevice.FAILED->R.string.device_status_failed - WifiP2pDevice.INVITED->R.string.device_status_invaited - else->R.string.device_status_unavailable + viewModel.device.observe { + val status = when (it?.status) { + WifiP2pDevice.AVAILABLE -> R.string.device_status_available + WifiP2pDevice.CONNECTED -> R.string.device_status_connected + WifiP2pDevice.FAILED -> R.string.device_status_failed + WifiP2pDevice.INVITED -> R.string.device_status_invaited + else -> R.string.device_status_unavailable } - deviceStatus?.text=getString(R.string.current_device_info,it?.deviceName,getString(status)) + deviceStatus?.text = + getString(R.string.current_device_info, it?.deviceName, getString(status)) } viewModel.withPermission( this, - if(Build.VERSION.SDK_INT>=33){ + if (Build.VERSION.SDK_INT >= 33) { Manifest.permission.NEARBY_WIFI_DEVICES - }else { + } else { Manifest.permission.ACCESS_FINE_LOCATION }, action = { hasPermission -> if (hasPermission) { - ScanService.startScan(requireContext()) + viewModel.init(requireActivity()) + viewModel.discover( + object : WifiP2pManager.ActionListener { + override fun onSuccess() { + + } + + override fun onFailure(reason: Int) { + context?.errorToast(failedReason(reason)) + } + }) } else { mParent?.dialog { setMessage(R.string.need_location) @@ -95,39 +108,41 @@ class DiscoverFragment : AppFragment() { viewModel.openSetting(this@DiscoverFragment) } .setNegativeButton(R.string.cancel) { _, _ -> - mParent?.errorToast(R.string.rejected_location) + requireContext().errorToast(R.string.rejected_location) } } } }) - } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - super.onCreateOptionsMenu(menu, inflater) - inflater.inflate(R.menu.menu_discover, menu) - } + requireActivity().addMenuProvider(object :MenuProvider{ + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.menu_discover, menu) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (R.id.menu_discover_help == item.itemId) { - mParent?.dialog { - setMessage(R.string.discover_help) - .setPositiveButton(R.string.knowIt, null) + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + if (R.id.menu_discover_help == menuItem.itemId) { + mParent?.dialog { + setMessage(R.string.discover_help) + .setPositiveButton(R.string.knowIt, null) + } + return true + } + return false } - return true - } - return super.onOptionsItemSelected(item) + },this) } fun jump() { - mParent?.successToast(R.string.connect_success) val needToTarget = arguments?.containsKey("target") ?: false if (needToTarget) { val target = requireArguments().getInt("target") - navigation(target,args={putAll(arguments)}, options = { + navigation(target, args = { putAll(arguments) }, options = { setPopUpTo(R.id.discoverFragment, true) }) } else { mParent?.onBackPressed() } + viewModel.startService(requireContext(), MessageService::class.java) + viewModel.startService(requireContext(), FileService::class.java) } } \ No newline at end of file diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/HomeFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/HomeFragment.kt index e077894..5573f82 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/HomeFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/HomeFragment.kt @@ -7,7 +7,6 @@ import android.os.Bundle import android.view.Gravity import android.view.MenuItem import android.view.View -import androidx.activity.viewModels import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.PopupMenu @@ -24,11 +23,11 @@ import com.mob.lee.fastair.R import com.mob.lee.fastair.adapter.DeleteAdapter import com.mob.lee.fastair.adapter.PageAdapter import com.mob.lee.fastair.base.AppFragment -import com.mob.lee.fastair.p2p.P2PManager import com.mob.lee.fastair.service.FileService import com.mob.lee.fastair.utils.dialog import com.mob.lee.fastair.utils.errorToast import com.mob.lee.fastair.utils.successToast +import com.mob.lee.fastair.viewmodel.DeviceViewModel import com.mob.lee.fastair.viewmodel.HomeViewModel /** @@ -40,28 +39,40 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe override val defaultContainer: Int = -1 + val mDeviceViewModel by lazy { + activityViewModel() + } + + val mViewModel by lazy { + activityViewModel() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val viewModel:HomeViewModel by mParent!!.viewModels() - if(Build.VERSION.SDK_INT>=30){ - viewModel.registerActivityResult(this) - }else { - viewModel.registerPermission(this) + if (Build.VERSION.SDK_INT >= 30) { + mViewModel.registerActivityResult(this) } + mViewModel.registerPermission(this) } + override fun setting() { - val viewModel:HomeViewModel by mParent!!.viewModels() - val homeDrawer=view(R.id.homeDrawer) - val toolbar=view(R.id.toolbar) - val homeNavgation=view(R.id.homeNavgation) - val homeContent=view(R.id.homeContent) - val homeTabs=view(R.id.homeTabs) - val toolOperation=view(R.id.toolOperation) - val toolSwap=view(R.id.toolSwap) - val toolAll=view(R.id.toolAll) - val toolSort=view(R.id.toolSort) - val toolDelete=view(R.id.toolDelete) - val toggle = ActionBarDrawerToggle(mParent!!, homeDrawer, toolbar, R.string.toggle_open, R.string.toggle_close) + val homeDrawer = view(R.id.homeDrawer) + val toolbar = view(R.id.toolbar) + val homeNavgation = view(R.id.homeNavgation) + val homeContent = view(R.id.homeContent) + val homeTabs = view(R.id.homeTabs) + val toolOperation = view(R.id.toolOperation) + val toolSwap = view(R.id.toolSwap) + val toolAll = view(R.id.toolAll) + val toolSort = view(R.id.toolSort) + val toolDelete = view(R.id.toolDelete) + val toggle = ActionBarDrawerToggle( + mParent!!, + homeDrawer, + toolbar, + R.string.toggle_open, + R.string.toggle_close + ) toolbar?.title = getString(R.string.app_description) toggle.syncState() @@ -71,7 +82,7 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe override fun onDrawerOpened(drawerView: View) { super.onDrawerOpened(drawerView) val item = homeNavgation?.menu?.findItem(R.id.menu_disconnet) - val title = if (P2PManager.isConnected()) { + val title = if (mDeviceViewModel.isConnected()) { R.string.device_disconnect } else { R.string.device_connect @@ -80,20 +91,26 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe } }) - viewModel.hasSelectedLiveData.observe { + mViewModel.hasSelectedLiveData.observe { val value = if (true == it) { R.drawable.ic_action_file_upload to R.color.color_red } else { R.drawable.ic_action_file_download to R.color.colorAccent } - toolOperation?.supportBackgroundTintList= ColorStateList.valueOf(ContextCompat.getColor(requireContext(),value.second)) + toolOperation?.supportBackgroundTintList = + ColorStateList.valueOf(ContextCompat.getColor(requireContext(), value.second)) toolOperation?.setImageDrawable(ContextCompat.getDrawable(mParent!!, value.first)) } - toolOperation?.setImageDrawable(ContextCompat.getDrawable(mParent!!, R.drawable.ic_action_file_download)) + toolOperation?.setImageDrawable( + ContextCompat.getDrawable( + mParent!!, + R.drawable.ic_action_file_download + ) + ) toolSwap?.setOnClickListener { - viewModel.reverse() - val textId = if (viewModel.isDes) { + mViewModel.reverse() + val textId = if (mViewModel.isDes) { R.string.des } else { R.string.aes @@ -101,8 +118,8 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe toolSwap.setText(textId) } toolAll?.setOnClickListener { - viewModel.selectAll() - val textId = if (viewModel.checkedRecords().isNotEmpty()) { + mViewModel.selectAll() + val textId = if (mViewModel.checkedRecords().isNotEmpty()) { R.string.unselect_all } else { R.string.select_all @@ -114,16 +131,16 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe menus.inflate(R.menu.menu_sort) menus.setOnMenuItemClickListener { when (it.itemId) { - R.id.menu_content_sort_byname -> viewModel.sortByName() - R.id.menu_content_sort_bysize -> viewModel.sortBySize() - R.id.menu_content_sort_bytime -> viewModel.sortByDate() + R.id.menu_content_sort_byname -> mViewModel.sortByName() + R.id.menu_content_sort_bysize -> mViewModel.sortBySize() + R.id.menu_content_sort_bytime -> mViewModel.sortByDate() } true } menus.show() } toolDelete?.setOnClickListener { - if (viewModel.hasSelectedLiveData.value != true) { + if (mViewModel.hasSelectedLiveData.value != true) { mParent?.successToast(R.string.select_nothing) return@setOnClickListener } @@ -131,25 +148,25 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe setTitle(R.string.delete_file_list) val rv = layoutInflater.inflate(R.layout.recyclerview, null) as RecyclerView rv.layoutManager = LinearLayoutManager(mParent) - rv.adapter = DeleteAdapter(viewModel) + rv.adapter = DeleteAdapter(mViewModel) setView(rv) - .setPositiveButton(R.string.delete) { _, _ -> - viewModel.delete(mParent) - viewModel.update() - } - .setNegativeButton(R.string.cancel) { _, _ -> - viewModel.update() - } + .setPositiveButton(R.string.delete) { _, _ -> + mViewModel.delete(mParent) + mViewModel.update() + } + .setNegativeButton(R.string.cancel) { _, _ -> + mViewModel.update() + } } } toolOperation?.setOnClickListener { - if(viewModel.checkedRecords().isEmpty()){ - P2PManager.withConnectNavigation(this,R.id.transferFragment){ - putInt("target",R.id.transferFragment) + if (mViewModel.checkedRecords().isEmpty()) { + mDeviceViewModel.withConnectNavigation(this, R.id.transferFragment) { + putInt("target", R.id.transferFragment) } - }else { - viewModel.write(context).observe { + } else { + mViewModel.write(context).observe { if (it.isSuccess()) { navigation(R.id.beforeFragment) } else { @@ -164,15 +181,15 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe override fun onNavigationItemSelected(item: MenuItem): Boolean { when (item.getItemId()) { R.id.menu_disconnet -> { - if (P2PManager.isConnected()) { + if (mDeviceViewModel.isConnected()) { mParent?.dialog { setMessage(R.string.disconnect_info) - .setPositiveButton(R.string.disconnect_now) { _, _ -> - P2PManager.stopConnect() - val intent= Intent(context,FileService::class.java) - mParent?.stopService(intent) - } - .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.disconnect_now) { _, _ -> + val intent = Intent(context, FileService::class.java) + mParent?.stopService(intent) + mDeviceViewModel.disconnect(null) + } + .setNegativeButton(R.string.cancel, null) } } else { navigation(R.id.discoverFragment) @@ -183,29 +200,32 @@ class HomeFragment : AppFragment(), NavigationView.OnNavigationItemSelectedListe } R.id.menu_history -> { - navigation(R.id.historyFragment,args = { + navigation(R.id.historyFragment, args = { putBoolean("isHistory", true) }) } - R.id.menu_connect_chat -> P2PManager.withConnectNavigation(this,R.id.chatFragment){ - putAll(P2PManager.bundle()) - putInt("target",R.id.chatFragment) + R.id.menu_connect_chat -> mDeviceViewModel.withConnectNavigation( + this, + R.id.chatFragment + ) { + putAll(mDeviceViewModel.bundle()) + putInt("target", R.id.chatFragment) } R.id.menu_payment -> navigation(R.id.payFragment) - R.id.menu_help -> navigation(R.id.textFragment,args = { + R.id.menu_help -> navigation(R.id.textFragment, args = { putInt("type", 0) }) - R.id.menu_about -> navigation(R.id.textFragment,args = { + R.id.menu_about -> navigation(R.id.textFragment, args = { putInt("type", 1) }) R.id.menu_setting -> navigation(R.id.settingFragment) } - val homeDrawer=view(R.id.homeDrawer) + val homeDrawer = view(R.id.homeDrawer) homeDrawer?.closeDrawer(Gravity.LEFT) return true } diff --git a/app/src/main/java/com/mob/lee/fastair/fragment/HostFragment.kt b/app/src/main/java/com/mob/lee/fastair/fragment/HostFragment.kt index d82a650..9cdc39c 100644 --- a/app/src/main/java/com/mob/lee/fastair/fragment/HostFragment.kt +++ b/app/src/main/java/com/mob/lee/fastair/fragment/HostFragment.kt @@ -3,11 +3,13 @@ package com.mob.lee.fastair.fragment import android.app.Service import android.content.* import android.os.IBinder -import android.view.* +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.widget.Button import android.widget.TextView import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer +import androidx.core.view.MenuProvider import com.mob.lee.fastair.R import com.mob.lee.fastair.base.AppFragment import com.mob.lee.fastair.io.getNetIP @@ -21,31 +23,32 @@ class HostFragment() : AppFragment(), ServiceConnection { override val layout: Int = R.layout.fragment_host override fun setting() { - setHasOptionsMenu(true) title(R.string.local_host) - val tv_host_ip=view(R.id.tv_host_ip) + val tv_host_ip = view(R.id.tv_host_ip) tv_host_ip?.text = "${getNetIP(mParent!!)}:${port}" HostService.start(requireContext(), port) tv_host_ip?.setOnClickListener { val manager = ContextCompat.getSystemService(requireContext(), ClipboardManager::class.java) manager?.let { - it.setPrimaryClip(ClipData.newPlainText("ipInfo",tv_host_ip.text.toString())) + it.setPrimaryClip(ClipData.newPlainText("ipInfo", tv_host_ip.text.toString())) } } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - super.onCreateOptionsMenu(menu, inflater) - inflater.inflate(R.menu.menu_local_host, menu) - } + requireActivity().addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.menu_local_host, menu) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_restart_server -> HostService.start(requireContext(), port, true) - } - return true + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + return if (R.id.menu_restart_server == menuItem.itemId) { + HostService.start(requireContext(), port, true) + true + } else { + false + } + } + }, this) } override fun onResume() { @@ -60,37 +63,34 @@ class HostFragment() : AppFragment(), ServiceConnection { } override fun onServiceConnected(name: ComponentName?, service: IBinder?) { - val b = service as BinderImpl? - b?.run { - mHostService = mService as HostService - mHostService?.mStatus?.observe(this@HostFragment,object :Observer{ - override fun onChanged(t: Boolean?) { - switchStatus(t==true) - } - }) + (service as BinderImpl?)?.let { binder -> + mHostService = binder.mService as HostService + mHostService?.mStatus?.observe(this@HostFragment) { + switchStatus(it == true) + } } } override fun onServiceDisconnected(name: ComponentName?) { mHostService?.mStatus?.removeObservers(this) - mHostService=null + mHostService = null } - fun switchStatus(isRunning:Boolean){ - val text=if(isRunning){ + fun switchStatus(isRunning: Boolean) { + val text = if (isRunning) { R.string.server_runing to R.string.stop_server - }else{ + } else { R.string.server_stoped to R.string.start_server } - val tv_host_status=view(R.id.tv_host_status) - val btn_host_action=view