Notification channels and categories

Notification channels give users granular control over notification types on Android 8+. I create channels with unique IDs, names, and importance levels. Channels group related notifications—messages, reminders, promotions. Users control vibration, so

App widgets for home screen

App Widgets display app content on the home screen. I extend AppWidgetProvider, a BroadcastReceiver subclass handling widget lifecycle. onUpdate() refreshes widget UI, onEnabled() initializes on first widget added, onDisabled() cleans up when last rem

Broadcast Receivers for system events

BroadcastReceiver responds to system-wide or app-specific events. I register receivers statically in AndroidManifest or dynamically with registerReceiver(). The onReceive() method handles broadcasts—network changes, battery status, boot completed, SMS

LiveData transformations and mediators

LiveData transformations create derived data streams reactively. Transformations.map() converts values—like mapping User to username string. Transformations.switchMap() switches LiveData sources based on input, enabling dynamic queries. MediatorLiveDa

Custom ViewGroup for advanced layouts

Custom ViewGroups enable specialized layout behavior beyond standard containers. I extend ViewGroup and override onMeasure() to measure children and onLayout() to position them. measureChild() or measureChildWithMargins() determines child sizes. Layou

Download Manager for file downloads

DownloadManager handles long-running downloads with notification progress. I create DownloadManager.Request with URI and destination. setNotificationVisibility() controls progress notifications. Headers customize HTTP requests. Network type requiremen

Biometric authentication implementation

BiometricPrompt provides secure authentication via fingerprint, face, or iris. I create BiometricPrompt with callback handling success, error, and failure. PromptInfo configures title, subtitle, description, and allowed authenticators. Negative button

CameraX for camera functionality

CameraX simplifies camera implementation with consistent behavior across devices. I bind use cases—Preview, ImageCapture, ImageAnalysis, VideoCapture—to lifecycle. ProcessCameraProvider manages camera instances. Preview displays viewfinder, ImageCaptu

ExoPlayer for media playback

ExoPlayer is a flexible media player supporting diverse formats and protocols. I create instances with ExoPlayer.Builder(context).build() and configure with MediaItem. Setting player.setMediaItem() and player.prepare() initializes playback. PlayerView

DataStore for modern preferences

DataStore replaces SharedPreferences with coroutine and Flow support. Preferences DataStore stores key-value pairs with type safety using preferencesDataStore delegate. Proto DataStore stores typed objects using Protocol Buffers. I use dataStore.data

Glide for image loading and caching

Glide efficiently loads and caches images from network, disk, or resources. I use Glide.with(context).load(url).into(imageView) for basic loading. Transformations apply effects—centerCrop(), circleCrop(), RoundedCorners(). Placeholders show during loa

Firebase Cloud Messaging for push notifications

Firebase Cloud Messaging (FCM) delivers push notifications across platforms. I extend FirebaseMessagingService and override onMessageReceived() to handle incoming messages. Device tokens obtained via FirebaseMessaging.getInstance().token register with