RedJocker / fix-PhotoEditor

0 stars 0 forks source link

stage3 proposed solution does not deal with permissions #2

Closed RedJocker closed 2 years ago

RedJocker commented 2 years ago

Proposed solution throws error because it lacks permission to write to storage. Tests and description should also be updated for this issue

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.hyperskill.photoeditor, PID: 32565
    java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=32565, uid=10102 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
        at android.content.ContentResolver.insert(ContentResolver.java:1539)
        at org.hyperskill.photoeditor.MainActivity.saveImage(MainActivity.kt:59)
        at org.hyperskill.photoeditor.MainActivity$onCreate$1.onClick(MainActivity.kt:36)
        at android.view.View.performClick(View.java:6294)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1120)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
(...)
RedJocker commented 2 years ago

reference for writing solution

RedJocker commented 2 years ago

sketch for testing permission code


 @Test
    fun testShouldCheckPermission() {
        val shadowActivity = shadowOf(activity)
        val btnSave = activity.findViewById<Button>(R.id.btnSave)
        btnSave.performClick()
        val permissionRequest = shadowActivity.lastRequestedPermission ?: throw AssertionError("Permission should be requested")
        val hasRequestedPermission = permissionRequest.requestedPermissions.filter { it == Manifest.permission.WRITE_EXTERNAL_STORAGE }.any()
        assert(hasRequestedPermission) { "Permission should be requested" }
    }
RedJocker commented 2 years ago

granting permission code (to be used in tests that assume the permission is granted)


val shadowActivity = shadowOf(activity)
shadowActivity.grantPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
RedJocker commented 2 years ago

fixed tests on fixTests branch, pending description and solution update

RedJocker commented 2 years ago

description updated on fixTests branch new proposed solution is on alternativeSolution branch