am 9c474738: Merge "Update layoutlib for jb mr1." into jb-mr1-dev

* commit '9c474738a29f77359a461035855d6e9b3935ade1':
  Update layoutlib for jb mr1.
This commit is contained in:
Xavier Ducrohet
2012-10-17 17:21:36 -07:00
committed by Android Git Automerger
29 changed files with 184 additions and 95 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<ImageView <ImageView
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="wrap_content"/> android:layout_width="wrap_content"/>
@ -13,12 +17,4 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"/> android:layout_weight="1"/>
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="3dip"
android:layout_marginRight="15dip"/>
</merge> </merge>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

View File

@ -210,7 +210,8 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
Capability.PLAY_ANIMATION, Capability.PLAY_ANIMATION,
Capability.ANIMATED_VIEW_MANIPULATION, Capability.ANIMATED_VIEW_MANIPULATION,
Capability.ADAPTER_BINDING, Capability.ADAPTER_BINDING,
Capability.EXTENDED_VIEWINFO); Capability.EXTENDED_VIEWINFO,
Capability.FIXED_SCALABLE_NINE_PATCH);
BridgeAssetManager.initSystem(); BridgeAssetManager.initSystem();

View File

@ -60,11 +60,15 @@ abstract class CustomBar extends LinearLayout {
protected abstract TextView getStyleableTextView(); protected abstract TextView getStyleableTextView();
protected CustomBar(Context context, Density density, String layoutPath, String name) protected CustomBar(Context context, Density density, int orientation, String layoutPath,
throws XmlPullParserException { String name) throws XmlPullParserException {
super(context); super(context);
setOrientation(LinearLayout.HORIZONTAL); setOrientation(orientation);
setGravity(Gravity.CENTER_VERTICAL); if (orientation == LinearLayout.HORIZONTAL) {
setGravity(Gravity.CENTER_VERTICAL);
} else {
setGravity(Gravity.CENTER_HORIZONTAL);
}
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE); Context.LAYOUT_INFLATER_SERVICE);

View File

@ -21,6 +21,7 @@ import com.android.resources.Density;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.content.Context; import android.content.Context;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
public class FakeActionBar extends CustomBar { public class FakeActionBar extends CustomBar {
@ -29,7 +30,7 @@ public class FakeActionBar extends CustomBar {
public FakeActionBar(Context context, Density density, String label, String icon) public FakeActionBar(Context context, Density density, String label, String icon)
throws XmlPullParserException { throws XmlPullParserException {
super(context, density, "/bars/action_bar.xml", "action_bar.xml"); super(context, density, LinearLayout.HORIZONTAL, "/bars/action_bar.xml", "action_bar.xml");
// Cannot access the inside items through id because no R.id values have been // Cannot access the inside items through id because no R.id values have been
// created for them. // created for them.

View File

@ -17,34 +17,34 @@
package com.android.layoutlib.bridge.bars; package com.android.layoutlib.bridge.bars;
import com.android.resources.Density; import com.android.resources.Density;
import com.android.resources.ResourceType;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.widget.LinearLayout;
import android.graphics.drawable.LevelListDrawable;
import android.widget.TextView; import android.widget.TextView;
public class TabletSystemBar extends CustomBar { public class NavigationBar extends CustomBar {
public TabletSystemBar(Context context, Density density) throws XmlPullParserException { public NavigationBar(Context context, Density density, int orientation) throws XmlPullParserException {
super(context, density, "/bars/tablet_system_bar.xml", "tablet_system_bar.xml"); super(context, density, orientation, "/bars/navigation_bar.xml", "navigation_bar.xml");
setBackgroundColor(0xFF000000); setBackgroundColor(0xFF000000);
// Cannot access the inside items through id because no R.id values have been // Cannot access the inside items through id because no R.id values have been
// created for them. // created for them.
// We do know the order though. // We do know the order though.
loadIcon(0, "ic_sysbar_back_default.png", density); // 0 is a spacer.
loadIcon(1, "ic_sysbar_home_default.png", density); int back = 1;
loadIcon(2, "ic_sysbar_recent_default.png", density); int recent = 3;
// 3 is the spacer if (orientation == LinearLayout.VERTICAL) {
loadIcon(4, "stat_sys_wifi_signal_4_fully.png", density); back = 3;
Drawable drawable = loadIcon(5, ResourceType.DRAWABLE, "stat_sys_battery_charge"); recent = 1;
if (drawable instanceof LevelListDrawable) {
((LevelListDrawable) drawable).setLevel(100);
} }
loadIcon(back, "ic_sysbar_back.png", density);
loadIcon(2, "ic_sysbar_home.png", density);
loadIcon(recent, "ic_sysbar_recent.png", density);
} }
@Override @Override

View File

@ -25,12 +25,13 @@ import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LevelListDrawable; import android.graphics.drawable.LevelListDrawable;
import android.view.Gravity; import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
public class PhoneSystemBar extends CustomBar { public class StatusBar extends CustomBar {
public PhoneSystemBar(Context context, Density density) throws XmlPullParserException { public StatusBar(Context context, Density density) throws XmlPullParserException {
super(context, density, "/bars/phone_system_bar.xml", "phone_system_bar.xml"); super(context, density, LinearLayout.HORIZONTAL, "/bars/status_bar.xml", "status_bar.xml");
// FIXME: use FILL_H? // FIXME: use FILL_H?
setGravity(Gravity.START | Gravity.TOP | Gravity.RIGHT); setGravity(Gravity.START | Gravity.TOP | Gravity.RIGHT);

View File

@ -21,6 +21,7 @@ import com.android.resources.Density;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.content.Context; import android.content.Context;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
public class TitleBar extends CustomBar { public class TitleBar extends CustomBar {
@ -29,7 +30,7 @@ public class TitleBar extends CustomBar {
public TitleBar(Context context, Density density, String label) public TitleBar(Context context, Density density, String label)
throws XmlPullParserException { throws XmlPullParserException {
super(context, density, "/bars/title_bar.xml", "title_bar.xml"); super(context, density, LinearLayout.HORIZONTAL, "/bars/title_bar.xml", "title_bar.xml");
// Cannot access the inside items through id because no R.id values have been // Cannot access the inside items through id because no R.id values have been
// created for them. // created for them.

View File

@ -20,11 +20,12 @@ import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTE
import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT; import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT;
import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
import com.android.ide.common.rendering.api.HardwareConfig;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.RenderParams; import com.android.ide.common.rendering.api.RenderParams;
import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.RenderResources;
import com.android.ide.common.rendering.api.Result;
import com.android.ide.common.rendering.api.RenderResources.FrameworkResourceIdProvider; import com.android.ide.common.rendering.api.RenderResources.FrameworkResourceIdProvider;
import com.android.ide.common.rendering.api.Result;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.BridgeContext;
import com.android.resources.Density; import com.android.resources.Density;
@ -98,19 +99,22 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
return result; return result;
} }
HardwareConfig hardwareConfig = mParams.getHardwareConfig();
// setup the display Metrics. // setup the display Metrics.
DisplayMetrics metrics = new DisplayMetrics(); DisplayMetrics metrics = new DisplayMetrics();
metrics.densityDpi = metrics.noncompatDensityDpi = mParams.getDensity().getDpiValue(); metrics.densityDpi = metrics.noncompatDensityDpi =
hardwareConfig.getDensity().getDpiValue();
metrics.density = metrics.noncompatDensity = metrics.density = metrics.noncompatDensity =
metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT;
metrics.scaledDensity = metrics.noncompatScaledDensity = metrics.density; metrics.scaledDensity = metrics.noncompatScaledDensity = metrics.density;
metrics.widthPixels = metrics.noncompatWidthPixels = mParams.getScreenWidth(); metrics.widthPixels = metrics.noncompatWidthPixels = hardwareConfig.getScreenWidth();
metrics.heightPixels = metrics.noncompatHeightPixels = mParams.getScreenHeight(); metrics.heightPixels = metrics.noncompatHeightPixels = hardwareConfig.getScreenHeight();
metrics.xdpi = metrics.noncompatXdpi = mParams.getXdpi(); metrics.xdpi = metrics.noncompatXdpi = hardwareConfig.getXdpi();
metrics.ydpi = metrics.noncompatYdpi = mParams.getYdpi(); metrics.ydpi = metrics.noncompatYdpi = hardwareConfig.getYdpi();
RenderResources resources = mParams.getResources(); RenderResources resources = mParams.getResources();
@ -305,7 +309,9 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
private Configuration getConfiguration() { private Configuration getConfiguration() {
Configuration config = new Configuration(); Configuration config = new Configuration();
ScreenSize screenSize = mParams.getConfigScreenSize(); HardwareConfig hardwareConfig = mParams.getHardwareConfig();
ScreenSize screenSize = hardwareConfig.getScreenSize();
if (screenSize != null) { if (screenSize != null) {
switch (screenSize) { switch (screenSize) {
case SMALL: case SMALL:
@ -323,13 +329,13 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
} }
} }
Density density = mParams.getDensity(); Density density = hardwareConfig.getDensity();
if (density == null) { if (density == null) {
density = Density.MEDIUM; density = Density.MEDIUM;
} }
config.screenWidthDp = mParams.getScreenWidth() / density.getDpiValue(); config.screenWidthDp = hardwareConfig.getScreenWidth() / density.getDpiValue();
config.screenHeightDp = mParams.getScreenHeight() / density.getDpiValue(); config.screenHeightDp = hardwareConfig.getScreenHeight() / density.getDpiValue();
if (config.screenHeightDp < config.screenWidthDp) { if (config.screenHeightDp < config.screenWidthDp) {
config.smallestScreenWidthDp = config.screenHeightDp; config.smallestScreenWidthDp = config.screenHeightDp;
} else { } else {

View File

@ -19,6 +19,7 @@ package com.android.layoutlib.bridge.impl;
import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN; import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
import com.android.ide.common.rendering.api.DrawableParams; import com.android.ide.common.rendering.api.DrawableParams;
import com.android.ide.common.rendering.api.HardwareConfig;
import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.Result;
import com.android.ide.common.rendering.api.Result.Status; import com.android.ide.common.rendering.api.Result.Status;
@ -59,6 +60,7 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
try { try {
// get the drawable resource value // get the drawable resource value
DrawableParams params = getParams(); DrawableParams params = getParams();
HardwareConfig hardwareConfig = params.getHardwareConfig();
ResourceValue drawableResource = params.getDrawable(); ResourceValue drawableResource = params.getDrawable();
// resolve it // resolve it
@ -75,15 +77,15 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
// get the actual Drawable object to draw // get the actual Drawable object to draw
Drawable d = ResourceHelper.getDrawable(drawableResource, context); Drawable d = ResourceHelper.getDrawable(drawableResource, context);
content.setBackgroundDrawable(d); content.setBackground(d);
// set the AttachInfo on the root view. // set the AttachInfo on the root view.
AttachInfo_Accessor.setAttachInfo(content); AttachInfo_Accessor.setAttachInfo(content);
// measure // measure
int w = params.getScreenWidth(); int w = hardwareConfig.getScreenWidth();
int h = params.getScreenHeight(); int h = hardwareConfig.getScreenHeight();
int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY); int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY); int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
content.measure(w_spec, h_spec); content.measure(w_spec, h_spec);
@ -99,11 +101,11 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
// create an Android bitmap around the BufferedImage // create an Android bitmap around the BufferedImage
Bitmap bitmap = Bitmap_Delegate.createBitmap(image, Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
true /*isMutable*/, params.getDensity()); true /*isMutable*/, hardwareConfig.getDensity());
// create a Canvas around the Android bitmap // create a Canvas around the Android bitmap
Canvas canvas = new Canvas(bitmap); Canvas canvas = new Canvas(bitmap);
canvas.setDensity(params.getDensity().getDpiValue()); canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
// and draw // and draw
content.draw(canvas); content.draw(canvas);

View File

@ -24,6 +24,7 @@ import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP
import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
import com.android.ide.common.rendering.api.AdapterBinding; import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.HardwareConfig;
import com.android.ide.common.rendering.api.IAnimationListener; import com.android.ide.common.rendering.api.IAnimationListener;
import com.android.ide.common.rendering.api.ILayoutPullParser; import com.android.ide.common.rendering.api.ILayoutPullParser;
import com.android.ide.common.rendering.api.IProjectCallback; import com.android.ide.common.rendering.api.IProjectCallback;
@ -43,13 +44,13 @@ import com.android.layoutlib.bridge.android.BridgeContext;
import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes; import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes;
import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
import com.android.layoutlib.bridge.bars.FakeActionBar; import com.android.layoutlib.bridge.bars.FakeActionBar;
import com.android.layoutlib.bridge.bars.PhoneSystemBar; import com.android.layoutlib.bridge.bars.NavigationBar;
import com.android.layoutlib.bridge.bars.TabletSystemBar; import com.android.layoutlib.bridge.bars.StatusBar;
import com.android.layoutlib.bridge.bars.TitleBar; import com.android.layoutlib.bridge.bars.TitleBar;
import com.android.layoutlib.bridge.impl.binding.FakeAdapter; import com.android.layoutlib.bridge.impl.binding.FakeAdapter;
import com.android.layoutlib.bridge.impl.binding.FakeExpandableAdapter; import com.android.layoutlib.bridge.impl.binding.FakeExpandableAdapter;
import com.android.resources.ResourceType; import com.android.resources.ResourceType;
import com.android.resources.ScreenSize; import com.android.resources.ScreenOrientation;
import com.android.util.Pair; import com.android.util.Pair;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@ -68,8 +69,8 @@ import android.util.DisplayMetrics;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.AttachInfo_Accessor; import android.view.AttachInfo_Accessor;
import android.view.BridgeInflater; import android.view.BridgeInflater;
import android.view.IWindowManagerImpl;
import android.view.IWindowManager; import android.view.IWindowManager;
import android.view.IWindowManagerImpl;
import android.view.Surface; import android.view.Surface;
import android.view.View; import android.view.View;
import android.view.View.MeasureSpec; import android.view.View.MeasureSpec;
@ -124,7 +125,8 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
private boolean mWindowIsFloating; private boolean mWindowIsFloating;
private int mStatusBarSize; private int mStatusBarSize;
private int mSystemBarSize; private int mNavigationBarSize;
private int mNavigationBarOrientation = LinearLayout.HORIZONTAL;
private int mTitleBarSize; private int mTitleBarSize;
private int mActionBarSize; private int mActionBarSize;
@ -187,7 +189,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
findBackground(resources); findBackground(resources);
findStatusBar(resources, metrics); findStatusBar(resources, metrics);
findActionBar(resources, metrics); findActionBar(resources, metrics);
findSystemBar(resources, metrics); findNavigationBar(resources, metrics);
// FIXME: find those out, and possibly add them to the render params // FIXME: find those out, and possibly add them to the render params
boolean hasSystemNavBar = true; boolean hasSystemNavBar = true;
@ -221,19 +223,57 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
try { try {
SessionParams params = getParams(); SessionParams params = getParams();
HardwareConfig hardwareConfig = params.getHardwareConfig();
BridgeContext context = getContext(); BridgeContext context = getContext();
// the view group that receives the window background. // the view group that receives the window background.
ViewGroup backgroundView = null; ViewGroup backgroundView = null;
if (mWindowIsFloating || params.isForceNoDecor()) { if (mWindowIsFloating || params.isForceNoDecor()) {
backgroundView = mViewRoot = mContentRoot = new FrameLayout(context); backgroundView = mViewRoot = mContentRoot = new FrameLayout(context);
} else { } else {
if (hasSoftwareButtons() && mNavigationBarOrientation == LinearLayout.VERTICAL) {
/*
* This is a special case where the navigation bar is on the right.
+-------------------------------------------------+---+
| Status bar (always) | |
+-------------------------------------------------+ |
| (Layout with background drawable) | |
| +---------------------------------------------+ | |
| | Title/Action bar (optional) | | |
| +---------------------------------------------+ | |
| | Content, vertical extending | | |
| | | | |
| +---------------------------------------------+ | |
+-------------------------------------------------+---+
So we create a horizontal layout, with the nav bar on the right,
and the left part is the normal layout below without the nav bar at
the bottom
*/
LinearLayout topLayout = new LinearLayout(context);
mViewRoot = topLayout;
topLayout.setOrientation(LinearLayout.HORIZONTAL);
try {
NavigationBar navigationBar = new NavigationBar(context,
hardwareConfig.getDensity(), LinearLayout.VERTICAL);
navigationBar.setLayoutParams(
new LinearLayout.LayoutParams(
mNavigationBarSize,
LayoutParams.MATCH_PARENT));
topLayout.addView(navigationBar);
} catch (XmlPullParserException e) {
}
}
/* /*
* we're creating the following layout * we're creating the following layout
* *
+-------------------------------------------------+ +-------------------------------------------------+
| System bar (only in phone UI) | | Status bar (always) |
+-------------------------------------------------+ +-------------------------------------------------+
| (Layout with background drawable) | | (Layout with background drawable) |
| +---------------------------------------------+ | | +---------------------------------------------+ |
@ -243,20 +283,31 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
| | | | | | | |
| +---------------------------------------------+ | | +---------------------------------------------+ |
+-------------------------------------------------+ +-------------------------------------------------+
| System bar (only in tablet UI) | | Navigation bar for soft buttons, maybe see above|
+-------------------------------------------------+ +-------------------------------------------------+
*/ */
LinearLayout topLayout = new LinearLayout(context); LinearLayout topLayout = new LinearLayout(context);
mViewRoot = topLayout;
topLayout.setOrientation(LinearLayout.VERTICAL); topLayout.setOrientation(LinearLayout.VERTICAL);
// if we don't already have a view root this is it
if (mViewRoot == null) {
mViewRoot = topLayout;
} else {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
layoutParams.weight = 1;
topLayout.setLayoutParams(layoutParams);
// this is the case of soft buttons + vertical bar.
// this top layout is the first layout in the horizontal layout. see above)
mViewRoot.addView(topLayout, 0);
}
if (mStatusBarSize > 0) { if (mStatusBarSize > 0) {
// system bar // system bar
try { try {
PhoneSystemBar systemBar = new PhoneSystemBar(context, StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity());
params.getDensity());
systemBar.setLayoutParams( systemBar.setLayoutParams(
new LinearLayout.LayoutParams( new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, mStatusBarSize)); LayoutParams.MATCH_PARENT, mStatusBarSize));
@ -280,7 +331,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
if (mActionBarSize > 0) { if (mActionBarSize > 0) {
try { try {
FakeActionBar actionBar = new FakeActionBar(context, FakeActionBar actionBar = new FakeActionBar(context,
params.getDensity(), hardwareConfig.getDensity(),
params.getAppLabel(), params.getAppIcon()); params.getAppLabel(), params.getAppIcon());
actionBar.setLayoutParams( actionBar.setLayoutParams(
new LinearLayout.LayoutParams( new LinearLayout.LayoutParams(
@ -292,7 +343,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
} else if (mTitleBarSize > 0) { } else if (mTitleBarSize > 0) {
try { try {
TitleBar titleBar = new TitleBar(context, TitleBar titleBar = new TitleBar(context,
params.getDensity(), params.getAppLabel()); hardwareConfig.getDensity(), params.getAppLabel());
titleBar.setLayoutParams( titleBar.setLayoutParams(
new LinearLayout.LayoutParams( new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, mTitleBarSize)); LayoutParams.MATCH_PARENT, mTitleBarSize));
@ -310,15 +361,16 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
mContentRoot.setLayoutParams(layoutParams); mContentRoot.setLayoutParams(layoutParams);
backgroundLayout.addView(mContentRoot); backgroundLayout.addView(mContentRoot);
if (mSystemBarSize > 0) { if (mNavigationBarOrientation == LinearLayout.HORIZONTAL &&
mNavigationBarSize > 0) {
// system bar // system bar
try { try {
TabletSystemBar systemBar = new TabletSystemBar(context, NavigationBar navigationBar = new NavigationBar(context,
params.getDensity()); hardwareConfig.getDensity(), LinearLayout.HORIZONTAL);
systemBar.setLayoutParams( navigationBar.setLayoutParams(
new LinearLayout.LayoutParams( new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, mSystemBarSize)); LayoutParams.MATCH_PARENT, mNavigationBarSize));
topLayout.addView(systemBar); topLayout.addView(navigationBar);
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
} }
@ -346,7 +398,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
// get the background drawable // get the background drawable
if (mWindowBackground != null && backgroundView != null) { if (mWindowBackground != null && backgroundView != null) {
Drawable d = ResourceHelper.getDrawable(mWindowBackground, context); Drawable d = ResourceHelper.getDrawable(mWindowBackground, context);
backgroundView.setBackgroundDrawable(d); backgroundView.setBackground(d);
} }
return SUCCESS.createResult(); return SUCCESS.createResult();
@ -389,13 +441,14 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
} }
RenderingMode renderingMode = params.getRenderingMode(); RenderingMode renderingMode = params.getRenderingMode();
HardwareConfig hardwareConfig = params.getHardwareConfig();
// only do the screen measure when needed. // only do the screen measure when needed.
boolean newRenderSize = false; boolean newRenderSize = false;
if (mMeasuredScreenWidth == -1) { if (mMeasuredScreenWidth == -1) {
newRenderSize = true; newRenderSize = true;
mMeasuredScreenWidth = params.getScreenWidth(); mMeasuredScreenWidth = hardwareConfig.getScreenWidth();
mMeasuredScreenHeight = params.getScreenHeight(); mMeasuredScreenHeight = hardwareConfig.getScreenHeight();
if (renderingMode != RenderingMode.NORMAL) { if (renderingMode != RenderingMode.NORMAL) {
int widthMeasureSpecMode = renderingMode.isHorizExpand() ? int widthMeasureSpecMode = renderingMode.isHorizExpand() ?
@ -495,11 +548,11 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
// create an Android bitmap around the BufferedImage // create an Android bitmap around the BufferedImage
Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage, Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage,
true /*isMutable*/, params.getDensity()); true /*isMutable*/, hardwareConfig.getDensity());
// create a Canvas around the Android bitmap // create a Canvas around the Android bitmap
mCanvas = new Canvas(bitmap); mCanvas = new Canvas(bitmap);
mCanvas.setDensity(params.getDensity().getDpiValue()); mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue());
} }
if (freshRender && newImage == false) { if (freshRender && newImage == false) {
@ -972,30 +1025,28 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
} }
} }
private boolean isTabletUi() { private boolean hasSoftwareButtons() {
return getParams().getConfigScreenSize() == ScreenSize.XLARGE; return getParams().getHardwareConfig().hasSoftwareButtons();
} }
private void findStatusBar(RenderResources resources, DisplayMetrics metrics) { private void findStatusBar(RenderResources resources, DisplayMetrics metrics) {
if (isTabletUi() == false) { boolean windowFullscreen = getBooleanThemeValue(resources,
boolean windowFullscreen = getBooleanThemeValue(resources, "windowFullscreen", false /*defaultValue*/);
"windowFullscreen", false /*defaultValue*/);
if (windowFullscreen == false && mWindowIsFloating == false) { if (windowFullscreen == false && mWindowIsFloating == false) {
// default value // default value
mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT; mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT;
// get the real value // get the real value
ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN,
"status_bar_height"); "status_bar_height");
if (value != null) { if (value != null) {
TypedValue typedValue = ResourceHelper.getValue("status_bar_height", TypedValue typedValue = ResourceHelper.getValue("status_bar_height",
value.getValue(), true /*requireUnit*/); value.getValue(), true /*requireUnit*/);
if (typedValue != null) { if (typedValue != null) {
// compute the pixel value based on the display metrics // compute the pixel value based on the display metrics
mStatusBarSize = (int)typedValue.getDimension(metrics); mStatusBarSize = (int)typedValue.getDimension(metrics);
}
} }
} }
} }
@ -1062,22 +1113,48 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
} }
} }
private void findSystemBar(RenderResources resources, DisplayMetrics metrics) { private void findNavigationBar(RenderResources resources, DisplayMetrics metrics) {
if (isTabletUi() && mWindowIsFloating == false) { if (hasSoftwareButtons() && mWindowIsFloating == false) {
// default value // default value
mSystemBarSize = 48; // ?? mNavigationBarSize = 48; // ??
HardwareConfig hardwareConfig = getParams().getHardwareConfig();
boolean barOnBottom = true;
if (hardwareConfig.getOrientation() == ScreenOrientation.LANDSCAPE) {
// compute the dp of the screen.
int shortSize = hardwareConfig.getScreenHeight();
// compute in dp
int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / hardwareConfig.getDensity().getDpiValue();
if (shortSizeDp < 600) {
// 0-599dp: "phone" UI with bar on the side
barOnBottom = false;
} else {
// 600+dp: "tablet" UI with bar on the bottom
barOnBottom = true;
}
}
if (barOnBottom) {
mNavigationBarOrientation = LinearLayout.HORIZONTAL;
} else {
mNavigationBarOrientation = LinearLayout.VERTICAL;
}
// get the real value // get the real value
ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN,
"status_bar_height"); barOnBottom ? "navigation_bar_height" : "navigation_bar_width");
if (value != null) { if (value != null) {
TypedValue typedValue = ResourceHelper.getValue("status_bar_height", TypedValue typedValue = ResourceHelper.getValue("navigation_bar_height",
value.getValue(), true /*requireUnit*/); value.getValue(), true /*requireUnit*/);
if (typedValue != null) { if (typedValue != null) {
// compute the pixel value based on the display metrics // compute the pixel value based on the display metrics
mSystemBarSize = (int)typedValue.getDimension(metrics); mNavigationBarSize = (int)typedValue.getDimension(metrics);
} }
} }
} }