diff --git a/CHANGELOG.md b/CHANGELOG.md index acd23d158..e7e753d5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,18 @@ [Migration Guides](https://github.com/urbanairship/android-library/tree/main/documentation/migration) -## Version 18.1.1, June 28, 2024 +## Version 18.1.3, July 30, 2024 +Patch release that includes bug fixes for Embedded Content and Preference Center, and accessibility improvements for Message Center. + +### Changes +- Fixed an issue with container child item measurement in Scenes, when margins were set on the container items. +- Fixed a Preference Center bug that could lead to subscription channel chips not being visible when initially displaying a Preference Center. +- Fixed dismissing multiple embedded views in the same session. +- Fixed an issue with automation trigger state not correctly persisting across sessions. +- Message Center accessibility improvements. +- Updated the default style for the pull to dismiss view in In-App Message Banners to better match iOS. + +## Version 18.1.2, July 15, 2024 Patch release that includes fixes for Preference Center. ### Changes diff --git a/build.gradle b/build.gradle index a199ae1f1..1f9767fa3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { // Airship Version - major.minor.patch - airshipVersion = '18.1.2' + airshipVersion = '18.1.3' // Airship Version Qualifier beta, release, etc... // airshipVersionQualifier = "alpha" diff --git a/sample/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml index c2d1185bc..c61a237ee 100644 --- a/sample/src/main/res/values/styles.xml +++ b/sample/src/main/res/values/styles.xml @@ -25,6 +25,7 @@ diff --git a/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/AutomationStore.kt b/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/AutomationStore.kt index 391c813c7..7b692edfe 100644 --- a/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/AutomationStore.kt +++ b/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/AutomationStore.kt @@ -125,8 +125,7 @@ internal abstract class AutomationStore : RoomDatabase(), AutomationStoreInterfa val name = config.configOptions.appKey + "_automation_store" val path = File(ContextCompat.getNoBackupFilesDir(context), name).absolutePath return databaseBuilder(context, AutomationStore::class.java, path) - .addMigrations(MIGRATION_1_2) - .addMigrations(MIGRATION_2_3) + .addMigrations(MIGRATION_1_2, MIGRATION_2_3) .fallbackToDestructiveMigrationOnDowngrade() .build() } diff --git a/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/PreparedSchedule.kt b/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/PreparedSchedule.kt index 453729fd4..30969dd24 100644 --- a/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/PreparedSchedule.kt +++ b/urbanairship-automation/src/main/java/com/urbanairship/automation/engine/PreparedSchedule.kt @@ -64,7 +64,7 @@ public data class PreparedScheduleInfo( reportingContext = content.get(REPORTING_CONTEXT), // Default to a UUID for backwards compatibility triggerSessionId = content.optionalField(TRIGGER_SESSION_ID) ?: UUID.randomUUID().toString(), - additionalAudienceCheckResult = content.requireField(ADDITIONAL_AUDIENCE_CHECK_RESULT) + additionalAudienceCheckResult = content.optionalField(ADDITIONAL_AUDIENCE_CHECK_RESULT) ?: true ) } } diff --git a/urbanairship-automation/src/main/java/com/urbanairship/iam/view/MediaView.kt b/urbanairship-automation/src/main/java/com/urbanairship/iam/view/MediaView.kt index be4c4c6ff..2526cdbf9 100644 --- a/urbanairship-automation/src/main/java/com/urbanairship/iam/view/MediaView.kt +++ b/urbanairship-automation/src/main/java/com/urbanairship/iam/view/MediaView.kt @@ -17,6 +17,7 @@ import android.widget.ImageView import android.widget.ProgressBar import androidx.core.view.doOnPreDraw import com.urbanairship.UAirship +import com.urbanairship.android.layout.util.ResourceUtils import com.urbanairship.iam.info.InAppMessageMediaInfo import com.urbanairship.images.ImageRequestOptions import com.urbanairship.util.ManifestUtils @@ -87,11 +88,16 @@ internal class MediaView @JvmOverloads constructor( imageView.contentDescription = mediaInfo.description val url = cachedMediaUrl ?: mediaInfo.url + val fallbackWidth = ResourceUtils.getDisplayWidthPixels(context) + val fallbackHeight = ResourceUtils.getDisplayHeightPixels(context) + imageView.doOnPreDraw { UAirship.shared().imageLoader.load( context, imageView, - ImageRequestOptions.newBuilder(url).build() + ImageRequestOptions.newBuilder(url) + .setFallbackDimensions(fallbackWidth, fallbackHeight) + .build() ) } diff --git a/urbanairship-automation/src/main/res/values/style_iam_banner.xml b/urbanairship-automation/src/main/res/values/style_iam_banner.xml index 466431bee..4fa77b9b5 100644 --- a/urbanairship-automation/src/main/res/values/style_iam_banner.xml +++ b/urbanairship-automation/src/main/res/values/style_iam_banner.xml @@ -25,8 +25,8 @@ @@ -34,11 +34,13 @@ diff --git a/urbanairship-core/src/main/java/com/urbanairship/images/AirshipGlideImageLoader.kt b/urbanairship-core/src/main/java/com/urbanairship/images/AirshipGlideImageLoader.kt index 111291884..3c268fce4 100644 --- a/urbanairship-core/src/main/java/com/urbanairship/images/AirshipGlideImageLoader.kt +++ b/urbanairship-core/src/main/java/com/urbanairship/images/AirshipGlideImageLoader.kt @@ -3,7 +3,9 @@ package com.urbanairship.images import android.content.Context import android.graphics.drawable.Drawable import android.util.Size +import android.view.View import android.view.ViewGroup +import android.view.ViewParent import android.view.ViewTreeObserver import android.view.ViewTreeObserver.OnPreDrawListener import android.widget.ImageView @@ -80,62 +82,69 @@ internal object AirshipGlideImageLoader : ImageLoader { private val zeroWidthFallback: Int?, private val zeroHeightFallback: Int?, private val subtractPadding: Boolean = true, - ) : DrawableImageViewTarget(view) { + ) : DrawableImageViewTarget(view) { override fun getSize(cb: SizeReadyCallback) { // Fast path: the view is already measured or has fallback width/height val size = getSize() - if (size != null) { + if (size.width > 0 && size.height > 0) { cb.onSizeReady(size.width, size.height) - return@getSize - } - - // Slow path: wait for the view to be measured... - val viewTreeObserver = view.viewTreeObserver - val preDrawListener = object : OnPreDrawListener { - private var isResumed = false - - override fun onPreDraw(): Boolean { - getSize()?.let { size -> - viewTreeObserver.removePreDrawListenerSafe(this) - - if (!isResumed) { - isResumed = true - cb.onSizeReady(size.width, size.height) + } else { + // Slow path: wait for the view to be measured... + val viewTreeObserver = view.viewTreeObserver + val preDrawListener = object : OnPreDrawListener { + private var isResumed = false + + override fun onPreDraw(): Boolean { + getSize().let { size -> + viewTreeObserver.removePreDrawListenerSafe(this) + + if (!isResumed) { + isResumed = true + cb.onSizeReady(size.width, size.height) + } } + return true } - return true } - } - viewTreeObserver.addOnPreDrawListener(preDrawListener) + viewTreeObserver.addOnPreDrawListener(preDrawListener) + } } - fun getSize(): Size? { - val width = getWidth() ?: return null - val height = getHeight() ?: return null - return Size(width, height) - } + fun getSize(): Size = Size(getWidth(), getHeight()) fun getWidth() = getDimension( - paramSize = view.layoutParams?.width ?: -1, + paramSize = view.layoutParams?.width ?: ViewGroup.LayoutParams.MATCH_PARENT, viewSize = view.width, paddingSize = if (subtractPadding) view.paddingLeft + view.paddingRight else 0 - ) ?: zeroWidthFallback + ) ?: zeroWidthFallback.let { + if (it == null || it < 0) { + Target.SIZE_ORIGINAL + } else { + it + } + } fun getHeight() = getDimension( - paramSize = view.layoutParams?.height ?: -1, + paramSize = view.layoutParams?.height ?: ViewGroup.LayoutParams.MATCH_PARENT, viewSize = view.height, paddingSize = if (subtractPadding) view.paddingTop + view.paddingBottom else 0 - ) ?: zeroHeightFallback + ) ?: zeroHeightFallback.let { + if (it == null || it < 0) { + Target.SIZE_ORIGINAL + } else { + it + } + } fun getDimension( paramSize: Int, viewSize: Int, paddingSize: Int ): Int? { - // If the dimension is set to WRAP_CONTENT, then the dimension is undefined. - if (paramSize == ViewGroup.LayoutParams.WRAP_CONTENT) { + // If the dimension is set to WRAP_CONTENT or MATCH_PARENT, then the dimension is undefined. + if (paramSize <= 0) { return null } diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/property/HexColor.kt b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/property/HexColor.kt index 1d7be3dc1..10484e48f 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/property/HexColor.kt +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/property/HexColor.kt @@ -6,6 +6,7 @@ package com.urbanairship.android.layout.property import android.graphics.Color import androidx.annotation.ColorInt import androidx.core.graphics.ColorUtils +import com.urbanairship.UALog import com.urbanairship.UALog.w import com.urbanairship.json.JsonMap @@ -25,10 +26,15 @@ public object HexColor { return null } - var color = Color.parseColor(hex) - if (alpha != 1f) { - color = ColorUtils.setAlphaComponent(color, (alpha * 255).toInt()) + return try { + var color = Color.parseColor(hex) + if (alpha != 1f) { + color = ColorUtils.setAlphaComponent(color, (alpha * 255).toInt()) + } + color + } catch (e: Exception) { + UALog.e(e) { "Invalid color $hex " } + null } - return color } } diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/ConstraintSetBuilder.java b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/ConstraintSetBuilder.java index 275f04666..2a0e46963 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/ConstraintSetBuilder.java +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/ConstraintSetBuilder.java @@ -184,7 +184,7 @@ public ConstraintSetBuilder width(@Nullable Size size, @IdRes int viewId) { @NonNull public ConstraintSetBuilder width(@Nullable Size size, boolean ignoreSafeArea, @IdRes int viewId) { - return size(size, ignoreSafeArea, viewId, ConstraintSet.WRAP_CONTENT); + return width(size, ignoreSafeArea, viewId, ConstraintSet.WRAP_CONTENT); } @NonNull diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/LayoutUtils.java b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/LayoutUtils.java index 420714ed2..c89563019 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/LayoutUtils.java +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/util/LayoutUtils.java @@ -9,6 +9,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -50,10 +51,12 @@ /** * Helpers for layout rendering. + * * @hide */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public final class LayoutUtils { + private static final float PRESSED_ALPHA_PERCENT = 0.2f; private static final int DEFAULT_STROKE_WIDTH_DPS = 2; private static final int DEFAULT_BORDER_RADIUS = 0; @@ -72,9 +75,9 @@ public static void applyBorderAndBackground(@NonNull View view, @NonNull BaseMod } public static void applyBorderAndBackground( - @NonNull View view, - @Nullable Border border, - @Nullable Color backgroundColor + @NonNull View view, + @Nullable Border border, + @Nullable Color backgroundColor ) { Context context = view.getContext(); @@ -123,7 +126,7 @@ public static void applyBorderAndBackground( private static void mergeBackground(@NonNull View view, @NonNull Drawable drawable) { Drawable background = drawable; if (view.getBackground() != null) { - background = new LayerDrawable(new Drawable[]{view.getBackground(), drawable}); + background = new LayerDrawable(new Drawable[] { view.getBackground(), drawable }); } view.setBackground(background); } @@ -136,35 +139,35 @@ public static void applyButtonModel(@NonNull MaterialButton button, @NonNull Lab int textColor = textAppearance.getColor().resolve(context); int backgroundColor = model.getBackgroundColor() == null - ? Color.TRANSPARENT - : model.getBackgroundColor().resolve(button.getContext()); + ? Color.TRANSPARENT + : model.getBackgroundColor().resolve(button.getContext()); int pressedColor = ColorUtils.setAlphaComponent(textColor, Math.round(Color.alpha(textColor) * PRESSED_ALPHA_PERCENT)); int disabledColor = generateDisabledColor(backgroundColor); int strokeWidth = model.getBorder() == null || model.getBorder().getStrokeWidth() == null - ? DEFAULT_STROKE_WIDTH_DPS - : model.getBorder().getStrokeWidth(); + ? DEFAULT_STROKE_WIDTH_DPS + : model.getBorder().getStrokeWidth(); int strokeColor = model.getBorder() == null || model.getBorder().getStrokeColor() == null - ? backgroundColor - : model.getBorder().getStrokeColor().resolve(context); + ? backgroundColor + : model.getBorder().getStrokeColor().resolve(context); int disabledStrokeColor = generateDisabledColor(strokeColor); int borderRadius = model.getBorder() == null || model.getBorder().getRadius() == null - ? DEFAULT_BORDER_RADIUS - : model.getBorder().getRadius(); + ? DEFAULT_BORDER_RADIUS + : model.getBorder().getRadius(); button.setBackgroundTintList(new ColorStateListBuilder() - .add(disabledColor, -android.R.attr.state_enabled) - .add(backgroundColor) - .build()); + .add(disabledColor, -android.R.attr.state_enabled) + .add(backgroundColor) + .build()); button.setRippleColor(ColorStateList.valueOf(pressedColor)); - int strokeWidthDp = (int) dpToPx(context, strokeWidth); - button.setStrokeWidth(strokeWidthDp); - if (strokeWidthDp > 0) { - addPadding(button, strokeWidthDp); - } + int strokeWidthPixels = (int) dpToPx(context, strokeWidth); + button.setStrokeWidth(strokeWidthPixels); button.setStrokeColor(new ColorStateListBuilder() - .add(disabledStrokeColor, -android.R.attr.state_enabled) - .add(strokeColor) - .build()); + .add(disabledStrokeColor, -android.R.attr.state_enabled) + .add(strokeColor) + .build()); + + button.setEllipsize(TextUtils.TruncateAt.END); + button.setIncludeFontPadding(false); button.setCornerRadius((int) dpToPx(context, borderRadius)); button.setSingleLine(false); } @@ -229,9 +232,9 @@ public static void applyTextAppearance(@NonNull TextView textView, @NonNull Text int disabledTextColor = generateDisabledColor(Color.TRANSPARENT, textColor); textView.setTextColor(new ColorStateListBuilder() - .add(disabledTextColor, -android.R.attr.state_enabled) - .add(textColor) - .build()); + .add(disabledTextColor, -android.R.attr.state_enabled) + .add(textColor) + .build()); int typefaceFlags = Typeface.NORMAL; int paintFlags = Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG; @@ -344,10 +347,10 @@ public static void addPadding(@NonNull View view, int padding) { public static void addPadding(@NonNull View view, int left, int top, int right, int bottom) { view.setPadding( - view.getPaddingLeft() + left, - view.getPaddingTop() + top, - view.getPaddingRight() + right, - view.getPaddingBottom() + bottom + view.getPaddingLeft() + left, + view.getPaddingTop() + top, + view.getPaddingRight() + right, + view.getPaddingBottom() + bottom ); } @@ -373,12 +376,13 @@ public static int generateDisabledColor(@ColorInt int background, @ColorInt int @ColorInt private static int overlayColors( - @ColorInt int backgroundColor, - @ColorInt int overlayColor, - @FloatRange(from = 0, to = 1) float overlayAlpha + @ColorInt int backgroundColor, + @ColorInt int overlayColor, + @FloatRange(from = 0, to = 1) float overlayAlpha ) { int alpha = Math.round(Color.alpha(overlayColor) * overlayAlpha); int overlay = ColorUtils.setAlphaComponent(overlayColor, alpha); return ColorUtils.compositeColors(overlay, backgroundColor); } + } diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/ImageButtonView.kt b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/ImageButtonView.kt index f450953f3..b3ffa1ea3 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/ImageButtonView.kt +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/ImageButtonView.kt @@ -15,6 +15,7 @@ import com.urbanairship.android.layout.model.ImageButtonModel import com.urbanairship.android.layout.property.Image import com.urbanairship.android.layout.util.ColorStateListBuilder import com.urbanairship.android.layout.util.LayoutUtils +import com.urbanairship.android.layout.util.ResourceUtils import com.urbanairship.android.layout.util.debouncedClicks import com.urbanairship.android.layout.util.ifNotEmpty import com.urbanairship.android.layout.widget.TappableView @@ -50,11 +51,16 @@ internal class ImageButtonView( var isLoaded = false + // Falling back to the screen dimensions keeps the image as large as possible, + // while still allowing for sampling to occur. + val fallbackWidth = ResourceUtils.getDisplayWidthPixels(context) + val fallbackHeight = ResourceUtils.getDisplayHeightPixels(context) fun loadImage(url: String) = UAirship.shared().imageLoader .load(context, this, ImageRequestOptions.newBuilder(url) .setImageLoadedCallback { success -> if (success) { isLoaded = true } } + .setFallbackDimensions(fallbackWidth, fallbackHeight) .build()) loadImage(url) diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/LabelButtonView.kt b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/LabelButtonView.kt index 671deb13a..8ac125d52 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/LabelButtonView.kt +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/view/LabelButtonView.kt @@ -4,8 +4,6 @@ package com.urbanairship.android.layout.view import android.content.Context import android.text.TextUtils import androidx.core.view.isGone -import com.google.android.material.button.MaterialButton -import com.urbanairship.android.layout.R import com.urbanairship.android.layout.model.ButtonModel import com.urbanairship.android.layout.model.LabelButtonModel import com.urbanairship.android.layout.util.LayoutUtils @@ -13,6 +11,7 @@ import com.urbanairship.android.layout.util.ResourceUtils import com.urbanairship.android.layout.util.debouncedClicks import com.urbanairship.android.layout.util.ifNotEmpty import com.urbanairship.android.layout.widget.TappableView +import com.google.android.material.button.MaterialButton import kotlinx.coroutines.flow.Flow internal class LabelButtonView( @@ -48,15 +47,17 @@ internal class LabelButtonView( } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val strokeWidthPixels = strokeWidth + val autoHeight = MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY val autoWidth = MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY if (autoHeight || autoWidth) { val twelveDp = ResourceUtils.dpToPx(context, 12).toInt() val horizontal = if (autoWidth) twelveDp else 0 val vertical = if (autoHeight) twelveDp else 0 - setPadding(horizontal, vertical, horizontal, vertical) + setPadding(horizontal + strokeWidthPixels, vertical + strokeWidthPixels, horizontal + strokeWidthPixels, vertical + strokeWidthPixels) } else { - setPadding(0, 0, 0, 0) + setPadding(strokeWidthPixels, strokeWidthPixels, strokeWidthPixels, strokeWidthPixels) } super.onMeasure(widthMeasureSpec, heightMeasureSpec) } diff --git a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/widget/WeightlessLinearLayout.java b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/widget/WeightlessLinearLayout.java index cd91659e6..d328b5abd 100644 --- a/urbanairship-layout/src/main/java/com/urbanairship/android/layout/widget/WeightlessLinearLayout.java +++ b/urbanairship-layout/src/main/java/com/urbanairship/android/layout/widget/WeightlessLinearLayout.java @@ -232,7 +232,6 @@ private void measureVertical(int widthMeasureSpec, int heightMeasureSpec) { int count = getChildCount(); List childrenWithMaxPercent = new ArrayList<>(); - int maxPercentChildrenTotalMargins = 0; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); @@ -254,7 +253,6 @@ private void measureVertical(int widthMeasureSpec, int heightMeasureSpec) { if (lp.maxHeightPercent > 0) { childrenWithMaxPercent.add(child); - maxPercentChildrenTotalMargins += lp.getMarginStart() + lp.getMarginEnd(); } if (heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.maxHeightPercent > 0) { @@ -463,7 +461,6 @@ private void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { int count = getChildCount(); List childrenWithMaxPercent = new ArrayList<>(); - int maxPercentChildrenTotalMargins = 0; int widthMode = MeasureSpec.getMode(widthMeasureSpec); @@ -485,7 +482,6 @@ private void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { if (lp.maxWidthPercent > 0) { childrenWithMaxPercent.add(child); - maxPercentChildrenTotalMargins += lp.getMarginStart() + lp.getMarginEnd(); } if (widthMode == MeasureSpec.EXACTLY && lp.width == 0 && lp.maxWidthPercent > 0) { @@ -604,7 +600,7 @@ private void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { heightSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY); } } else { - heightSpec = getChildMeasureSpec(widthMeasureSpec, getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin, lp.height); + heightSpec = getChildMeasureSpec(heightMeasureSpec, getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin, lp.height); } int widthSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY); @@ -792,6 +788,7 @@ private void layoutHorizontal(int left, int top, int right, int bottom) { break; case Gravity.CENTER_HORIZONTAL: + // mTotalLength contains the padding already childLeft = getPaddingLeft() + (right - left - totalLength) / 2; break; @@ -918,7 +915,7 @@ public LayoutParams(ViewGroup.MarginLayoutParams source) { @NonNull @Override public String toString() { - return String.format("LayoutParams{ width = %d, height = %d, maxWidth = %.2f, maxHeight = %.2f", + return String.format("LayoutParams{ width = %d, height = %d, maxWidth = %.2f, maxHeight = %.2f }", width, height, maxWidthPercent, maxHeightPercent); } } diff --git a/urbanairship-layout/src/main/res/values/style_airship_layout.xml b/urbanairship-layout/src/main/res/values/style_airship_layout.xml index dc6f2ac17..53e5a1da9 100644 --- a/urbanairship-layout/src/main/res/values/style_airship_layout.xml +++ b/urbanairship-layout/src/main/res/values/style_airship_layout.xml @@ -10,6 +10,7 @@ true false @android:style/Animation.Dialog + @android:color/transparent