Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -191,42 +191,11 @@ class MediaPickerActivity : LocaleAwareActivity(), MediaPickerListener {
}
}
TAKE_PHOTO -> {
try {
val intent = Intent()
mediaCapturePath!!.let {
WPMediaUtils.scanMediaFile(this, it)
val f = File(it)
val capturedImageUri = listOf(Uri.fromFile(f))
if (mediaPickerSetup.queueResults) {
intent.putQueuedUris(capturedImageUri)
} else {
intent.putUris(capturedImageUri)
}
intent.putExtra(
EXTRA_MEDIA_SOURCE,
ANDROID_CAMERA.name
)
}
intent
} catch (e: RuntimeException) {
AppLog.e(MEDIA, e)
null
}
takeAPhoto()
}
IMAGE_EDITOR_EDIT_IMAGE -> {
data?.let {
val intent = Intent()
val uris = WPMediaUtils.retrieveImageEditorResult(data)
if (mediaPickerSetup.queueResults) {
intent.putQueuedUris(uris)
} else {
intent.putUris(uris)
}
intent.putExtra(
EXTRA_MEDIA_SOURCE,
APP_PICKER.name
)
intent
editImageIntent(data)
}
}
else -> {
Expand All @@ -239,6 +208,43 @@ class MediaPickerActivity : LocaleAwareActivity(), MediaPickerListener {
}
}

private fun takeAPhoto() = try {
val intent = Intent()
mediaCapturePath!!.let {
WPMediaUtils.scanMediaFile(this, it)
val f = File(it)
val capturedImageUri = listOf(Uri.fromFile(f))
if (mediaPickerSetup.queueResults) {
intent.putQueuedUris(capturedImageUri)
} else {
intent.putUris(capturedImageUri)
}
intent.putExtra(
EXTRA_MEDIA_SOURCE,
ANDROID_CAMERA.name
)
}
intent
} catch (e: RuntimeException) {
AppLog.e(MEDIA, e)
null
}

private fun editImageIntent(data: Intent?): Intent {
val intent = Intent()
val uris = WPMediaUtils.retrieveImageEditorResult(data)
if (mediaPickerSetup.queueResults) {
intent.putQueuedUris(uris)
} else {
intent.putUris(uris)
}
intent.putExtra(
EXTRA_MEDIA_SOURCE,
APP_PICKER.name
)
return intent
}

private fun launchChooserWithContext(openSystemPicker: OpenSystemPicker, uiHelpers: UiHelpers) {
WPMediaUtils.launchChooserWithContext(this, openSystemPicker, uiHelpers, MEDIA_LIBRARY)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import org.wordpress.android.R
import org.wordpress.android.R.string
import org.wordpress.android.WordPress
import org.wordpress.android.databinding.MediaPickerFragmentBinding
import org.wordpress.android.fluxc.model.SiteModel
Expand Down Expand Up @@ -233,10 +234,7 @@ class MediaPickerFragment : Fragment() {
layoutManager.onRestoreInstanceState(it)
}
with(MediaPickerFragmentBinding.bind(view)) {
binding = this
recycler.layoutManager = layoutManager
recycler.setEmptyView(actionableEmptyView)
recycler.setHasFixedSize(true)
setUpRecyclerView(layoutManager)

val swipeToRefreshHelper = WPSwipeToRefreshHelper.buildSwipeToRefreshHelper(pullToRefresh) {
viewModel.onPullToRefresh()
Expand All @@ -262,41 +260,8 @@ class MediaPickerFragment : Fragment() {
}
})

viewModel.onNavigate.observeEvent(viewLifecycleOwner,
{ navigationEvent ->
when (navigationEvent) {
is PreviewUrl -> {
MediaPreviewActivity.showPreview(
requireContext(),
null,
navigationEvent.url
)
AccessibilityUtils.setActionModeDoneButtonContentDescription(
activity,
getString(R.string.cancel)
)
}
is PreviewMedia -> MediaPreviewActivity.showPreview(
requireContext(),
null,
navigationEvent.media,
null
)
is EditMedia -> {
val inputData = WPMediaUtils.createListOfEditImageInputData(
requireContext(),
navigationEvent.uris.map { wrapper -> wrapper.uri }
)
ActivityLauncher.openImageEditor(activity, inputData)
}
is InsertMedia -> listener?.onItemsChosen(navigationEvent.identifiers)
is IconClickEvent -> listener?.onIconClicked(navigationEvent.action)
Exit -> {
val activity = requireActivity()
activity.setResult(Activity.RESULT_CANCELED)
activity.finish()
}
}
viewModel.onNavigate.observeEvent(viewLifecycleOwner, { navigationEvent ->
navigateEvent(navigationEvent)
})

viewModel.onPermissionsRequested.observeEvent(viewLifecycleOwner, {
Expand All @@ -315,6 +280,64 @@ class MediaPickerFragment : Fragment() {
}
}

private fun MediaPickerFragmentBinding.setUpRecyclerView(
layoutManager: GridLayoutManager
) {
binding = this
recycler.layoutManager = layoutManager
recycler.setEmptyView(actionableEmptyView)
recycler.setHasFixedSize(true)
}

private fun navigateEvent(navigationEvent: MediaNavigationEvent) {
when (navigationEvent) {
is PreviewUrl -> {
previewUrl(navigationEvent)
}
is PreviewMedia -> previewMedia(navigationEvent)

is EditMedia -> {
editMedia(navigationEvent)
}
is InsertMedia -> listener?.onItemsChosen(navigationEvent.identifiers)
is IconClickEvent -> listener?.onIconClicked(navigationEvent.action)
Exit -> {
val activity = requireActivity()
activity.setResult(Activity.RESULT_CANCELED)
activity.finish()
}
}
}

private fun editMedia(navigationEvent: EditMedia) {
val inputData = WPMediaUtils.createListOfEditImageInputData(
requireContext(),
navigationEvent.uris.map { wrapper -> wrapper.uri }
)
ActivityLauncher.openImageEditor(activity, inputData)
}

private fun previewMedia(navigationEvent: PreviewMedia) {
MediaPreviewActivity.showPreview(
requireContext(),
null,
navigationEvent.media,
null
)
}

private fun previewUrl(navigationEvent: PreviewUrl) {
MediaPreviewActivity.showPreview(
requireContext(),
null,
navigationEvent.url
)
AccessibilityUtils.setActionModeDoneButtonContentDescription(
activity,
getString(string.cancel)
)
}

override fun onDestroyView() {
super.onDestroyView()
binding = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,14 @@ import org.wordpress.android.ui.mediapicker.MediaPickerSetup.DataSource.STOCK_LI
import org.wordpress.android.ui.mediapicker.MediaPickerSetup.DataSource.WP_LIBRARY
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.ClickAction
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.FileItem
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.NextPageLoader
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.PhotoItem
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.ToggleAction
import org.wordpress.android.ui.mediapicker.MediaPickerUiItem.VideoItem
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.BrowseMenuUiModel.BrowseAction
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.BrowseMenuUiModel.BrowseAction.SYSTEM_PICKER
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.PhotoListUiModel.Data
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.PhotoListUiModel.Empty
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.ProgressDialogUiModel.Hidden
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.ProgressDialogUiModel.Visible
import org.wordpress.android.ui.mediapicker.MediaType.AUDIO
Expand All @@ -63,6 +66,7 @@ import org.wordpress.android.ui.mediapicker.insert.MediaInsertHandler.InsertMode
import org.wordpress.android.ui.mediapicker.insert.MediaInsertHandlerFactory
import org.wordpress.android.ui.mediapicker.loader.MediaLoader
import org.wordpress.android.ui.mediapicker.loader.MediaLoader.DomainModel
import org.wordpress.android.ui.mediapicker.loader.MediaLoader.DomainModel.EmptyState
import org.wordpress.android.ui.mediapicker.loader.MediaLoader.LoadAction
import org.wordpress.android.ui.mediapicker.loader.MediaLoader.LoadAction.NextPage
import org.wordpress.android.ui.mediapicker.loader.MediaLoaderFactory
Expand Down Expand Up @@ -196,70 +200,28 @@ class MediaPickerViewModel @Inject constructor(
mediaUtilsWrapper.getExtensionForMimeType(mimeType).uppercase(localeManagerWrapper.getLocale())
}
when (it.type) {
IMAGE -> PhotoItem(
url = it.url,
identifier = it.identifier,
isSelected = isSelected,
selectedOrder = selectedOrder,
showOrderCounter = showOrderCounter,
toggleAction = toggleAction,
clickAction = clickAction
IMAGE -> PhotoItem(url = it.url, identifier = it.identifier, isSelected = isSelected,
selectedOrder = selectedOrder, showOrderCounter = showOrderCounter,
toggleAction = toggleAction, clickAction = clickAction
)
VIDEO -> VideoItem(
url = it.url,
identifier = it.identifier,
isSelected = isSelected,
selectedOrder = selectedOrder,
showOrderCounter = showOrderCounter,
toggleAction = toggleAction,
clickAction = clickAction
VIDEO -> VideoItem(url = it.url, identifier = it.identifier, isSelected = isSelected,
selectedOrder = selectedOrder, showOrderCounter = showOrderCounter,
toggleAction = toggleAction, clickAction = clickAction
)
AUDIO, DOCUMENT -> FileItem(
fileName = it.name ?: "",
fileExtension = fileExtension,
identifier = it.identifier,
isSelected = isSelected,
selectedOrder = selectedOrder,
showOrderCounter = showOrderCounter,
toggleAction = toggleAction,
clickAction = clickAction
fileName = it.name ?: "", fileExtension = fileExtension, identifier = it.identifier,
isSelected = isSelected, selectedOrder = selectedOrder, showOrderCounter = showOrderCounter,
toggleAction = toggleAction, clickAction = clickAction
)
}
}
if (domainModel.hasMore) {
val updatedItems = uiItems.toMutableList()
val loaderItem = if (domainModel.emptyState?.isError == true) {
MediaPickerUiItem.NextPageLoader(false) {
launch {
retry()
}
}
} else {
MediaPickerUiItem.NextPageLoader(true) {
launch {
loadActions.send(NextPage)
}
}
}
updatedItems.add(loaderItem)
PhotoListUiModel.Data(items = updatedItems)
loadNextPage(uiItems, domainModel)
} else {
PhotoListUiModel.Data(items = uiItems)
}
} else if (domainModel?.emptyState != null) {
PhotoListUiModel.Empty(
domainModel.emptyState.title,
domainModel.emptyState.htmlSubtitle,
domainModel.emptyState.image,
domainModel.emptyState.bottomImage,
domainModel.emptyState.bottomImageDescription,
isSearching == true,
retryAction = if (domainModel.emptyState.isError) {
this::retry
} else {
null
}
)
showEmptyState(domainModel.emptyState, isSearching)
} else if (domainModel?.isLoading == true) {
PhotoListUiModel.Loading
} else {
Expand All @@ -273,12 +235,50 @@ class MediaPickerViewModel @Inject constructor(
}
PhotoListUiModel.Empty(
UiStringRes(stringId),
image = R.drawable.img_illustration_media_105dp,
isSearching = isSearching == true
image = R.drawable.img_illustration_media_105dp, isSearching = isSearching == true
)
}
}

private fun showEmptyState(
emptyState: EmptyState,
isSearching: Boolean?
) = Empty(
emptyState.title,
emptyState.htmlSubtitle,
emptyState.image,
emptyState.bottomImage,
emptyState.bottomImageDescription,
isSearching == true,
retryAction = if (emptyState.isError) {
this::retry
} else {
null
}
)

private fun loadNextPage(
uiItems: List<MediaPickerUiItem>,
domainModel: DomainModel
): Data {
val updatedItems = uiItems.toMutableList()
val loaderItem = if (domainModel.emptyState?.isError == true) {
NextPageLoader(false) {
launch {
retry()
}
}
} else {
NextPageLoader(true) {
launch {
loadActions.send(NextPage)
}
}
}
updatedItems.add(loaderItem)
return Data(items = updatedItems)
}

private fun buildActionModeUiModel(
selectedIds: List<Identifier>?,
items: List<MediaItem>?
Expand Down
Loading