Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PermissionsDispatcher × Kotlin
Search
@hotchemi
July 18, 2017
Programming
3.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PermissionsDispatcher × Kotlin
CA.kt #2
@hotchemi
July 18, 2017
More Decks by @hotchemi
See All by @hotchemi
kompile-testing internal
hotchemi
0
290
The things we’ve learned from iOS×React Native hybrid development
hotchemi
2
5.5k
React Nativeを活用したアプリ開発体制/sapuri meetup
hotchemi
3
8.3k
Type-Safe i18n on RN
hotchemi
2
1.2k
Navigation in a hybrid app
hotchemi
3
1.4k
kotlin compiler plugin
hotchemi
1
820
Rx and Preferences
hotchemi
2
180
Introducing PermissionsDispatcher
hotchemi
1
190
khronos
hotchemi
4
2k
Other Decks in Programming
See All in Programming
源内ハンズオン概要編
hideg
0
130
5分で問診!Composer セキュリティ健康診断
codmoninc
0
910
数百円から始めるRuby電子工作
tarosay
0
140
Built Our Own Background Agent at LayerX
layerx
PRO
9
5.1k
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
Foundation Models frameworkで画像分析
ryodeveloper
1
600
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
670
継続モナドとリアクティブプログラミング
yukikurage
3
700
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
160
「人を評価する AI」の設計と実装
ryoyanara
0
180
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
350
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The SEO identity crisis: Don't let AI make you average
varn
0
530
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
How GitHub (no longer) Works
holman
316
150k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
440
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
Designing for Timeless Needs
cassininazir
1
430
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
PermissionsDispatcher ✖ Kotlin
• PermissionsDispatcher • Generate Runtime Permissions code • 100% reflection-free
• Special permissions support • Xiaomi support • committer: @shiraji, @aurae
• 3.0.0(beta) • fully Kotlin support • Why? • to
support inline modifier • to make API Kotlin-ish • Now it’s official
repositories { jcenter() maven { url ‘http://oss.jfrog.org/artifactory/oss-snapshot-local/' } } dependencies
{ compile(“com.github.hotchemi:permissionsdispatcher:3.0.0-SNAPSHOT”) { exclude module: "support-v13" } kapt "com.github.hotchemi:permissionsdispatcher-processor:3.0.0-SNAPSHOT" }
@RuntimePermissions class MainActivity extends AppCompatActivity Java
@NeedsPermission(Manifest.permission.CAMERA) void showCamera(); MainActivityPermissionsDispatcher.showCameraWithCheck(this); Java
@RuntimePermissions(kotlin = true) class MainActivity : AppCompatActivity() Kotlin
@NeedsPermission(Manifest.permission.CAMERA) inline fun showCamera() showCameraWithCheck() Kotlin
private val REQUEST_SHOWCAMERA: Int = 0 private val PERMISSION_SHOWCAMERA: Array<String>
= arrayOf("android.permission.CAMERA") fun MainActivity.showCameraWithCheck() { if (PermissionUtils.hasSelfPermissions(this, PERMISSION_SHOWCAMERA)) { showCamera() } else { if (PermissionUtils.shouldShowRequestPermissionRationale(this, PERMISSION_SHOWCAMERA)) { showRationaleForCamera(ShowCameraPermissionRequest(this)) } else { ActivityCompat.requestPermissions(this, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA) } } } fun MainActivity.onRequestPermissionsResult(requestCode: Int, grantResults: IntArray): Unit { when (requestCode) { REQUEST_SHOWCAMERA -> if (PermissionUtils.verifyPermissions(*grantResults)) { showCamera() } else { if (!PermissionUtils.shouldShowRequestPermissionRationale(this, PERMISSION_SHOWCAMERA)) { onCameraNeverAskAgain() } else { onCameraDenied() } } } } private class ShowCameraPermissionRequest(target: MainActivity) : PermissionRequest { private val weakTarget: WeakReference<MainActivity> = WeakReference(target) override fun proceed() { val target = weakTarget.get() ?: return ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA) } override fun cancel() { val target = weakTarget.get() ?: return target.onCameraDenied() } }
• Under the hood • generate .kt file at compile
time • KotlinPoet • kapt3 • Testing
• KotlinPoet • Kotlin version of JavaPoet • DSL for
generating source files • latest ver: 0.3.0 • early-access release • KDoc is not updated • writeTo(filer: Filer) is not supported
class Greeter(val name: String) { fun greet() { println("Hello, $name")
} } fun main(vararg args: String) { Greeter(args[0]).greet() }
val greeterClass = ClassName("", "Greeter") val kotlinFile = KotlinFile.builder("", "HelloWorld")
.addType(TypeSpec.classBuilder("Greeter") .primaryConstructor(FunSpec.constructorBuilder() .addParameter("name", String::class) .build()) .addProperty(PropertySpec.builder("name", String::class) .initializer("name") .build()) .addFun(FunSpec.builder("greet") .addStatement("println(%S)", "Hello, \$name") .build()) .build()) .addFun(FunSpec.builder("main") .addParameter("args", String::class, VARARG) .addStatement("%T(args[0]).greet()", greeterClass) .build()) .build() kotlinFile.writeTo(System.out)
if (isKotlin) { val kaptGeneratedDirPath = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME]?.replace("kaptKotlin", "kap processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Can't
find the target directory for generated Kot return false } val kaptGeneratedDir = File(kaptGeneratedDirPath) if (!kaptGeneratedDir.parentFile.exists()) { kaptGeneratedDir.parentFile.mkdirs() } val processorUnits = listOf(ActivityKtProcessorUnit(), SupportFragmentKtProcessorUnit(), NativeFragmentKtProces val processorUnit = findAndValidateKtProcessorUnit(processorUnits, it) val kotlinFile = processorUnit.createKotlinFile(rpe, requestCodeProvider) kotlinFile.writeTo(kaptGeneratedDir) } else { val processorUnits = listOf(ActivityProcessorUnit(), SupportFragmentProcessorUnit(), NativeFragmentProcessorUni val processorUnit = findAndValidateProcessorUnit(processorUnits, it) val javaFile = processorUnit.createJavaFile(rpe, requestCodeProvider) javaFile.writeTo(filer) }
• kapt3 • supports .kt file generation • kt generated/source/kaptKotlin/$sourceSet
• java generated/source/kapt/$sourceSet • apt generated/source/apt/$sourceSet • processingEnv. options[“kapt.kotlin.generated”]
• kapt3 • But… • kaptKotlin dir was not recognized
correctly with Android project… • worked well only on java project • filed a bug report • youtrack.jetbrains.com/issue/KT-19097
• Testing • we can’t use google/compile-testing • write tests
for behavior, not code itself • with PowerMockito, Robolectric • check test, test-v13 projects • read Testing Against Annotation Processing • by @shiraji san
• What learned • Supporting Java/Kotlin is tough work than
we expected • class delegation is a way to go? • Anyway it was fun:D
• Misc • 3.0.0 would be officially released soon! •
Hopefully end of July • Give us feedback!
Thank you