Android Kotlin native development skill. USE FOR: creating Activities, Fragments, layouts XML, drawables, adapters, ViewBinding, CameraX, OpenGL, AdMob ads integration, In-App Billing, RecyclerView, navigation, manifest registration, Gradle dependencies, ProGuard rules, Android resource management. DO NOT USE FOR: React Native, Flutter, iOS, web development.
#1A1A1A, camera/player #000000#FFC107 (yellow) for buttons, active states, FAB#1A1A1A (dark)#FFFFFF#80FFFFFF#66000000bg_ prefix (bg_button_primary, bg_circle_button)ic_ prefix (ic_back, ic_camera, ic_home)activity_, item_, fragment_, dialog_ prefixesXxxActivity.kt paired with activity_xxx.xmlbtnCamera, rvVideos, tvTitle, imgThumbnail)res/layout/activity_xxx.xmlui/ subfolderActivityXxxBinding.inflate(layoutInflater)AndroidManifest.xml:
<activity
android:name=".ui.xxx.XxxActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.NativeCamera.Fullscreen" />
gradlew assembleDebugres/layout/item_xxx.xmladapter/ subfolderItemXxxBinding.inflate()bindingAdapterPosition (NOT deprecated adapterPosition)(Item) -> Unit#FFFFFF<shape> with <solid>, <corners>, <gradient>#CC000000 → transparent, bottom transparent → #CC000000res/drawable/ (no subfolders)<ImageView
android:id="@+id/btnBack"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="16dp"
android:layout_marginTop="44dp"
android:background="@drawable/bg_circle_button"
android:contentDescription="Back"
android:padding="10dp"
android:scaleType="centerInside"
android:src="@drawable/ic_back" />
// Before navigation with interstitial
AdManager.frequencyController.recordAction()
AdManager.showInterstitialIfReady(activity) {
// onDismiss callback — navigate here
}
// App Open Ad with callback
AdManager.appOpenAdManager.showIfAvailable(activity) {
// onDismiss callback
}
val videoUri = Uri.parse("android.resource://$packageName/$rawResId")
binding.videoView.setVideoURI(videoUri)
binding.videoView.setOnPreparedListener { mp ->
mp.isLooping = true
binding.videoView.start()
}
// For raw resources — use file descriptor, NOT URI
val afd = context.resources.openRawResourceFd(rawResId)
val retriever = MediaMetadataRetriever()
retriever.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
val bitmap = retriever.getFrameAtTime(1_000_000)
retriever.release()
afd.close()
.\gradlew.bat assembleDebug.\gradlew.bat clean assembleDebugapp/build.gradle.ktssettings.gradle.kts with content{} filtersapp/proguard-rules.proget_errors)gradlew assembleDebug)