diff options
author | Diego Perez <diegoperez@google.com> | 2015-06-02 17:09:45 +0100 |
---|---|---|
committer | Diego Perez <diegoperez@google.com> | 2015-06-02 17:09:45 +0100 |
commit | 4362443cd9a5df6c5cc012881a0aaf96c927b923 (patch) | |
tree | f93270aabffc681bbe32ae981a7428523f90874c | |
parent | 958a7c1cd816986ac58073ae415b0825c0a11b7b (diff) | |
download | frameworks_base-4362443cd9a5df6c5cc012881a0aaf96c927b923.zip frameworks_base-4362443cd9a5df6c5cc012881a0aaf96c927b923.tar.gz frameworks_base-4362443cd9a5df6c5cc012881a0aaf96c927b923.tar.bz2 |
Render to measured size when using expand mode
When using RenderingMode.V_SCROLL or RenderingMode.H_SCROLL, if the
screen size is smaller than the measured size but as large as the
desired size, the layout will render incorrectly and won't expand.
This changes that to expand to at least the size of the screen.
Added tests for the V_SCROLL and H_SCROLL modes.
Bug: http://b.android.com/174928
Change-Id: I22686903560775e2e4f362af1d7b50c9b985467d
8 files changed, 131 insertions, 11 deletions
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index f6e5ef1..5ded389 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -523,6 +523,11 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { if (neededWidth > measuredWidth) { mMeasuredScreenWidth += neededWidth - measuredWidth; } + if (mMeasuredScreenWidth < measuredWidth) { + // If the screen width is less than the exact measured width, + // expand to match. + mMeasuredScreenWidth = measuredWidth; + } } if (renderingMode.isVertExpand()) { @@ -531,6 +536,11 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { if (neededHeight > measuredHeight) { mMeasuredScreenHeight += neededHeight - measuredHeight; } + if (mMeasuredScreenHeight < measuredHeight) { + // If the screen height is less than the exact measured height, + // expand to match. + mMeasuredScreenHeight = measuredHeight; + } } } } diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class Binary files differindex 36e2688..1499751 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png Binary files differnew file mode 100644 index 0000000..92eb3e1 --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_vert_layout.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_vert_layout.png Binary files differnew file mode 100644 index 0000000..81755ce --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_vert_layout.png diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_horz_layout.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_horz_layout.xml new file mode 100644 index 0000000..2c66b7f --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_horz_layout.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:padding="16dp" + android:orientation="horizontal" + android:background="#AAAAAA" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <include layout="@layout/expand_layout" + android:layout_height="wrap_content" + android:layout_width="wrap_content" /> + +</LinearLayout> + diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_layout.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_layout.xml new file mode 100644 index 0000000..a255da7 --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_layout.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> + +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <TextView + android:background="#FF0000" + android:textSize="200sp" + android:layout_width="200dp" + android:layout_height="200dp" /> + <TextView + android:background="#00FF00" + android:textSize="200sp" + android:layout_width="200dp" + android:layout_height="200dp" /> + <TextView + android:background="#0000FF" + android:textSize="200sp" + android:layout_width="200dp" + android:layout_height="200dp" /> + <TextView + android:background="#FF00FF" + android:textSize="200sp" + android:layout_width="200dp" + android:layout_height="200dp" /> + <TextView + android:background="#00FFFF" + android:textSize="200sp" + android:layout_width="200dp" + android:layout_height="200dp" /> +</merge> diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_vert_layout.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_vert_layout.xml new file mode 100644 index 0000000..5319654 --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/expand_vert_layout.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:padding="16dp" + android:orientation="vertical" + android:background="#AAAAAA" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <include layout="@layout/expand_layout" + android:layout_height="wrap_content" + android:layout_width="wrap_content" /> + +</LinearLayout> + diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index f2a039e..6fcd645 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -32,6 +32,8 @@ import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.intensive.setup.ConfigGenerator; import com.android.layoutlib.bridge.intensive.setup.LayoutLibTestCallback; import com.android.layoutlib.bridge.intensive.setup.LayoutPullParser; +import com.android.resources.Density; +import com.android.resources.Navigation; import com.android.utils.ILogger; import org.junit.Before; @@ -288,20 +290,50 @@ public class Main { renderAndVerify("allwidgets.xml", "allwidgets.png"); } + /** Test expand_layout.xml */ + @Test + public void testExpand() throws ClassNotFoundException { + // Create the layout pull parser. + LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + + "expand_vert_layout.xml"); + // Create LayoutLibCallback. + LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); + layoutLibCallback.initResources(); + + ConfigGenerator customConfigGenerator = new ConfigGenerator() + .setScreenWidth(300) + .setScreenHeight(20) + .setDensity(Density.XHIGH) + .setNavigation(Navigation.NONAV); + + SessionParams params = getSessionParams(parser, customConfigGenerator, + layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", RenderingMode.V_SCROLL, + 22); + + renderAndVerify(params, "expand_vert_layout.png"); + + customConfigGenerator = new ConfigGenerator() + .setScreenWidth(20) + .setScreenHeight(300) + .setDensity(Density.XHIGH) + .setNavigation(Navigation.NONAV); + parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + + "expand_horz_layout.xml"); + params = getSessionParams(parser, customConfigGenerator, + layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", RenderingMode + .H_SCROLL, 22); + + renderAndVerify(params, "expand_horz_layout.png"); + } + /** * Create a new rendering session and test that rendering given layout on nexus 5 * doesn't throw any exceptions and matches the provided image. */ - private void renderAndVerify(String layoutFileName, String goldenFileName) + private void renderAndVerify(SessionParams params, String goldenFileName) throws ClassNotFoundException { - // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + layoutFileName); - // Create LayoutLibCallback. - LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); - layoutLibCallback.initResources(); // TODO: Set up action bar handler properly to test menu rendering. // Create session params. - SessionParams params = getSessionParams(parser, ConfigGenerator.NEXUS_5, layoutLibCallback); RenderSession session = mBridge.createSession(params); if (!session.getResult().isSuccess()) { getLogger().error(session.getResult().getException(), @@ -322,25 +354,44 @@ public class Main { } /** + * Create a new rendering session and test that rendering given layout on nexus 5 + * doesn't throw any exceptions and matches the provided image. + */ + private void renderAndVerify(String layoutFileName, String goldenFileName) + throws ClassNotFoundException { + // Create the layout pull parser. + LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + layoutFileName); + // Create LayoutLibCallback. + LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); + layoutLibCallback.initResources(); + // TODO: Set up action bar handler properly to test menu rendering. + // Create session params. + SessionParams params = getSessionParams(parser, ConfigGenerator.NEXUS_5, + layoutLibCallback, "Theme.Material.Light.DarkActionBar", RenderingMode.NORMAL, 22); + renderAndVerify(params, goldenFileName); + } + + /** * Uses Theme.Material and Target sdk version as 22. */ private SessionParams getSessionParams(LayoutPullParser layoutParser, - ConfigGenerator configGenerator, LayoutLibTestCallback layoutLibCallback) { + ConfigGenerator configGenerator, LayoutLibTestCallback layoutLibCallback, + String themeName, RenderingMode renderingMode, int targetSdk) { FolderConfiguration config = configGenerator.getFolderConfig(); ResourceResolver resourceResolver = ResourceResolver.create(mProjectResources.getConfiguredResources(config), mFrameworkRepo.getConfiguredResources(config), - "Theme.Material.Light.DarkActionBar", false); + themeName, false); return new SessionParams( layoutParser, - RenderingMode.NORMAL, + renderingMode, null /*used for caching*/, configGenerator.getHardwareConfig(), resourceResolver, layoutLibCallback, 0, - 22, // TODO: Make it more configurable to run tests for various versions. + targetSdk, getLayoutLog()); } |