From a7e8a6f1ed3adcbc508196035ab210876f3ba32f Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 24 May 2021 01:40:40 +0200 Subject: [PATCH] Add location field to note editor and display in note details --- app/src/main/AndroidManifest.xml | 2 +- .../activities/NoteEditorFragment.kt | 101 +++++++++++++----- .../profinote/models/NoteEditorViewModel.kt | 59 ++++++---- .../baseline_my_location_black_18.png | Bin 0 -> 299 bytes .../baseline_my_location_black_20.png | Bin 0 -> 317 bytes .../baseline_my_location_black_24.png | Bin 0 -> 376 bytes .../baseline_my_location_black_36.png | Bin 0 -> 543 bytes .../baseline_my_location_black_48.png | Bin 0 -> 677 bytes .../baseline_my_location_black_18.png | Bin 0 -> 211 bytes .../baseline_my_location_black_20.png | Bin 0 -> 233 bytes .../baseline_my_location_black_24.png | Bin 0 -> 244 bytes .../baseline_my_location_black_36.png | Bin 0 -> 376 bytes .../baseline_my_location_black_48.png | Bin 0 -> 454 bytes .../baseline_my_location_black_18.png | Bin 0 -> 376 bytes .../baseline_my_location_black_20.png | Bin 0 -> 412 bytes .../baseline_my_location_black_24.png | Bin 0 -> 454 bytes .../baseline_my_location_black_36.png | Bin 0 -> 677 bytes .../baseline_my_location_black_48.png | Bin 0 -> 945 bytes .../baseline_my_location_black_18.png | Bin 0 -> 543 bytes .../baseline_my_location_black_20.png | Bin 0 -> 573 bytes .../baseline_my_location_black_24.png | Bin 0 -> 677 bytes .../baseline_my_location_black_36.png | Bin 0 -> 1066 bytes .../baseline_my_location_black_48.png | Bin 0 -> 1402 bytes .../baseline_my_location_black_18.png | Bin 0 -> 677 bytes .../baseline_my_location_black_20.png | Bin 0 -> 788 bytes .../baseline_my_location_black_24.png | Bin 0 -> 945 bytes .../baseline_my_location_black_36.png | Bin 0 -> 1402 bytes .../baseline_my_location_black_48.png | Bin 0 -> 1956 bytes .../res/drawable/baseline_my_location_24.xml | 10 ++ .../main/res/layout/fragment_note_details.xml | 46 +++++++- .../main/res/layout/fragment_note_editor.xml | 27 ++++- app/src/main/res/values/strings.xml | 1 + build.gradle | 4 +- ...eocodingService.kt => GeocodingService.kt} | 14 ++- .../data/geocoding/GeocodingService.kt | 5 - gradle.properties | 2 +- 36 files changed, 210 insertions(+), 61 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/baseline_my_location_black_18.png create mode 100644 app/src/main/res/drawable-hdpi/baseline_my_location_black_20.png create mode 100644 app/src/main/res/drawable-hdpi/baseline_my_location_black_24.png create mode 100644 app/src/main/res/drawable-hdpi/baseline_my_location_black_36.png create mode 100644 app/src/main/res/drawable-hdpi/baseline_my_location_black_48.png create mode 100644 app/src/main/res/drawable-mdpi/baseline_my_location_black_18.png create mode 100644 app/src/main/res/drawable-mdpi/baseline_my_location_black_20.png create mode 100644 app/src/main/res/drawable-mdpi/baseline_my_location_black_24.png create mode 100644 app/src/main/res/drawable-mdpi/baseline_my_location_black_36.png create mode 100644 app/src/main/res/drawable-mdpi/baseline_my_location_black_48.png create mode 100644 app/src/main/res/drawable-xhdpi/baseline_my_location_black_18.png create mode 100644 app/src/main/res/drawable-xhdpi/baseline_my_location_black_20.png create mode 100644 app/src/main/res/drawable-xhdpi/baseline_my_location_black_24.png create mode 100644 app/src/main/res/drawable-xhdpi/baseline_my_location_black_36.png create mode 100644 app/src/main/res/drawable-xhdpi/baseline_my_location_black_48.png create mode 100644 app/src/main/res/drawable-xxhdpi/baseline_my_location_black_18.png create mode 100644 app/src/main/res/drawable-xxhdpi/baseline_my_location_black_20.png create mode 100644 app/src/main/res/drawable-xxhdpi/baseline_my_location_black_24.png create mode 100644 app/src/main/res/drawable-xxhdpi/baseline_my_location_black_36.png create mode 100644 app/src/main/res/drawable-xxhdpi/baseline_my_location_black_48.png create mode 100644 app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_18.png create mode 100644 app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_20.png create mode 100644 app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_24.png create mode 100644 app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_36.png create mode 100644 app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_48.png create mode 100644 app/src/main/res/drawable/baseline_my_location_24.xml rename data-lib/src/main/java/me/profiluefter/profinote/data/{geocoding/LocationIQGeocodingService.kt => GeocodingService.kt} (77%) delete mode 100644 data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/GeocodingService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5a9e08b..f3fd50d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ - + () private val viewModel: MainViewModel by activityViewModels() - private val editor: NoteEditorViewModel by viewModels { - NoteEditorViewModelFactory( - args.note - ) - } + private val editor: NoteEditorViewModel by viewModels() + + private val gpsRequestCode = 1337 override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View = DataBindingUtil.inflate( - inflater, - R.layout.fragment_note_editor, - container, - false + inflater, + R.layout.fragment_note_editor, + container, + false ).apply { + editor.setInitialNote(args.note) + lifecycleOwner = this@NoteEditorFragment fragment = this@NoteEditorFragment layoutViewModel = this@NoteEditorFragment.editor - }.also { binding -> + enterTransition = MaterialContainerTransform().apply { startView = requireActivity().findViewById(R.id.floatingActionButton) - endView = binding.root + endView = root duration = resources.getInteger(R.integer.notian_animation_time).toLong() scrimColor = Color.TRANSPARENT containerColor = requireContext().themeColor(R.attr.colorSurface) @@ -58,10 +67,50 @@ class NoteEditorFragment : Fragment() { } returnTransition = Slide().apply { duration = resources.getInteger(R.integer.notian_animation_time).toLong() - addTarget(binding.root) + addTarget(root) + } + + noteEditorLocationContainer.setEndIconOnClickListener { + val permission = requireContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) + + if (permission != PackageManager.PERMISSION_GRANTED) { + requireActivity().requestPermissions( + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + gpsRequestCode + ) + } else { + searchGPS() + } } }.root + @Suppress("JoinDeclarationAndAssignment") // IntelliJ Bug + @SuppressLint("MissingPermission") // Only called if permission is granted + private fun searchGPS() { + val locationManager = requireContext().getSystemService()!! + + lateinit var locationListener: LocationListener + locationListener = LocationListener { + Log.i("NoteEditorFragment", "Received location $it") + editor.receivedGPS(it.latitude, it.longitude) + locationManager.removeUpdates(locationListener) + } + + val provider = locationManager.getBestProvider(Criteria().apply { + this.isCostAllowed = false + this.accuracy = Criteria.ACCURACY_FINE + }, true)!! + Log.i("NoteEditorFragment", "Using provider $provider") + locationManager.requestLocationUpdates(provider, 0L, 0.0f, locationListener) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if (requestCode != gpsRequestCode) return + + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) + searchGPS() + } + fun saveNote() { if (editor.localID == 0) viewModel.addNote(editor.note) @@ -73,11 +122,11 @@ class NoteEditorFragment : Fragment() { fun openTimePicker(view: View) { val calendar = Calendar.getInstance() val dialog = TimePickerDialog( - requireContext(), - { _, hour, minute -> editor.setTime(hour, minute) }, - calendar.get(Calendar.HOUR_OF_DAY), - calendar.get(Calendar.MINUTE), - false + requireContext(), + { _, hour, minute -> editor.setTime(hour, minute) }, + calendar.get(Calendar.HOUR_OF_DAY), + calendar.get(Calendar.MINUTE), + false ) dialog.show() } @@ -85,11 +134,11 @@ class NoteEditorFragment : Fragment() { fun openDatePicker(view: View) { val calendar = Calendar.getInstance() val dialog = DatePickerDialog( - requireContext(), - { _, year, month, day -> editor.setDate(day, month + 1, year) }, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) + requireContext(), + { _, year, month, day -> editor.setDate(day, month + 1, year) }, + calendar.get(Calendar.YEAR), + calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH) ) dialog.show() } diff --git a/app/src/main/java/me/profiluefter/profinote/models/NoteEditorViewModel.kt b/app/src/main/java/me/profiluefter/profinote/models/NoteEditorViewModel.kt index 61cad50..61f707c 100644 --- a/app/src/main/java/me/profiluefter/profinote/models/NoteEditorViewModel.kt +++ b/app/src/main/java/me/profiluefter/profinote/models/NoteEditorViewModel.kt @@ -2,19 +2,15 @@ package me.profiluefter.profinote.models import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import me.profiluefter.profinote.data.GeocodingService import me.profiluefter.profinote.data.entities.* +import javax.inject.Inject -class NoteEditorViewModelFactory(private val note: Note) : ViewModelProvider.Factory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - if (!modelClass.isAssignableFrom(NoteEditorViewModel::class.java)) - throw IllegalArgumentException("Unknown ViewModel") - return NoteEditorViewModel(note) as T - } -} - -class NoteEditorViewModel(note: Note) : ViewModel() { +@HiltViewModel +class NoteEditorViewModel @Inject constructor(private val geocodingService: GeocodingService) : ViewModel() { fun setTime(hour: Int, minute: Int) { time.value = formatTime(hour, minute) } @@ -23,19 +19,40 @@ class NoteEditorViewModel(note: Note) : ViewModel() { date.value = formatDate(day, month, year) } - val localID: Int = note.localID - val title: MutableLiveData = MutableLiveData(note.title) - val done: MutableLiveData = MutableLiveData(note.done) - val date: MutableLiveData = MutableLiveData(note.date) - val time: MutableLiveData = MutableLiveData(note.time) - val description: MutableLiveData = MutableLiveData(note.description) + fun receivedGPS(latitude: Double, longitude: Double) { + viewModelScope.launch { + val location = geocodingService.reverse(latitude, longitude) + this@NoteEditorViewModel.location.value = location + this@NoteEditorViewModel.longitude.value = longitude + this@NoteEditorViewModel.latitude.value = latitude + } + } + + fun setInitialNote(note: Note) { + localID = note.localID + title.value = note.title + done.value = note.done + date.value = note.date + time.value = note.time + description.value = note.description + } + + var localID: Int? = null + val title: MutableLiveData = MutableLiveData() + val done: MutableLiveData = MutableLiveData() + val date: MutableLiveData = MutableLiveData() + val time: MutableLiveData = MutableLiveData() + val description: MutableLiveData = MutableLiveData() + val latitude: MutableLiveData = MutableLiveData() + val longitude: MutableLiveData = MutableLiveData() + val location: MutableLiveData = MutableLiveData() val note: Note get() { val (day, month, year) = date.value!!.split(".").map { it.toInt() } val (hour, minute) = time.value!!.split(":").map { it.toInt() } return Note( - localID, + localID!!, title.value!!, done.value!!, minute, @@ -44,9 +61,9 @@ class NoteEditorViewModel(note: Note) : ViewModel() { month, year, description.value!!, - 0.0, - 0.0, - "", + latitude.value!!, + longitude.value!!, + location.value!! ) } } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/baseline_my_location_black_18.png b/app/src/main/res/drawable-hdpi/baseline_my_location_black_18.png new file mode 100644 index 0000000000000000000000000000000000000000..4306ce8b2773d16cb3543c16422f7581055da321 GIT binary patch literal 299 zcmV+`0o4A9P)`wbZ}=ZH8mXY?JCvO|r%BmImF$n9#y8poQ-?3}?nXvhX3JV{MW@CdPC z*p20gD_Mspo=Y}?S78)9ORuf@?DI6>SP zH?bL_q6fgDm4F2RJu1YkUPg`+VrBNeh3!pWAx^kw$(80V%zbWQXVVL_%c$1^{}vI+ xz`O-lNnlL|cR*mj1$TGEEQy$05p(k6x&zBp&_wSUaIF9U002ovPDHLkV1leEfY$&3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_my_location_black_20.png b/app/src/main/res/drawable-hdpi/baseline_my_location_black_20.png new file mode 100644 index 0000000000000000000000000000000000000000..13996da9cf5fd96e496638ac12dd5e5ad7f3bf19 GIT binary patch literal 317 zcmV-D0mA-?P)KSQ-i7-(b5bGyRgz>+}JC z8Z&ZoX1~E9LWIA;D}-2mi!DewAvaH?EItDR3XeU{g5Vvxp+bm~16v{@wj3xCqGIzJ zy&-C1rmgstm>O{##sezEnR#z^&KXhlAAUlCs0YvoULy)7eF_T^`|pU1D_1fiABz#{ zQ$9tMzSez9>AkPLM5JB#h)CRe*}15t%Or?nyN5&82(fdKtOI8*vqOkAVbk-u-_lff z>A)ASL=(wJfKA6X2{yu2nVQ7Zo~DOke3C{pFxrsO0L|7rg6W%nH*d!skSYSu3EH-l P00000NkvXXu0mjffS`eJ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_my_location_black_24.png b/app/src/main/res/drawable-hdpi/baseline_my_location_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..511242223a51e8cccc3da90908aacda31a5cd822 GIT binary patch literal 376 zcmV-;0f+vHP)#DG+Bi^A3g{e$oaKp=r}6Dt)d6tEEXlK8#8 z#)<0`_?iu2$cLW`8C=NCj|er<$BKnkG-|#hQNtJsjx6H*NRcriFIW$0LBjWx(26#} zNgn&d95MNvMlN WwsfpABF?S=00004iZ?HA{8YJ{qLQ6xTMJWmFbR&^r7!I9CNr4)I!G28M%Xiy0|$GIpdtHA zOcHfWapo}Ie#R7aB%gsQV|^Fn?Q4|(21=ukOC*#72N(2_eiW6#N|?@ufi{{@prDC1 z4A_Fj3YkYx1su6)CXkWxS*0Lj!r2{Bh`%Z?YKc;ybqPxjmx&jvl_wH95}_Um=$`1V z;>2#i+)hv}dU)ZYDSevhUJj>CJ@P_?AJ+`cL=DUe<%o`qA_+wQ?4?Ebf zu|p5l8?pP9N+TRLV;dnVFpq`rATN;jDf7COvoKVS<-oBpQh|9hZ51XDO?D->pN_R2qoy>J^z z1wtzQHyvuybVZtoNk1{fA5YS$ioM&kE3ak>Bi002ovPDHLkV1nrJ?z8{^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_my_location_black_48.png b/app/src/main/res/drawable-hdpi/baseline_my_location_black_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b94a313ddc8f432446ae03596ce494ef4999dcc8 GIT binary patch literal 677 zcmV;W0$TlvP)_w{K%yb|6xv}Zwb0NJjRm#snHUoS zSQ&S3_i*<(aiX_V?#$eGyR$Rj&O$o=;g~6s0!jg;fRY?#8l2J70QESdL3!Cws$B4* z0SU_s7gU!4CCeehxlmLYa!B?k;p{SU2JJNeOlDmqyRvHO=`60^KR8YO$JPcON;Xd_Q*xrM8CAo2Rrkb-SD&9USJZV0r@x!|mI$5{mWBJK*8#-~ZlE6wR@7%E( zd!<*o3+1I1efm3-6I{jXTi(rx~fYPJ=6+dF7R7 zu4u3xsoT_i9{9!2P|G{^gI=V=*vK?vIus+4z(8XH9&uFFK4DLT+jFX0z;;BcRJA<# z(z#-GZ`C+qGPjscII-H@D>~=y8>X_see3E>zOC;Q>niPQtkQAQ%34LwSz;$}q#Q*{ z*;ScC+Mlq=wv&UXc z@z}7hDYG|jmpxTB49#mVK-Y%-Mx?G2AhUu!dI5U0RJDZwnH4ASB==^O{9Ay;ZP~8{ zwYXz1Ix&hX9pZ|sIQk)upb4a~;z+)@YmmT;qPVNHz-EKEc8tJ=mB5ysz^13bwy?Oy zxyYvlfsZc&pQl7V;C=BWF;AR2_ZIUA9DT_YF;YM&pg#vF9ZMY_uEx`tBCMG)00000 LNkvXXu0mjf^_)PQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_my_location_black_18.png b/app/src/main/res/drawable-mdpi/baseline_my_location_black_18.png new file mode 100644 index 0000000000000000000000000000000000000000..def8ab6232b7d2f9b9589292e6cca4fae72ac60b GIT binary patch literal 211 zcmV;^04)EBP)r;MwQ^XJGI56Ed!_<>Z#HIm8mI hazp3j4*U3re4^`%a;I)cwgI}G!PC{xWt~$(698}fS4jW> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_my_location_black_24.png b/app/src/main/res/drawable-mdpi/baseline_my_location_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..056bbd4709567504e43614819fb63bf9a7374482 GIT binary patch literal 244 zcmVE7LY_XA%tp`QU7 zItGLo=xE*tmpHV0j`CG_jYq5)DsJ4UFsukqeV*MTdh*Dd(#DG+Bi^A3g{e$oaKp=r}6Dt)d6tEEXlK8#8 z#)<0`_?iu2$cLW`8C=NCj|er<$BKnkG-|#hQNtJsjx6H*NRcriFIW$0LBjWx(26#} zNgn&d95MNvMlN WwsfpABF?S=0000wuBIu%3tV5>>pCAZO`a; za$Q#5v{WHjxzh0 zVJ>z^tVH3I6A0vx4edg7n~lT=<(zYo^iIi$?-G|{M^$9<;u5p}jv|(3DA*USv|f7c z2lyO0bLNQ8;72a*mUi<6LIGQ9y)}Z=ZcYfOX_%$>6Xwx(1A#r*4Q1FVSKy=|8*e1=@+C5!WNS7xzR`>y6~+%c3&*wb3&;4CY2nhhP_`H^ wyeyQC7K&dB<-3&!h=nKA=NbEM0`K^J0WY$a$Eu!Ux&QzG07*qoM6N<$f|GmBcK`qY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_my_location_black_18.png b/app/src/main/res/drawable-xhdpi/baseline_my_location_black_18.png new file mode 100644 index 0000000000000000000000000000000000000000..511242223a51e8cccc3da90908aacda31a5cd822 GIT binary patch literal 376 zcmV-;0f+vHP)#DG+Bi^A3g{e$oaKp=r}6Dt)d6tEEXlK8#8 z#)<0`_?iu2$cLW`8C=NCj|er<$BKnkG-|#hQNtJsjx6H*NRcriFIW$0LBjWx(26#} zNgn&d95MNvMlN WwsfpABF?S=0000DdU*dMs}OKT=FBqzm3Qfe zoN~$T^ThC-K$nJVj9`I}&jLYgtSny(-eap>BDxPw9$g~6zI}!Ae!7HlA!baXPx)jF z^c^)zaZP>4gEClE!ICF*DP^Lzt`>s=wQDxmI#UFKDfNfIQ*=-)$4N=?J8Fd7vU=6 zhb&PGfj}tL=Gs0h{PAWQGgn!WGPF|TC+-@O)W+U>%eI2Sv(y8Ff(TowOnjnx!voIGr`^Z;T(UrpvroQQ*7)0000wuBIu%3tV5>>pCAZO`a; za$Q#5v{WHjxzh0 zVJ>z^tVH3I6A0vx4edg7n~lT=<(zYo^iIi$?-G|{M^$9<;u5p}jv|(3DA*USv|f7c z2lyO0bLNQ8;72a*mUi<6LIGQ9y)}Z=ZcYfOX_%$>6Xwx(1A#r*4Q1FVSKy=|8*e1=@+C5!WNS7xzR`>y6~+%c3&*wb3&;4CY2nhhP_`H^ wyeyQC7K&dB<-3&!h=nKA=NbEM0`K^J0WY$a$Eu!Ux&QzG07*qoM6N<$f|GmBcK`qY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_my_location_black_36.png b/app/src/main/res/drawable-xhdpi/baseline_my_location_black_36.png new file mode 100644 index 0000000000000000000000000000000000000000..b94a313ddc8f432446ae03596ce494ef4999dcc8 GIT binary patch literal 677 zcmV;W0$TlvP)_w{K%yb|6xv}Zwb0NJjRm#snHUoS zSQ&S3_i*<(aiX_V?#$eGyR$Rj&O$o=;g~6s0!jg;fRY?#8l2J70QESdL3!Cws$B4* z0SU_s7gU!4CCeehxlmLYa!B?k;p{SU2JJNeOlDmqyRvHO=`60^KR8YO$JPcON;Xd_Q*xrM8CAo2Rrkb-SD&9USJZV0r@x!|mI$5{mWBJK*8#-~ZlE6wR@7%E( zd!<*o3+1I1efm3-6I{jXTi(rx~fYPJ=6+dF7R7 zu4u3xsoT_i9{9!2P|G{^gI=V=*vK?vIus+4z(8XH9&uFFK4DLT+jFX0z;;BcRJA<# z(z#-GZ`C+qGPjscII-H@D>~=y8>X_see3E>zOC;Q>niPQtkQAQ%34LwSz;$}q#Q*{ z*;ScC+Mlq=wv&UXc z@z}7hDYG|jmpxTB49#mVK-Y%-Mx?G2AhUu!dI5U0RJDZwnH4ASB==^O{9Ay;ZP~8{ zwYXz1Ix&hX9pZ|sIQk)upb4a~;z+)@YmmT;qPVNHz-EKEc8tJ=mB5ysz^13bwy?Oy zxyYvlfsZc&pQl7V;C=BWF;AR2_ZIUA9DT_YF;YM&pg#vF9ZMY_uEx`tBCMG)00000 LNkvXXu0mjf^_)PQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_my_location_black_48.png b/app/src/main/res/drawable-xhdpi/baseline_my_location_black_48.png new file mode 100644 index 0000000000000000000000000000000000000000..746bf5874004f7c04eccc2b234acc0c38bc3155d GIT binary patch literal 945 zcmV;i15W&jP)Z!TQhvzy&@fZ6MDYmd+IYsTX-V8n=#_DDl0hJYbp2p9r}!2dxYffTk; zkO&m8jT92U7kCtD6mc&B7t1}0NF(~2pm$;phj?>@{l zcfg;-t;1MWu!ALxBaRpVAci=`v4kB|9Oms7lkJ9|#0%N|D+-uJpKbd-%%Xr-QpXFD z?S#KTj^GV4h_tLHf(&lR8C+=J=&RvBViVo2wRK|?j|7Fb%)%70c=j>mS?3V;iG?(! z|Kw3^-6y1dYfj@yxt+D1NMRf)I;mn*i}q1e721z<+J&5=gEI_k(?5(eMGrY$>cJ=q)97lUrEC}0{lM?UrJ%0vXtrX=qoy=ZHRS)e zceD(lF0{JzbMc&)Ky29742 z#8gv)iV9hC&vP7NkJMQaYNp&1*b-Fil2-S@Gl2)vI`0ZKx7-sDH_{?eZ^l~Uj%C8 z(O?J!ZV9p9#J~O+WpBs==Sr}5=GeQ_>@PIzuap6})Uyw(un%knAhgInxXV7g9)Jf9 z_D@U!c;sXM%nGo7=ng=t0sCYRfPK0Rz&_y#V4rek%>wJBKY)GOrF9~)PJFfO0_)Uc zOIRm=Tf#j3-V)XyAezGZ3(BW3{si=|u>FQ5it7gnL%4iZ?HA{8YJ{qLQ6xTMJWmFbR&^r7!I9CNr4)I!G28M%Xiy0|$GIpdtHA zOcHfWapo}Ie#R7aB%gsQV|^Fn?Q4|(21=ukOC*#72N(2_eiW6#N|?@ufi{{@prDC1 z4A_Fj3YkYx1su6)CXkWxS*0Lj!r2{Bh`%Z?YKc;ybqPxjmx&jvl_wH95}_Um=$`1V z;>2#i+)hv}dU)ZYDSevhUJj>CJ@P_?AJ+`cL=DUe<%o`qA_+wQ?4?Ebf zu|p5l8?pP9N+TRLV;dnVFpq`rATN;jDf7COvoKVS<-oBpQh|9hZ51XDO?D->pN_R2qoy>J^z z1wtzQHyvuybVZtoNk1{fA5YS$ioM&kE3ak>Bi002ovPDHLkV1nrJ?z8{^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_20.png b/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_20.png new file mode 100644 index 0000000000000000000000000000000000000000..cb98fc68a69a0e733824d2464fe8d6067223d65b GIT binary patch literal 573 zcmV-D0>b@?P)P^i?F#+YbgVy}tXS$Nk7EDOTo z*PM4U<<876yE{8OI{=?g?5jY%NaeL)72g+8Kj1$JmN9U^1IW(@7SM%>y#uvn4-;J! zo`FoEfsqf$%Lomm9*Hf%iiFx?q4XGN9=b5p79IKf!)O`ccmo4p=%I%%7}x}8Ebj}s zDt4U13EGf+dJ@{0aGE<*Z^xcIu4X8Q>X$L|=$~#w%bwY8p$J(i*m`Cid%<&9F%IS^ z3R@O2XDnC9#RCsKr!y1FHsd+*gE*#ToSE5XV{cQIne{m$GCWzzV)nLpQ(zXEy|zTN zS(90)dcb%Z3Un-S#1TvAP>>GLsxw}iV&E}zfc#(06Lxk8)dDo#!!;JWf!zJ&cP9z$ zYMRuL^hJuh&jL4B$5Eg9#9WiTTFPXIN*#gKEc5CSha zt6_kS8V>GrE)GKA183ELBk)U>nk=};j?*tlAY>_%@RA_A7Rd?$!qSJV*dr@%2@86{ zCk)x6jqsUD_%J7IMG!V$2-{7h4K~7-B5@P-(V6xvo@B94#+e-_LVl2qk00000 LNkvXXu0mjffR6zD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_24.png b/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..b94a313ddc8f432446ae03596ce494ef4999dcc8 GIT binary patch literal 677 zcmV;W0$TlvP)_w{K%yb|6xv}Zwb0NJjRm#snHUoS zSQ&S3_i*<(aiX_V?#$eGyR$Rj&O$o=;g~6s0!jg;fRY?#8l2J70QESdL3!Cws$B4* z0SU_s7gU!4CCeehxlmLYa!B?k;p{SU2JJNeOlDmqyRvHO=`60^KR8YO$JPcON;Xd_Q*xrM8CAo2Rrkb-SD&9USJZV0r@x!|mI$5{mWBJK*8#-~ZlE6wR@7%E( zd!<*o3+1I1efm3-6I{jXTi(rx~fYPJ=6+dF7R7 zu4u3xsoT_i9{9!2P|G{^gI=V=*vK?vIus+4z(8XH9&uFFK4DLT+jFX0z;;BcRJA<# z(z#-GZ`C+qGPjscII-H@D>~=y8>X_see3E>zOC;Q>niPQtkQAQ%34LwSz;$}q#Q*{ z*;ScC+Mlq=wv&UXc z@z}7hDYG|jmpxTB49#mVK-Y%-Mx?G2AhUu!dI5U0RJDZwnH4ASB==^O{9Ay;ZP~8{ zwYXz1Ix&hX9pZ|sIQk)upb4a~;z+)@YmmT;qPVNHz-EKEc8tJ=mB5ysz^13bwy?Oy zxyYvlfsZc&pQl7V;C=BWF;AR2_ZIUA9DT_YF;YM&pg#vF9ZMY_uEx`tBCMG)00000 LNkvXXu0mjf^_)PQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_36.png b/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_36.png new file mode 100644 index 0000000000000000000000000000000000000000..1621efdbce6862a87d27fdc1d626d8eb24fac972 GIT binary patch literal 1066 zcmV+_1l9YAP)CNTq!MjXSP3aZS|zPjKs&LxPSP1sqE&*8wgFQKnnKbjT1rr` zFpa1IA1I2iuQ-B!-rU}6FDB#8w6`<&yW5+co!vb^i4rBvE)&px=mZZi4WB<$Q(y{A zfhjNrrofs+y0C5lTSr&3;&da1C6sV&fU4;=N?1Y+-OYkDgasU#;!t{o1q?MZQV^RMi3^PV2G$H-Y~9`m%GgE@YtW!!4LNM1j1OCFUocZ&s1~eR-qaoP zNFs~?X(50xlE~xE(#|Sc>V?&YEsN)zN8IL^6hs_(i+8_;w)$Wd1UK=7H2NLe>_-|; z0;>i8(OR%+>i!KG^t!g(iwxdOZEyPBAzB^ z6Ye<1(%+i6L*@-Fj=f;@5Q$V=*kaigmj11YBu*q(J?_C`26MNGp5~x?Hi0G9lc+tDtZS=!`1ul!LAI(!h)-JJ%jBEtcML(U%AEV zCK4g@b&xKTh)6s52uE!*X?XS(`>jc2;6Q+ z0oxFGDA;JPxdY1y+!m#P6$Ku0{(-Fs+?J()l?5JF`~zDQxV@JGb}#U-sK8WLWFI`5 zGTgHrpxLHWe<%rNJZ)h+(PUd1U|Y;#TYh6)FlAffX1gfCco~W9!XMkETE>g(Y_~%& z-oV0k%MrkKlNjS|eQY;k0&KU=0&F)sGv1!g_CSG-#_|Y=-XU2Y+NniIhR3XQVR|qQ zV0)BN7nX-lbzyp3SQnNDyuZdIhDY+hgyByVz6-BA+2Xzq~WJ{b#Y5)KL07*qoM6N<$f=^rLMgRZ+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_48.png b/app/src/main/res/drawable-xxhdpi/baseline_my_location_black_48.png new file mode 100644 index 0000000000000000000000000000000000000000..58e017d36530f2210314129f2c09ebc83c3ed57f GIT binary patch literal 1402 zcmV-=1%>*FP)cA)^G8K_8ys!T*M(08fxc7JEuCH`^YvNaG0#ZabR0 zc!4<_iNV}#N0`G4+`Wxx^3j1=ocKobXFI_xI*@;R;FKYaFILd}*}fo+vfPJLg(-Zq z4(FX#PgOi6r>^O&W)pjt5yj;Rlj}M{2xoRI!pDR($2u?%C zbBRlwVkG{NQVl*u0_UoILQS0Uw1hbCsOO`WxZ)Ycx#z#LiFv$251R29b*KOURG?oeW94!jq5BN~7NLJp~xTp{E@4A%;Bed37oK`s}JQ zq(fO#qxgN+E}-2&E7*jS zN}!2AE7`71Je5i(t3|J*M@|48iC$x?mA|jF2Pmm5f0AgxSvA>!$o^)a$qSA(K*<23&rZt( zm_b7TB-yKc?-bB`fd}=`0jd+Yx9$|sy1;|F=m1ILkgrYweHF!FkpYsFlzevz=)1s! zLIR2{AUeEA{O?{h__E4$hnsW<6J|`gGHLHLY0qsRZX9y!+40shix*h_ z5>zapGKeL3MzM&~AeI3e#6oi4;UYgp_$_|SViZ4zGKe448O2XB4dO?=M)9+7gLtrj zQ9PQ$C?0NN5Rb<(iU%wi#Ur|m;vsJa@t8nCOvHmG4dPLyM)9y)!6@Q!$;P>e2W|@% zeID6v3>|sszwvS4wGjsK;t^41hF8}ZS2bRKWE8K@5{MVD3B)V>1mY!-BJmngVWh;1 zXoccc#zI;9u#JESh=2%)fCz|y2#A0Ph=2%)fGCQhD9WjR0@RaOBG60+J^%m!07*qo IM6N<$f?V~O_5c6? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_18.png new file mode 100644 index 0000000000000000000000000000000000000000..b94a313ddc8f432446ae03596ce494ef4999dcc8 GIT binary patch literal 677 zcmV;W0$TlvP)_w{K%yb|6xv}Zwb0NJjRm#snHUoS zSQ&S3_i*<(aiX_V?#$eGyR$Rj&O$o=;g~6s0!jg;fRY?#8l2J70QESdL3!Cws$B4* z0SU_s7gU!4CCeehxlmLYa!B?k;p{SU2JJNeOlDmqyRvHO=`60^KR8YO$JPcON;Xd_Q*xrM8CAo2Rrkb-SD&9USJZV0r@x!|mI$5{mWBJK*8#-~ZlE6wR@7%E( zd!<*o3+1I1efm3-6I{jXTi(rx~fYPJ=6+dF7R7 zu4u3xsoT_i9{9!2P|G{^gI=V=*vK?vIus+4z(8XH9&uFFK4DLT+jFX0z;;BcRJA<# z(z#-GZ`C+qGPjscII-H@D>~=y8>X_see3E>zOC;Q>niPQtkQAQ%34LwSz;$}q#Q*{ z*;ScC+Mlq=wv&UXc z@z}7hDYG|jmpxTB49#mVK-Y%-Mx?G2AhUu!dI5U0RJDZwnH4ASB==^O{9Ay;ZP~8{ zwYXz1Ix&hX9pZ|sIQk)upb4a~;z+)@YmmT;qPVNHz-EKEc8tJ=mB5ysz^13bwy?Oy zxyYvlfsZc&pQl7V;C=BWF;AR2_ZIUA9DT_YF;YM&pg#vF9ZMY_uEx`tBCMG)00000 LNkvXXu0mjf^_)PQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_20.png b/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_20.png new file mode 100644 index 0000000000000000000000000000000000000000..6df853350dfb269a31432117fbe526b2390631a0 GIT binary patch literal 788 zcmV+v1MB>WP)-K-Y`y) zluiTRSYob>X~51)At|K-cH$Ie#8xlhX`72+J(TeKODTfCSuWt|+(RsFKy;x`l@&D5 zhba1JUFS2ZMP7`6`WSU1lk@c!KO6~At4R12AfLI z_V)w@IBOrGXv3x&Mv(tBLJc;xA&PxCs|!(7Eq{38$!oI;*o#?X2`8N2SVHvvXMQymnNci#qRZl?Tht zi?1j1JuwGCn>|r4VZ%LfSApw2k$Z!TQhvzy&@fZ6MDYmd+IYsTX-V8n=#_DDl0hJYbp2p9r}!2dxYffTk; zkO&m8jT92U7kCtD6mc&B7t1}0NF(~2pm$;phj?>@{l zcfg;-t;1MWu!ALxBaRpVAci=`v4kB|9Oms7lkJ9|#0%N|D+-uJpKbd-%%Xr-QpXFD z?S#KTj^GV4h_tLHf(&lR8C+=J=&RvBViVo2wRK|?j|7Fb%)%70c=j>mS?3V;iG?(! z|Kw3^-6y1dYfj@yxt+D1NMRf)I;mn*i}q1e721z<+J&5=gEI_k(?5(eMGrY$>cJ=q)97lUrEC}0{lM?UrJ%0vXtrX=qoy=ZHRS)e zceD(lF0{JzbMc&)Ky29742 z#8gv)iV9hC&vP7NkJMQaYNp&1*b-Fil2-S@Gl2)vI`0ZKx7-sDH_{?eZ^l~Uj%C8 z(O?J!ZV9p9#J~O+WpBs==Sr}5=GeQ_>@PIzuap6})Uyw(un%knAhgInxXV7g9)Jf9 z_D@U!c;sXM%nGo7=ng=t0sCYRfPK0Rz&_y#V4rek%>wJBKY)GOrF9~)PJFfO0_)Uc zOIRm=Tf#j3-V)XyAezGZ3(BW3{si=|u>FQ5it7gnL%*FP)cA)^G8K_8ys!T*M(08fxc7JEuCH`^YvNaG0#ZabR0 zc!4<_iNV}#N0`G4+`Wxx^3j1=ocKobXFI_xI*@;R;FKYaFILd}*}fo+vfPJLg(-Zq z4(FX#PgOi6r>^O&W)pjt5yj;Rlj}M{2xoRI!pDR($2u?%C zbBRlwVkG{NQVl*u0_UoILQS0Uw1hbCsOO`WxZ)Ycx#z#LiFv$251R29b*KOURG?oeW94!jq5BN~7NLJp~xTp{E@4A%;Bed37oK`s}JQ zq(fO#qxgN+E}-2&E7*jS zN}!2AE7`71Je5i(t3|J*M@|48iC$x?mA|jF2Pmm5f0AgxSvA>!$o^)a$qSA(K*<23&rZt( zm_b7TB-yKc?-bB`fd}=`0jd+Yx9$|sy1;|F=m1ILkgrYweHF!FkpYsFlzevz=)1s! zLIR2{AUeEA{O?{h__E4$hnsW<6J|`gGHLHLY0qsRZX9y!+40shix*h_ z5>zapGKeL3MzM&~AeI3e#6oi4;UYgp_$_|SViZ4zGKe448O2XB4dO?=M)9+7gLtrj zQ9PQ$C?0NN5Rb<(iU%wi#Ur|m;vsJa@t8nCOvHmG4dPLyM)9y)!6@Q!$;P>e2W|@% zeID6v3>|sszwvS4wGjsK;t^41hF8}ZS2bRKWE8K@5{MVD3B)V>1mY!-BJmngVWh;1 zXoccc#zI;9u#JESh=2%)fCz|y2#A0Ph=2%)fGCQhD9WjR0@RaOBG60+J^%m!07*qo IM6N<$f?V~O_5c6? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_my_location_black_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8f21ee48a7d422bc72fd1b97961bba6330518c GIT binary patch literal 1956 zcmeH|`#aMM9LK*KbD3ttNMv%U^QFn9F}GaiI-H%1xpXy`TA91lXf@(Aly;t|SrWNb zOgT#`XPGUB;wdc7v2%<%hawaXH# zu&m*eEBdZ>Q8l=FUN`Fx>#Iw4t!8Uz&Znav&7VNi6quj=XCTZ~)O}gWF)whNq3N#+ zf^;>jY`n_k1zW#Ifh%9`IXX392iItzi=>P!RN%Zv&KLwe2*#!{;fQqPgZtll* z-cM=ggObll@N72wV?GoPRs||~?4!lI33LVdBj*ELF21!u4j%6A; zHg^Ws`>D!3I0+jR8sT_@9GQ??N0XJvpwe;8)GPH3*)tD*>(``q* zf164+Z%}zZk)8vVb#`qP=^RMd#^A8Ko%iFQU1Yb4iA2}SU7JQi{@QtTgy?-c zge9F=fMKgRFVh}-sloNv)9;X7ieU-8+eykcjf5h7QYe3@r8JxW+{)Sy99#)*IW8!u zYvoaj){?vmM}aPxNmH$~J}PE2+&2qE2d_$szHE<0%L=_7CzldhF(L1UK=drZ!G@%h zXu3nmM;9h?b_V{?iK<7aqcsWEXW7sidrQMhAZo$KJcR`{K#*w$a8=7mm8)P!_&1y* zWc}@1H^-+*-z{nDj*brYAczm#^VU9?4GG7gFAZw@F|@tR{P;^0BX=6-b)mmrAijD) z&(gU?DuTkWxO+ElO?__ihRjAkYe=?!m9xdCa9&GkjkkM`R5tm54)@6)kRh(l_41vi zj5_%|q|c@H5JHQQgLLxr$cUd?tl4t z>rErxwkn}$*mwr-0vkn4m}x?_M@L6#RGV?x;cdFc1WMz+dJ0grF3V1qUoT&lpI#rw z&IQX|KBf_msW5nvHb$+@ydHt~lrCoSuGOo?o?+U_ThsTAdm{K@4=c~N8^h=A9sC*& z9+|H6@5$U6_Apm4ZBt+oe@DS>jP$OzfVWW|@@i1aKTPb3hrBlVQ4t5vNIj9F%=g#S z3NmkOP+&^(w!_c&BfiJdomq1nF&V%M&`VXu?)_p3@OTegkh=TkJtPHJTSiqK@+i=$ zaBuGY(xFBn1Z##nJ~D0c6nEhYOm0=uW;O4az@@47KGe;;puj{bjCT;eJ9QqrY)iX| zF;SS){w!JAq~3{^KB#i3zN|-kz;)6W$yE!IKqK4Cg+W&AHL>c9(7~q3d!W9?3Ej#$ zcK06M$~Xt)nYd2lsyT^IEoX*`oyt-&mm=<8tFvG3a6RBLzTDI-K%8|~bRr_4OgjaX+ysYm6H zxCkpG^cDp$X7{=JswtOw6*C^Wu3RzfoM}@4Ozzr1uW8?3b?Q;)Mqt7NB066I#Bond z)oBURrXWt#EH7JiyWdt*K9J}D+uKlMY0NQ!TlT#+cJwk!i269Iv!ILgs5uiat;v@h zm~|fQ=vUk=T?=M*@CQ@q%KgPq^P$%X}w#^RuA!ub+nKNAhhZ#N_=AJUYM4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/baseline_my_location_24.xml b/app/src/main/res/drawable/baseline_my_location_24.xml new file mode 100644 index 0000000..b050330 --- /dev/null +++ b/app/src/main/res/drawable/baseline_my_location_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_note_details.xml b/app/src/main/res/layout/fragment_note_details.xml index acf6b01..2a2978c 100644 --- a/app/src/main/res/layout/fragment_note_details.xml +++ b/app/src/main/res/layout/fragment_note_details.xml @@ -5,6 +5,8 @@ + + + + + + + + diff --git a/app/src/main/res/layout/fragment_note_editor.xml b/app/src/main/res/layout/fragment_note_editor.xml index 5f3af8d..df2db18 100644 --- a/app/src/main/res/layout/fragment_note_editor.xml +++ b/app/src/main/res/layout/fragment_note_editor.xml @@ -84,6 +84,29 @@ app:layout_constraintStart_toEndOf="@+id/noteEditorDate" app:layout_constraintTop_toBottomOf="@+id/noteEditorTitleContainer" /> + + + + + Cancel recycler_view_item_transition_name_%1$s Logout + Location \ No newline at end of file diff --git a/build.gradle b/build.gradle index 32fe0fa..69a092a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = "1.4.32" - ext.hilt_version = "2.34-beta" - ext.room_version = "2.2.6" + ext.hilt_version = '2.35' + ext.room_version = '2.3.0' ext.nav_version = "2.3.5" repositories { diff --git a/data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/LocationIQGeocodingService.kt b/data-lib/src/main/java/me/profiluefter/profinote/data/GeocodingService.kt similarity index 77% rename from data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/LocationIQGeocodingService.kt rename to data-lib/src/main/java/me/profiluefter/profinote/data/GeocodingService.kt index ba4d1aa..07f946e 100644 --- a/data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/LocationIQGeocodingService.kt +++ b/data-lib/src/main/java/me/profiluefter/profinote/data/GeocodingService.kt @@ -1,4 +1,4 @@ -package me.profiluefter.profinote.data.geocoding +package me.profiluefter.profinote.data import com.google.gson.Gson import com.google.gson.annotations.SerializedName @@ -16,6 +16,10 @@ import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton +interface GeocodingService { + suspend fun reverse(latitude: Double, longitude: Double): String +} + class LocationIQGeocodingService @Inject constructor( private val api: LocationIQAPI, @Named("locationIQ") @@ -51,4 +55,12 @@ object LocationIQModule { .addConverterFactory(GsonConverterFactory.create(gson)) .build() .create() + + @Provides + @Singleton + fun locationIQGeocoder(locationIQGeocodingService: LocationIQGeocodingService): GeocodingService = locationIQGeocodingService + + @Provides + @Named("locationIQ") + fun apiKeyLocationIQ(): String = "pk.c84c8c163dcf39e91bbfdb75c757ead0" // Throwaway account, not secret } \ No newline at end of file diff --git a/data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/GeocodingService.kt b/data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/GeocodingService.kt deleted file mode 100644 index 249fc48..0000000 --- a/data-lib/src/main/java/me/profiluefter/profinote/data/geocoding/GeocodingService.kt +++ /dev/null @@ -1,5 +0,0 @@ -package me.profiluefter.profinote.data.geocoding - -interface GeocodingService { - suspend fun reverse(latitude: Double, longitude: Double): String -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 98bed16..0bc9d91 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app"s APK # https://developer.android.com/topic/libraries/support-library/androidx-rn