Merge "cleanup some of the STOPSHIP comments"
diff --git a/api/current.xml b/api/current.xml
index 86ed7b8..7db3e89 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -134781,6 +134781,17 @@
<parameter name="key" type="java.lang.String">
</parameter>
</method>
+<method name="getClassLoader"
+ return="java.lang.ClassLoader"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getDouble"
return="double"
abstract="false"
@@ -151830,6 +151841,36 @@
</implements>
<implements name="android.provider.ContactsContract.DataColumnsWithJoins">
</implements>
+<method name="getTypeLabel"
+ return="java.lang.CharSequence"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="res" type="android.content.res.Resources">
+</parameter>
+<parameter name="type" type="int">
+</parameter>
+<parameter name="label" type="java.lang.CharSequence">
+</parameter>
+</method>
+<method name="getTypeLabelResource"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="type" type="int">
+</parameter>
+</method>
<field name="CONTENT_ITEM_TYPE"
type="java.lang.String"
transient="false"
@@ -218267,6 +218308,17 @@
<parameter name="completions" type="android.view.inputmethod.CompletionInfo[]">
</parameter>
</method>
+<method name="getCurrentInputMethodSubtype"
+ return="android.view.inputmethod.InputMethodSubtype"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getEnabledInputMethodList"
return="java.util.List<android.view.inputmethod.InputMethodInfo>"
abstract="false"
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 3ec0912..f27a15e 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -84,6 +84,10 @@
return mInstance;
}
+ if (mArguments != null) {
+ mArguments.setClassLoader(activity.getClassLoader());
+ }
+
mInstance = Fragment.instantiate(activity, mClassName, mArguments);
if (mSavedFragmentState != null) {
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index d9a6171..45f9325 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -1200,6 +1200,7 @@
f.mInLayout = false;
f.mAdded = false;
if (fs.mSavedFragmentState != null) {
+ fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader());
f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
FragmentManagerImpl.VIEW_STATE_TAG);
}
diff --git a/core/java/android/bluetooth/BluetoothDeviceProfileState.java b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
index fd8f930..0c8e4d9 100644
--- a/core/java/android/bluetooth/BluetoothDeviceProfileState.java
+++ b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
@@ -80,6 +80,7 @@
public static final int UNPAIR = 100;
public static final int AUTO_CONNECT_PROFILES = 101;
public static final int TRANSITION_TO_STABLE = 102;
+ public static final int CONNECT_OTHER_PROFILES = 103;
private static final int AUTO_CONNECT_DELAY = 6000; // 6 secs
@@ -149,10 +150,6 @@
sendMessage(TRANSITION_TO_STABLE);
}
} else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
- if (!getCurrentState().equals(mBondedDevice)) {
- Log.e(TAG, "State is: " + getCurrentState());
- return;
- }
Message msg = new Message();
msg.what = AUTO_CONNECT_PROFILES;
sendMessageDelayed(msg, AUTO_CONNECT_DELAY);
@@ -330,6 +327,27 @@
}
}
break;
+ case CONNECT_OTHER_PROFILES:
+ if (isPhoneDocked(mDevice)) {
+ break;
+ }
+ if (message.arg1 == CONNECT_A2DP_OUTGOING) {
+ if (mA2dpService != null &&
+ mA2dpService.getConnectedDevices().size() == 0) {
+ Log.i(TAG, "A2dp:Connect Other Profiles");
+ mA2dpService.connect(mDevice);
+ }
+ } else if (message.arg1 == CONNECT_HFP_OUTGOING) {
+ if (mHeadsetService == null) {
+ deferMessage(message);
+ } else {
+ if (mHeadsetService.getConnectedDevices().size() == 0) {
+ Log.i(TAG, "Headset:Connect Other Profiles");
+ mHeadsetService.connect(mDevice);
+ }
+ }
+ }
+ break;
case TRANSITION_TO_STABLE:
// ignore.
break;
@@ -440,6 +458,7 @@
case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
+ case CONNECT_OTHER_PROFILES:
deferMessage(message);
break;
case TRANSITION_TO_STABLE:
@@ -519,6 +538,7 @@
case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
+ case CONNECT_OTHER_PROFILES:
deferMessage(message);
break;
case TRANSITION_TO_STABLE:
@@ -628,6 +648,7 @@
case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
+ case CONNECT_OTHER_PROFILES:
deferMessage(message);
break;
case TRANSITION_TO_STABLE:
@@ -705,6 +726,7 @@
case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
+ case CONNECT_OTHER_PROFILES:
deferMessage(message);
break;
case TRANSITION_TO_STABLE:
@@ -890,6 +912,7 @@
} else if (mHeadsetState == BluetoothHeadset.STATE_CONNECTING) {
return mHeadsetService.acceptIncomingConnect(mDevice);
} else if (mHeadsetState == BluetoothHeadset.STATE_DISCONNECTED) {
+ handleConnectionOfOtherProfiles(command);
return mHeadsetService.createIncomingConnect(mDevice);
}
break;
@@ -899,6 +922,7 @@
}
break;
case CONNECT_A2DP_INCOMING:
+ handleConnectionOfOtherProfiles(command);
// ignore, Bluez takes care
return true;
case CONNECT_HID_OUTGOING:
@@ -960,6 +984,60 @@
return false;
}
+ private void handleConnectionOfOtherProfiles(int command) {
+ // The white paper recommendations mentions that when there is a
+ // link loss, it is the responsibility of the remote device to connect.
+ // Many connect only 1 profile - and they connect the second profile on
+ // some user action (like play being pressed) and so we need this code.
+ // Auto Connect code only connects to the last connected device - which
+ // is useful in cases like when the phone reboots. But consider the
+ // following case:
+ // User is connected to the car's phone and A2DP profile.
+ // User comes to the desk and places the phone in the dock
+ // (or any speaker or music system or even another headset) and thus
+ // gets connected to the A2DP profile. User goes back to the car.
+ // Ideally the car's system is supposed to send incoming connections
+ // from both Handsfree and A2DP profile. But they don't. The Auto
+ // connect code, will not work here because we only auto connect to the
+ // last connected device for that profile which in this case is the dock.
+ // Now suppose a user is using 2 headsets simultaneously, one for the
+ // phone profile one for the A2DP profile. If this is the use case, we
+ // expect the user to use the preference to turn off the A2DP profile in
+ // the Settings screen for the first headset. Else, after link loss,
+ // there can be an incoming connection from the first headset which
+ // might result in the connection of the A2DP profile (if the second
+ // headset is slower) and thus the A2DP profile on the second headset
+ // will never get connected.
+ //
+ // TODO(): Handle other profiles here.
+ switch (command) {
+ case CONNECT_HFP_INCOMING:
+ // Connect A2DP if there is no incoming connection
+ // If the priority is OFF - don't auto connect.
+ // If the priority is AUTO_CONNECT, auto connect code takes care.
+ if (mA2dpService.getPriority(mDevice) == BluetoothProfile.PRIORITY_ON) {
+ Message msg = new Message();
+ msg.what = CONNECT_OTHER_PROFILES;
+ msg.arg1 = CONNECT_A2DP_OUTGOING;
+ sendMessageDelayed(msg, AUTO_CONNECT_DELAY);
+ }
+ break;
+ case CONNECT_A2DP_INCOMING:
+ // This is again against spec. HFP incoming connections should be made
+ // before A2DP, so we should not hit this case. But many devices
+ // don't follow this.
+ if (mHeadsetService.getPriority(mDevice) == BluetoothProfile.PRIORITY_ON) {
+ Message msg = new Message();
+ msg.what = CONNECT_OTHER_PROFILES;
+ msg.arg1 = CONNECT_HFP_OUTGOING;
+ sendMessageDelayed(msg, AUTO_CONNECT_DELAY);
+ }
+ break;
+ default:
+ break;
+ }
+
+ }
/*package*/ BluetoothDevice getDevice() {
return mDevice;
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index c9115c5..34bd386 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -728,10 +728,16 @@
newDelayInMs = maxSyncRetryTimeInSeconds * 1000;
}
+ final long backoff = now + newDelayInMs;
+
mSyncStorageEngine.setBackoff(op.account, op.authority,
- now + newDelayInMs, newDelayInMs);
+ backoff, newDelayInMs);
+
+ op.backoff = backoff;
+ op.updateEffectiveRunTime();
+
synchronized (mSyncQueue) {
- mSyncQueue.onBackoffChanged(op.account, op.authority, now + newDelayInMs);
+ mSyncQueue.onBackoffChanged(op.account, op.authority, backoff);
}
}
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index 0ec1c74..8eac7aa 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -181,6 +181,13 @@
}
/**
+ * Return the ClassLoader currently associated with this Bundle.
+ */
+ public ClassLoader getClassLoader() {
+ return mClassLoader;
+ }
+
+ /**
* Clones the current Bundle. The internal map is cloned, but the keys and
* values to which it refers are copied by reference.
*/
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 0448ec0..9e6434a 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -5127,6 +5127,47 @@
* <P>Type: TEXT</P>
*/
public static final String NAME = DATA;
+
+ /**
+ * Return the string resource that best describes the given
+ * {@link #TYPE}. Will always return a valid resource.
+ */
+ public static final int getTypeLabelResource(int type) {
+ switch (type) {
+ case TYPE_ASSISTANT: return com.android.internal.R.string.relationTypeAssistant;
+ case TYPE_BROTHER: return com.android.internal.R.string.relationTypeBrother;
+ case TYPE_CHILD: return com.android.internal.R.string.relationTypeChild;
+ case TYPE_DOMESTIC_PARTNER:
+ return com.android.internal.R.string.relationTypeDomesticPartner;
+ case TYPE_FATHER: return com.android.internal.R.string.relationTypeFather;
+ case TYPE_FRIEND: return com.android.internal.R.string.relationTypeFriend;
+ case TYPE_MANAGER: return com.android.internal.R.string.relationTypeManager;
+ case TYPE_MOTHER: return com.android.internal.R.string.relationTypeMother;
+ case TYPE_PARENT: return com.android.internal.R.string.relationTypeParent;
+ case TYPE_PARTNER: return com.android.internal.R.string.relationTypePartner;
+ case TYPE_REFERRED_BY:
+ return com.android.internal.R.string.relationTypeReferredBy;
+ case TYPE_RELATIVE: return com.android.internal.R.string.relationTypeRelative;
+ case TYPE_SISTER: return com.android.internal.R.string.relationTypeSister;
+ case TYPE_SPOUSE: return com.android.internal.R.string.relationTypeSpouse;
+ default: return com.android.internal.R.string.orgTypeCustom;
+ }
+ }
+
+ /**
+ * Return a {@link CharSequence} that best describes the given type,
+ * possibly substituting the given {@link #LABEL} value
+ * for {@link #TYPE_CUSTOM}.
+ */
+ public static final CharSequence getTypeLabel(Resources res, int type,
+ CharSequence label) {
+ if (type == TYPE_CUSTOM && !TextUtils.isEmpty(label)) {
+ return label;
+ } else {
+ final int labelRes = getTypeLabelResource(type);
+ return res.getText(labelRes);
+ }
+ }
}
/**
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 8e355d6..7cb6291 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -33,6 +33,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewRoot;
+import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.os.HandlerCaller;
import com.android.internal.view.IInputConnectionWrapper;
@@ -1411,6 +1412,17 @@
}
}
+ public InputMethodSubtype getCurrentInputMethodSubtype() {
+ synchronized (mH) {
+ try {
+ return mService.getCurrentInputMethodSubtype();
+ } catch (RemoteException e) {
+ Log.w(TAG, "IME died: " + mCurId, e);
+ return null;
+ }
+ }
+ }
+
void doDump(FileDescriptor fd, PrintWriter fout, String[] args) {
final Printer p = new PrintWriterPrinter(fout);
p.println("Input method client state for " + this + ":");
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 68fa5c385..b668340 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -6447,7 +6447,7 @@
mUserScroll = false;
final WebViewCore.DrawData draw = (WebViewCore.DrawData) msg.obj;
setBaseLayer(draw.mBaseLayer, draw.mInvalRegion.getBounds());
- final Point viewSize = draw.mViewPoint;
+ final Point viewSize = draw.mViewSize;
WebViewCore.ViewState viewState = draw.mViewState;
boolean isPictureAfterFirstLayout = viewState != null;
if (isPictureAfterFirstLayout) {
@@ -6470,8 +6470,8 @@
// received in the fixed dimension.
final boolean updateLayout = viewSize.x == mLastWidthSent
&& viewSize.y == mLastHeightSent;
- recordNewContentSize(draw.mWidthHeight.x,
- draw.mWidthHeight.y, updateLayout);
+ recordNewContentSize(draw.mContentSize.x,
+ draw.mContentSize.y, updateLayout);
if (DebugFlags.WEB_VIEW) {
Rect b = draw.mInvalRegion.getBounds();
Log.v(LOGTAG, "NEW_PICTURE_MSG_ID {" +
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index cd6c81e..9a873b6 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1826,12 +1826,13 @@
DrawData() {
mBaseLayer = 0;
mInvalRegion = new Region();
- mWidthHeight = new Point();
+ mContentSize = new Point();
}
int mBaseLayer;
Region mInvalRegion;
- Point mViewPoint;
- Point mWidthHeight;
+ // view size that was used by webkit during the most recent layout
+ Point mViewSize;
+ Point mContentSize;
int mMinPrefWidth;
// only non-null if it is for the first picture set after the first layout
ViewState mViewState;
@@ -1842,16 +1843,14 @@
mDrawIsScheduled = false;
DrawData draw = new DrawData();
if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw start");
- draw.mBaseLayer = nativeRecordContent(draw.mInvalRegion, draw.mWidthHeight);
+ draw.mBaseLayer = nativeRecordContent(draw.mInvalRegion, draw.mContentSize);
if (draw.mBaseLayer == 0) {
if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort");
return;
}
if (mWebView != null) {
- // Send the native view size that was used during the most recent
- // layout.
draw.mFocusSizeChanged = nativeFocusBoundsChanged();
- draw.mViewPoint = new Point(mCurrentViewWidth, mCurrentViewHeight);
+ draw.mViewSize = new Point(mCurrentViewWidth, mCurrentViewHeight);
if (mSettings.getUseWideViewPort()) {
draw.mMinPrefWidth = Math.max(
mViewportWidth == -1 ? WebView.DEFAULT_VIEWPORT_WIDTH
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 91c0fb2..86dfd1f 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -793,9 +793,9 @@
// bound to match the default scale for mobile sites.
setZoomOverviewWidth(Math.min(WebView.sMaxViewportWidth,
Math.max((int) (viewWidth * mInvDefaultScale),
- Math.max(drawData.mMinPrefWidth, drawData.mViewPoint.x))));
+ Math.max(drawData.mMinPrefWidth, drawData.mViewSize.x))));
} else {
- final int contentWidth = drawData.mWidthHeight.x;
+ final int contentWidth = drawData.mContentSize.x;
setZoomOverviewWidth(Math.min(WebView.sMaxViewportWidth, contentWidth));
}
}
@@ -826,16 +826,16 @@
assert mWebView.getSettings() != null;
WebViewCore.ViewState viewState = drawData.mViewState;
- final Point viewSize = drawData.mViewPoint;
+ final Point viewSize = drawData.mViewSize;
updateZoomRange(viewState, viewSize.x, drawData.mMinPrefWidth);
if (mWebView.getSettings().getUseWideViewPort() &&
mWebView.getSettings().getUseFixedViewport()) {
- final int contentWidth = drawData.mWidthHeight.x;
+ final int contentWidth = drawData.mContentSize.x;
setZoomOverviewWidth(Math.min(WebView.sMaxViewportWidth, contentWidth));
}
if (!mWebView.drawHistory()) {
- final float scale;
+ float scale;
final boolean reflowText;
WebSettings settings = mWebView.getSettings();
@@ -847,12 +847,13 @@
scale = viewState.mViewScale;
reflowText = false;
} else {
+ scale = getZoomOverviewScale();
if (settings.getUseWideViewPort()
- && (settings.getLoadWithOverviewMode() || settings.getUseFixedViewport())) {
+ && settings.getLoadWithOverviewMode()) {
mInitialZoomOverview = true;
- scale = (float) mWebView.getViewWidth() / mZoomOverviewWidth;
} else {
- scale = viewState.mTextWrapScale;
+ scale = Math.max(viewState.mTextWrapScale, scale);
+ mInitialZoomOverview = !exceedsMinScaleIncrement(scale, getZoomOverviewScale());
}
reflowText = exceedsMinScaleIncrement(mTextWrapScale, scale);
}
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index bffec1d..49ae2bc7 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -18,6 +18,7 @@
import android.os.ResultReceiver;
import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.EditorInfo;
import com.android.internal.view.InputBindResult;
import com.android.internal.view.IInputContext;
@@ -54,6 +55,7 @@
void hideMySoftInput(in IBinder token, int flags);
void showMySoftInput(in IBinder token, int flags);
void updateStatusIcon(in IBinder token, String packageName, int iconId);
+ InputMethodSubtype getCurrentInputMethodSubtype();
boolean setInputMethodEnabled(String id, boolean enabled);
}
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 061fa4f..1d2ab1e 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1440,6 +1440,37 @@
<!-- Custom organization type -->
<string name="orgTypeCustom">Custom</string>
+ <!-- Custom relationship custom [CHAR LIMIT=20] -->
+ <string name="relationTypeCustom">Custom</string>
+ <!-- Assistant relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeAssistant">Assistant</string>
+ <!-- Brother relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeBrother">Brother</string>
+ <!-- Child relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeChild">Child</string>
+ <!-- Domestic Partner relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeDomesticPartner">Domestic Partner</string>
+ <!-- Father relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeFather">Father</string>
+ <!-- Friend relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeFriend">Friend</string>
+ <!-- Manager relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeManager">Manager</string>
+ <!-- Mother relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeMother">Mother</string>
+ <!-- Parent relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeParent">Parent</string>
+ <!-- Partner relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypePartner">Partner</string>
+ <!-- Referred by relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeReferredBy">Referred by</string>
+ <!-- Relative relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeRelative">Relative</string>
+ <!-- Sister relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeSister">Sister</string>
+ <!-- Spouse relationship type [CHAR LIMIT=20] -->
+ <string name="relationTypeSpouse">Spouse</string>
+
<!-- Custom SIP address type -->
<string name="sipAddressTypeCustom">Custom</string>
<!-- Home SIP address type -->
diff --git a/graphics/java/android/renderscript/FileA3D.java b/graphics/java/android/renderscript/FileA3D.java
index 7548878..fc74fc4 100644
--- a/graphics/java/android/renderscript/FileA3D.java
+++ b/graphics/java/android/renderscript/FileA3D.java
@@ -141,9 +141,11 @@
}
IndexEntry[] mFileEntries;
+ InputStream mInputStream;
- FileA3D(int id, RenderScript rs) {
+ FileA3D(int id, RenderScript rs, InputStream stream) {
super(id, rs);
+ mInputStream = stream;
}
private void initEntries() {
@@ -193,20 +195,12 @@
if(fileId == 0) {
throw new IllegalStateException("Load failed.");
}
- FileA3D fa3d = new FileA3D(fileId, rs);
+ FileA3D fa3d = new FileA3D(fileId, rs, is);
fa3d.initEntries();
return fa3d;
} catch (Exception e) {
// Ignore
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- // Ignore
- }
- }
}
return null;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index dd108c0..b0faacc 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -104,7 +104,10 @@
{
LOG_API("nGetName, con(%p), obj(%p)", con, (void *)obj);
const char *name = NULL;
- rsGetName(con, (void *)obj, &name);
+ rsaGetName(con, (void *)obj, &name);
+ if(name == NULL || strlen(name) == 0) {
+ return NULL;
+ }
return _env->NewStringUTF(name);
}
@@ -306,7 +309,7 @@
assert(dataSize == 5);
uint32_t elementData[5];
- rsElementGetNativeData(con, (RsElement)id, elementData, dataSize);
+ rsaElementGetNativeData(con, (RsElement)id, elementData, dataSize);
for(jint i = 0; i < dataSize; i ++) {
_env->SetIntArrayRegion(_elementData, i, 1, (const jint*)&elementData[i]);
@@ -323,7 +326,7 @@
uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
- rsElementGetSubElements(con, (RsElement)id, ids, names, (uint32_t)dataSize);
+ rsaElementGetSubElements(con, (RsElement)id, ids, names, (uint32_t)dataSize);
for(jint i = 0; i < dataSize; i++) {
_env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
@@ -364,7 +367,7 @@
LOG_API("nTypeCreate, con(%p)", con);
uint32_t typeData[6];
- rsTypeGetNativeData(con, (RsType)id, typeData, 6);
+ rsaTypeGetNativeData(con, (RsType)id, typeData, 6);
for(jint i = 0; i < elementCount; i ++) {
_env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]);
@@ -590,7 +593,7 @@
nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a)
{
LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a);
- return (jint) rsAllocationGetType(con, (RsAllocation)a);
+ return (jint) rsaAllocationGetType(con, (RsAllocation)a);
}
static void
@@ -616,7 +619,7 @@
Asset* asset = reinterpret_cast<Asset*>(native_asset);
- jint id = (jint)rsFileA3DCreateFromAssetStream(con, asset->getBuffer(false), asset->getLength());
+ jint id = (jint)rsaFileA3DCreateFromAssetStream(con, asset->getBuffer(false), asset->getLength());
return id;
}
@@ -624,7 +627,7 @@
nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D)
{
int32_t numEntries = 0;
- rsFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
+ rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
return numEntries;
}
@@ -634,7 +637,7 @@
LOGV("______nFileA3D %u", (uint32_t) fileA3D);
RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
- rsFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
+ rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
for(jint i = 0; i < numEntries; i ++) {
_env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
@@ -648,7 +651,7 @@
nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
{
LOGV("______nFileA3D %u", (uint32_t) fileA3D);
- jint id = (jint)rsFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
+ jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
return id;
}
@@ -1166,7 +1169,7 @@
{
LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
jint vtxCount = 0;
- rsMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount);
+ rsaMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount);
return vtxCount;
}
@@ -1175,7 +1178,7 @@
{
LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
jint idxCount = 0;
- rsMeshGetIndexCount(con, (RsMesh)mesh, &idxCount);
+ rsaMeshGetIndexCount(con, (RsMesh)mesh, &idxCount);
return idxCount;
}
@@ -1185,7 +1188,7 @@
LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
- rsMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
+ rsaMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
for(jint i = 0; i < numVtxIDs; i ++) {
_env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]);
@@ -1202,7 +1205,7 @@
RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
- rsMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
+ rsaMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
for(jint i = 0; i < numIndices; i ++) {
_env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]);
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 1d67329..8c2081d 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -286,6 +286,25 @@
} RsScriptCall;
+// A3D loading and object update code.
+// Should only be called at object creation, not thread safe
+RsObjectBase rsaFileA3DGetEntryByIndex(RsContext, uint32_t idx, RsFile);
+RsFile rsaFileA3DCreateFromAssetStream(RsContext, const void *data, uint32_t len);
+void rsaFileA3DGetNumIndexEntries(RsContext, int32_t *numEntries, RsFile);
+void rsaFileA3DGetIndexEntries(RsContext, RsFileIndexEntry *fileEntries,uint32_t numEntries, RsFile);
+void rsaGetName(RsContext, void * obj, const char **name);
+// Mesh update functions
+void rsaMeshGetVertexBufferCount(RsContext, RsMesh, int32_t *vtxCount);
+void rsaMeshGetIndexCount(RsContext, RsMesh, int32_t *idxCount);
+void rsaMeshGetVertices(RsContext, RsMesh, RsAllocation *vtxData, uint32_t vtxDataCount);
+void rsaMeshGetIndices(RsContext, RsMesh, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount);
+// Allocation update
+const void* rsaAllocationGetType(RsContext con, RsAllocation va);
+// Type update
+void rsaTypeGetNativeData(RsContext, RsType, uint32_t *typeData, uint32_t typeDataSize);
+// Element update
+void rsaElementGetNativeData(RsContext, RsElement, uint32_t *elemData, uint32_t elemDataSize);
+void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char **names, uint32_t dataSize);
// Async commands for returning new IDS
RsType rsaTypeCreate(RsContext, RsElement, uint32_t dimCount,
@@ -293,7 +312,6 @@
RsAllocation rsaAllocationCreateTyped(RsContext rsc, RsType vtype);
RsAllocation rsaAllocationCreateFromBitmap(RsContext con, uint32_t w, uint32_t h, RsElement _dst, RsElement _src, bool genMips, const void *data);
-
#ifndef NO_RS_FUNCS
#include "rsgApiFuncDecl.h"
#endif
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 3e131b2..14809e9 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -58,11 +58,6 @@
param size_t len
}
-GetName {
- param void *obj
- param const char **name
- }
-
ObjDestroy {
param RsAsyncVoidPtr objPtr
}
@@ -84,26 +79,6 @@
ret RsElement
}
-ElementGetNativeData {
- param RsElement elem
- param uint32_t *elemData
- param uint32_t elemDataSize
- }
-
-ElementGetSubElements {
- param RsElement elem
- param uint32_t *ids
- param const char **names
- param uint32_t dataSize
- }
-
-
-TypeGetNativeData {
- param RsType type
- param uint32_t * typeData
- param uint32_t typeDataSize
- }
-
AllocationUpdateFromBitmap {
param RsAllocation alloc
param RsElement srcFmt
@@ -237,11 +212,6 @@
param const void *data
}
-AllocationGetType {
- param RsAllocation va
- ret const void*
- }
-
AllocationResize1D {
param RsAllocation va
param uint32_t dimX
@@ -433,35 +403,12 @@
ret RsProgramVertex
}
-FileA3DCreateFromAssetStream {
- param const void * data
- param size_t len
- ret RsFile
- }
-
FileOpen {
ret RsFile
param const char *name
param size_t len
}
-FileA3DGetNumIndexEntries {
- param int32_t * numEntries
- param RsFile file
- }
-
-FileA3DGetIndexEntries {
- param RsFileIndexEntry * fileEntries
- param uint32_t numEntries
- param RsFile fileA3D
- }
-
-FileA3DGetEntryByIndex {
- param uint32_t index
- param RsFile file
- ret RsObjectBase
- }
-
FontCreateFromFile {
param const char *name
param uint32_t fontSize
@@ -488,29 +435,6 @@
param uint32_t slot
}
-MeshGetVertexBufferCount {
- param RsMesh mesh
- param int32_t *numVtx
- }
-
-MeshGetIndexCount {
- param RsMesh mesh
- param int32_t *numIdx
- }
-
-MeshGetVertices {
- param RsMesh mv
- param RsAllocation *vtxData
- param uint32_t vtxDataCount
- }
-
-MeshGetIndices {
- param RsMesh mv
- param RsAllocation *va
- param uint32_t *primType
- param uint32_t idxDataCount
- }
-
AnimationCreate {
param const float *inValues
param const float *outValues
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index b4872e3..b74fa8e 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -816,7 +816,12 @@
a->resize2D(rsc, dimX, dimY);
}
-const void* rsi_AllocationGetType(Context *rsc, RsAllocation va)
+#endif //ANDROID_RS_BUILD_FOR_HOST
+
+}
+}
+
+const void * rsaAllocationGetType(RsContext con, RsAllocation va)
{
Allocation *a = static_cast<Allocation *>(va);
a->getType()->incUserRef();
@@ -824,11 +829,6 @@
return a->getType();
}
-#endif //ANDROID_RS_BUILD_FOR_HOST
-
-}
-}
-
RsAllocation rsaAllocationCreateTyped(RsContext con, RsType vtype)
{
Context *rsc = static_cast<Context *>(con);
@@ -873,4 +873,3 @@
return texAlloc;
}
-
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 944cd86..3f04585 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -222,6 +222,7 @@
glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &mGL.mMaxFragmentUniformVectors);
mGL.OES_texture_npot = NULL != strstr((const char *)mGL.mExtensions, "GL_OES_texture_npot");
+ mGL.GL_NV_texture_npot_2D_mipmap = NULL != strstr((const char *)mGL.mExtensions, "GL_NV_texture_npot_2D_mipmap");
mGL.EXT_texture_max_aniso = 1.0f;
bool hasAniso = NULL != strstr((const char *)mGL.mExtensions, "GL_EXT_texture_filter_anisotropic");
if(hasAniso) {
@@ -970,12 +971,6 @@
rsc->assignName(ob, name, len);
}
-void rsi_GetName(Context *rsc, void * obj, const char **name)
-{
- ObjectBase *ob = static_cast<ObjectBase *>(obj);
- (*name) = ob->getName();
-}
-
void rsi_ObjDestroy(Context *rsc, void *optr)
{
ObjectBase *ob = static_cast<ObjectBase *>(optr);
@@ -1062,3 +1057,10 @@
rsc->deinitToClient();
}
+// Only to be called at a3d load time, before object is visible to user
+// not thread safe
+void rsaGetName(RsContext con, void * obj, const char **name)
+{
+ ObjectBase *ob = static_cast<ObjectBase *>(obj);
+ (*name) = ob->getName();
+}
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index dbe2c79..e269d4e 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -190,6 +190,7 @@
mutable const ObjectBase * mObjHead;
bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;}
+ bool ext_GL_NV_texture_npot_2D_mipmap() const {return mGL.GL_NV_texture_npot_2D_mipmap;}
float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; }
uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;}
uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;}
@@ -232,6 +233,7 @@
int32_t mMaxVertexTextureUnits;
bool OES_texture_npot;
+ bool GL_NV_texture_npot_2D_mipmap;
float EXT_texture_max_aniso;
} mGL;
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 096115c..d207dcf 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -379,7 +379,10 @@
return (RsElement)e;
}
-void rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
+}
+}
+
+void rsaElementGetNativeData(RsContext con, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
{
rsAssert(elemDataSize == 5);
// we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
@@ -393,7 +396,7 @@
}
-void rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
+void rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
{
Element *e = static_cast<Element *>(elem);
rsAssert(e->getFieldCount() == dataSize);
@@ -405,7 +408,3 @@
}
}
-
-
-}
-}
diff --git a/libs/rs/rsFileA3D.cpp b/libs/rs/rsFileA3D.cpp
index c90edc2..e4c6dbd 100644
--- a/libs/rs/rsFileA3D.cpp
+++ b/libs/rs/rsFileA3D.cpp
@@ -115,19 +115,10 @@
return false;
}
- uint8_t *headerData = (uint8_t *)malloc(headerSize);
- if(!headerData) {
- return false;
- }
-
- memcpy(headerData, localData, headerSize);
-
// Now open the stream to parse the header
- IStream headerStream(headerData, false);
+ IStream headerStream(localData, false);
parseHeader(&headerStream);
- free(headerData);
-
localData += headerSize;
lengthRemaining -= headerSize;
@@ -145,13 +136,7 @@
}
// We should know enough to read the file in at this point.
- mAlloc = malloc(mDataSize);
- if (!mAlloc) {
- return false;
- }
- mData = (uint8_t *)mAlloc;
- memcpy(mAlloc, localData, mDataSize);
-
+ mData = (uint8_t *)localData;
mReadStream = new IStream(mData, mUse64BitOffsets);
return true;
@@ -383,7 +368,41 @@
namespace android {
namespace renderscript {
-void rsi_FileA3DGetNumIndexEntries(Context *rsc, int32_t *numEntries, RsFile file)
+RsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len)
+{
+ FileA3D *fa3d = new FileA3D(rsc);
+
+ FILE *f = fopen("/sdcard/test.a3d", "rb");
+ if (f) {
+ fa3d->load(f);
+ fclose(f);
+ fa3d->incUserRef();
+ return fa3d;
+ }
+ delete fa3d;
+ return NULL;
+}
+
+
+}
+}
+
+RsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file)
+{
+ FileA3D *fa3d = static_cast<FileA3D *>(file);
+ if(!fa3d) {
+ LOGE("Can't load entry. No valid file");
+ return NULL;
+ }
+
+ ObjectBase *obj = fa3d->initializeFromEntry(index);
+ LOGV("Returning object with name %s", obj->getName());
+
+ return obj;
+}
+
+
+void rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file)
{
FileA3D *fa3d = static_cast<FileA3D *>(file);
@@ -395,7 +414,7 @@
}
}
-void rsi_FileA3DGetIndexEntries(Context *rsc, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file)
+void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file)
{
FileA3D *fa3d = static_cast<FileA3D *>(file);
@@ -418,51 +437,17 @@
}
-RsObjectBase rsi_FileA3DGetEntryByIndex(Context *rsc, uint32_t index, RsFile file)
-{
- FileA3D *fa3d = static_cast<FileA3D *>(file);
- if(!fa3d) {
- LOGE("Can't load entry. No valid file");
- return NULL;
- }
-
- ObjectBase *obj = fa3d->initializeFromEntry(index);
- LOGV("Returning object with name %s", obj->getName());
-
- return obj;
-}
-
-RsFile rsi_FileA3DCreateFromAssetStream(Context *rsc, const void *data, uint32_t len)
+RsFile rsaFileA3DCreateFromAssetStream(RsContext con, const void *data, uint32_t len)
{
if (data == NULL) {
LOGE("File load failed. Asset stream is NULL");
return NULL;
}
+ Context *rsc = static_cast<Context *>(con);
FileA3D *fa3d = new FileA3D(rsc);
-
- fa3d->load(data, len);
fa3d->incUserRef();
+ fa3d->load(data, len);
return fa3d;
}
-
-
-RsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len)
-{
- FileA3D *fa3d = new FileA3D(rsc);
-
- FILE *f = fopen("/sdcard/test.a3d", "rb");
- if (f) {
- fa3d->load(f);
- fclose(f);
- fa3d->incUserRef();
- return fa3d;
- }
- delete fa3d;
- return NULL;
-}
-
-
-}
-}
diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp
index 761be93..fd604e5 100644
--- a/libs/rs/rsMesh.cpp
+++ b/libs/rs/rsMesh.cpp
@@ -310,19 +310,21 @@
sm->updateGLPrimitives();
}
-void rsi_MeshGetVertexBufferCount(Context *rsc, RsMesh mv, int32_t *numVtx)
+}}
+
+void rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx)
{
Mesh *sm = static_cast<Mesh *>(mv);
*numVtx = sm->mVertexBufferCount;
}
-void rsi_MeshGetIndexCount(Context *rsc, RsMesh mv, int32_t *numIdx)
+void rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx)
{
Mesh *sm = static_cast<Mesh *>(mv);
*numIdx = sm->mPrimitivesCount;
}
-void rsi_MeshGetVertices(Context *rsc, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount)
+void rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount)
{
Mesh *sm = static_cast<Mesh *>(mv);
rsAssert(vtxDataCount == sm->mVertexBufferCount);
@@ -333,7 +335,7 @@
}
}
-void rsi_MeshGetIndices(Context *rsc, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount)
+void rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount)
{
Mesh *sm = static_cast<Mesh *>(mv);
rsAssert(idxDataCount == sm->mPrimitivesCount);
@@ -347,8 +349,3 @@
}
}
-
-
-
-
-}}
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index cfae7b2..cbdc407 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -76,7 +76,11 @@
};
if (!rsc->ext_OES_texture_npot() && tex->getType()->getIsNp2()) {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
+ if (tex->getHasGraphicsMipmaps() && rsc->ext_GL_NV_texture_npot_2D_mipmap()) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
+ }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, transNP[mMagFilter]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, transNP[mWrapS]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, transNP[mWrapT]);
diff --git a/libs/rs/rsScriptC_LibCL.cpp b/libs/rs/rsScriptC_LibCL.cpp
index ce8e7b2..1b1a752 100644
--- a/libs/rs/rsScriptC_LibCL.cpp
+++ b/libs/rs/rsScriptC_LibCL.cpp
@@ -205,9 +205,9 @@
{ "_Z5asinhf", (void *)&asinhf },
{ "_Z6asinpif", (void *)&SC_asinpi },
{ "_Z4atanf", (void *)&atanf },
- { "_Z5atan2f", (void *)&atan2f },
+ { "_Z5atan2ff", (void *)&atan2f },
{ "_Z6atanpif", (void *)&SC_atanpi },
- { "_Z7atan2pif", (void *)&SC_atan2pi },
+ { "_Z7atan2piff", (void *)&SC_atan2pi },
{ "_Z4cbrtf", (void *)&cbrtf },
{ "_Z4ceilf", (void *)&ceilf },
{ "_Z8copysignff", (void *)©signf },
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index 7ef2464..caaa9f5 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -374,23 +374,6 @@
namespace android {
namespace renderscript {
-void rsi_TypeGetNativeData(Context *rsc, RsType type, uint32_t *typeData, uint32_t typeDataSize)
-{
- rsAssert(typeDataSize == 6);
- // Pack the data in the follofing way mDimX; mDimY; mDimZ;
- // mDimLOD; mDimFaces; mElement; into typeData
- Type *t = static_cast<Type *>(type);
-
- (*typeData++) = t->getDimX();
- (*typeData++) = t->getDimY();
- (*typeData++) = t->getDimZ();
- (*typeData++) = t->getDimLOD();
- (*typeData++) = t->getDimFaces() ? 1 : 0;
- (*typeData++) = (uint32_t)t->getElement();
- t->getElement()->incUserRef();
-}
-
-
}
}
@@ -424,3 +407,18 @@
return Type::getType(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
}
+void rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize)
+{
+ rsAssert(typeDataSize == 6);
+ // Pack the data in the follofing way mDimX; mDimY; mDimZ;
+ // mDimLOD; mDimFaces; mElement; into typeData
+ Type *t = static_cast<Type *>(type);
+
+ (*typeData++) = t->getDimX();
+ (*typeData++) = t->getDimY();
+ (*typeData++) = t->getDimZ();
+ (*typeData++) = t->getDimLOD();
+ (*typeData++) = t->getDimFaces() ? 1 : 0;
+ (*typeData++) = (uint32_t)t->getElement();
+ t->getElement()->incUserRef();
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
index ba682b7..56b4f24 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
@@ -17,25 +17,38 @@
package com.android.systemui.statusbar.tablet;
import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.util.Log;
import android.util.Slog;
-import android.view.View;
import android.util.AttributeSet;
-import android.widget.ImageView;
+import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.View;
+import android.widget.ImageView;
import com.android.server.InputMethodManagerService;
+import com.android.systemui.R;
+
+import java.util.List;
public class InputMethodButton extends ImageView {
+ private static final String TAG = "StatusBar/InputMethodButton";
+
+ private boolean mKeyboardShown;
+ private ImageView mIcon;
// other services we wish to talk to
- InputMethodManager mImm;
+ private InputMethodManager mImm;
public InputMethodButton(Context context, AttributeSet attrs) {
super(context, attrs);
+ mKeyboardShown = false;
// IME hookup
mImm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-
// TODO: read the current icon & visibility state directly from the service
// TODO: register for notifications about changes to visibility & subtype from service
@@ -47,5 +60,80 @@
}
});
}
-}
+ protected void onAttachedToWindow() {
+ mIcon = (ImageView) findViewById(R.id.imeButton);
+ refreshStatusIcon(mKeyboardShown);
+ }
+
+ private InputMethodInfo getCurrentInputMethodInfo() {
+ String curInputMethodId = Settings.Secure.getString(getContext()
+ .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
+ List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
+ if (curInputMethodId != null) {
+ for (InputMethodInfo imi: imis) {
+ if (imi.getId().equals(curInputMethodId)) {
+ return imi;
+ }
+ }
+ }
+ return null;
+ }
+
+ private Drawable getCurrentSubtypeIcon() {
+ final PackageManager pm = getContext().getPackageManager();
+ InputMethodInfo imi = getCurrentInputMethodInfo();
+ InputMethodSubtype subtype = mImm.getCurrentInputMethodSubtype();
+ Drawable icon = null;
+ if (imi != null) {
+ if (subtype != null) {
+ return pm.getDrawable(imi.getPackageName(), subtype.getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else if (imi.getSubtypes().size() > 0) {
+ return pm.getDrawable(imi.getPackageName(),
+ imi.getSubtypes().get(0).getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else {
+ try {
+ return pm.getApplicationInfo(imi.getPackageName(), 0).loadIcon(pm);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "Current IME cann't be found: " + imi.getPackageName());
+ }
+ }
+ }
+ return null;
+ }
+
+ private void refreshStatusIcon(boolean keyboardShown) {
+ if (!keyboardShown) {
+ setVisibility(View.INVISIBLE);
+ return;
+ } else {
+ setVisibility(View.VISIBLE);
+ }
+ Drawable icon = getCurrentSubtypeIcon();
+ if (icon == null) {
+ mIcon.setImageResource(R.drawable.ic_sysbar_ime_default);
+ } else {
+ mIcon.setImageDrawable(icon);
+ }
+ }
+
+ private void postRefreshStatusIcon() {
+ getHandler().post(new Runnable() {
+ public void run() {
+ refreshStatusIcon(mKeyboardShown);
+ }
+ });
+ }
+
+ public void showSoftInput() {
+ mKeyboardShown = true;
+ postRefreshStatusIcon();
+ }
+
+ public void hideSoftInput() {
+ mKeyboardShown = false;
+ postRefreshStatusIcon();
+ }
+}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b4c696b..cd1ad4c 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -256,8 +256,10 @@
}
};
- // The current size of the screen.
- int mW, mH;
+ // The current size of the screen; these may be different than (0,0)-(dw,dh)
+ // if the status bar can't be hidden; in that case it effectively carves out
+ // that area of the display from all other windows.
+ int mScreenLeft, mScreenTop, mScreenWidth, mScreenHeight;
// During layout, the current screen borders with all outer decoration
// (status bar, input method dock) accounted for.
int mCurLeft, mCurTop, mCurRight, mCurBottom;
@@ -1316,10 +1318,11 @@
public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset) {
final int fl = attrs.flags;
- if (mStatusBarCanHide && (fl &
- (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
+ if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
- contentInset.set(mCurLeft, mCurTop, mW - mCurRight, mH - mCurBottom);
+ contentInset.set(mCurLeft, mCurTop,
+ (mScreenLeft+mScreenWidth) - mCurRight,
+ (mScreenTop+mScreenHeight) - mCurBottom);
} else {
contentInset.setEmpty();
}
@@ -1327,8 +1330,9 @@
/** {@inheritDoc} */
public void beginLayoutLw(int displayWidth, int displayHeight) {
- mW = displayWidth;
- mH = displayHeight;
+ mScreenLeft = mScreenTop = 0;
+ mScreenWidth = displayWidth;
+ mScreenHeight = displayHeight;
mDockLeft = mContentLeft = mCurLeft = 0;
mDockTop = mContentTop = mCurTop = 0;
mDockRight = mContentRight = mCurRight = displayWidth;
@@ -1350,16 +1354,34 @@
// If the status bar is hidden, we don't want to cause
// windows behind it to scroll.
final Rect r = mStatusBar.getFrameLw();
- if (mDockTop == r.top) mDockTop = r.bottom;
- else if (mDockBottom == r.bottom) mDockBottom = r.top;
- mContentTop = mCurTop = mDockTop;
- mContentBottom = mCurBottom = mDockBottom;
- if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mDockTop=" + mDockTop
- + " mContentTop=" + mContentTop
- + " mCurTop=" + mCurTop
- + " mDockBottom=" + mDockBottom
- + " mContentBottom=" + mContentBottom
- + " mCurBottom=" + mCurBottom);
+ if (mStatusBarCanHide) {
+ // Status bar may go away, so the screen area it occupies
+ // is available to apps but just covering them when the
+ // status bar is visible.
+ if (mDockTop == r.top) mDockTop = r.bottom;
+ else if (mDockBottom == r.bottom) mDockBottom = r.top;
+ mContentTop = mCurTop = mDockTop;
+ mContentBottom = mCurBottom = mDockBottom;
+ if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mDockTop=" + mDockTop
+ + " mContentTop=" + mContentTop
+ + " mCurTop=" + mCurTop
+ + " mDockBottom=" + mDockBottom
+ + " mContentBottom=" + mContentBottom
+ + " mCurBottom=" + mCurBottom);
+ } else {
+ // Status bar can't go away; the part of the screen it
+ // covers does not exist for anything behind it.
+ if (mScreenTop == r.top) {
+ mScreenTop = r.bottom;
+ mScreenHeight -= (r.bottom-r.top);
+ } else if ((mScreenHeight-mScreenTop) == r.bottom) {
+ mScreenHeight -= (r.bottom-r.top);
+ }
+ mContentTop = mCurTop = mDockTop = mScreenTop;
+ mContentBottom = mCurBottom = mDockBottom = mScreenTop+mScreenHeight;
+ if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mScreenTop=" + mScreenTop
+ + " mScreenHeight=" + mScreenHeight);
+ }
}
}
}
@@ -1444,8 +1466,7 @@
attrs.gravity = Gravity.BOTTOM;
mDockLayer = win.getSurfaceLayer();
} else {
- if (mStatusBarCanHide && (fl &
- (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
+ if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
// This is the case for a normal activity window: we want it
// to cover all of the screen space, and it can take care of
@@ -1456,10 +1477,10 @@
// frame is the same as the one we are attached to.
setAttachedWindowFrames(win, fl, sim, attached, true, pf, df, cf, vf);
} else {
- pf.left = df.left = 0;
- pf.top = df.top = 0;
- pf.right = df.right = mW;
- pf.bottom = df.bottom = mH;
+ pf.left = df.left = mScreenLeft;
+ pf.top = df.top = mScreenTop;
+ pf.right = df.right = mScreenLeft+mScreenWidth;
+ pf.bottom = df.bottom = mScreenTop+mScreenHeight;
if ((sim & SOFT_INPUT_MASK_ADJUST) != SOFT_INPUT_ADJUST_RESIZE) {
cf.left = mDockLeft;
cf.top = mDockTop;
@@ -1476,13 +1497,13 @@
vf.right = mCurRight;
vf.bottom = mCurBottom;
}
- } else if (mStatusBarCanHide && (fl & FLAG_LAYOUT_IN_SCREEN) != 0) {
+ } else if ((fl & FLAG_LAYOUT_IN_SCREEN) != 0) {
// A window that has requested to fill the entire screen just
// gets everything, period.
- pf.left = df.left = cf.left = 0;
- pf.top = df.top = cf.top = 0;
- pf.right = df.right = cf.right = mW;
- pf.bottom = df.bottom = cf.bottom = mH;
+ pf.left = df.left = cf.left = mScreenLeft;
+ pf.top = df.top = cf.top = mScreenTop;
+ pf.right = df.right = cf.right = mScreenLeft+mScreenWidth;
+ pf.bottom = df.bottom = cf.bottom = mScreenTop+mScreenHeight;
vf.left = mCurLeft;
vf.top = mCurTop;
vf.right = mCurRight;
@@ -1743,9 +1764,9 @@
rect.union(w.getShownFrameLw());
}
}
- final int insetw = mW/10;
- final int inseth = mH/10;
- if (rect.contains(insetw, inseth, mW-insetw, mH-inseth)) {
+ final int insetw = mScreenWidth/10;
+ final int inseth = mScreenHeight/10;
+ if (rect.contains(insetw, inseth, mScreenWidth-insetw, mScreenHeight-inseth)) {
// All of the status bar windows put together cover the
// screen, so the app can't be seen. (Note this test doesn't
// work if the rects of these windows are at off offsets or
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 30e90a8..5cf013f 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -219,6 +219,8 @@
private float mLightSensorValue = -1;
private boolean mProxIgnoredBecauseScreenTurnedOff = false;
private int mHighestLightSensorValue = -1;
+ private boolean mLightSensorPendingDecrease = false;
+ private boolean mLightSensorPendingIncrease = false;
private float mLightSensorPendingValue = -1;
private int mLightSensorScreenBrightness = -1;
private int mLightSensorButtonBrightness = -1;
@@ -1141,6 +1143,8 @@
pw.println(" mLightSensorEnabled=" + mLightSensorEnabled);
pw.println(" mLightSensorValue=" + mLightSensorValue
+ " mLightSensorPendingValue=" + mLightSensorPendingValue);
+ pw.println(" mLightSensorPendingDecrease=" + mLightSensorPendingDecrease
+ + " mLightSensorPendingIncrease=" + mLightSensorPendingIncrease);
pw.println(" mLightSensorScreenBrightness=" + mLightSensorScreenBrightness
+ " mLightSensorButtonBrightness=" + mLightSensorButtonBrightness
+ " mLightSensorKeyboardBrightness=" + mLightSensorKeyboardBrightness);
@@ -1742,6 +1746,8 @@
} else {
// cancel light sensor task
mHandler.removeCallbacks(mAutoBrightnessTask);
+ mLightSensorPendingDecrease = false;
+ mLightSensorPendingIncrease = false;
mScreenOffTime = SystemClock.elapsedRealtime();
long identity = Binder.clearCallingIdentity();
try {
@@ -2325,9 +2331,10 @@
private Runnable mAutoBrightnessTask = new Runnable() {
public void run() {
synchronized (mLocks) {
- int value = (int)mLightSensorPendingValue;
- if (value >= 0) {
- mLightSensorPendingValue = -1;
+ if (mLightSensorPendingDecrease || mLightSensorPendingIncrease) {
+ int value = (int)mLightSensorPendingValue;
+ mLightSensorPendingDecrease = false;
+ mLightSensorPendingIncrease = false;
lightSensorChangedLocked(value);
}
}
@@ -2981,19 +2988,29 @@
if (mDebugLightSensor) {
Slog.d(TAG, "onSensorChanged: light value: " + value);
}
- mHandler.removeCallbacks(mAutoBrightnessTask);
- if (mLightSensorValue != value) {
- if (mLightSensorValue == -1 ||
- milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) {
- // process the value immediately if screen has just turned on
- lightSensorChangedLocked(value);
- } else {
- // delay processing to debounce the sensor
- mLightSensorPendingValue = value;
- mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);
- }
+ if (mLightSensorValue == -1 ||
+ milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) {
+ // process the value immediately if screen has just turned on
+ mHandler.removeCallbacks(mAutoBrightnessTask);
+ mLightSensorPendingDecrease = false;
+ mLightSensorPendingIncrease = false;
+ lightSensorChangedLocked(value);
} else {
- mLightSensorPendingValue = -1;
+ if ((value > mLightSensorValue && mLightSensorPendingDecrease) ||
+ (value < mLightSensorValue && mLightSensorPendingIncrease) ||
+ (value == mLightSensorValue) ||
+ (!mLightSensorPendingDecrease && !mLightSensorPendingIncrease)) {
+ // delay processing to debounce the sensor
+ mHandler.removeCallbacks(mAutoBrightnessTask);
+ mLightSensorPendingDecrease = (value < mLightSensorValue);
+ mLightSensorPendingIncrease = (value > mLightSensorValue);
+ if (mLightSensorPendingDecrease || mLightSensorPendingIncrease) {
+ mLightSensorPendingValue = value;
+ mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);
+ }
+ } else {
+ mLightSensorPendingValue = value;
+ }
}
}
}
diff --git a/services/jni/com_android_server_location_GpsLocationProvider.cpp b/services/jni/com_android_server_location_GpsLocationProvider.cpp
index f5e17f5..a75e41d 100755
--- a/services/jni/com_android_server_location_GpsLocationProvider.cpp
+++ b/services/jni/com_android_server_location_GpsLocationProvider.cpp
@@ -199,8 +199,6 @@
static void agps_request_set_id(uint32_t flags)
{
- LOGD("agps_request_set_id: flags (%d)", flags);
-
JNIEnv* env = AndroidRuntime::getJNIEnv();
env->CallVoidMethod(mCallbacksObj, method_requestSetID, flags);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
@@ -208,8 +206,6 @@
static void agps_request_ref_location(uint32_t flags)
{
- LOGD("agps_ref_location: flags (%d)", flags);
-
JNIEnv* env = AndroidRuntime::getJNIEnv();
env->CallVoidMethod(mCallbacksObj, method_requestRefLocation, flags);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index 8ab5a10..df6aa51 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -424,6 +424,20 @@
cb = (texture.NPOTAdjust ? texture.hScale : 1.0f);
}
+ /*
+ * For the buffer transformation, we apply the rotation last.
+ * Since we're transforming the texture-coordinates, we need
+ * to apply the inverse of the buffer transformation:
+ * inverse( FLIP_V -> FLIP_H -> ROT_90 )
+ * <=> inverse( ROT_90 * FLIP_H * FLIP_V )
+ * = inverse(FLIP_V) * inverse(FLIP_H) * inverse(ROT_90)
+ * = FLIP_V * FLIP_H * ROT_270
+ * <=> ROT_270 -> FLIP_H -> FLIP_V
+ *
+ * The rotation is performed first, in the texture coordinate space.
+ *
+ */
+
struct TexCoords {
GLfloat u;
GLfloat v;
diff --git a/services/surfaceflinger/LayerBuffer.cpp b/services/surfaceflinger/LayerBuffer.cpp
index b7f9481..23506cf 100644
--- a/services/surfaceflinger/LayerBuffer.cpp
+++ b/services/surfaceflinger/LayerBuffer.cpp
@@ -676,8 +676,8 @@
overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h);
// we need to combine the layer orientation and the
// user-requested orientation.
- Transform finalTransform = Transform(mOrientation) *
- Transform(mLayer.getOrientation());
+ Transform finalTransform(Transform(mLayer.getOrientation()) *
+ Transform(mOrientation));
overlay_dev->setParameter(overlay_dev, mOverlay,
OVERLAY_TRANSFORM, finalTransform.getOrientation());
overlay_dev->commit(overlay_dev, mOverlay);
diff --git a/services/surfaceflinger/Transform.cpp b/services/surfaceflinger/Transform.cpp
index f128429..0467a14 100644
--- a/services/surfaceflinger/Transform.cpp
+++ b/services/surfaceflinger/Transform.cpp
@@ -28,26 +28,40 @@
// ---------------------------------------------------------------------------
-template <typename T> inline T min(T a, T b) {
+template <typename T>
+static inline T min(T a, T b) {
return a<b ? a : b;
}
-template <typename T> inline T min(T a, T b, T c) {
+template <typename T>
+static inline T min(T a, T b, T c) {
return min(a, min(b, c));
}
-template <typename T> inline T min(T a, T b, T c, T d) {
+template <typename T>
+static inline T min(T a, T b, T c, T d) {
return min(a, b, min(c, d));
}
-template <typename T> inline T max(T a, T b) {
+template <typename T>
+static inline T max(T a, T b) {
return a>b ? a : b;
}
-template <typename T> inline T max(T a, T b, T c) {
+template <typename T>
+static inline T max(T a, T b, T c) {
return max(a, max(b, c));
}
-template <typename T> inline T max(T a, T b, T c, T d) {
+template <typename T>
+static inline T max(T a, T b, T c, T d) {
return max(a, b, max(c, d));
}
+template <typename T>
+static inline
+void swap(T& a, T& b) {
+ T t(a);
+ a = b;
+ b = t;
+}
+
// ---------------------------------------------------------------------------
Transform::Transform() {
@@ -160,6 +174,11 @@
}
Transform H, V, R;
+ if (flags & ROT_90) {
+ // w & h are inverted when rotating by 90 degrees
+ swap(w, h);
+ }
+
if (flags & FLIP_H) {
H.mType = (FLIP_H << 8) | SCALE;
H.mType |= isZero(w) ? IDENTITY : TRANSLATE;
@@ -177,14 +196,15 @@
}
if (flags & ROT_90) {
+ const float original_w = h;
R.mType = (ROT_90 << 8) | ROTATE;
- R.mType |= isZero(w) ? IDENTITY : TRANSLATE;
+ R.mType |= isZero(original_w) ? IDENTITY : TRANSLATE;
mat33& M(R.mMatrix);
- M[0][0] = 0; M[1][0] =-1; M[2][0] = w;
+ M[0][0] = 0; M[1][0] =-1; M[2][0] = original_w;
M[0][1] = 1; M[1][1] = 0;
}
- *this = ((H*V)*R);
+ *this = (R*(H*V));
return NO_ERROR;
}
@@ -282,8 +302,8 @@
}
} else if (isZero(a) && isZero(d)) {
flags |= ROT_90;
- if (b>0) flags |= FLIP_H;
- if (c<0) flags |= FLIP_V;
+ if (b>0) flags |= FLIP_V;
+ if (c<0) flags |= FLIP_H;
if (!absIsOne(b) || !absIsOne(c)) {
scale = true;
}
diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath
index d3bcb6c..aeeffa6 100644
--- a/tools/layoutlib/bridge/.classpath
+++ b/tools/layoutlib/bridge/.classpath
@@ -6,7 +6,7 @@
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/layoutlib_api/layoutlib_api-prebuilt.jar"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_SRC/dalvik/libcore/xml/src/main/java"/>
- <classpathentry kind="var" path="ANDROID_PLAT_OUT_FRAMEWORK/layoutlib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/>
<classpathentry kind="var" path="ANDROID_OUT_FRAMEWORK/ninepatch.jar" sourcepath="/ANDROID_SRC/development/tools/ninepatch/src"/>
+ <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint.java b/tools/layoutlib/bridge/src/android/graphics/Paint.java
index d13b5fe..2de21c1 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Paint.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Paint.java
@@ -249,7 +249,7 @@
private void updateFontObject() {
if (mTypeface != null) {
// Get the fonts from the TypeFace object.
- List<Font> fonts = mTypeface.getFonts();
+ List<Font> fonts = Typeface_Delegate.getFonts(mTypeface);
// create new font objects as well as FontMetrics, based on the current text size
// and skew info.
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface.java b/tools/layoutlib/bridge/src/android/graphics/Typeface.java
deleted file mode 100644
index af3adb5..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.FontLoader;
-
-import android.content.res.AssetManager;
-
-import java.awt.Font;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Re-implementation of Typeface over java.awt
- */
-public class Typeface {
- private static final String DEFAULT_FAMILY = "sans-serif";
- private static final int[] styleBuffer = new int[1];
-
- /** The default NORMAL typeface object */
- public static Typeface DEFAULT;
- /**
- * The default BOLD typeface object. Note: this may be not actually be
- * bold, depending on what fonts are installed. Call getStyle() to know
- * for sure.
- */
- public static Typeface DEFAULT_BOLD;
- /** The NORMAL style of the default sans serif typeface. */
- public static Typeface SANS_SERIF;
- /** The NORMAL style of the default serif typeface. */
- public static Typeface SERIF;
- /** The NORMAL style of the default monospace typeface. */
- public static Typeface MONOSPACE;
-
- private static Typeface[] sDefaults;
- private static FontLoader mFontLoader;
-
- private final int mStyle;
- private final List<Font> mFonts;
- private final String mFamily;
-
- // Style
- public static final int NORMAL = _Original_Typeface.NORMAL;
- public static final int BOLD = _Original_Typeface.BOLD;
- public static final int ITALIC = _Original_Typeface.ITALIC;
- public static final int BOLD_ITALIC = _Original_Typeface.BOLD_ITALIC;
-
- /**
- * Returns the underlying {@link Font} objects. The first item in the list is the real
- * font. Any other items are fallback fonts for characters not found in the first one.
- */
- public List<Font> getFonts() {
- return mFonts;
- }
-
- /** Returns the typeface's intrinsic style attributes */
- public int getStyle() {
- return mStyle;
- }
-
- /** Returns true if getStyle() has the BOLD bit set. */
- public final boolean isBold() {
- return (getStyle() & BOLD) != 0;
- }
-
- /** Returns true if getStyle() has the ITALIC bit set. */
- public final boolean isItalic() {
- return (getStyle() & ITALIC) != 0;
- }
-
- /**
- * Create a typeface object given a family name, and option style information.
- * If null is passed for the name, then the "default" font will be chosen.
- * The resulting typeface object can be queried (getStyle()) to discover what
- * its "real" style characteristics are.
- *
- * @param familyName May be null. The name of the font family.
- * @param style The style (normal, bold, italic) of the typeface.
- * e.g. NORMAL, BOLD, ITALIC, BOLD_ITALIC
- * @return The best matching typeface.
- */
- public static Typeface create(String familyName, int style) {
- styleBuffer[0] = style;
- Font font = mFontLoader.getFont(familyName, styleBuffer);
- if (font != null) {
- ArrayList<Font> list = new ArrayList<Font>();
- list.add(font);
- list.addAll(mFontLoader.getFallBackFonts());
- return new Typeface(familyName, styleBuffer[0], list);
- }
-
- return null;
- }
-
- /**
- * Create a typeface object that best matches the specified existing
- * typeface and the specified Style. Use this call if you want to pick a new
- * style from the same family of an existing typeface object. If family is
- * null, this selects from the default font's family.
- *
- * @param family May be null. The name of the existing type face.
- * @param style The style (normal, bold, italic) of the typeface.
- * e.g. NORMAL, BOLD, ITALIC, BOLD_ITALIC
- * @return The best matching typeface.
- */
- public static Typeface create(Typeface family, int style) {
- styleBuffer[0] = style;
- Font font = mFontLoader.getFont(family.mFamily, styleBuffer);
- if (font != null) {
- ArrayList<Font> list = new ArrayList<Font>();
- list.add(font);
- list.addAll(mFontLoader.getFallBackFonts());
- return new Typeface(family.mFamily, styleBuffer[0], list);
- }
-
- return null;
- }
-
- /**
- * Returns one of the default typeface objects, based on the specified style
- *
- * @return the default typeface that corresponds to the style
- */
- public static Typeface defaultFromStyle(int style) {
- return sDefaults[style];
- }
-
- /**
- * Create a new typeface from the specified font data.
- * @param mgr The application's asset manager
- * @param path The file name of the font data in the assets directory
- * @return The new typeface.
- */
- public static Typeface createFromAsset(AssetManager mgr, String path) {
- return null;
- //return new Typeface(nativeCreateFromAsset(mgr, path));
- }
-
- // don't allow clients to call this directly
- private Typeface(String family, int style, List<Font> fonts) {
- mFamily = family;
- mFonts = Collections.unmodifiableList(fonts);
- mStyle = style;
- }
-
- public static void init(FontLoader fontLoader) {
- mFontLoader = fontLoader;
-
- DEFAULT = create(DEFAULT_FAMILY, NORMAL);
- DEFAULT_BOLD = create(DEFAULT_FAMILY, BOLD);
- SANS_SERIF = create("sans-serif", NORMAL);
- SERIF = create("serif", NORMAL);
- MONOSPACE = create("monospace", NORMAL);
- sDefaults = new Typeface[] {
- DEFAULT,
- DEFAULT_BOLD,
- create(DEFAULT_FAMILY, ITALIC),
- create(DEFAULT_FAMILY, BOLD_ITALIC),
- };
-
- /*
- DEFAULT = create((String)null, 0);
- DEFAULT_BOLD = create((String)null, Typeface.BOLD);
- SANS_SERIF = create("sans-serif", 0);
- SERIF = create("serif", 0);
- MONOSPACE = create("monospace", 0);
-
- sDefaults = new Typeface[] {
- DEFAULT,
- DEFAULT_BOLD,
- create((String)null, Typeface.ITALIC),
- create((String)null, Typeface.BOLD_ITALIC),
- };*/
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
new file mode 100644
index 0000000..309d934
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics;
+
+import com.android.layoutlib.bridge.DelegateManager;
+import com.android.layoutlib.bridge.FontLoader;
+
+import android.content.res.AssetManager;
+
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Delegate implementing the native methods of android.graphics.Typeface
+ *
+ * Through the layoutlib_create tool, the original native methods of Typeface have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original Matrix class.
+ *
+ * @see DelegateManager
+ *
+ */
+public final class Typeface_Delegate {
+
+ // ---- delegate manager ----
+ private static final DelegateManager<Typeface_Delegate> sManager =
+ new DelegateManager<Typeface_Delegate>();
+
+ // ---- delegate helper data ----
+ private static final String DEFAULT_FAMILY = "sans-serif";
+ private static final int[] STYLE_BUFFER = new int[1];
+
+ private static FontLoader sFontLoader;
+ private static final List<Typeface_Delegate> sPostInitDelegate =
+ new ArrayList<Typeface_Delegate>();
+
+ // ---- delegate data ----
+
+ private final String mFamily;
+ private int mStyle;
+ private List<Font> mFonts;
+
+
+ // ---- Public Helper methods ----
+
+ public static synchronized void init(FontLoader fontLoader) {
+ sFontLoader = fontLoader;
+
+ for (Typeface_Delegate delegate : sPostInitDelegate) {
+ delegate.init();
+ }
+ sPostInitDelegate.clear();
+ }
+
+ public static List<Font> getFonts(Typeface typeface) {
+ Typeface_Delegate delegate = sManager.getDelegate(typeface.native_instance);
+ if (delegate == null) {
+ assert false;
+ return null;
+ }
+
+ return delegate.mFonts;
+ }
+
+
+ // ---- native methods ----
+
+ public static synchronized int nativeCreate(String familyName, int style) {
+ if (familyName == null) {
+ familyName = DEFAULT_FAMILY;
+ }
+
+ Typeface_Delegate newDelegate = new Typeface_Delegate(familyName, style);
+ if (sFontLoader != null) {
+ newDelegate.init();
+ } else {
+ // font loader has not been initialized yet, add the delegate to a list of delegates
+ // to init when the font loader is initialized.
+ // There won't be any rendering before this happens anyway.
+ sPostInitDelegate.add(newDelegate);
+ }
+
+ return sManager.addDelegate(newDelegate);
+ }
+
+ public static synchronized int nativeCreateFromTypeface(int native_instance, int style) {
+ Typeface_Delegate delegate = sManager.getDelegate(native_instance);
+ if (delegate == null) {
+ assert false;
+ return 0;
+ }
+
+ Typeface_Delegate newDelegate = new Typeface_Delegate(delegate.mFamily, style);
+ if (sFontLoader != null) {
+ newDelegate.init();
+ } else {
+ // font loader has not been initialized yet, add the delegate to a list of delegates
+ // to init when the font loader is initialized.
+ // There won't be any rendering before this happens anyway.
+ sPostInitDelegate.add(newDelegate);
+ }
+
+ return sManager.addDelegate(newDelegate);
+ }
+
+ public static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) {
+ // FIXME
+ throw new UnsupportedOperationException();
+ }
+
+ public static synchronized int nativeCreateFromFile(String path) {
+ // FIXME
+ throw new UnsupportedOperationException();
+ }
+
+ public static void nativeUnref(int native_instance) {
+ sManager.removeDelegate(native_instance);
+ }
+
+ public static int nativeGetStyle(int native_instance) {
+ Typeface_Delegate delegate = sManager.getDelegate(native_instance);
+ if (delegate == null) {
+ assert false;
+ return 0;
+ }
+
+ return delegate.mStyle;
+ }
+
+ public static void setGammaForText(float blackGamma, float whiteGamma) {
+ // This is for device testing only: pass
+ }
+
+ // ---- Private delegate/helper methods ----
+
+ private Typeface_Delegate(String family, int style) {
+ mFamily = family;
+ mStyle = style;
+ }
+
+ private void init() {
+ STYLE_BUFFER[0] = mStyle;
+ Font font = sFontLoader.getFont(mFamily, STYLE_BUFFER);
+ if (font != null) {
+ List<Font> list = new ArrayList<Font>();
+ list.add(font);
+ list.addAll(sFontLoader.getFallBackFonts());
+ mFonts = Collections.unmodifiableList(list);
+ mStyle = STYLE_BUFFER[0];
+ }
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index eb0eba2..9eb83c8 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -31,13 +31,12 @@
import com.android.tools.layoutlib.create.OverrideMethod;
import android.content.ClipData;
-import android.content.ClipDescription;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Region;
-import android.graphics.Typeface;
+import android.graphics.Typeface_Delegate;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -49,9 +48,9 @@
import android.util.TypedValue;
import android.view.BridgeInflater;
import android.view.DragEvent;
-import android.view.InputChannel;
import android.view.IWindow;
import android.view.IWindowSession;
+import android.view.InputChannel;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
@@ -220,7 +219,7 @@
// load the fonts.
FontLoader fontLoader = FontLoader.create(fontOsLocation);
if (fontLoader != null) {
- Typeface.init(fontLoader);
+ Typeface_Delegate.init(fontLoader);
} else {
return false;
}
@@ -1007,7 +1006,7 @@
// pass for now.
return 0;
}
-
+
@SuppressWarnings("unused")
public void finishDrawing(IWindow arg0) throws RemoteException {
// pass for now.
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentProvider.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentProvider.java
new file mode 100644
index 0000000..9d6dd27
--- /dev/null
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentProvider.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.layoutlib.bridge;
+
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.ContentValues;
+import android.content.IContentProvider;
+import android.content.OperationApplicationException;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.IBulkCursor;
+import android.database.IContentObserver;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+
+/**
+ * Mock implementation of {@link IContentProvider}.
+ *
+ * TODO: never return null when the method is not supposed to. Return fake data instead.
+ */
+public final class BridgeContentProvider implements IContentProvider {
+
+ public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> arg0)
+ throws RemoteException, OperationApplicationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int bulkInsert(Uri arg0, ContentValues[] arg1) throws RemoteException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public IBulkCursor bulkQuery(Uri arg0, String[] arg1, String arg2, String[] arg3,
+ String arg4, IContentObserver arg5, CursorWindow arg6) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Bundle call(String arg0, String arg1, Bundle arg2) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int delete(Uri arg0, String arg1, String[] arg2) throws RemoteException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public String getType(Uri arg0) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Uri insert(Uri arg0, ContentValues arg1) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public AssetFileDescriptor openAssetFile(Uri arg0, String arg1) throws RemoteException,
+ FileNotFoundException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public ParcelFileDescriptor openFile(Uri arg0, String arg1) throws RemoteException,
+ FileNotFoundException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4)
+ throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3)
+ throws RemoteException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public IBinder asBinder() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String[] getStreamTypes(Uri arg0, String arg1) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public AssetFileDescriptor openTypedAssetFile(Uri arg0, String arg1, Bundle arg2)
+ throws RemoteException, FileNotFoundException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentResolver.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentResolver.java
index a063455..e15cb69 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentResolver.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContentResolver.java
@@ -16,27 +16,12 @@
package com.android.layoutlib.bridge;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
import android.content.ContentResolver;
-import android.content.ContentValues;
import android.content.Context;
import android.content.IContentProvider;
-import android.content.OperationApplicationException;
-import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.IBulkCursor;
-import android.database.IContentObserver;
import android.net.Uri;
import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
/**
* A mock content resolver for the LayoutLib Bridge.
@@ -49,87 +34,6 @@
private BridgeContentProvider mProvider = null;
- public static final class BridgeContentProvider implements IContentProvider {
-
- public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> arg0)
- throws RemoteException, OperationApplicationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public int bulkInsert(Uri arg0, ContentValues[] arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- public IBulkCursor bulkQuery(Uri arg0, String[] arg1, String arg2, String[] arg3,
- String arg4, IContentObserver arg5, CursorWindow arg6) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public Bundle call(String arg0, String arg1, Bundle arg2) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public int delete(Uri arg0, String arg1, String[] arg2) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- public String getType(Uri arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public Uri insert(Uri arg0, ContentValues arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public AssetFileDescriptor openAssetFile(Uri arg0, String arg1) throws RemoteException,
- FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public ParcelFileDescriptor openFile(Uri arg0, String arg1) throws RemoteException,
- FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4)
- throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3)
- throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- public IBinder asBinder() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public String[] getStreamTypes(Uri arg0, String arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- public AssetFileDescriptor openTypedAssetFile(Uri arg0, String arg1, Bundle arg2)
- throws RemoteException, FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- }
-
public BridgeContentResolver(Context context) {
super(context);
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/FontLoader.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/FontLoader.java
index 801503b..de89a81 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/FontLoader.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/FontLoader.java
@@ -134,6 +134,15 @@
return mFallBackFonts;
}
+ /**
+ * Returns a {@link Font} object given a family name and a style value (constant in
+ * {@link Typeface}).
+ * @param family the family name
+ * @param style a 1-item array containing the requested style. Based on the font being read
+ * the actual style may be different. The array contains the actual style after
+ * the method returns.
+ * @return the font object or null if no match could be found.
+ */
public synchronized Font getFont(String family, int[] style) {
if (family == null) {
return null;
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index 2d0ee6d..f6d11fe 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -104,6 +104,7 @@
*/
private final static String[] DELEGATE_CLASS_NATIVES = new String[] {
"android.graphics.Matrix",
+ "android.graphics.Typeface",
};
/**
@@ -135,7 +136,6 @@
"android.graphics.RadialGradient", "android.graphics._Original_RadialGradient",
"android.graphics.Shader", "android.graphics._Original_Shader",
"android.graphics.SweepGradient", "android.graphics._Original_SweepGradient",
- "android.graphics.Typeface", "android.graphics._Original_Typeface",
"android.os.ServiceManager", "android.os._Original_ServiceManager",
"android.util.FloatMath", "android.util._Original_FloatMath",
"android.view.SurfaceView", "android.view._Original_SurfaceView",