Auto hide IllustrationPreference when lottie file is empty
Flag: com.android.settingslib.widget.flags.auto_hide_lottie_res
Bug: 337873972
Test: unit test
Test: manual: delete `lottie_adaptive_brightness.json` from overlay, navigate to Display > Adaptive Brightness -- verify no empty container
Change-Id: I873976d3e87b119a3ee690d95c68149f249fe7a9
diff --git a/packages/SettingsLib/IllustrationPreference/Android.bp b/packages/SettingsLib/IllustrationPreference/Android.bp
index 6407810..c3a91a2 100644
--- a/packages/SettingsLib/IllustrationPreference/Android.bp
+++ b/packages/SettingsLib/IllustrationPreference/Android.bp
@@ -21,6 +21,7 @@
"SettingsLibColor",
"androidx.preference_preference",
"lottie",
+ "settingslib_illustrationpreference_flags_lib",
],
sdk_version: "system_current",
@@ -31,3 +32,24 @@
"com.android.permission",
],
}
+
+aconfig_declarations {
+ name: "settingslib_illustrationpreference_flags",
+ package: "com.android.settingslib.widget.flags",
+ container: "system",
+ srcs: [
+ "aconfig/illustrationpreference.aconfig",
+ ],
+}
+
+java_aconfig_library {
+ name: "settingslib_illustrationpreference_flags_lib",
+ aconfig_declarations: "settingslib_illustrationpreference_flags",
+
+ min_sdk_version: "30",
+
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.permission",
+ ],
+}
diff --git a/packages/SettingsLib/IllustrationPreference/aconfig/illustrationpreference.aconfig b/packages/SettingsLib/IllustrationPreference/aconfig/illustrationpreference.aconfig
new file mode 100644
index 0000000..e566d89
--- /dev/null
+++ b/packages/SettingsLib/IllustrationPreference/aconfig/illustrationpreference.aconfig
@@ -0,0 +1,12 @@
+package: "com.android.settingslib.widget.flags"
+container: "system"
+
+flag {
+ name: "auto_hide_empty_lottie_res"
+ namespace: "android_settings"
+ description: "Hides IllustrationPreference when Lottie resource is an empty file"
+ bug: "337873972"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
\ No newline at end of file
diff --git a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
index 815a101..bbf0315 100644
--- a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
+++ b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
@@ -39,12 +39,14 @@
import androidx.preference.PreferenceViewHolder;
import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
+import com.android.settingslib.widget.flags.Flags;
import com.android.settingslib.widget.preference.illustration.R;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieDrawable;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.io.InputStream;
/**
@@ -142,7 +144,7 @@
illustrationFrame.setLayoutParams(lp);
illustrationView.setCacheComposition(mCacheComposition);
- handleImageWithAnimation(illustrationView);
+ handleImageWithAnimation(illustrationView, illustrationFrame);
handleImageFrameMaxHeight(backgroundView, illustrationView);
if (mIsAutoScale) {
@@ -332,7 +334,8 @@
}
}
- private void handleImageWithAnimation(LottieAnimationView illustrationView) {
+ private void handleImageWithAnimation(LottieAnimationView illustrationView,
+ ViewGroup container) {
if (mImageDrawable != null) {
resetAnimations(illustrationView);
illustrationView.setImageDrawable(mImageDrawable);
@@ -356,6 +359,25 @@
}
if (mImageResId > 0) {
+ if (Flags.autoHideEmptyLottieRes()) {
+ // Check if resource is empty
+ try (InputStream is = illustrationView.getResources()
+ .openRawResource(mImageResId)) {
+ int check = is.read();
+ // -1 = end of stream. if first read is end of stream, then file is empty
+ if (check == -1) {
+ illustrationView.setVisibility(View.GONE);
+ container.setVisibility(View.GONE);
+ return;
+ }
+ } catch (IOException e) {
+ Log.w(TAG, "Unable to open Lottie raw resource", e);
+ }
+
+ illustrationView.setVisibility(View.VISIBLE);
+ container.setVisibility(View.VISIBLE);
+ }
+
resetAnimations(illustrationView);
illustrationView.setImageResource(mImageResId);
final Drawable drawable = illustrationView.getDrawable();