Где хранить общий контекстно-зависимый код между фрагментом и Activity, кроме ViewModel? - PullRequest
1 голос
/ 06 апреля 2019

Я создаю это новое приложение для Android, и я застрял в этом мыслительном процессе. У меня есть активность, у которой есть нижний лист, в котором вы можете выбрать изображение из галереи или камеры, чтобы добавить вложение в сообщение. Поэтому мне нужно запросить разрешения, прослушать обратный вызов разрешений, проанализировать результаты галереи / камеры и переключить интерфейс, в котором много кода. И дело в том, что у меня есть фрагмент, который делает то же самое, чтобы загрузить фотографию профиля. Если бы это было два действия, я мог бы просто добавить код в baseActivity. Но это фрагмент и активность. С другой стороны, вы также не должны раздувать вашу ViewModel, и эти два компонента полностью независимы.

Я думал поместить его в ViewModel, но не могу поместить в него представления. Кроме того, я почему-то знаю, что это требование является общим. Я знаю о шаблоне презентатора, но вы все равно не можете поместить в него представления.

// starting gallery
private fun startGallery(type: String, title: String, requestCode: Int){
    val intent = Intent()
    intent.type = type
    intent.action = Intent.ACTION_PICK
    startActivityForResult(Intent.createChooser(intent, title), 
    requestCode)
}

// starting camera intent
private fun startCameraFor(action: String, requestCode: Int) {
    val takeVideoIntent = Intent(action)
    if (takeVideoIntent.resolveActivity(context?.packageManager) != null) 
{
        startActivityForResult(takeVideoIntent, requestCode)
    }
}

 // Handling image results
 override fun onActivityResult(requestCode: Int, resultCode: Int, data: 
 Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(resultCode == Activity.RESULT_OK) {
        postViewModel.uploadImageResults(data = data, requestCode = 
        requestCode, userId = "c7c2352b-5449-43bf-a099-688843025130")
    }
    toggleBottomSheet()
}

  // Check for permission
  private fun permissionAction(permission: String =  
  Manifest.permission.READ_EXTERNAL_STORAGE, callback: () -> Unit){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        val checkPermission = ContextCompat.checkSelfPermission(context!!, 
        permission)
        if (checkPermission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity!!, 
            arrayOf(permission), Constants.REQUEST_CODE_STORAGE_PICK)
        } else {
            callback()
        }
    }
}

// Toggles bottom sheet
private fun toggleBottomSheet() {
    if(bottomSheet.state == BottomSheetBehavior.STATE_COLLAPSED) {
        bottomSheet.state = BottomSheetBehavior.STATE_EXPANDED
    } else {
        bottomSheet.state = BottomSheetBehavior.STATE_COLLAPSED
    }
}
...