Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PermissionsDispatcher × Kotlin
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
@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.3k
Navigation in a hybrid app
hotchemi
3
1.4k
kotlin compiler plugin
hotchemi
1
830
Rx and Preferences
hotchemi
2
190
Introducing PermissionsDispatcher
hotchemi
1
200
khronos
hotchemi
4
2k
Other Decks in Programming
See All in Programming
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
280
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
Java 27新機能 / Java 27 new features
kishida
2
180
アクセシビリティから考える情報設計
high_g_engineer
0
420
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
850
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
590
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
18
18k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
110
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
540
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
240
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
699
190k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Scaling GitHub
holman
464
140k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
530
How STYLIGHT went responsive
nonsquared
100
6.3k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
The Limits of Empathy - UXLibs8
cassininazir
1
690
Prompt Engineering for Job Search
mfonobong
0
460
sira's awesome portfolio website redesign presentation
elsirapls
0
420
Technical Leadership for Architectural Decision Making
baasie
3
580
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