diff --git a/core/network/src/main/java/com/android/developers/androidify/RemoteConfigDataSource.kt b/core/network/src/main/java/com/android/developers/androidify/RemoteConfigDataSource.kt index 7c9f502c..5ffd968a 100644 --- a/core/network/src/main/java/com/android/developers/androidify/RemoteConfigDataSource.kt +++ b/core/network/src/main/java/com/android/developers/androidify/RemoteConfigDataSource.kt @@ -34,6 +34,10 @@ interface RemoteConfigDataSource { fun getPromoVideoLink(): String fun getDancingDroidLink(): String + + fun useImagen(): Boolean + + fun getFineTunedModelName(): String } @Singleton @@ -83,4 +87,11 @@ class RemoteConfigDataSourceImpl @Inject constructor() : RemoteConfigDataSource override fun getDancingDroidLink(): String { return remoteConfig.getString("dancing_droid_gif_link") } + + override fun useImagen(): Boolean { + return remoteConfig.getBoolean("use_imagen") + } + override fun getFineTunedModelName(): String { + return remoteConfig.getString("fine_tuned_model_name") + } } diff --git a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt index 24c9d6a5..6fbe086a 100644 --- a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt +++ b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt @@ -34,6 +34,7 @@ import com.google.firebase.ai.type.ImagenSafetySettings import com.google.firebase.ai.type.PublicPreviewAPI import com.google.firebase.ai.type.SafetySetting import com.google.firebase.ai.type.Schema +import com.google.firebase.ai.type.asImageOrNull import com.google.firebase.ai.type.content import com.google.firebase.ai.type.generationConfig import kotlinx.serialization.json.Json @@ -138,21 +139,36 @@ class FirebaseAiDataSourceImpl @Inject constructor( image, ) } + private fun createFineTunedModel(): GenerativeModel { + return Firebase.ai.generativeModel( + remoteConfigDataSource.getFineTunedModelName(), + safetySettings = listOf( + SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.CIVIC_INTEGRITY, HarmBlockThreshold.LOW_AND_ABOVE), + ), + ) + } override suspend fun generateImageFromPromptAndSkinTone(prompt: String, skinTone: String): Bitmap { - val generativeModel = createGenerativeImageModel() - // Retrieve the base prompt template from Remote Config val basePromptTemplate = remoteConfigDataSource.promptImageGenerationWithSkinTone() - - // Perform the substitution val imageGenerationPrompt = basePromptTemplate .replace("{prompt}", prompt) .replace("{skinTone}", skinTone) - - return executeImageGeneration( - generativeModel, - imageGenerationPrompt, - ) + if (remoteConfigDataSource.useImagen()) { + val generativeModel = createGenerativeImageModel() + return executeImageGeneration( + generativeModel, + imageGenerationPrompt, + ) + } else { + val fineTunedModel = createFineTunedModel() + val response = fineTunedModel.generateContent(imageGenerationPrompt) + return response.candidates.firstOrNull()?.content?.parts?.firstOrNull()?.asImageOrNull() + ?: throw IllegalStateException("Could not extract image from fine-tuned model response") + } } private suspend fun executeTextValidation( diff --git a/core/network/src/main/res/xml/remote_config_defaults.xml b/core/network/src/main/res/xml/remote_config_defaults.xml index afe70370..ef27518d 100644 --- a/core/network/src/main/res/xml/remote_config_defaults.xml +++ b/core/network/src/main/res/xml/remote_config_defaults.xml @@ -15,42 +15,23 @@ limitations under the License. --> + + use_imagen + true + prompt_image_validation - You are to analyze the provided image and determine if it is acceptable and - appropriate based on specific criteria. - In the JSON response, respond with the result 'success' as set to true or false based on - results. - If the image is considered invalid, include the relevant reason as to why it is invalid - in the 'error' property. A photo is only valid if: - - it is a photo of a person, at least showing their shoulders and head, it can be a full - body photo + You are to analyze the provided image and determine if it is acceptable and appropriate based on specific criteria. + In the JSON response, respond with the result 'success' as set to true or false based on results. + If the image is considered invalid, include the relevant reason as to why it is invalid in the 'error' property. A photo is only valid if: + - it is a photo of a person, at least showing their shoulders and head, it can be a full body photo - it must be a photo of a person - - the photo has a clear main person in it, if there are people in the background ignore - them + - the photo has a clear main person in it, if there are people in the background ignore them - it cannot contain nudity or explicit content - it cannot contain illegal weapons or violent references - it cannot contain references to drugs or other illicit substances - - it cannot contain hate speech or other offensive language - -it cannot contain blood or gore or violence. - - - - prompt_image_generation - This 3D rendered, cartoonish Android mascot rendered in a photorealistic style, the - pose is relaxed and straightforward, facing directly forward with his shoulders at ease, - as if posing for a photo. The cartoonish exaggeration is subtle, lending a playful touch - to the otherwise realistic rendering of the figure. The figure is centered against a - muted, neutral warm cream coloured background (#F8F2E4) gives the figurine a unique and - collectible appeal. - The bot should take on the body shape of the newest Google Android Robot (Shape: It has - the distinctive rounded body. The main body is a slightly barrel-shaped form with a - smooth, continuous surface connecting to the head without a distinct neck, a - semi-circular head with Two short, straight antennae protrude vertically from the top of - the dome, positioned towards the sides, and simple, cylindrical arms and legs.) but the - characteristics of the description should be used. It should NOT use the model shape or - color from pre 2024. - + - it cannot contain hate speech or other offensive language + -it cannot contain blood or gore or violence. use_gemini_nano @@ -62,53 +43,35 @@ system_prompt_image_description - Extract detailed information from the provided image. THE GOAL is to using this - information to recreate the image with image generation model. + Extract detailed information from the provided image. THE GOAL is to using this information to recreate the image with image generation model. - | Category | Attribute | Description (Focus on visual, descriptive language for image - generation) | + | Category | Attribute | Description (Focus on visual, descriptive language for image generation) | |---|---|---| | **Subject** | Type | The central figure in the image. | - | | Hair | The color, length, and style of the hair. Use concise, descriptive adjectives - to detail its appearance. | - | | Facial Hair | The style, and color (if applicable) of any facial hair present. Be - visually specific about its form and length (if applicable). | - | | Headwear | The type, color, material, and any visually distinct details of the - headwear. Describe any patterns, textures, or embellishments, and its position on the - head. | - | | Skin Color | The apparent color of the skin, using terms commonly associated with - skin tones followed by the approximate hex code for accuracy. | - | | Clothing - Top | The type, color, and pattern of the upper garment. Describe its fit - and any observable visual details such as closures, necklines, or textures. | - | | Clothing - Bottom | The type, color, and pattern of the lower garment. Describe its - fit and any visual details like rips, pleats, or pockets. | - | | Footwear | The type, color, and material of the footwear. Be visually specific about - any details such as laces, buckles, or straps. | - | | Accessories | The type, color, and material of any accessories. Explicitly state - their position on or relative to the subject, as well as their arrangement if multiple - items are present. | - | | Gadgets | The type, color, and material of any gadgets present. Be specific about - their appearance and their position relative to the subject. | - | | Additional Notes | Any other visually distinct details of the subject that have not - been covered in the above attributes. | - - * Remember to replace the bracketed information with your detailed visual analysis of a - specific image. + | | Hair | The color, length, and style of the hair. Use concise, descriptive adjectives to detail its appearance. | + | | Facial Hair | The style, and color (if applicable) of any facial hair present. Be visually specific about its form and length (if applicable). | + | | Headwear | The type, color, material, and any visually distinct details of the headwear. Describe any patterns, textures, or embellishments, and its position on the head. | + | | Skin Color | The apparent color of the skin, using terms commonly associated with skin tones followed by the approximate hex code for accuracy. | + | | Clothing - Top | The type, color, and pattern of the upper garment. Describe its fit and any observable visual details such as closures, necklines, or textures. | + | | Clothing - Bottom | The type, color, and pattern of the lower garment. Describe its fit and any visual details like rips, pleats, or pockets. | + | | Footwear | The type, color, and material of the footwear. Be visually specific about any details such as laces, buckles, or straps. | + | | Accessories | The type, color, and material of any accessories. Explicitly state their position on or relative to the subject, as well as their arrangement if multiple items are present. | + | | Gadgets | The type, color, and material of any gadgets present. Be specific about their appearance and their position relative to the subject. | + | | Additional Notes | Any other visually distinct details of the subject that have not been covered in the above attributes. | + + * Remember to replace the bracketed information with your detailed visual analysis of a specific image. * Provide highly descriptive details for all attributes of the subject. - * For accessories, ensure the descriptions are highly detailed and explicitly state - their position on or relative to the subject, as well as their arrangement if - applicable. - * Describe hair and facial hair with rich visual detail, including color, style, and - length. - * Use color names that accurately reflect human visual perception and are commonly - understood by image generation models. + * For accessories, ensure the descriptions are highly detailed and explicitly state their position on or relative to the subject, as well as their arrangement if applicable. + * Describe hair and facial hair with rich visual detail, including color, style, and length. + * Use color names that accurately reflect human visual perception and are commonly understood by image generation models. + * Do not describe any text that appears in the image. Instead, make it as a placeholder and blur it. + * ID badges or any accessories that include a person's face MUST be stated together with the phrase "that has no image." For example, "ID badge that has no image," etc. + * If there is more than one person in the image, ALWAYS choose only the most prominent one. + * Do not include any brand logos or brand names in your descriptions. * Do not include descriptions of any emblems present. - * Do not include any reference to facial features or facial expressions in the - description. - * Do not include descriptions of anything that appears in the background. Only describe - the appearance of the person and what the subject may be wearing or holding. - + * Do not include any reference to facial features or facial expressions in the description. + * Do not include descriptions of anything that appears in the background. Only describe the appearance of the person and what the subject may be wearing or holding. is_android_app_inactive @@ -116,56 +79,45 @@ prompt_image_description - Create a new image description where the subject(s) and surroundings are transformed - into subject(s) attributes hair color, clothing, accessories are important for human - subjects. - The goal is a near perfect recreation. - Describe details of the subject, accessories. - - Never say "the image". - - If the subject is non human do not add anthropomorphic attributes. - - Style is not allowed to alter skin tone directly or indrectly. - - never use the suffix "-esque" or "-style" - - Dont say rendered, rendering, or digital. Do not mention the background. - - The detailed description should become the 'user_description' value in the JSON schema - that will be used for the generative image model. - For the 'user_description' value, describe attributes such as: - -headwear; for example: hats, hair accessories, glasses, or headphones - -hair color, hair style, and hair length; for example: chin-length straight brown hair, - long curly blonde hair, short spiky red hair, bald with no hair - -facial hair, if applicable; for example: full brown bushy beard, blonde mustache, short - black chin patch - -upper body clothing style and color; for example: white t-shirt, black dress shirt - under a white and pink striped blazer, green lace dress with spaghetti straps - -lower body clothing style and color; for example: blue cuffed jeans with a brown - leather belt, black slacks, white knee-length skirt - -footwear; for example: pink leather sandals, blue flip flops, brown suede ankle boots, - black high heels, brown loafers, green sneakers, red socks - -accessories; for example: holding a navy blue backpack, holding a tennis racket, using - a walking cane, holding a coffee mug - - - For all those attributes, include details such as color, shape, length, style, - accessories, and textures and materials. When describing clothing on the upper body, - include details such as neckline, type of sleeves or straps that go over the shoulders - as well as the exact colors in hex codes. - For example: v-neck tank top with thin straps, or scoop neck dress with cap sleeves. - When describing clothing, use this phrase structure: "wearing (describe clothing) on its - body - - Do not include brand logos or brand names in the description. Do not include - descriptions of emblems. The description should be gender neutral. Do not use gendered - terms like 'he' or 'she'. Do not describe skin color or include any reference to skin. - Do not include any reference to facial features or facial expressions in the - description. Dn not include descriptions of anything that appears in the background. - Only describe the appearance of the person, and what the subject may be wearing or - holding. - + Extract detailed information about the human subject included in the provided image. THE GOAL is to use this information to recreate the human's likeness with an image generation AI model. + + * Pay special attention to attributes that are important for describing human subjects. Provide rich visual detail for attributes such as: + - Hair: Describe the hair in detail, including its style (e.g., layered bob, loose waves, tight curls), length (e.g., chin-length, shoulder-length, cascading), and color. For hair color, be specific about the particular shade of hair (e.g. light blonde, dark blonde, golden blonde, platinum blonde, and so on), including any highlights, lowlights, or variations. If applicable, meticulously describe any bangs (e.g., blunt, side-swept, wispy), braids (e.g., French braid, fishtail braid, single plait), or other distinctive features. Explicitly name the hairstyle if known (e.g., pixie cut, updo, ponytail). If the subject does not have hair, describe it as bald. + - Facial hair (only if any exists): If the subject has facial hair, provide a detailed description of its style (e.g., goatee, full beard, mustache), length (e.g., stubble, short, long), texture (e.g., coarse, fine, wiry), and color (including any variations). Explicitly name the facial hair style if known. If the subject does not have facial hair, describe it as no facial hair. + - Headwear (only if any exists): If the subject is wearing headwear, identify the type (e.g., baseball cap, fedora, beanie), color, and material. Describe any visually distinct details such as patterns (e.g., plaid, stripes, floral), textures (e.g., knit, leather, straw), or embellishments (e.g., embroidery, sequins, ribbons). Specify its position on the head (e.g., tilted back, covering the ears). Include the name of the headwear if possible. + - Clothing: Provide a thorough description of the clothing worn on the subject's top and bottom. For each garment, detail the style (e.g., t-shirt, blouse, jeans, skirt), colors (including any gradients or color blocking), materials (e.g., cotton, silk, denim), patterns (e.g., polka dots, floral, paisley, geometric), embellishments (e.g., buttons, zippers, lace), and fit (e.g., tight, loose, tailored). Be visually specific about details such as sleeve length, neckline, hemline, and any unique cuts or features. Include the name of the clothing items if known (e.g., A-line skirt, Henley shirt). You MUST describe clothing that is covering the top and torso of the subject's body. You MUST describe clothing that is covering the bottom of the subject's body. If you are unable to determine a portion of the clothing, infer what clothing is most likely to be present there and describe it. + - Footwear (only if they exist): If the subject is wearing footwear, identify the type (e.g., sneakers, boots, sandals), color, and style (e.g., running shoes, ankle boots, flip-flops). Be visually specific about any details such as laces (color, type of lacing), buckles (shape, material), or straps (number, placement). + - Accessories: Describe any accessories worn by the subject, including jewelry (e.g., necklace, earrings, rings - specify material, color, and any notable features), hats (if not already described as headwear - reiterate key details), glasses (e.g., frame shape, color, lens type), watches (e.g., strap material, face color), and any other visible adornments (e.g., scarves, belts - describe color, material, and how they are worn). Detail the color, placement, position, and arrangement of each accessory on the subject. + - Props or items: Describe any props or items the subject is holding or interacting with. This includes electronic devices (e.g., smartphone - color, screen details; laptop - color, open or closed), food or drinks (e.g., coffee cup - color, material; apple - color, size), sporting equipment (e.g., basketball - color, texture; tennis racket - color, grip details), or any other objects held in the hands, placed on the body (e.g., a backpack - color, material, details), or positioned next to the subject in a way that suggests interaction (e.g., a book lying open). For each item, describe its color, material, and any significant details. Prefer to be held on the hand if possible. Do not include furniture. Furniture is not considered a prop or item. + - Any other special attributes or characteristics of the subject's body and style that provide further detail + + * If the person's clothing, accessories or items include photorealistic depictions of humans or animals, describe them as having a cartoon style. + * If the person's clothing, accessories or items include artistic renderings, graphical depictions, or elaborate pictures describe them as having a cartoon style, portrayed in a simple manner. + * Use color names that accurately reflect human visual perception and are commonly understood by image generation models. + * DO NOT describe the background or setting that is behind or around the subject. Focus only on describing the main person in the foreground and items it is interacting with. If there is more than one person in the image, ALWAYS choose only the most prominent person in the foreground. + * Do not describe the skin color of the subject in the image. + * Do not infer ethnicity. + * Do not infer gender. The description should always include gender neutral language when referring to the subject, such as "it" or "the figure". + * Do not describe any permanent markings on the skin such as tattoos, scars, birthmarks, skin discolorations, or notable moles. It is only permissible to describe temporary paint or markings on the skin that are obviously part of a costume or cultural dress. + * Do not describe any facial expressions. However, describing the subject's general mood is helpful. + * DO NOT describe parts of the face such as the nose, mouth, lips, teeth, or tongue. The final rendered figure should not have these body parts. + * Do not describe any body piercings such as nose piercings or naval piercings. Only describing earrings is permissible. + * Do not describe nails, nail polish, or rings if present on the subject's fingers or toes. Avoid including the words "fingers" or "toes" in your description. + * Do not describe any branded logos or icons or emblems that may be included in the image or as part of the subject. + * DO NOT describe any text, slogans, typography or items that depict alphanumeric symbols that may be found in the image. Instead, describe it as a generic placeholder and blur it. + * Do not describe any blood or gore or open wounds, if they are present on the subject. + * Do not describe the pose that the subject is in, such as sitting, standing, dancing, or waving. Only describe what the subject looks like. The subject should always be described in a standing position facing forward, unless the subject is in a wheelchair or using a walking aid that may require its body to adapt to that. + * Do not include any adult substances inappropriate for children, nor any actions directly related to their use. Specifically exclude cigarettes, drugs, drug paraphernalia, alcoholic beverages, and similar items, as well as activities such as smoking, injecting, drinking alcohol, or any other actions involving these substances. + * If the subject is holding any weapon that suggests violence, only describe it if it is obviously a toy, a fake prop that won't actually cause harm, or is used in common sports. For example, do not ever describe a realistic gun, but it is permissible if the image shows a subject holding a plastic water squirt gun. Similarly, if the image shows the subject holding a baseball bat, that is permissible because it is primarily used in sports. + * ID badges or any accessories or items that include a person's face MUST be stated together with the phrase "that has no image." For example, "ID badge that has no image," etc. + + + * Your description should start with a high level overview of the new image starting with style. Then describe details of the subject, accessories and context with strong style influence. Then finish with details about the style. + * Do not use the word "Subject" in description. + * Never say "the image". + * Never use the suffix "-esque" or "-style". + * Do not say rendered, rendering, or digital. + * Only respond with new image description as a paragraph. promo_video_link @@ -173,20 +125,11 @@ text_model_name - gemini-2.5-pro - - - is_app_active - true + gemini-2.5-flash generate_bot_prompt - Generate 10 different random prompts as a comma separated list for a description of - what a person looks like for android bot generation: include hair color texture and - length, clothing including colors and details (like the persons shirt and pants or dress - and collar types), with accessories. Make them, fun, safe and all different, dont - include gender or ethnicity or dangerous content. For example "wearing blue jeans, gray - ruffly blouse, holding a magnifying glass with sparkly shoes and brown wavy hair." + Generate 10 different random prompts as a comma separated list for a description of what a person looks like for android bot generation: include hair color texture and length, clothing including colors and details (like the persons shirt and pants or dress and collar types), with accessories. Make them, fun, safe and all different, dont include gender or ethnicity or dangerous content. For example "wearing blue jeans, gray ruffly blouse, holding a magnifying glass with sparkly shoes and brown wavy hair." The prompt should: - it cannot contain gender or ethnicity or dangerous content. @@ -198,32 +141,21 @@ - it cannot contain political symbolism. + + fine_tuned_model_name + androidify + prompt_text_verify - You are to evaluate the given text string, restructure it, and return it in a JSON - format for use with a backend application. First, check that the text describes the - attributes of a person and includes some attributes describing what they look like and - are wearing. For example, valid attributes may include hair color and style, facial - hair, clothing, shoes, and objects and accessories that the person is holding or - wearing. If no valid attributes describing a person and their appearance exist in the - text, set the value for the 'success' property in the JSON to 'false'. + You are to evaluate the given text string, restructure it, and return it in a JSON format for use with a backend application. First, check that the text describes the attributes of a person and includes some attributes describing what they look like and are wearing. For example, valid attributes may include hair color and style, facial hair, clothing, shoes, and objects and accessories that the person is holding or wearing. If no valid attributes describing a person and their appearance exist in the text, set the value for the 'success' property in the JSON to 'false'. - If the text string includes a valid description of a person, set the value for the - 'success' property in the JSON to 'true' and restructure the input text to be part of - the response as 'user_description' in the following ways,: - -strip out any phrases or descriptors that are inappropriate for a general audience such - as racial or cultural stereotypes, political or hate symbols, sexual references, hateful - comments, or inappropriate language. - -strip out descriptions of weapons and guns, and references to drugs or drug - paraphernalia + If the text string includes a valid description of a person, set the value for the 'success' property in the JSON to 'true' and restructure the input text to be part of the response as 'user_description' in the following ways,: + -strip out any phrases or descriptors that are inappropriate for a general audience such as racial or cultural stereotypes, political or hate symbols, sexual references, hateful comments, or inappropriate language. + -strip out descriptions of weapons and guns, and references to drugs or drug paraphernalia -strip out descriptions of logos or brand names - -strip out descriptions of anything that might describe the background behind or around - the person or subject in the text + -strip out descriptions of anything that might describe the background behind or around the person or subject in the text - Keep all words and descriptors that describe details such as colors, styles, size and - materials of hair, clothing, shoes, accessories that do not allude to any of the - inappropriate content listed above. - + Keep all words and descriptors that describe details such as colors, styles, size and materials of hair, clothing, shoes, accessories that do not allude to any of the inappropriate content listed above. image_model_name @@ -231,19 +163,6 @@ prompt_image_generation_skin_tone - This 3D rendered, cartoonish Android mascot rendered in a photorealistic style, with - the {skinTone} skin color and {prompt}, the pose is relaxed and straightforward, facing - directly forward with his shoulders at ease, as if posing for a photo. The cartoonish - exaggeration is subtle, lending a playful touch to the otherwise realistic rendering of - the figure. The figure is centered against a muted, neutral warm cream coloured - background (#F8F2E4) gives the figurine a unique and collectible appeal. The bot should - take on the body shape of the newest Google Android Robot (Shape: It has the distinctive - rounded body. The main body is a slightly barrel-shaped form with a smooth, continuous - surface connecting to the head without a distinct neck, a semi-circular head with Two - short, straight antennae protrude vertically from the top of the dome, positioned - towards the sides, and simple, cylindrical arms and legs.) but the characteristics of - the description should be used. It should NOT use the model shape or color from pre - 2024. - + This 3D rendered, cartoonish Android mascot rendered in a photorealistic style, with the {skinTone} skin color and {prompt}. The figure is centered against a white background gives the figurine a unique and collectible appeal. \ No newline at end of file diff --git a/core/testing/src/main/java/com/android/developers/testing/network/TestRemoteConfigDataSource.kt b/core/testing/src/main/java/com/android/developers/testing/network/TestRemoteConfigDataSource.kt index 6ff547e2..7f46caa4 100644 --- a/core/testing/src/main/java/com/android/developers/testing/network/TestRemoteConfigDataSource.kt +++ b/core/testing/src/main/java/com/android/developers/testing/network/TestRemoteConfigDataSource.kt @@ -59,4 +59,12 @@ class TestRemoteConfigDataSource(private val useGeminiNano: Boolean) : RemoteCon override fun getDancingDroidLink(): String { TODO("Not yet implemented") } + + override fun useImagen(): Boolean { + return true + } + + override fun getFineTunedModelName(): String { + return "test-fine-tuned-model" + } } diff --git a/feature/results/src/main/java/com/android/developers/androidify/customize/CustomizeExportScreen.kt b/feature/results/src/main/java/com/android/developers/androidify/customize/CustomizeExportScreen.kt index 5f8483af..8593b756 100644 --- a/feature/results/src/main/java/com/android/developers/androidify/customize/CustomizeExportScreen.kt +++ b/feature/results/src/main/java/com/android/developers/androidify/customize/CustomizeExportScreen.kt @@ -223,8 +223,10 @@ private fun CustomizeExportContents( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { - Box(modifier = Modifier.weight(0.6f), - contentAlignment = Alignment.Center) { + Box( + modifier = Modifier.weight(0.6f), + contentAlignment = Alignment.Center, + ) { imageResult( state.exportImageCanvas, ) diff --git a/feature/results/src/main/java/com/android/developers/androidify/customize/GenericTool.kt b/feature/results/src/main/java/com/android/developers/androidify/customize/GenericTool.kt index 9ca91b93..5096b233 100644 --- a/feature/results/src/main/java/com/android/developers/androidify/customize/GenericTool.kt +++ b/feature/results/src/main/java/com/android/developers/androidify/customize/GenericTool.kt @@ -63,7 +63,7 @@ fun GenericTool( individualToolContent(tool) }, onToolSelected = onToolSelected, - tool = tool + tool = tool, ) } }