From 7b0f5f39aba23e6fe45dca4d8ae3e62b746724e1 Mon Sep 17 00:00:00 2001 From: Dmitry Alexeeenkoff Date: Sat, 26 Oct 2019 17:16:29 +0300 Subject: [PATCH 1/7] Fix show of settings popup of first permission dismiss --- app/build.gradle | 4 ++-- .../com/livetyping/permission/ActivePermissionRequest.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a81bfe3..ee84010 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,8 +39,8 @@ 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 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout: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" diff --git a/permission/src/main/kotlin/com/livetyping/permission/ActivePermissionRequest.kt b/permission/src/main/kotlin/com/livetyping/permission/ActivePermissionRequest.kt index 519d173..0c8bf41 100644 --- a/permission/src/main/kotlin/com/livetyping/permission/ActivePermissionRequest.kt +++ b/permission/src/main/kotlin/com/livetyping/permission/ActivePermissionRequest.kt @@ -31,7 +31,7 @@ internal class ActivePermissionRequest( if (areAllPermissionGranted(activity)) { invokeResult(activity) } else { - if (!rationaleShowed) { + if (!rationaleShowed && getPermissionsWithoutRationale(activity).isNotEmpty()) { showOpenSettingsDialog(activity) } else { invokeResult(activity) From eca878749c493817afde559b21475c1f478b4b92 Mon Sep 17 00:00:00 2001 From: Dmitry Alexeeenkoff Date: Sat, 18 Jan 2020 17:02:03 +0300 Subject: [PATCH 2/7] Remove default FileProvider from images module --- images/src/main/AndroidManifest.xml | 16 +--------------- .../livetyping/images/photo/DefaultProvider.kt | 6 ------ images/src/main/res/xml/default_file_paths.xml | 8 -------- 3 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 images/src/main/kotlin/com/livetyping/images/photo/DefaultProvider.kt delete mode 100644 images/src/main/res/xml/default_file_paths.xml diff --git a/images/src/main/AndroidManifest.xml b/images/src/main/AndroidManifest.xml index 2d097be..feebc64 100644 --- a/images/src/main/AndroidManifest.xml +++ b/images/src/main/AndroidManifest.xml @@ -1,15 +1 @@ - - - - - - - - + diff --git a/images/src/main/kotlin/com/livetyping/images/photo/DefaultProvider.kt b/images/src/main/kotlin/com/livetyping/images/photo/DefaultProvider.kt deleted file mode 100644 index 879b316..0000000 --- a/images/src/main/kotlin/com/livetyping/images/photo/DefaultProvider.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.livetyping.images.photo - -import androidx.core.content.FileProvider - - -class DefaultProvider : FileProvider() diff --git a/images/src/main/res/xml/default_file_paths.xml b/images/src/main/res/xml/default_file_paths.xml deleted file mode 100644 index 97cfd6b..0000000 --- a/images/src/main/res/xml/default_file_paths.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - From 8990a5b8789bafb79d57cc201c5ca7e64697f179 Mon Sep 17 00:00:00 2001 From: alexeenkoff Date: Mon, 30 Mar 2020 23:44:49 +0300 Subject: [PATCH 3/7] Merge LiveTyping-develop --- app/build.gradle | 18 +-- .../activitybinder/ExampleInstrumentedTest.kt | 24 --- app/src/main/AndroidManifest.xml | 12 +- .../BinderExampleApplication.kt | 20 +-- .../activitybinder/ImageBinderActivity.kt | 4 +- .../PermissionExampleActivity.kt | 138 +++++++++------- .../activitybinder/SocialActivity.kt | 117 ++++++++++---- .../main/res/layout/activity_permissions.xml | 73 +++++---- app/src/main/res/layout/activity_social.xml | 15 +- app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/styles.xml | 5 + .../activitybinder/ExampleUnitTest.kt | 17 -- build.gradle | 13 +- core/proguard-rules.pro | 21 --- .../core/ExampleInstrumentedTest.java | 26 --- .../com/livetyping/core/ExampleUnitTest.java | 17 -- gradle.properties | 15 +- gradle/wrapper/gradle-wrapper.properties | 4 +- images/build.gradle | 5 +- kotlin_android_library.gradle | 11 +- permission/build.gradle | 5 +- permission/proguard-rules.pro | 21 --- .../permission/ExampleInstrumentedTest.java | 26 --- .../permission/ActivePermissionRequest.kt | 74 +++++---- .../permission/GlobalPermissionRequest.kt | 41 +++-- .../permission/PassivePermissionRequest.kt | 21 ++- .../livetyping/permission/PermissionBinder.kt | 148 ++++++++++++------ .../permission/PermissionRequest.kt | 90 ++++++----- .../permission/PermissionRequestCodes.kt | 73 +++++---- settings.gradle | 1 - social/facebook/build.gradle | 12 +- social/facebook/proguard-rules.pro | 21 --- .../facebook/ExampleInstrumentedTest.java | 26 --- .../facebook/FacebookInitializer.kt | 6 +- .../livetyping/facebook/FacebookLoginError.kt | 10 -- .../facebook/FacebookLoginResult.kt | 16 +- .../livetyping/facebook/FacebookNetwork.kt | 57 ++++--- .../livetyping/facebook/ExampleUnitTest.java | 17 -- social/google/build.gradle | 12 +- .../livetyping/google/GoogleAccountNetwork.kt | 52 +++--- .../livetyping/google/GoogleAccountResult.kt | 9 +- .../livetyping/google/GoogleInitializer.kt | 4 +- .../com/livetyping/google/GoogleLoginError.kt | 9 -- .../livetyping/google/GoogleTokenLoader.kt | 25 --- .../livetyping/google/GoogleTokenNetwork.kt | 91 ++++++----- .../livetyping/google/GoogleTokenResult.kt | 6 +- social/instagram/.gitignore | 1 - social/instagram/build.gradle | 10 -- social/instagram/proguard-rules.pro | 21 --- .../instagram/ExampleInstrumentedTest.java | 26 --- social/instagram/src/main/AndroidManifest.xml | 1 - .../instagram/InstagramInitializer.kt | 13 -- .../instagram/InstagramLoginError.kt | 10 -- .../instagram/InstagramLoginResult.kt | 7 - .../livetyping/instagram/InstagramNetwork.kt | 41 ----- .../instagram/src/main/res/values/strings.xml | 3 - .../livetyping/instagram/ExampleUnitTest.java | 17 -- social/logincore/build.gradle | 1 - social/logincore/proguard-rules.pro | 21 --- .../logincore/ExampleInstrumentedTest.java | 26 --- .../livetyping/logincore/SocialInitializer.kt | 3 +- .../livetyping/logincore/SocialLoginBinder.kt | 36 +++-- .../livetyping/logincore/SocialLoginError.kt | 6 - .../livetyping/logincore/SocialLoginResult.kt | 4 +- .../com/livetyping/logincore/SocialNetwork.kt | 11 +- .../livetyping/logincore/ExampleUnitTest.java | 17 -- social/social_login_item.gradle | 4 +- social/vk/build.gradle | 10 +- social/vk/proguard-rules.pro | 21 --- .../vk/ExampleInstrumentedTest.java | 26 --- .../kotlin/com/livetyping/vk/VkInitializer.kt | 7 +- .../kotlin/com/livetyping/vk/VkLoginError.kt | 10 -- .../kotlin/com/livetyping/vk/VkLoginResult.kt | 12 +- .../kotlin/com/livetyping/vk/VkNetwork.kt | 60 ++++--- .../com/livetyping/vk/ExampleUnitTest.java | 17 -- versions.gradle | 16 ++ 76 files changed, 773 insertions(+), 1119 deletions(-) delete mode 100644 app/src/androidTest/java/com/livetyping/activitybinder/ExampleInstrumentedTest.kt delete mode 100644 app/src/test/java/com/livetyping/activitybinder/ExampleUnitTest.kt delete mode 100644 core/proguard-rules.pro delete mode 100644 core/src/androidTest/java/com/livetyping/core/ExampleInstrumentedTest.java delete mode 100644 core/src/test/java/com/livetyping/core/ExampleUnitTest.java delete mode 100644 permission/proguard-rules.pro delete mode 100644 permission/src/androidTest/java/com/livetyping/permission/ExampleInstrumentedTest.java delete mode 100644 social/facebook/proguard-rules.pro delete mode 100644 social/facebook/src/androidTest/java/com/livetyping/facebook/ExampleInstrumentedTest.java delete mode 100644 social/facebook/src/main/kotlin/com/livetyping/facebook/FacebookLoginError.kt delete mode 100644 social/facebook/src/test/java/com/livetyping/facebook/ExampleUnitTest.java delete mode 100644 social/google/src/main/java/com/livetyping/google/GoogleLoginError.kt delete mode 100644 social/google/src/main/java/com/livetyping/google/GoogleTokenLoader.kt delete mode 100644 social/instagram/.gitignore delete mode 100644 social/instagram/build.gradle delete mode 100644 social/instagram/proguard-rules.pro delete mode 100644 social/instagram/src/androidTest/java/com/livetyping/instagram/ExampleInstrumentedTest.java delete mode 100644 social/instagram/src/main/AndroidManifest.xml delete mode 100644 social/instagram/src/main/kotlin/com/livetyping/instagram/InstagramInitializer.kt delete mode 100644 social/instagram/src/main/kotlin/com/livetyping/instagram/InstagramLoginError.kt delete mode 100644 social/instagram/src/main/kotlin/com/livetyping/instagram/InstagramLoginResult.kt delete mode 100644 social/instagram/src/main/kotlin/com/livetyping/instagram/InstagramNetwork.kt delete mode 100644 social/instagram/src/main/res/values/strings.xml delete mode 100644 social/instagram/src/test/java/com/livetyping/instagram/ExampleUnitTest.java delete mode 100644 social/logincore/proguard-rules.pro delete mode 100644 social/logincore/src/androidTest/java/com/livetyping/logincore/ExampleInstrumentedTest.java delete mode 100644 social/logincore/src/main/kotlin/com/livetyping/logincore/SocialLoginError.kt delete mode 100644 social/logincore/src/test/java/com/livetyping/logincore/ExampleUnitTest.java delete mode 100644 social/vk/proguard-rules.pro delete mode 100644 social/vk/src/androidTest/java/com/livetyping/vk/ExampleInstrumentedTest.java delete mode 100644 social/vk/src/main/kotlin/com/livetyping/vk/VkLoginError.kt delete mode 100644 social/vk/src/test/java/com/livetyping/vk/ExampleUnitTest.java create mode 100644 versions.gradle diff --git a/app/build.gradle b/app/build.gradle index ee84010..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 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout: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..80a933d 100644 --- a/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt +++ b/app/src/main/kotlin/com/livetyping/activitybinder/ImageBinderActivity.kt @@ -120,13 +120,13 @@ 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) { 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_permissions.xml b/app/src/main/res/layout/activity_permissions.xml index cf51f25..482d219 100644 --- a/app/src/main/res/layout/activity_permissions.xml +++ b/app/src/main/res/layout/activity_permissions.xml @@ -6,73 +6,70 @@ android:layout_height="match_parent" tools:context=".PermissionExampleActivity"> -