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.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
190
khronos
hotchemi
4
2k
Other Decks in Programming
See All in Programming
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
260
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
960
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
720
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
1
460
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.3k
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
560
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
110
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
200
信頼性の目標を誰も求めてない
shubox
0
480
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.3k
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
620
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
290
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
310
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
360
Product Roadmaps are Hard
iamctodd
55
13k
Faster Mobile Websites
deanohume
310
32k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
The SEO identity crisis: Don't let AI make you average
varn
0
550
Facilitating Awesome Meetings
lara
57
7.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
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