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
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
220
Heart of Swift Concurrency
koher
0
740
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
970
Security issues being discussed on Web Platforms
petamoriken
0
940
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.9k
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
260
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
210
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
0
280
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
150
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
110
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
240
Featured
See All Featured
Technical Leadership for Architectural Decision Making
baasie
3
570
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Amusing Abliteration
ianozsvald
1
300
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Chasing Engaging Ingredients in Design
codingconduct
0
310
Music & Morning Musume
bryan
48
7.4k
So, you think you're a good person
axbom
PRO
2
2.2k
How to Talk to Developers About Accessibility
jct
2
550
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
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