diff options
| -rw-r--r-- | core/java/android/view/View.java | 15 | ||||
| -rw-r--r-- | core/java/android/widget/FrameLayout.java | 13 | ||||
| -rw-r--r-- | core/java/android/widget/GridLayout.java | 13 | ||||
| -rw-r--r-- | core/java/android/widget/LinearLayout.java | 13 | ||||
| -rw-r--r-- | core/java/android/widget/RelativeLayout.java | 13 |
5 files changed, 43 insertions, 24 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index cdd7098d27fe..30de74ae32dc 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -821,6 +821,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, static boolean sTextureViewIgnoresDrawableSetters = false; /** + * Prior to N, some ViewGroups would not convert LayoutParams properly even though both extend + * MarginLayoutParams. For instance, converting LinearLayout.LayoutParams to + * RelativeLayout.LayoutParams would lose margin information. This is fixed on N but target API + * check is implemented for backwards compatibility. + * + * {@hide} + */ + protected static boolean sPreserveMarginParamsInLayoutParamConversion; + + + /** * This view does not want keystrokes. Use with TAKES_FOCUS_MASK when * calling setFlags. */ @@ -4054,6 +4065,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // On N+, we throw, but that breaks compatibility with apps that use these methods. sTextureViewIgnoresDrawableSetters = targetSdkVersion <= M; + // Prior to N, we would drop margins in LayoutParam conversions. The fix triggers bugs + // in apps so we target check it to avoid breaking existing apps. + sPreserveMarginParamsInLayoutParamConversion = targetSdkVersion >= N; + sCompatibilityDone = true; } } diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 029313c53938..b8c74d88b580 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -382,13 +382,14 @@ public class FrameLayout extends ViewGroup { @Override protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - if (lp instanceof LayoutParams) { - return new LayoutParams((LayoutParams) lp); - } else if (lp instanceof MarginLayoutParams) { - return new LayoutParams((MarginLayoutParams) lp); - } else { - return new LayoutParams(lp); + if (sPreserveMarginParamsInLayoutParamConversion) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } } + return new LayoutParams(lp); } @Override diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index 726586ee8d5f..af2852cde22a 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -868,13 +868,14 @@ public class GridLayout extends ViewGroup { @Override protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - if (lp instanceof LayoutParams) { - return new LayoutParams((LayoutParams) lp); - } else if (lp instanceof MarginLayoutParams) { - return new LayoutParams((MarginLayoutParams) lp); - } else { - return new LayoutParams(lp); + if (sPreserveMarginParamsInLayoutParamConversion) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } } + return new LayoutParams(lp); } // Draw grid diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 33d335a1a9aa..e2c535ca1695 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -1871,13 +1871,14 @@ public class LinearLayout extends ViewGroup { @Override protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - if (lp instanceof LayoutParams) { - return new LayoutParams((LayoutParams) lp); - } else if (lp instanceof MarginLayoutParams) { - return new LayoutParams((MarginLayoutParams) lp); - } else { - return new LayoutParams(lp); + if (sPreserveMarginParamsInLayoutParamConversion) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } } + return new LayoutParams(lp); } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 0136542ef4ac..a189d3c0cc91 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -1104,13 +1104,14 @@ public class RelativeLayout extends ViewGroup { @Override protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - if (lp instanceof LayoutParams) { - return new LayoutParams((LayoutParams) lp); - } else if (lp instanceof MarginLayoutParams) { - return new LayoutParams((MarginLayoutParams) lp); - } else { - return new LayoutParams(lp); + if (sPreserveMarginParamsInLayoutParamConversion) { + if (lp instanceof LayoutParams) { + return new LayoutParams((LayoutParams) lp); + } else if (lp instanceof MarginLayoutParams) { + return new LayoutParams((MarginLayoutParams) lp); + } } + return new LayoutParams(lp); } /** @hide */ |