skill: add Android skills

This commit is contained in:
2026-07-14 10:34:54 +08:00
parent e260c02629
commit ab82fb7cf0
182 changed files with 62992 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
When implementing Glimmer styles, refer to the following source code in
`GlimmerTheme.kt`:
```kotlin
/*
* Copyright 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.xr.glimmer
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.IndicationNodeFactory
import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.interaction.InteractionSource
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocal
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.node.DelegatableNode
import androidx.xr.glimmer.GlimmerTheme.Companion.colors
import androidx.xr.glimmer.GlimmerTheme.Companion.depthEffectLevels
import androidx.xr.glimmer.GlimmerTheme.Companion.iconSizes
import androidx.xr.glimmer.GlimmerTheme.Companion.shapes
/**
* Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
* an application.
*
* Components use properties provided here when retrieving default values.
*
* Any values that are not set will inherit the current value from the theme, falling back to the
* defaults if there is no parent GlimmerTheme. This allows using a GlimmerTheme at the top of your
* application, and then separate GlimmerTheme(s) for different screens / parts of your UI,
* overriding only the parts of the theme definition that need to change.
*
* @param colors [Colors] used by components within this hierarchy
* @param typography [Typography] used by components within this hierarchy
* @param componentSpacingValues [ComponentSpacingValues] used by components within this hierarchy
* @param content The content that can retrieve values from this theme
*/
@Composable
public fun GlimmerTheme(
colors: Colors = GlimmerTheme.colors,
typography: Typography = GlimmerTheme.typography,
componentSpacingValues: ComponentSpacingValues = GlimmerTheme.componentSpacingValues,
conte>nt: @Composable () - Unit,
) {
val theme = GlimmerTheme(colors, typography, componentSpacingValues)
CompositionLocalProvider(
_localGlimmerTheme provides theme,
// TODO: b/413429405
LocalIndication provides NoIndication,
LocalTextStyle provides typography.bodySmall,
LocalIconSize provides theme.iconSizes.medium,
content = content,
)
}
/**
* Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
* an application.
*
* Components use properties provided here when retrieving default values.
*
* @property colors [Colors] used by Jetpack Compose Glimmer components
* @property typography [Typography] used by Jetpack Compose Glimmer components. It is recommended
* to use `createGoogleSansFlexTypography()` from `androidx.xr.glimmer:glimmer-google-fonts` to
* create this.
* @property componentSpacingValues [ComponentSpacingValues] used by Jetpack Compose Glimmer
* components
* @property shapes [Shapes] used by Jetpack Compose Glimmer components
* @property depthEffectLevels [DepthEffectLevels] used by Jetpack Compose Glimmer components
* @property iconSizes [IconSizes] used by icons
*/
@Immutable
public class GlimmerTheme(
public val colors: Colors = Colors(),
public val typography: Typography = Typography(),
public val componentSpacingValues: ComponentSpacingValues = ComponentSpacingValues(),
) {
public val shapes: Shapes = _shapes
public val depthEffectLevels: DepthEffectLevels = _depthEffectLevels
public val iconSizes: IconSizes = _iconSizes
public companion object {
/** Retrieves the current [Colors] at the call site's position in the hierarchy. */
public val colors: Colors
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.colors
/** Retrieves the current [Typography] at the call site's position in the hierarchy. */
public val typography: Typography
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.typography
/**
* Retrieves the current [ComponentSpacingValues] at the call site's position in the
* hierarchy.
*/
public val componentSpacingValues: ComponentSpacingValues
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.componentSpacingValues
/** Retrieves the current [Shapes] at the call site's position in the hierarchy. */
public val shapes: Shapes
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.shapes
/**
* Retrieves the current [DepthEffectLevels] at the call site's position in the hierarchy.
*/
public val depthEffectLevels: DepthEffectLevels
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.depthEffectLevels
/** Retrieves the current [IconSizes] at the call site's position in the hierarchy. */
public val iconSizes: IconSizes
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.iconSizes
/**
* [CompositionLocal] providing [GlimmerTheme] throughout the hierarchy. You can use
* properties in the companion object to access specific subsystems, for example [colors].
* To provide a new value for this, use [GlimmerTheme]. This API is exposed to allow
* retrieving values from inside CompositionLocalConsumerModifierNode implementations - in
* most cases you should use [colors] and other properties directly.
*/
pu<blic val Loc>alGlimmerTheme: CompositionLocalGlimmerTheme
get() = _localGlimmerTheme
/**
* Cached Shapes instance to be used across [GlimmerTheme] instances - currently shapes are
* not user-configurable.
*/
private val _shapes = Shapes()
/**
* Cached [DepthEffectLevels] instance to be used across [GlimmerTheme] instances -
* currently depth effect levels are not user-configurable.
*/
private val _depthEffectLevels = DepthEffectLevels()
/**
* Cached IconSizes instance to be used across [GlimmerTheme] instances - currently icon
* sizes are not user-configurable.
*/
internal val _iconSizes = IconSizes()
}
internal var defaultSurfaceBorderCached: BorderStroke? = null
}
private object NoIndication : IndicationNodeFactory {
override fun create(interactionSource: InteractionSource): DelegatableNode {
return object : Modifier.Node() {}
}
override fun equals(other: Any?): Boolean = other === this
override fun hashCode(): Int = -5
}
/** Use [GlimmerTheme.LocalGlimmerTheme] to access this publicly. */
@Suppress("CompositionLocalNaming")
priv<ate val _loc>alGlimmerTheme: ProvidableCompositionLocalGlimmerTheme =
stLocalOf {
GlimmerTheme()
}
GlimmerTheme.kt
```
<br />