Merge branch 'main' into psh/convert-upload-to-kotlin-I

This commit is contained in:
Nicolas Raoul 2024-12-13 22:50:46 +09:00 committed by GitHub
commit 147ee41b1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 78 additions and 39 deletions

View file

@ -18,7 +18,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import androidx.test.rule.GrantPermissionRule import androidx.test.rule.GrantPermissionRule
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity import fr.free.nrw.commons.locationpicker.LocationPickerActivity
import fr.free.nrw.commons.UITestHelper.Companion.childAtPosition import fr.free.nrw.commons.UITestHelper.Companion.childAtPosition
import fr.free.nrw.commons.auth.LoginActivity import fr.free.nrw.commons.auth.LoginActivity
import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers

View file

@ -171,7 +171,7 @@
android:name=".review.ReviewActivity" android:name=".review.ReviewActivity"
android:label="@string/title_activity_review" /> android:label="@string/title_activity_review" />
<activity <activity
android:name=".LocationPicker.LocationPickerActivity" android:name=".locationpicker.LocationPickerActivity"
android:label="Location Picker" /> android:label="Location Picker" />
<service <service

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.di
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import fr.free.nrw.commons.AboutActivity import fr.free.nrw.commons.AboutActivity
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity import fr.free.nrw.commons.locationpicker.LocationPickerActivity
import fr.free.nrw.commons.WelcomeActivity import fr.free.nrw.commons.WelcomeActivity
import fr.free.nrw.commons.auth.LoginActivity import fr.free.nrw.commons.auth.LoginActivity
import fr.free.nrw.commons.auth.SignupActivity import fr.free.nrw.commons.auth.SignupActivity

View file

@ -1,4 +1,4 @@
package fr.free.nrw.commons.LocationPicker package fr.free.nrw.commons.locationpicker
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
@ -32,7 +32,7 @@ object LocationPicker {
/** /**
* Gets and puts location in intent * Gets and puts location in intent
* @param position CameraPosition * @param position CameraPosition
* @return LocationPicker.IntentBuilder * @return locationpicker.IntentBuilder
*/ */
fun defaultLocation(position: CameraPosition): IntentBuilder { fun defaultLocation(position: CameraPosition): IntentBuilder {
intent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION, position) intent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION, position)
@ -42,7 +42,7 @@ object LocationPicker {
/** /**
* Gets and puts activity name in intent * Gets and puts activity name in intent
* @param activity activity key * @param activity activity key
* @return LocationPicker.IntentBuilder * @return locationpicker.IntentBuilder
*/ */
fun activityKey(activity: String): IntentBuilder { fun activityKey(activity: String): IntentBuilder {
intent.putExtra(LocationPickerConstants.ACTIVITY_KEY, activity) intent.putExtra(LocationPickerConstants.ACTIVITY_KEY, activity)
@ -52,7 +52,7 @@ object LocationPicker {
/** /**
* Gets and puts media in intent * Gets and puts media in intent
* @param media Media * @param media Media
* @return LocationPicker.IntentBuilder * @return locationpicker.IntentBuilder
*/ */
fun media(media: Media): IntentBuilder { fun media(media: Media): IntentBuilder {
intent.putExtra(LocationPickerConstants.MEDIA, media) intent.putExtra(LocationPickerConstants.MEDIA, media)

View file

@ -1,4 +1,4 @@
package fr.free.nrw.commons.LocationPicker package fr.free.nrw.commons.locationpicker
import android.Manifest.permission import android.Manifest.permission
import android.annotation.SuppressLint import android.annotation.SuppressLint
@ -8,8 +8,7 @@ import android.graphics.Color
import android.graphics.Paint import android.graphics.Paint
import android.location.LocationManager import android.location.LocationManager
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import androidx.preference.PreferenceManager
import android.text.Html
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
@ -23,6 +22,9 @@ import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.IntentCompat
import androidx.core.os.BundleCompat
import androidx.core.text.HtmlCompat
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import fr.free.nrw.commons.CameraPosition import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.CommonsApplication import fr.free.nrw.commons.CommonsApplication
@ -181,13 +183,25 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
setContentView(R.layout.activity_location_picker) setContentView(R.layout.activity_location_picker)
if (savedInstanceState == null) { if (savedInstanceState == null) {
cameraPosition = intent.getParcelableExtra(LocationPickerConstants.MAP_CAMERA_POSITION) cameraPosition = IntentCompat.getParcelableExtra(
intent,
LocationPickerConstants.MAP_CAMERA_POSITION,
CameraPosition::class.java
)
activity = intent.getStringExtra(LocationPickerConstants.ACTIVITY_KEY) activity = intent.getStringExtra(LocationPickerConstants.ACTIVITY_KEY)
media = intent.getParcelableExtra(LocationPickerConstants.MEDIA) media = IntentCompat.getParcelableExtra(
intent,
LocationPickerConstants.MEDIA,
Media::class.java
)
} else { } else {
cameraPosition = savedInstanceState.getParcelable(CAMERA_POS) cameraPosition = BundleCompat.getParcelable(
savedInstanceState,
CAMERA_POS,
CameraPosition::class.java
)
activity = savedInstanceState.getString(ACTIVITY) activity = savedInstanceState.getString(ACTIVITY)
media = savedInstanceState.getParcelable("sMedia") media = BundleCompat.getParcelable(savedInstanceState, "sMedia", Media::class.java)
} }
bindViews() bindViews()
@ -270,7 +284,10 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
* For showing credits * For showing credits
*/ */
private fun addCredits() { private fun addCredits() {
tvAttribution.text = Html.fromHtml(getString(R.string.map_attribution)) tvAttribution.text = HtmlCompat.fromHtml(
getString(R.string.map_attribution),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
tvAttribution.movementMethod = LinkMovementMethod.getInstance() tvAttribution.movementMethod = LinkMovementMethod.getInstance()
} }
@ -396,7 +413,11 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
val position = when { val position = when {
//location metadata is available //location metadata is available
activity == "UploadActivity" && cameraPosition != null -> { activity == "UploadActivity" && cameraPosition != null -> {
fr.free.nrw.commons.location.LatLng(cameraPosition!!.latitude, cameraPosition!!.longitude, 0.0f) fr.free.nrw.commons.location.LatLng(
cameraPosition!!.latitude,
cameraPosition!!.longitude,
0.0f
)
} }
//location metadata is not available //location metadata is not available
mapView != null -> { mapView != null -> {
@ -447,14 +468,18 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
LAST_LOCATION, LAST_LOCATION,
"${mapView?.mapCenter?.latitude},${mapView?.mapCenter?.longitude}" "${mapView?.mapCenter?.latitude},${mapView?.mapCenter?.longitude}"
) )
applicationKvStore.putString(LAST_ZOOM, mapView?.zoomLevel?.toString()!!) applicationKvStore.putString(LAST_ZOOM, mapView?.zoomLevelDouble?.toString()!!)
} }
if (media == null) { if (media == null) {
val intent = Intent().apply { val intent = Intent().apply {
putExtra( putExtra(
LocationPickerConstants.MAP_CAMERA_POSITION, LocationPickerConstants.MAP_CAMERA_POSITION,
CameraPosition(mapView?.mapCenter?.latitude!!, mapView?.mapCenter?.longitude!!, 14.0) CameraPosition(
mapView?.mapCenter?.latitude!!,
mapView?.mapCenter?.longitude!!,
14.0
)
) )
} }
setResult(RESULT_OK, intent) setResult(RESULT_OK, intent)
@ -556,8 +581,15 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
) )
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { override fun onRequestPermissionsResult(
if (requestCode == Constants.RequestCodes.LOCATION && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == Constants.RequestCodes.LOCATION &&
grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
onLocationPermissionGranted() onLocationPermissionGranted()
} else { } else {
onLocationPermissionDenied(getString(R.string.upload_map_location_access)) onLocationPermissionDenied(getString(R.string.upload_map_location_access))
@ -577,12 +609,18 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
override fun onLocationPermissionDenied(toastMessage: String) { override fun onLocationPermissionDenied(toastMessage: String) {
val isDeniedBefore = store.getBoolean("isPermissionDenied", false) val isDeniedBefore = store.getBoolean("isPermissionDenied", false)
val showRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permission.ACCESS_FINE_LOCATION) val showRationale = ActivityCompat.shouldShowRequestPermissionRationale(
this,
permission.ACCESS_FINE_LOCATION
)
if (!showRationale) { if (!showRationale) {
if (!locationPermissionsHelper.checkLocationPermission(this)) { if (!locationPermissionsHelper.checkLocationPermission(this)) {
if (isDeniedBefore) { if (isDeniedBefore) {
locationPermissionsHelper.showAppSettingsDialog(this, R.string.upload_map_location_access) locationPermissionsHelper.showAppSettingsDialog(
this,
R.string.upload_map_location_access
)
} else { } else {
Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show() Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show()
} }
@ -601,7 +639,10 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
addMarkerAtGPSLocation() addMarkerAtGPSLocation()
} else { } else {
addMarkerAtGPSLocation() addMarkerAtGPSLocation()
locationPermissionsHelper.showLocationOffDialog(this, R.string.ask_to_turn_location_on_text) locationPermissionsHelper.showLocationOffDialog(
this,
R.string.ask_to_turn_location_on_text
)
} }
} }
} }
@ -652,7 +693,10 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER,
Marker.ANCHOR_BOTTOM Marker.ANCHOR_BOTTOM
) )
icon = ContextCompat.getDrawable(this@LocationPickerActivity, R.drawable.current_location_marker) icon = ContextCompat.getDrawable(
this@LocationPickerActivity,
R.drawable.current_location_marker
)
title = "Your Location" title = "Your Location"
textLabelFontSize = 24 textLabelFontSize = 24
} }

View file

@ -1,4 +1,4 @@
package fr.free.nrw.commons.LocationPicker package fr.free.nrw.commons.locationpicker
/** /**
* Constants need for location picking * Constants need for location picking

View file

@ -1,4 +1,4 @@
package fr.free.nrw.commons.LocationPicker package fr.free.nrw.commons.locationpicker
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel

View file

@ -74,7 +74,7 @@ import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.CameraPosition import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.CommonsApplication import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.CommonsApplication.Companion.instance import fr.free.nrw.commons.CommonsApplication.Companion.instance
import fr.free.nrw.commons.LocationPicker.LocationPicker import fr.free.nrw.commons.locationpicker.LocationPicker
import fr.free.nrw.commons.Media import fr.free.nrw.commons.Media
import fr.free.nrw.commons.MediaDataExtractor import fr.free.nrw.commons.MediaDataExtractor
import fr.free.nrw.commons.R import fr.free.nrw.commons.R

View file

@ -25,7 +25,7 @@ import androidx.annotation.Nullable;
import androidx.exifinterface.media.ExifInterface; import androidx.exifinterface.media.ExifInterface;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import fr.free.nrw.commons.CameraPosition; import fr.free.nrw.commons.CameraPosition;
import fr.free.nrw.commons.LocationPicker.LocationPicker; import fr.free.nrw.commons.locationpicker.LocationPicker;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentUploadMediaDetailFragmentBinding; import fr.free.nrw.commons.databinding.FragmentUploadMediaDetailFragmentBinding;

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".LocationPicker.LocationPickerActivity"> tools:context=".locationpicker.LocationPickerActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/location_picker_app_bar_layout" android:id="@+id/location_picker_app_bar_layout"

View file

@ -11,7 +11,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.verify
import fr.free.nrw.commons.CameraPosition import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.kvstore.JsonKvStore import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION
@ -165,13 +164,13 @@ class LocationPickerActivityUnitTests {
"placeSelected", "placeSelected",
) )
`when`(mapView.mapCenter).thenReturn(position) `when`(mapView.mapCenter).thenReturn(position)
`when`(mapView.zoomLevel).thenReturn(15) `when`(mapView.zoomLevelDouble).thenReturn(15.0)
method.isAccessible = true method.isAccessible = true
method.invoke(activity) method.invoke(activity)
verify(applicationKvStore, times(1)).putString( verify(applicationKvStore, times(1)).putString(
LAST_LOCATION, LAST_LOCATION,
position.latitude.toString() + "," + position.longitude.toString(), position.latitude.toString() + "," + position.longitude.toString(),
) )
verify(applicationKvStore, times(1)).putString(LAST_ZOOM, mapView.zoomLevel.toString()) verify(applicationKvStore, times(1)).putString(LAST_ZOOM, mapView.zoomLevelDouble.toString())
} }
} }

View file

@ -7,7 +7,6 @@ import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.CameraPosition import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.LocationPicker.LocationPickerViewModel
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mockito.Mock import org.mockito.Mock

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons.media package fr.free.nrw.commons.media
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
@ -19,7 +18,6 @@ import android.widget.ProgressBar
import android.widget.ScrollView import android.widget.ScrollView
import android.widget.Spinner import android.widget.Spinner
import android.widget.TextView import android.widget.TextView
import androidx.activity.result.ActivityResult
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
@ -27,10 +25,9 @@ import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.generic.GenericDraweeHierarchy import com.facebook.drawee.generic.GenericDraweeHierarchy
import com.facebook.drawee.view.SimpleDraweeView import com.facebook.drawee.view.SimpleDraweeView
import com.facebook.soloader.SoLoader import com.facebook.soloader.SoLoader
import com.nhaarman.mockitokotlin2.anyOrNull
import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.whenever import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity import fr.free.nrw.commons.locationpicker.LocationPickerActivity
import fr.free.nrw.commons.Media import fr.free.nrw.commons.Media
import fr.free.nrw.commons.OkHttpConnectionFactory import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.TestCommonsApplication

View file

@ -21,8 +21,8 @@ import androidx.test.core.app.ApplicationProvider
import com.github.chrisbanes.photoview.PhotoView import com.github.chrisbanes.photoview.PhotoView
import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.mock
import fr.free.nrw.commons.CameraPosition import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.LocationPicker.LocationPicker import fr.free.nrw.commons.locationpicker.LocationPicker
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity import fr.free.nrw.commons.locationpicker.LocationPickerActivity
import fr.free.nrw.commons.OkHttpConnectionFactory import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.TestCommonsApplication