Amazon to rescind its publisher role on Lost Ark and Throne and Liberty by early 2027
Amazon Games is returning the MMOs to their respective developers.
Explore
Mobile gaming news - hit titles, studios, monetization trends, and the platforms powering play on the go.
815 results • Page 4 of 68
Amazon Games is returning the MMOs to their respective developers.
Posted by Nick Butcher, Product Manager, Jetpack Compose Today, the Jetpack Compose August ‘26 release is stable! This release brings version 1.12 across core Compose modules (see the full BOM mapping ), introducing rich visual APIs like Mesh Gradients and Wide Color Gamut (WCG) support, structural layout features like named areas in Grid, seamless integration with Android’s Credential Manager, and significant testing and performance improvements. To update your project to today’s release, upgrade your Compose BOM version to 2026.08.00 : implementation(platform("androidx.compose:compose-bom:2026.08.00")) Breaking Changes AGP & Compile SDK: Compose 1.12 updates compileSdk to API 37, requiring a minimum AGP 9.1.1. As a reminder, Compose will always target the latest compileSdk . Learn more about this change here . Modifier.onFirstVisible() is deprecated: Migrate to Modifier.onVisibilityChanged() , which provides more precise visibility threshold tracking. Graphics Mesh Gradients Compose 1.12 introduces MeshGradientPainter to help you create multi-point, organic color gradients. val rows = 1 val columns = 1 val gradientPainter = remember { MeshGradientPainter(rows, columns) { // Parameters: row, column, position, color setVertex(0, 0, Offset(0f, 0f), Color.Red) // Top-Left setVertex(0, 1, Offset(1f, 0f), Color.Blue) // Top-Right setVertex(1, 0, Offset(0f, 1f), Color.Green) // Bottom-Left setVertex(1, 1, Offset(1f, 1f), Color.Yellow) // Bottom-Right } } Box( modifier = modifier .aspectRatio(16/9f) .fillMaxWidth() .paint(gradientPainter) ) For more information and examples, see the documentation . Wide Color Gamut & HDR Support Modern displays offer extended color fidelity and higher dynamic range. In Compose 1.12, full pipeline support for Wide Color Gamut (P3) and HDR rendering has been enabled across Compose graphics, paint, and shaders. Colors defined in non-sRGB color spaces (such as Display P3) are preserved through to platform rendering without color clamping. Colors will safely fall back to sRGB if they use an unsupported color space (e.g. CieXyz, CieLab, or Oklab), rely on a color space on an unsupported Android version (e.g Bt2020Hlg on Android 13 and below), or if the app is running on Android 9 (API 28) and below. Other notable changes: LayerOutsets was added to GraphicsLayer & Modifier.graphicsLayer , which you can use to increase the visual bounds of the layer beyond its measured size. Apply LayerOutsets to avoid the implicit clipToBounds behavior when the layer is promoted to an offscreen buffer. Styles At Google I/O, we shared our early vision for the Compose Styles API —a unified, performant way to style components. Since then, we have continued building the underlying architecture to guarantee strict type safety and predictable correctness, and to support building custom design systems. To ensure we get this foundational layer correct, the API will remain experimental, and you can expect breaking changes. Runtime Optimizations Keyed SideEffect Overload SideEffect now supports key arguments, which lets you fire one-shot side effects whenever specific keys change. This can lead to better performance compared to using a LaunchedEffect or DisposableEffect when you don’t need the coroutine or dispose block. SideEffect is up to 90% faster than LaunchedEffect and around 20% faster than DisposableEffect . Note that SideEffect runs its effect before DisposableEffect and LaunchedEffect , so use caution if migrating existing effects to this API, especially for LaunchedEffects that rely on being dispatched to start after the current frame is completed. @Composable fun AnalyticsTracker(userId: String, screenName: String) { SideEffect(key1 = userId, key2 = screenName) { analytics.logScreenView(userId, screenName) } } Animation DeferredTargetAnimation has graduated out of experimental status. Interactive Two-Stage Transitions New composables: DeferredAnimatedContent and DeferredAnimatedVisibility allow creating delightful two-stage transitions, e.g. for predictive back gesture tracking. Manual animation control: During a transition's deferred phase, animated properties (like scale or offset) can now be manually manipulated in real-time (e.g., tracking a swipe gesture). Seamless handoff: Once the deferred phase ends, the transition engine takes over and performs a seamless handoff, including velocity transfer, to the automatic transition. Shared element support: A new permitTransformDuringDeferredTransition flag in SharedContentConfig controls whether shared elements visually transform along with their parent containers during the deferred transition phase. val state = remember { DeferredTransitionState(initialScreen) } val transition = rememberDeferredTransition(state) if (predictiveBackInProgress) { state.defer(targetScreen) } else { state.animateTo(targetScreen) } transition.DeferredAnimatedContent( targetState = targetScreen, mutableTransformSpec = { MutableContentTransform { // Manually manipulate properties during the deferred phase initialContentTransform { scale = swipeProgress } } } ) { screen -> ScreenContent(screen) } Below are two demos of use cases where a gesture-driven animation is handed off to a triggered animation: Text, Input & Platform Integrations Editable Text Formatting New APIs offer rich-text formatting for editable text in BasicTextField . You can now programmatically apply and manipulate inline character and paragraph formatting using SpanStyle and ParagraphStyle via the new addStyle() method inside a TextFieldBuffer scope (such as inside textFieldState.edit { ... } or an InputTransformation ). Additionally, TextFieldBuffer provides getSpanStyles() and getParagraphStyles() APIs that return TrackedRange objects, allowing you to read, update, or remove applied styles. To complement formatting creation, TextFieldState now exposes a read-only textStyles property for querying active styles across ranges, while TextFieldBuffer provides originalTextStyles to inspect formatting state prior to an edit. Text formatting and custom annotations are persisted across configuration changes. val state = rememberTextFieldState("Formatted text in Compose 1.12") // Apply bold and color styles to a range of text state.edit { addStyle( SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue), start = 0, end = 9 ) } // Query active styles from TextFieldState val currentStyles = state.textStyles Text Selection A new SelectionState API provides programmatic control and observability over text selection within a SelectionContainer . Hoisting a SelectionState object via rememberSelectionState() and passing into SelectionContainer exposes selectedTexts as a reactive list of AnnotatedStrings and provides methods like selectAll() , clear() , select(TextRange) , and extendSelectionByWord() . Additionally, use getSelectableTexts() to retrieve all selectable text items in layout order and select text across composables in the SelectionContainer using a global range. @Composable fun ProgrammaticSelectionExample() { val selectionState = rememberSelectionState() Column { Button( onClick = { selectionState.selectAll() }, modifier = Modifier.disableSelectionClearOnTap() ) { Text("Select All") } SelectionContainer(state = selectionState) { Text("Text content to be selected programmatically.") } } } Credential Manager Integration Compose text fields now natively integrate with Android’s Credential Manager (API 34+) via the Autofill framework (below API 34 is handled by androidx.credentialslibrary ). By attaching the new credentialRequest semantics property with CredentialRequestData , text inputs can prompt passkeys, saved credentials, or sign-in requests directly within the user input flow. @Composable fun LoginField(textFieldState: TextFieldState) { val credentialData = remember { CredentialRequestData( // Specify Credential Manager request options ) } BasicTextField( state = textFieldState, modifier = Modifier.semantics { credentialRequest = credentialData } ) } Other notable changes: Support for font variation settings in downloadable fonts . Enabled auto-scrolling when dragging text selection beyond the viewport in SelectionContainer . Added support for automatic interaction sounds (clicks and focus navigation) to Compose components, with a new SoundEffectOnInteraction composable to allow opt-out. Note that as a consequence of this change, semantics click listeners must now be called from the main thread, which may affect a small number of test cases. KeyboardType now includes Date , Time , DateTime , and SignedDecimal . BasicSecureTextField now uses TextObfuscationMode.System by default, while RevealLastTyped serves as an absolute override. Layout Enhancements Named Areas in Grid Layout Building complex 2D layouts is now easier with named areas in the @Experimental Grid component. Rather than managing numeric column and row indices across items, you can define semantic regions in your GridConfigurationScope and position composables by area name. @OptIn(ExperimentalGridApi::class) @Composable fun DashboardLayout() { Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) gap(16.dp) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) NavigationSidebar(modifier = Modifier.gridItem(areaId = "sidebar")) MainContentView(modifier = Modifier.gridItem(areaId = "content")) } } For more information, see the documentation . Performance As with every release, we continue to invest in Compose's performance to ensure that the framework helps you to build beautiful, performant apps. In this release we've focused on improving startup performance and are now seeing Time to Initial Display (the time it takes for an app to produce its first frame) that is comparable to Views in our benchmarks . Testing & Tooling Upgrades Test Synchronization Compose 1.12 introduces new test APIs designed to reduce test execution times and eliminate flakiness during state sampling: hasPendingWork : Passively checks if the UI has pending work without advancing the clock, which is ideal for manual animation loops. runWithoutImplicitWait : Temporarily disables implicit synchronization when stepping through manual clock frames (e.g. animation tests). @Test fun testAnimationStateFast() { composeTestRule.mainClock.autoAdvance = false while (composeTestRule.hasPendingWork()) { composeTestRule.mainClock.advanceTimeByFrame() composeTestRule.waitForIdle() composeTestRule.runOnUiThread { composeTestRule.runWithoutImplicitWait { // This is most effective when querying multiple nodes in a single frame. // It prevents the redundant synchronization overhead that would // otherwise occur on every individual query. val box1 = composeTestRule.onNodeWithTag("Box1").fetchSemanticsNode() val box2 = composeTestRule.onNodeWithTag("Box2").fetchSemanticsNode() assertThat(box1.boundsInRoot.right).isAtMost(box2.boundsInRoot.left) } } } } Other notable changes: The captureToImage API now allows you to capture a popup or dialog together with its anchor in a single bitmap. Added onRootWithViewInteraction to scope Compose semantic searches to specific Android Views. This simplifies testing hybrid UIs, such as RecyclerViews, without requiring unique test tags in production code. @PreviewWrapper annotations can now be applied to custom @MultiPreview classes, enabling reusable preview setups (such as custom themes) across multiple components. Happy Composing! Compose 1.12 makes app development easier and more expressive than ever, with mesh gradients, wide color gamut support, downloadable variable fonts, Credential Manager integration, and faster testing tools. As always, we value your input, so please share your feedback on these changes or what you'd like to see next on our issue tracker . Happy composing!
Apple generates appropriate age ratings based on your answers to the age rating questionnaire in App Store Connect. In compliance with local regulatory requirements, apps in the Games and Entertainment categories distributed on the App Store in Korea receive a region-specific age rating based on these answers. We’re making two changes to age ratings in the Republic of Korea: one taking effect today and the other later this year. First, starting today, if your app has received an official rating from the Game Rating and Administration Committee (GRAC), you can now override your app’s existing age rating for the App Store in Korea to any of the region-specific ratings (All, 12+, 15+, or 19+) by providing your GRAC Rating Classification Number (RCN) with your app’s next version submission. Learn how to override an age rating for the Republic of Korea Second, starting in October 2026, two content descriptors will move from an age rating of All to 12+ for the App Store in Korea: Infrequent profanity and crude humor Infrequent mature or suggestive themes Learn more about the Republic of Korea age rating values
The hide-and-seek sensation continues to surpass milestones.
The Game Animation Sample Project is back with a brand-new update for Unreal Engine 5.8. Showcasing the latest and greatest in-engine animation features, this release includes new physics, motion matching, pose searching, and look-at features—and more.
Crossfire was revealed in June of this year with Smilegate and Tencent subsidiary Team K1 acting as publishers.
Update: 'If no one protects indie developers or calls out bad behavior... who is going to save the indies?'
The news comes after Ubisoft moved to lay off of 51 employees at its Barcelona office.
Posted by Toni Heidenreich, Software Engineer, Android Media3 1.11 is out. Powering the vast majority of top Android media apps, this release brings new features, bug fixes, and improvements across playback, editing, and UI components. We're expanding our Jetpack Compose UI modules with customizable Player slots and easy to use defaults, interactive gestures, state observers, and short-form video preloading using PlayerPool . We also modernized the Media3 Cast integration with SystemUI Output Switcher support, introduced a new Ktor HTTP client network extension, and added new muxing utilities for Ogg and WAV files. Read on for key highlights, and check out the full release notes for a comprehensive list of changes. Playback UI and Compose With Android becoming Compose-first, we are continuing to expand the media3-ui-compose and media3-ui-compose-material3 modules. This update introduces more granular control over your player layout, richer interaction patterns, and deeper integration with Material3. Customizable Player layout The Material 3 Player Composable now supports dedicated content slots for topControls , centerControls , bottomControls , and errorOverlay . You can drop in your own Composables or use the ready-made defaults published in PlayerDefaults : Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, ) The Player Composable also integrates FocusRequester support, enabling seamless D-pad and keyboard navigation on Android TV, foldables, and desktop environments. Example for a Composable Player with customized controls Gestures and playback speed control PlaybackSpeedState now provides a fast-forward/slow-motion API. The demo-compose app showcases this with a long-press gesture to fast-forward playback and seeking with double tap. Combined with the ProgressSlider introduced in 1.10, the Compose player UI now offers rich touch and gesture interactions out of the box. Short-form video preloading with PlayerPool For apps with sliding-window media feeds (for example, short-form vertical video), managing multiple ExoPlayer instances efficiently is a common challenge. Media3 1.11 introduces PlayerPool (in common-ktx ) and rememberPooledPlayer (in ui-compose ) to handle player recycling and preloading automatically. The new ShortFormPlayerScreen in demo-compose shows this in action, a vertically paging feed where players are pooled, preloaded, and seamlessly recycled as the user scrolls. MiniController A new MiniController Composable in media3-ui-compose-material3 provides a compact playback bar displaying the current item's title, artist, artwork, and progress alongside play/pause controls. As all our default Composables in media3-ui-compose-material3 , the MiniController supports Material3 Dynamic Color integration, allowing it to automatically adapt to the user's wallpaper theme.This is ideal for persistent bottom-sheet or mini-player affordances, for example while the user browses content or during active Cast sessions. The Media3 MiniController showing album art, media metadata and basic controls Expanded state holders for metadata and errors We added several new reactive state holders to media3-ui-compose : rememberCurrentMediaItemState – observe metadata about the currently playing item rememberPlaylistState – observe the full playlist and active indices rememberErrorState – track playback errors, with a matching ErrorText Composable and default ErrorOverlay in Material3 We'll continue working on new additions and more customization options in upcoming releases. Please share your thoughts on the project issue tracker . Modernized Cast integration Media3 1.11 updates the Cast extension with programmatic configuration options and support for OS-level routing. CastParams and SystemUI Output Switcher You can now configure the Cast extension using CastParams : val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams) Setting setShowSystemOutputSwitcherOnCastIconClick(true) configures the MediaRouteButton to open Android's native SystemUI Output Switcher on supported platform versions, providing a unified output picker experience. Reactive MediaRouteButton state in Compose Apps using Jetpack Compose can now easily add the Media routing button (also known as Cast button), which automatically observes the dialog state and updates accordingly. No further logic needed when used together with Media3's CastPlayer ! @Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } } Media3 media route button in an app launching the default output switcher dialog Core playback and session enhancements Eclipsa Video - HAGC dynamic HDR metadata (API 37+) Eclipsa Video promises a more consistent HDR experience across devices, with a consistent baseline HDR white, adaptive headroom depending on the screen and the surroundings, ensuring the creative intent is preserved on all devices. ExoPlayer now supports playback of the necessary HAGC (ST 2094-50) timed metadata for progressive media (MP4, Matroska). The player automatically merges HAGC metadata tracks with the associated video track and delivers the metadata out-of-band to the decoder on API 37+ devices. On older devices, ExoPlayer seamlessly falls back to providing a standard HDR playback experience without the adjustments. Illustration to show benefits of Eclipsa Video HDR, like more consistent color contract New Ktor HTTP client extension A new media3-datasource-ktor extension module provides KtorDataSource , backed by the Ktor HTTP stack. This offers a Kotlin-first, coroutine-friendly alternative to the existing Cronet and OkHttp data source modules. Asynchronous MediaSession connections MediaSession.Callback now includes onConnectAsync() , which lets you process controller connection attempts asynchronously — for example, to verify authorization before accepting a connection. You can return an immediate Future with Futures.immediateFuture(ConnectionResult) for the same behavior as the existing onConnect . override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) } Safer MediaSession defaults For apps that don’t override onConnect or onConnectAsync in MediaSession.Callback , the library now defaults to a more secure configuration. Specifically, session data is no longer shared by default with untrusted controllers, meaning third-party or non-system apps lacking notification access are restricted from accessing session data unless you explicitly implement these callback methods to authorize the connection. New Muxer implementations & container parsing OggMuxer and WavMuxer We've added two new dedicated muxers: OggMuxer for muxing OPUS and VORBIS streams into standard .ogg files, and WavMuxer for generating uncompressed and floating-point PCM .wav audio files. Container parsing and track references MP4 Track References (tref): Mp4Muxer.addTrackReference allows linking dependent metadata or aux tracks to primary video streams. Chapter Extraction: QuickTime and Nero chapter from MP4 files (.m4a, .m4b), and Matroska chapters, are now extracted as Chapter metadata entries for audiobook and podcast navigation. Please use the issue tracker to report any bugs, or if you have questions or feature requests. We look forward to hearing from you!
Remedy is placing its bets on Control Resonant being priced at $60 and garnering positive preview coverage over concerns of self-publishing risks.
'These changes could discourage investment in subscription products and create financial exposure for businesses.'
All walk. All talk.
Hacker News
“GPT-5.5's API pricing is reshaping how startups build AI products”