Skip to content

Commit a611d36

Browse files
author
hotchemi
committed
Implement Kotlin processor and add test.
1 parent 4ee6dbd commit a611d36

14 files changed

+353
-109
lines changed

processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/KotlinBaseProcessorUnit.kt

Lines changed: 124 additions & 68 deletions
Large diffs are not rendered by default.

processor/src/main/kotlin/permissions/dispatcher/processor/util/Helpers.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ fun varargsParametersCodeBlock(needsElement: ExecutableElement, withCache: Boole
6363
return varargsCall.build()
6464
}
6565

66-
fun varargsKtParametersCodeBlock(needsElement: ExecutableElement): com.squareup.kotlinpoet.CodeBlock {
66+
fun varargsKtParametersCodeBlock(needsElement: ExecutableElement, withCache: Boolean = false): com.squareup.kotlinpoet.CodeBlock {
6767
val varargsCall = com.squareup.kotlinpoet.CodeBlock.builder()
6868
needsElement.parameters.forEachIndexed { i, it ->
69-
varargsCall.add("%L", it.simpleString())
69+
val name = if (withCache) "${needsElement.argumentFieldName(it)}!!" else it.simpleString()
70+
varargsCall.add("%L", name)
7071
if (i < needsElement.parameters.size - 1) {
7172
varargsCall.add(", ")
7273
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package permissions.dispatcher.test
2+
3+
import android.Manifest
4+
import androidx.appcompat.app.AppCompatActivity
5+
import permissions.dispatcher.*
6+
7+
@RuntimePermissions
8+
open class ActivityWithNoParameterArgumentKt : AppCompatActivity() {
9+
10+
@NeedsPermission(Manifest.permission.CAMERA)
11+
fun showCamera() {
12+
}
13+
14+
@OnShowRationale(Manifest.permission.CAMERA)
15+
fun showRationaleForCamera() {
16+
}
17+
18+
@OnPermissionDenied(Manifest.permission.CAMERA)
19+
fun showDeniedForCamera() {
20+
}
21+
22+
@OnNeverAskAgain(Manifest.permission.CAMERA)
23+
fun showNeverAskForCamera() {
24+
}
25+
26+
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
27+
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
28+
onRequestPermissionsResult(requestCode, grantResults)
29+
}
30+
}

test/src/main/java/permissions/dispatcher/test/SupportFragmentWithAllAnnotations.java renamed to test/src/main/java/permissions/dispatcher/test/FragmentWithAllAnnotations.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import permissions.dispatcher.RuntimePermissions;
1313

1414
@RuntimePermissions
15-
public class SupportFragmentWithAllAnnotations extends Fragment {
15+
public class FragmentWithAllAnnotations extends Fragment {
1616

1717
@NeedsPermission(Manifest.permission.CAMERA)
1818
void showCamera() {
@@ -33,7 +33,6 @@ void showNeverAskForCamera() {
3333
@Override
3434
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
3535
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
36-
SupportFragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
36+
FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
3737
}
38-
3938
}

test/src/main/java/permissions/dispatcher/test/SupportFragmentWithAllAnnotationsKt.kt renamed to test/src/main/java/permissions/dispatcher/test/FragmentWithAllAnnotationsKt.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import androidx.fragment.app.Fragment
55
import permissions.dispatcher.*
66

77
@RuntimePermissions
8-
open class SupportFragmentWithAllAnnotationsKt : Fragment() {
8+
open class FragmentWithAllAnnotationsKt : Fragment() {
99

1010
@NeedsPermission(Manifest.permission.CAMERA)
1111
fun showCamera() {
@@ -27,5 +27,4 @@ open class SupportFragmentWithAllAnnotationsKt : Fragment() {
2727
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
2828
onRequestPermissionsResult(requestCode, grantResults)
2929
}
30-
3130
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package permissions.dispatcher.test
2+
3+
import android.content.pm.PackageManager
4+
import android.os.Process
5+
import androidx.core.app.ActivityCompat
6+
import androidx.core.app.AppOpsManagerCompat
7+
import androidx.core.content.PermissionChecker
8+
import org.junit.After
9+
import org.junit.Before
10+
import org.junit.BeforeClass
11+
import org.junit.Test
12+
import org.junit.runner.RunWith
13+
import org.mockito.Mockito
14+
import org.powermock.api.mockito.PowerMockito
15+
import org.powermock.core.classloader.annotations.PrepareForTest
16+
import org.powermock.modules.junit4.PowerMockRunner
17+
18+
@Suppress("IllegalIdentifier")
19+
@RunWith(PowerMockRunner::class)
20+
@PrepareForTest(ActivityCompat::class, PermissionChecker::class, AppOpsManagerCompat::class, Process::class)
21+
class ActivityWithNoParameterArgumentKtPermissionsDispatcherTest {
22+
23+
private lateinit var activity: ActivityWithNoParameterArgumentKt
24+
25+
companion object {
26+
private var requestCode = 0
27+
lateinit private var requestPermissions: Array<String>
28+
29+
@BeforeClass
30+
@JvmStatic
31+
fun setUpForClass() {
32+
// TODO Reflection on Kotlin top-level properties?
33+
requestCode = 3
34+
requestPermissions = arrayOf("android.permission.CAMERA")
35+
}
36+
}
37+
38+
@Before
39+
fun setUp() {
40+
activity = Mockito.mock(ActivityWithNoParameterArgumentKt::class.java)
41+
PowerMockito.mockStatic(ActivityCompat::class.java)
42+
PowerMockito.mockStatic(PermissionChecker::class.java)
43+
PowerMockito.mockStatic(Process::class.java)
44+
PowerMockito.mockStatic(AppOpsManagerCompat::class.java)
45+
}
46+
47+
@After
48+
fun tearDown() {
49+
clearCustomManufacture()
50+
clearCustomSdkInt()
51+
}
52+
53+
@Test
54+
fun `already granted call the method`() {
55+
mockCheckSelfPermission(true)
56+
57+
activity.showCameraWithPermissionCheck()
58+
59+
Mockito.verify(activity, Mockito.times(1)).showCamera()
60+
}
61+
62+
@Test
63+
fun `not granted does not call the method`() {
64+
mockCheckSelfPermission(false)
65+
mockShouldShowRequestPermissionRationaleActivity(true)
66+
67+
activity.showCameraWithPermissionCheck()
68+
69+
Mockito.verify(activity, Mockito.times(0)).showCamera()
70+
}
71+
72+
@Test
73+
fun `not granted permission and show rationale is true then call the rationale method`() {
74+
mockCheckSelfPermission(false)
75+
mockShouldShowRequestPermissionRationaleActivity(true)
76+
77+
activity.showCameraWithPermissionCheck()
78+
79+
Mockito.verify(activity, Mockito.times(1)).showRationaleForCamera()
80+
}
81+
82+
@Test
83+
fun `not granted permission and show rationale is false then does not call the rationale method`() {
84+
mockCheckSelfPermission(false)
85+
mockShouldShowRequestPermissionRationaleActivity(false)
86+
87+
activity.showCameraWithPermissionCheck()
88+
89+
Mockito.verify(activity, Mockito.times(0)).showRationaleForCamera()
90+
}
91+
92+
@Test
93+
fun `the method is called if verifyPermission is true`() {
94+
activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))
95+
96+
Mockito.verify(activity, Mockito.times(1)).showCamera()
97+
}
98+
99+
@Test
100+
fun `the method is not called if verifyPermission is false`() {
101+
activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))
102+
103+
Mockito.verify(activity, Mockito.times(0)).showCamera()
104+
}
105+
106+
@Test
107+
fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {
108+
mockShouldShowRequestPermissionRationaleActivity(false)
109+
110+
activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))
111+
112+
Mockito.verify(activity, Mockito.times(1)).showNeverAskForCamera()
113+
}
114+
115+
@Test
116+
fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {
117+
mockShouldShowRequestPermissionRationaleActivity(true)
118+
119+
activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))
120+
121+
Mockito.verify(activity, Mockito.times(1)).showDeniedForCamera()
122+
}
123+
124+
@Test
125+
fun `no the method call if request code is not related to the library`() {
126+
activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())
127+
128+
Mockito.verify(activity, Mockito.times(0)).showCamera()
129+
}
130+
131+
@Test
132+
fun `no denied method call if request code is not related to the library`() {
133+
activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())
134+
135+
Mockito.verify(activity, Mockito.times(0)).showDeniedForCamera()
136+
}
137+
138+
@Test
139+
fun `no never ask method call if request code is not related to the library`() {
140+
activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())
141+
142+
Mockito.verify(activity, Mockito.times(0)).showNeverAskForCamera()
143+
}
144+
145+
@Test
146+
fun `blow M follows checkSelfPermissions result false`() {
147+
overwriteCustomSdkInt(22)
148+
mockCheckSelfPermission(false)
149+
150+
activity.showCameraWithPermissionCheck()
151+
152+
Mockito.verify(activity, Mockito.times(0)).showCamera()
153+
}
154+
155+
@Test
156+
fun `blow M follows checkSelfPermissions result true`() {
157+
overwriteCustomSdkInt(22)
158+
mockCheckSelfPermission(true)
159+
160+
activity.showCameraWithPermissionCheck()
161+
162+
Mockito.verify(activity, Mockito.times(1)).showCamera()
163+
}
164+
}

test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcherTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcherTest {
3636
@JvmStatic
3737
fun setUpForClass() {
3838
// TODO Reflection on Kotlin top-level properties?
39-
requestCode = 9
39+
requestCode = 10
4040
}
4141
}
4242

test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKtAllAnnotationsTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ActivityWithSystemAlertWindowKtAllAnnotationsTest {
3535
@JvmStatic
3636
fun setUpForClass() {
3737
// TODO Reflection on Kotlin top-level properties?
38-
requestCode = 11
38+
requestCode = 12
3939
}
4040
}
4141

test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKtTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ActivityWithSystemAlertWindowKtTest {
3333
@JvmStatic
3434
fun setUpForClass() {
3535
// TODO Reflection on Kotlin top-level properties?
36-
requestCode = 10
36+
requestCode = 11
3737
}
3838
}
3939

test/src/test/java/permissions/dispatcher/test/ActivityWithWriteSettingKtAllAnnotationsTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ActivityWithWriteSettingKtAllAnnotationsTest {
3535
@JvmStatic
3636
fun setUpForClass() {
3737
// TODO Reflection on Kotlin top-level properties?
38-
requestCode = 15
38+
requestCode = 16
3939
}
4040
}
4141

0 commit comments

Comments
 (0)