diff --git a/app/build.gradle b/app/build.gradle index 06d8497..fcc532c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,13 @@ apply plugin: 'com.android.application' - apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "com.shashankpednekar.imagepickercompression" - minSdkVersion 21 - targetSdkVersion 29 + minSdkVersion 23 + targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -21,21 +18,36 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + viewBinding { + enabled true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.13.1' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // Coroutines implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinerVer" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinerVer" - implementation "com.github.bumptech.glide:glide:4.10.0" + implementation "com.github.bumptech.glide:glide:4.12.0" + implementation 'androidx.activity:activity-ktx:1.3.0-alpha02' + implementation 'androidx.fragment:fragment-ktx:1.3.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fcbf4c1..6be4061 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,15 @@ xmlns:tools="http://schemas.android.com/tools" package="com.shashankpednekar.imagepickercompression"> - + + + + + + + + + , shouldRequestIfNotAllowed: Boolean = false, requestCode: Int = -1): Boolean { - var isGranted = true - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - for (permission in permissions) { - isGranted = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED - if (!isGranted) - break - } - } - if (!isGranted && shouldRequestIfNotAllowed) { - if (requestCode.equals(-1)) - throw RuntimeException("Send request code in third parameter") - requestRequiredPermissions(permissions, requestCode) - } - - return isGranted - } - - fun requestRequiredPermissions(permissions: Array, requestCode: Int) { - val pendingPermissions: ArrayList = ArrayList() - permissions.forEachIndexed { index, permission -> - if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) - pendingPermissions.add(permission) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val array = arrayOfNulls(pendingPermissions.size) - pendingPermissions.toArray(array) - requestPermissions(array, requestCode) - } - } - - fun isAllPermissionsGranted(grantResults: IntArray): Boolean { - var isGranted = true - for (grantResult in grantResults) { - isGranted = grantResult.equals(PackageManager.PERMISSION_GRANTED) - if (!isGranted) - break - } - return isGranted - } -} \ No newline at end of file diff --git a/app/src/main/java/com/shashankpednekar/imagepickercompression/activity/MainActivity.kt b/app/src/main/java/com/shashankpednekar/imagepickercompression/activity/MainActivity.kt index b450c83..3f4c706 100644 --- a/app/src/main/java/com/shashankpednekar/imagepickercompression/activity/MainActivity.kt +++ b/app/src/main/java/com/shashankpednekar/imagepickercompression/activity/MainActivity.kt @@ -2,82 +2,53 @@ package com.shashankpednekar.imagepickercompression.activity import android.Manifest import android.app.Activity +import android.app.AlertDialog import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.os.Environment import android.os.Parcelable import android.provider.MediaStore -import android.util.Log import android.view.View import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.shashankpednekar.imagepickercompression.BuildConfig -import com.shashankpednekar.imagepickercompression.ParentActivity import com.shashankpednekar.imagepickercompression.R +import com.shashankpednekar.imagepickercompression.databinding.ActivityMainBinding import com.shashankpednekar.imagepickercompression.utils.compressImageFile -import kotlinx.android.synthetic.main.activity_main.* import kotlinx.coroutines.* import java.io.File import java.util.ArrayList -private const val REQ_CAPTURE = 100 -private const val RES_IMAGE = 100 +class MainActivity : AppCompatActivity() { -class MainActivity : ParentActivity(R.layout.activity_main) { private var queryImageUrl: String = "" - private val tag = javaClass.simpleName private var imgPath: String = "" private var imageUri: Uri? = null - private val permissions = arrayOf(Manifest.permission.CAMERA) + private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - btn_capture.setOnClickListener { - if (isPermissionsAllowed(permissions, true, REQ_CAPTURE)) { - chooseImage() - } - } - } + binding = ActivityMainBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - when (requestCode) { - REQ_CAPTURE -> { - if (isAllPermissionsGranted(grantResults)) { + binding.btnCapture.setOnClickListener { chooseImage() - } else { - Toast.makeText( - this, - getString(R.string.permission_not_granted), - Toast.LENGTH_SHORT - ).show() - } - } } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - RES_IMAGE -> { - if (resultCode == Activity.RESULT_OK) { - handleImageRequest(data) - } - } - } - } private fun chooseImage() { - startActivityForResult(getPickImageIntent(), RES_IMAGE) + launchIntent.launch(getPickImageIntent()) } private fun getPickImageIntent(): Intent? { @@ -124,7 +95,6 @@ class MainActivity : ParentActivity(R.layout.activity_main) { return imageUri!! } - private fun addIntentsToList( context: Context, list: MutableList, @@ -143,7 +113,7 @@ class MainActivity : ParentActivity(R.layout.activity_main) { private fun handleImageRequest(data: Intent?) { val exceptionHandler = CoroutineExceptionHandler { _, t -> t.printStackTrace() - progressBar.visibility = View.GONE + binding.progressBar.visibility = View.GONE Toast.makeText( this, t.localizedMessage ?: getString(R.string.some_err), @@ -152,14 +122,14 @@ class MainActivity : ParentActivity(R.layout.activity_main) { } GlobalScope.launch(Dispatchers.Main + exceptionHandler) { - progressBar.visibility = View.VISIBLE + binding.progressBar.visibility = View.VISIBLE if (data?.data != null) { //Photo from gallery imageUri = data.data queryImageUrl = imageUri?.path!! queryImageUrl = compressImageFile(queryImageUrl, false, imageUri!!) } else { - queryImageUrl = imgPath ?: "" + queryImageUrl = imgPath compressImageFile(queryImageUrl, uri = imageUri!!) } imageUri = Uri.fromFile(File(queryImageUrl)) @@ -171,11 +141,17 @@ class MainActivity : ParentActivity(R.layout.activity_main) { .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .load(queryImageUrl) - .into(iv_img) + .into(binding.ivImg) } - progressBar.visibility = View.GONE + binding.progressBar.visibility = View.GONE } - } + private val launchIntent = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + handleImageRequest(result.data) + } + } + } diff --git a/app/src/main/java/com/shashankpednekar/imagepickercompression/utils/FileUtils.kt b/app/src/main/java/com/shashankpednekar/imagepickercompression/utils/FileUtils.kt index ef59d0f..9e7f67f 100644 --- a/app/src/main/java/com/shashankpednekar/imagepickercompression/utils/FileUtils.kt +++ b/app/src/main/java/com/shashankpednekar/imagepickercompression/utils/FileUtils.kt @@ -17,6 +17,7 @@ import java.util.* private const val tag = "FileUtils" +@Suppress("BlockingMethodInNonBlockingContext") suspend fun Activity.compressImageFile( path: String, shouldOverride: Boolean = true, diff --git a/build.gradle b/build.gradle index 4aec5d1..e8dac66 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,15 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' - ext.coroutinerVer = "1.1.1" + ext.kotlin_version = '1.4.30' + ext.coroutinerVer = "1.4.2" repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:4.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index beded37..39ca0a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 23 14:59:16 IST 2019 +#Mon Feb 22 21:42:00 IST 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip