diff --git a/app/build.gradle b/app/build.gradle index a81bfe3..28d9968 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,8 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply from: "$rootDir/versions.gradle" + android { compileSdkVersion 28 defaultConfig { @@ -12,7 +14,7 @@ android { targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -39,19 +41,17 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1' - implementation "com.google.android.gms:play-services-auth:16.0.1" - implementation 'com.squareup.picasso:picasso:2.71828' + implementation "com.google.android.material:material:$versions.material" + implementation "androidx.constraintlayout:constraintlayout:$versions.constraint_layout" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" + implementation "com.google.android.gms:play-services-auth:$versions.auth" implementation project(':core') -// implementation 'com.github.LiveTyping.activity-binder:core:0.1.3' + implementation project(':social:logincore') implementation project(':social:vk') implementation project(':social:facebook') - implementation project(':social:instagram') implementation project(':social:google') implementation project(':permission') diff --git a/app/src/androidTest/java/com/livetyping/activitybinder/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/livetyping/activitybinder/ExampleInstrumentedTest.kt deleted file mode 100644 index e38305e..0000000 --- a/app/src/androidTest/java/com/livetyping/activitybinder/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.livetyping.activitybinder - -import android.support.test.InstrumentationRegistry -import android.support.test.runner.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getTargetContext() - assertEquals("com.livetyping.activity_binder", appContext.packageName) - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 50e8b1a..b1dfb86 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ - + @@ -46,15 +46,6 @@ android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" /> - - - - - - diff --git a/app/src/main/kotlin/com/livetyping/activitybinder/BinderExampleApplication.kt b/app/src/main/kotlin/com/livetyping/activitybinder/BinderExampleApplication.kt index c2f2377..3846626 100644 --- a/app/src/main/kotlin/com/livetyping/activitybinder/BinderExampleApplication.kt +++ b/app/src/main/kotlin/com/livetyping/activitybinder/BinderExampleApplication.kt @@ -2,33 +2,33 @@ package com.livetyping.activitybinder import android.app.Application import com.livetyping.facebook.FacebookInitializer +import com.livetyping.google.GoogleInitializer import com.livetyping.images.ImagesBinder -import com.livetyping.instagram.InstagramInitializer import com.livetyping.logincore.SocialLoginBinder import com.livetyping.permission.PermissionBinder import com.livetyping.vk.VkInitializer class BinderExampleApplication : Application() { - val socialLoginBinder: SocialLoginBinder by lazy { + val socialLoginBinder by lazy { SocialLoginBinder() } - val permissionBinder: PermissionBinder by lazy { + val permissionBinder by lazy { PermissionBinder() } - val testImagesBinder: ImagesBinder by lazy { + val testImagesBinder by lazy { ImagesBinder(applicationContext.packageName + ".provider", R.xml.file_path) } override fun onCreate() { super.onCreate() - socialLoginBinder.initializeNetworks(this, - listOf( - VkInitializer(), - FacebookInitializer(), - InstagramInitializer() - )) + val socialsInitializers = listOf( + VkInitializer(), + FacebookInitializer(), + GoogleInitializer() + ) + socialLoginBinder.initializeNetworks(this, socialsInitializers) } } diff --git a/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt b/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt index 3833039..01d1dbf 100644 --- a/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt +++ b/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt @@ -47,7 +47,10 @@ class ImageBinderActivity : AppCompatActivity() { } default_photo.setOnClickListener { - permissionBinder.activePermission(Manifest.permission.CAMERA, getString(R.string.need_camera_permission)) { + permissionBinder.activePermission( + Manifest.permission.CAMERA, + getString(R.string.need_camera_permission) + ) { if (it) { val request = PhotoRequestDefaultPath() requestAndBindImage(request) @@ -56,17 +59,24 @@ class ImageBinderActivity : AppCompatActivity() { } cahche_path_photo.setOnClickListener { - permissionBinder.activePermission(Manifest.permission.CAMERA, getString(R.string.need_camera_permission)) { + permissionBinder.activePermission( + Manifest.permission.CAMERA, + getString(R.string.need_camera_permission) + ) { if (it) { - val request = PhotoRequestCachePath("cache_files") + val request = PhotoRequestCachePath("cache_files", maxFileSize = 1000000) requestAndBindImage(request) } } } external_cahce_path_photo.setOnClickListener { - val permissions = listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) - permissionBinder.activePermission(permissions, getString(R.string.need_camera_and_external_storage_permission)) { + val permissions = + listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + permissionBinder.activePermission( + permissions, + getString(R.string.need_camera_and_external_storage_permission) + ) { if (it.all { it.value }) { val request = PhotoRequestExternalCachePath("external_app_cache_path") requestAndBindImage(request) @@ -75,8 +85,12 @@ class ImageBinderActivity : AppCompatActivity() { } external_files_path_photo.setOnClickListener { - val permissions = listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) - permissionBinder.activePermission(permissions, getString(R.string.need_camera_and_external_storage_permission)) { + val permissions = + listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + permissionBinder.activePermission( + permissions, + getString(R.string.need_camera_and_external_storage_permission) + ) { if (it.all { it.value }) { val request = PhotoRequestExternalFilesPath("external_app_files_path") requestAndBindImage(request) @@ -85,8 +99,12 @@ class ImageBinderActivity : AppCompatActivity() { } external_path_photo.setOnClickListener { - val permissions = listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) - permissionBinder.activePermission(permissions, getString(R.string.need_camera_and_external_storage_permission)) { + val permissions = + listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + permissionBinder.activePermission( + permissions, + getString(R.string.need_camera_and_external_storage_permission) + ) { if (it.all { it.value }) { val request = PhotoRequestExternalPath("external_files") requestAndBindImage(request) @@ -95,8 +113,12 @@ class ImageBinderActivity : AppCompatActivity() { } files_path_photo.setOnClickListener { - val permissions = listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) - permissionBinder.activePermission(permissions, getString(R.string.need_camera_and_external_storage_permission)) { + val permissions = + listOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + permissionBinder.activePermission( + permissions, + getString(R.string.need_camera_and_external_storage_permission) + ) { if (it.all { it.value }) { val request = PhotoRequestFilesPath("images") requestAndBindImage(request) @@ -120,13 +142,17 @@ class ImageBinderActivity : AppCompatActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) imagesBinder.onActivityResult(requestCode, resultCode, data, this) - permissionBinder.onActivityResult(requestCode, data, this) + permissionBinder.onActivityResult(requestCode, this) } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) imagesBinder.onRequestPermissionsResult(requestCode, permissions, grantResults) - permissionBinder.onRequestPermissionResult(requestCode, grantResults) + permissionBinder.onRequestPermissionResult(requestCode) } private fun requestAndBindImage(request: ImageRequest) { diff --git a/app/src/main/kotlin/com/livetyping/activitybinder/PermissionExampleActivity.kt b/app/src/main/kotlin/com/livetyping/activitybinder/PermissionExampleActivity.kt index 9325d92..95e59e7 100644 --- a/app/src/main/kotlin/com/livetyping/activitybinder/PermissionExampleActivity.kt +++ b/app/src/main/kotlin/com/livetyping/activitybinder/PermissionExampleActivity.kt @@ -1,6 +1,6 @@ package com.livetyping.activitybinder -import android.Manifest +import android.Manifest.permission.* import android.content.Intent import android.os.Bundle import android.util.Log @@ -8,8 +8,8 @@ import androidx.appcompat.app.AppCompatActivity import com.livetyping.permission.PermissionBinder import kotlinx.android.synthetic.main.activity_permissions.* - class PermissionExampleActivity : AppCompatActivity() { + companion object { private const val TAG_SINGLE = "single" private const val TAG_MULTIPLY = "multiply" @@ -25,62 +25,102 @@ class PermissionExampleActivity : AppCompatActivity() { handleButtonMultiplyPermissions() } - private fun handleButtonMultiplyPermissions() { - multiply_passive.setOnClickListener { - permissionBinder.passivePermission(listOf(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)) { - for ((permission, isGranted) in it) { - handleOutputResults(isGranted, TAG_MULTIPLY, permission) - } - } + private fun handleButtonSinglePermissions() { + setOnSinglePassivePermissionClickListener() + setOnSingleActivePermissionClickListener() + setOnSingleGlobalPermissionClickListener() + } + + private fun setOnSinglePassivePermissionClickListener() { + single_passive.setOnClickListener { + permissionBinder.passivePermission(READ_EXTERNAL_STORAGE) { isGranted -> onPermissionResult(isGranted) } } + } + + private fun onPermissionResult(isGranted: Boolean) { + handleOutputResults(isGranted, TAG_SINGLE) + } + + private fun handleOutputResults( + isGranted: Boolean, + tag: String, + permission: String = "" + ) { + if (isGranted) granted(tag, permission) else denied(tag, permission) + } + private fun granted(tag: String, permission: String = "") { + Log.i(tag, "$permission was granted") + } + + private fun denied(tag: String, permission: String = "") { + Log.i(tag, "$permission was denied") + } + + private fun setOnSingleActivePermissionClickListener() { val rationaleText = getString(R.string.active_permission_rationale_text) - //cab be placed in active permission method as third parameter - val settingsButtonText = getString(R.string.active_permission_rationale_button_text) - multiply_active.setOnClickListener { - permissionBinder.activePermission(listOf(Manifest.permission.SEND_SMS, Manifest.permission.RECORD_AUDIO), rationaleText) { - for ((permission, isGranted) in it) { - handleOutputResults(isGranted, TAG_MULTIPLY, permission) - } - } + val dialogCustomThemeResId = R.style.SingleActivePermissionDialogTheme + val settingsButtonTitle = getString(R.string.active_permission_rationale_button_text) + single_active.setOnClickListener { + permissionBinder.activePermission( + CAMERA, + rationaleText, + dialogCustomThemeResId, + settingsButtonTitle + ) { isGranted -> onPermissionResult(isGranted) } } - multiply_global.setOnClickListener { - permissionBinder.globalPermission(listOf(Manifest.permission.BODY_SENSORS, Manifest.permission.READ_CALENDAR), - ShowGlobalExplanationActivity::class.java) { - for ((permission, isGranted) in it) { - handleOutputResults(isGranted, TAG_MULTIPLY, permission) - } - } + } + + private fun setOnSingleGlobalPermissionClickListener() { + single_global.setOnClickListener { + permissionBinder.globalPermission( + USE_SIP, + ShowGlobalExplanationActivity::class.java + ) { isGranted -> onPermissionResult(isGranted) } } } - private fun handleButtonSinglePermissions() { - single_passive.setOnClickListener { - permissionBinder.passivePermission(Manifest.permission.READ_EXTERNAL_STORAGE) { - handleOutputResults(it, TAG_SINGLE) - } + private fun handleButtonMultiplyPermissions() { + setOnMultiplePassivePermissionClickListener() + setOnMultipleActivePermissionClickListener() + setOnMultipleGlobalPermissionClickListener() + } + + private fun setOnMultiplePassivePermissionClickListener() { + val passivePermissions = listOf(READ_CONTACTS, ACCESS_FINE_LOCATION) + multiply_passive.setOnClickListener { + permissionBinder.passivePermissions(passivePermissions) { results -> onPermissionsResults(results) } } + } - val rationaleText = getString(R.string.active_permission_rationale_text) - //cab be placed in active permission method as third parameter - val settingsButtonText = getString(R.string.active_permission_rationale_button_text) - single_active.setOnClickListener { - permissionBinder.activePermission(Manifest.permission.CAMERA, rationaleText) { - handleOutputResults(it, TAG_SINGLE) - } + private fun onPermissionsResults(permissionsResults: Map) { + for ((permission, isGranted) in permissionsResults) { + handleOutputResults(isGranted, TAG_MULTIPLY, permission) } - single_global.setOnClickListener { - permissionBinder.globalPermission(Manifest.permission.USE_SIP, - ShowGlobalExplanationActivity::class.java) { - handleOutputResults(it, TAG_SINGLE) - } + } + + private fun setOnMultipleActivePermissionClickListener() { + val activePermissions = listOf(RECORD_AUDIO, CAMERA) + val rationaleText = getString(R.string.active_permission_rationale_text) + multiply_active.setOnClickListener { + permissionBinder.activePermissions( + activePermissions, + rationaleText + ) { results -> onPermissionsResults(results) } } } - private fun handleOutputResults(isGranted: Boolean, tag: String, permission: String = "") { - if (isGranted) granted(tag, permission) else denied(tag, permission) + private fun setOnMultipleGlobalPermissionClickListener() { + val globalPermissions = listOf(READ_PHONE_STATE, READ_CALENDAR) + multiply_global.setOnClickListener { + permissionBinder.globalPermissions( + globalPermissions, + ShowGlobalExplanationActivity::class.java + ) { results -> onPermissionsResults(results) } + } } + override fun onStart() { super.onStart() permissionBinder.attach(this) @@ -93,19 +133,11 @@ class PermissionExampleActivity : AppCompatActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - permissionBinder.onActivityResult(requestCode, data, this) + permissionBinder.onActivityResult(requestCode, this) } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) - permissionBinder.onRequestPermissionResult(requestCode, grantResults) - } - - private fun granted(tag: String, permission: String = "") { - Log.i(tag, "$permission was granted") - } - - private fun denied(tag: String, permission: String = "") { - Log.i(tag, "$permission was denied") + permissionBinder.onRequestPermissionResult(requestCode) } } diff --git a/app/src/main/kotlin/com/livetyping/activitybinder/SocialActivity.kt b/app/src/main/kotlin/com/livetyping/activitybinder/SocialActivity.kt index 687e12b..8e7069e 100644 --- a/app/src/main/kotlin/com/livetyping/activitybinder/SocialActivity.kt +++ b/app/src/main/kotlin/com/livetyping/activitybinder/SocialActivity.kt @@ -5,67 +5,121 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.auth.GoogleAuthUtil +import com.livetyping.facebook.FacebookLoginResult import com.livetyping.facebook.FacebookNetwork import com.livetyping.google.GoogleAccountNetwork +import com.livetyping.google.GoogleAccountResult import com.livetyping.google.GoogleTokenNetwork -import com.livetyping.instagram.InstagramNetwork +import com.livetyping.google.GoogleTokenResult import com.livetyping.logincore.SocialLoginBinder +import com.livetyping.logincore.SocialLoginResult +import com.livetyping.logincore.SocialNetwork +import com.livetyping.vk.VkLoginResult import com.livetyping.vk.VkNetwork import kotlinx.android.synthetic.main.activity_social.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* +import kotlin.coroutines.CoroutineContext +class SocialActivity : AppCompatActivity(), CoroutineScope { -class SocialActivity : AppCompatActivity() { + companion object { + private const val SCOPES = "oauth2:profile email" + private const val GOOGLE_ANDROID_CLIENT_ID = + "962786784406-vrmqfde2mtng3vei55djkqehd5me9t42.apps.googleusercontent.com" + } private lateinit var socialLoginBinder: SocialLoginBinder - private companion object { - const val GOOGLE_ANDROID_CLIENT_ID = "962786784406-vrmqfde2mtng3vei55djkqehd5me9t42.apps.googleusercontent.com" - } + private val job = SupervisorJob() + override val coroutineContext: CoroutineContext = Dispatchers.Main + job override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_social) - socialLoginBinder = (application as BinderExampleApplication).socialLoginBinder // can be injected with dagger + // can be injected with dagger + socialLoginBinder = (application as BinderExampleApplication).socialLoginBinder + + initVkLogin() + initFacebookLogin() + initGoogleAccountLogin() + initGoogleTokenLogin() + } + private fun initVkLogin() { + val socialNetwork = VkNetwork() login_vk.setOnClickListener { - socialLoginBinder.loginWith(VkNetwork()) { - Toast.makeText(this, it.accessToken, Toast.LENGTH_SHORT).show() - } + loginWith(socialNetwork, ::onSuccessVkLogin) } + } + private fun loginWith( + socialNetwork: SocialNetwork, + onSuccess: (result: T) -> Unit + ) = socialLoginBinder.loginWith(socialNetwork, onSuccess, ::onFail) + + private fun initFacebookLogin() { + val socialNetwork = FacebookNetwork() login_fb.setOnClickListener { - socialLoginBinder.loginWith(FacebookNetwork()) { - Toast.makeText(this, it.accessToken, Toast.LENGTH_SHORT).show() - } - } - login_instagram.setOnClickListener { - socialLoginBinder.loginWith(InstagramNetwork()) { - Toast.makeText(this, it.accessToken, Toast.LENGTH_SHORT).show() - } + loginWith(socialNetwork, ::onSuccessFacebookLogin) } + } + private fun initGoogleAccountLogin() { + val socialNetwork = GoogleAccountNetwork(GOOGLE_ANDROID_CLIENT_ID) login_google.setOnClickListener { - socialLoginBinder.loginWith(GoogleAccountNetwork(GOOGLE_ANDROID_CLIENT_ID)) { - GlobalScope.launch(Dispatchers.IO) { - val scopes = "oauth2:profile email" - val token = GoogleAuthUtil.getToken(this@SocialActivity, it.account.account, scopes) - GlobalScope.launch(Dispatchers.Main) { - Toast.makeText(this@SocialActivity, token.toString(), Toast.LENGTH_SHORT).show() - } - } - } + loginWith(socialNetwork, ::onSuccessGoogleAccountLogin) } + } + + private fun initGoogleTokenLogin() { + val socialNetwork = GoogleTokenNetwork(GOOGLE_ANDROID_CLIENT_ID) login_google_token.setOnClickListener { - socialLoginBinder.loginWith(GoogleTokenNetwork(GOOGLE_ANDROID_CLIENT_ID)) { - Toast.makeText(this, it.accessToken, Toast.LENGTH_SHORT).show() + loginWith(socialNetwork, ::onSuccessGoogleTokenLogin) + } + } + + private fun onSuccessVkLogin(result: VkLoginResult) { + val token = result.accessToken + val email = result.email + showToast("$email\n$token") + } + + private fun showToast(message: String) { + Toast.makeText(this@SocialActivity, message, Toast.LENGTH_SHORT).show() + } + + private fun onSuccessFacebookLogin(result: FacebookLoginResult) { + val token = result.accessToken + val appId = result.applicationId + val userId = result.userId + showToast("$userId\n$appId\n$token") + } + + private fun onSuccessGoogleAccountLogin(result: GoogleAccountResult) { + launch { + val account = result.googleAccount.account + val token = withContext(Dispatchers.IO) { + GoogleAuthUtil.getToken(this@SocialActivity, account, SCOPES) } + showToast(token) } } + private fun onSuccessGoogleTokenLogin(result: GoogleTokenResult) { + val token = result.accessToken + showToast(token) + } + + private fun onFail(exception: Exception) { + showToast(exception.localizedMessage) + } + + override fun onDestroy() { + job.cancel() + super.onDestroy() + } + override fun onStart() { super.onStart() socialLoginBinder.attach(this) @@ -79,6 +133,5 @@ class SocialActivity : AppCompatActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { socialLoginBinder.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data) - } } diff --git a/app/src/main/res/layout/activity_new_binder.xml b/app/src/main/res/layout/activity_new_binder.xml index 9fc212b..db011dd 100644 --- a/app/src/main/res/layout/activity_new_binder.xml +++ b/app/src/main/res/layout/activity_new_binder.xml @@ -18,9 +18,9 @@ @@ -45,7 +45,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="single_gallery" - app:layout_constraintEnd_toStartOf="@+id/view2" + app:layout_constraintEnd_toEndOf="@+id/view2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/multiple_gallery" /> @@ -57,7 +57,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="single_gallery_chooser" - app:layout_constraintEnd_toStartOf="@+id/view2" + app:layout_constraintEnd_toEndOf="@+id/view2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/single_gallery" /> @@ -69,7 +69,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="default_photo" - app:layout_constraintEnd_toStartOf="@+id/view2" + app:layout_constraintEnd_toEndOf="@+id/view2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/single_request_chooser" /> @@ -81,7 +81,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="cahche_path_photo" - app:layout_constraintEnd_toStartOf="@+id/view2" + app:layout_constraintEnd_toEndOf="@+id/view2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/default_photo" /> @@ -93,8 +93,8 @@ android:layout_marginEnd="8dp" android:text="external_cahce_path_photo" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/view2" - app:layout_constraintTop_toTopOf="@+id/multiple_gallery" /> + app:layout_constraintStart_toStartOf="@+id/view2" + app:layout_constraintTop_toBottomOf="@+id/cahche_path_photo" />