Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,10 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL
showShortToast(context, R.string.menu_from_gallery)
true
}
binding!!.fabCustomGallery.setOnClickListener { v: View? ->
launchCustomSelector()
animateFAB(isFabOpen)
}
}

/**
Expand All @@ -407,7 +411,6 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL
requireActivity(),
customSelectorLauncherForResult
)
animateFAB(isFabOpen)
}

fun scrollToTop() {
Expand Down
162 changes: 162 additions & 0 deletions app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,33 @@
package fr.free.nrw.commons.upload

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.paging.PagedList
import android.Manifest.permission
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.R
import fr.free.nrw.commons.contributions.Contribution
import fr.free.nrw.commons.contributions.ContributionController
import fr.free.nrw.commons.contributions.Contribution.Companion.STATE_IN_PROGRESS
import fr.free.nrw.commons.contributions.Contribution.Companion.STATE_PAUSED
import fr.free.nrw.commons.contributions.Contribution.Companion.STATE_QUEUED
import fr.free.nrw.commons.databinding.FragmentPendingUploadsBinding
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
import fr.free.nrw.commons.filepicker.FilePicker
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
import fr.free.nrw.commons.utils.ViewUtil
import fr.free.nrw.commons.utils.ViewUtil.showShortToast
import java.util.Locale
import javax.inject.Inject

Expand All @@ -28,6 +39,9 @@ class PendingUploadsFragment :
CommonsDaggerSupportFragment(),
PendingUploadsContract.View,
PendingUploadsAdapter.Callback {
@Inject
lateinit var contributionController: ContributionController

@Inject
lateinit var pendingUploadsPresenter: PendingUploadsPresenter

Expand All @@ -41,13 +55,78 @@ class PendingUploadsFragment :

private var contributionsList = mutableListOf<Contribution>()

private var fabClose: Animation? = null
private var fabOpen: Animation? = null
private var rotateForward: Animation? = null
private var rotateBackward: Animation? = null
private var isFabOpen = false
private val customSelectorLauncherForResult = registerForActivityResult<Intent, ActivityResult>(
StartActivityForResult()
) { result: ActivityResult? ->
contributionController.handleActivityResultWithCallback(requireActivity()
) { callbacks: FilePicker.Callbacks? ->
contributionController.onPictureReturnedFromCustomSelector(
result!!, requireActivity(), callbacks!!
)
}
}

private val galleryPickLauncherForResult = registerForActivityResult<Intent, ActivityResult>(
StartActivityForResult()
) { result: ActivityResult? ->
contributionController.handleActivityResultWithCallback(requireActivity()
) { callbacks: FilePicker.Callbacks? ->
contributionController.onPictureReturnedFromGallery(
result!!, requireActivity(), callbacks!!
)
}
}

private val cameraPickLauncherForResult = registerForActivityResult<Intent, ActivityResult>(
StartActivityForResult()
) { result: ActivityResult? ->
contributionController.handleActivityResultWithCallback(requireActivity()
) { callbacks: FilePicker.Callbacks? ->
contributionController.onPictureReturnedFromCamera(
result!!, requireActivity(), callbacks!!
)
}
}

private lateinit var inAppCameraLocationPermissionLauncher:
ActivityResultLauncher<Array<String>>

override fun onAttach(context: Context) {
super.onAttach(context)
if (context is UploadProgressActivity) {
uploadProgressActivity = context
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

//initialise the location permission launcher
inAppCameraLocationPermissionLauncher =
registerForActivityResult(RequestMultiplePermissions()) { result ->
val areAllGranted = result.values.all { it }

if (areAllGranted) {
contributionController.locationPermissionCallback?.onLocationPermissionGranted()
} else {
activity?.let { currentActivity ->
if (currentActivity.shouldShowRequestPermissionRationale(
permission.ACCESS_FINE_LOCATION)) {
}
contributionController.locationPermissionCallback?.onLocationPermissionDenied(
currentActivity.getString(
R.string.in_app_camera_location_permission_denied)
)
}
}
}
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -70,6 +149,87 @@ class PendingUploadsFragment :
) {
super.onViewCreated(view, savedInstanceState)
initRecyclerView()
initializeAnimations()
setListeners()
}

private fun initializeAnimations() {
fabOpen = AnimationUtils.loadAnimation(activity, R.anim.fab_open)
fabClose = AnimationUtils.loadAnimation(activity, R.anim.fab_close)
rotateForward = AnimationUtils.loadAnimation(activity, R.anim.rotate_forward)
rotateBackward = AnimationUtils.loadAnimation(activity, R.anim.rotate_backward)
}

private fun setListeners() {
binding.fabPlus.setOnClickListener { view: View? -> animateFAB(isFabOpen) }

binding.fabCamera.setOnClickListener { view: View? ->
contributionController.initiateCameraPick(
requireActivity(),
inAppCameraLocationPermissionLauncher,
cameraPickLauncherForResult
)
animateFAB(isFabOpen)
}
binding.fabCamera.setOnLongClickListener { view: View? ->
showShortToast(
context,
R.string.add_contribution_from_camera
)
true
}

binding.fabGallery.setOnClickListener { view: View? ->
contributionController.initiateGalleryPick(requireActivity(), galleryPickLauncherForResult, true)
animateFAB(isFabOpen)
}
binding.fabGallery.setOnLongClickListener { view: View? ->
showShortToast(context, R.string.menu_from_gallery)
true
}

binding.fabCustomGallery.setOnClickListener { v: View? ->
launchCustomSelector()
animateFAB(isFabOpen)
}
binding.fabCustomGallery.setOnLongClickListener { view: View? ->
showShortToast(context, R.string.custom_selector_title)
true
}
}

/**
* launch Custom Selector.
*/
private fun launchCustomSelector() {
contributionController.initiateCustomGalleryPickWithPermission(
requireActivity(),
customSelectorLauncherForResult
)
}

private fun animateFAB(isFabOpen: Boolean) {
this.isFabOpen = !isFabOpen
if (binding.fabPlus.isShown) {
if (isFabOpen) {
binding.fabPlus.startAnimation(rotateBackward)
binding.fabCamera.startAnimation(fabClose)
binding.fabGallery.startAnimation(fabClose)
binding.fabCustomGallery.startAnimation(fabClose)
binding.fabCamera.hide()
binding.fabGallery.hide()
binding.fabCustomGallery.hide()
} else {
binding.fabPlus.startAnimation(rotateForward)
binding.fabCamera.startAnimation(fabOpen)
binding.fabGallery.startAnimation(fabOpen)
binding.fabCustomGallery.startAnimation(fabOpen)
binding.fabCamera.show()
binding.fabGallery.show()
binding.fabCustomGallery.show()
}
this.isFabOpen = !isFabOpen
}
}

/**
Expand Down Expand Up @@ -101,6 +261,7 @@ class PendingUploadsFragment :
binding.nopendingTextView.visibility = View.VISIBLE
binding.pendingUplaodsLl.visibility = View.GONE
uploadProgressActivity.hidePendingIcons()
binding.fabLayout.visibility = View.VISIBLE
} else {
binding.nopendingTextView.visibility = View.GONE
binding.pendingUplaodsLl.visibility = View.VISIBLE
Expand All @@ -111,6 +272,7 @@ class PendingUploadsFragment :
} else {
uploadProgressActivity.setPausedIcon(false)
}
binding.fabLayout.visibility = View.VISIBLE
}
}
}
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.auth.LoginActivity
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.contributions.ContributionController
import fr.free.nrw.commons.contributions.MainActivity
import fr.free.nrw.commons.databinding.ActivityUploadBinding
import fr.free.nrw.commons.filepicker.Constants.RequestCodes
import fr.free.nrw.commons.filepicker.UploadableFile
Expand Down Expand Up @@ -362,7 +363,15 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
super.onStop()
}

override fun returnToMainActivity() = finish()
override fun returnToMainActivity() {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)

finish() // close the current UploadActivity
}



/**
* go to the uploadProgress activity to check the status of uploading
Expand Down
83 changes: 79 additions & 4 deletions app/src/main/res/layout/fragment_pending_uploads.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".upload.PendingUploadsFragment">

<LinearLayout
android:id="@+id/container_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:gravity="center"
android:orientation="vertical"
android:layout_marginBottom="16dp">

<TextView
android:id="@+id/nopendingTextView"
android:layout_width="match_parent"
Expand Down Expand Up @@ -61,7 +69,74 @@
android:layout_height="match_parent"
android:layout_marginHorizontal="10dp" />

</LinearLayout>
</LinearLayout>

<LinearLayout
android:id="@+id/fab_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="@dimen/medium_height"
android:layout_marginBottom="@dimen/activity_margin_horizontal"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/add_contribution_from_camera"
android:tint="@color/button_blue"
android:visibility="gone"
app:backgroundTint="@color/main_background_light"
app:elevation="@dimen/tiny_margin"
app:fabSize="mini"
app:srcCompat="@drawable/ic_photo_camera_white_24dp"
app:useCompatPadding="true" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_gallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/add_contribution_from_photos"
android:tint="@color/button_blue"
android:visibility="gone"
app:backgroundTint="@color/main_background_light"
app:elevation="@dimen/tiny_margin"
app:fabSize="mini"
app:srcCompat="@drawable/ic_photo_white_24dp"
app:useCompatPadding="true" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_custom_gallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/commons"
android:contentDescription="@string/add_contribution_from_contributions_gallery"
android:tint="@color/button_blue"
android:visibility="gone"
app:backgroundTint="@color/main_background_light"
app:elevation="@dimen/tiny_margin"
app:fabSize="mini"
app:srcCompat="@drawable/ic_custom_image_picker"
app:useCompatPadding="true" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/add_new_contribution"
android:gravity="center_vertical"
android:visibility="visible"
app:backgroundTint="@color/status_bar_blue"
app:elevation="@dimen/tiny_margin"
app:srcCompat="@drawable/ic_add_white_24dp"
app:useCompatPadding="true" />

</LinearLayout>

</LinearLayout>
</RelativeLayout>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -888,5 +888,6 @@ Upload your first media by tapping on the add button.</string>
<string name="image_tag_line_created_by_and_uploaded_by">Created by %1$s and uploaded by %2$s</string>
<string name="nominated_for_deletion_btn">Nominated for Deletion</string>
<string name="custom_selector_max_image_limit_reached">You can only select a maximum of %d images.</string>
<string name="add_new_upload">Add new upload</string>

</resources>