Merge change 27076 into eclair
* changes:
Optimize rotary selector widget by using bitmaps instead of drawables.
diff --git a/api/current.xml b/api/current.xml
index d5f3f46..37fb3a8 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -122805,7 +122805,7 @@
type="android.telephony.NeighboringCellInfo"
static="false"
final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</constructor>
@@ -122813,7 +122813,7 @@
type="android.telephony.NeighboringCellInfo"
static="false"
final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
<parameter name="rssi" type="int">
@@ -122853,6 +122853,39 @@
visibility="public"
>
</method>
+<method name="getLac"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getNetworkType"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getPsc"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getRssi"
return="int"
abstract="false"
@@ -122871,7 +122904,7 @@
synchronized="false"
static="false"
final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
<parameter name="cid" type="int">
@@ -122884,7 +122917,7 @@
synchronized="false"
static="false"
final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
<parameter name="rssi" type="int">
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 7adaf57..b877098 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -34,6 +34,8 @@
import android.os.ServiceManager;
import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -42,21 +44,21 @@
public final class Pm {
IPackageManager mPm;
-
+
private WeakHashMap<String, Resources> mResourceCache
= new WeakHashMap<String, Resources>();
-
+
private String[] mArgs;
private int mNextArg;
private String mCurArgData;
-
- private static final String PM_NOT_RUNNING_ERR =
+
+ private static final String PM_NOT_RUNNING_ERR =
"Error: Could not access the Package Manager. Is the system running?";
-
+
public static void main(String[] args) {
new Pm().run(args);
}
-
+
public void run(String[] args) {
boolean validCommand = false;
if (args.length < 1) {
@@ -73,37 +75,37 @@
mArgs = args;
String op = args[0];
mNextArg = 1;
-
+
if ("list".equals(op)) {
runList();
return;
}
-
+
if ("path".equals(op)) {
runPath();
return;
}
-
+
if ("install".equals(op)) {
runInstall();
return;
}
-
+
if ("uninstall".equals(op)) {
runUninstall();
return;
}
-
+
if ("enable".equals(op)) {
runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
return;
}
-
+
if ("disable".equals(op)) {
runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
return;
}
-
+
try {
if (args.length == 1) {
if (args[0].equalsIgnoreCase("-l")) {
@@ -128,10 +130,10 @@
}
}
}
-
+
/**
* Execute the list sub-command.
- *
+ *
* pm list [package | packages]
* pm list permission-groups
* pm list permissions
@@ -157,7 +159,7 @@
showUsage();
}
}
-
+
/**
* Lists all the installed packages.
*/
@@ -182,10 +184,10 @@
showUsage();
return;
}
-
+
try {
List<PackageInfo> packages = mPm.getInstalledPackages(0 /* all */);
-
+
int count = packages.size();
for (int p = 0 ; p < count ; p++) {
PackageInfo info = packages.get(p);
@@ -201,10 +203,10 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
/**
* Lists all of the installed instrumentation, or all for a given package
- *
+ *
* pm list instrumentation [package] [-f]
*/
private void runListInstrumentation() {
@@ -260,14 +262,14 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
/**
* Lists all the known permission groups.
*/
private void runListPermissionGroups() {
try {
List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0);
-
+
int count = pgs.size();
for (int p = 0 ; p < count ; p++) {
PermissionGroupInfo pgi = pgs.get(p);
@@ -279,7 +281,7 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) {
if (nonLocalized != null) {
return nonLocalized.toString();
@@ -290,7 +292,7 @@
}
return null;
}
-
+
/**
* Lists all the permissions in a group.
*/
@@ -321,7 +323,7 @@
return;
}
}
-
+
String grp = nextOption();
ArrayList<String> groupList = new ArrayList<String>();
if (groups) {
@@ -334,7 +336,7 @@
} else {
groupList.add(grp);
}
-
+
if (dangerousOnly) {
System.out.println("Dangerous Permissions:");
System.out.println("");
@@ -365,7 +367,7 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
private void doListPermissions(ArrayList<String> groupList,
boolean groups, boolean labels, boolean summary,
int startProtectionLevel, int endProtectionLevel)
@@ -385,7 +387,7 @@
pgi.nonLocalizedLabel) + ": ");
} else {
System.out.print(pgi.name + ": ");
-
+
}
} else {
System.out.println((labels ? "+ " : "")
@@ -468,13 +470,13 @@
}
}
}
-
+
if (summary) {
System.out.println("");
}
}
}
-
+
private void runPath() {
String pkg = nextArg();
if (pkg == null) {
@@ -484,7 +486,7 @@
}
displayPackageFilePath(pkg);
}
-
+
class PackageInstallObserver extends IPackageInstallObserver.Stub {
boolean finished;
int result;
@@ -497,95 +499,40 @@
}
}
}
-
+
+ /**
+ * Converts a failure code into a string by using reflection to find a matching constant
+ * in PackageManager.
+ */
private String installFailureToString(int result) {
- String s;
- switch (result) {
- case PackageManager.INSTALL_FAILED_ALREADY_EXISTS:
- s = "INSTALL_FAILED_ALREADY_EXISTS";
- break;
- case PackageManager.INSTALL_FAILED_INVALID_APK:
- s = "INSTALL_FAILED_INVALID_APK";
- break;
- case PackageManager.INSTALL_FAILED_INVALID_URI:
- s = "INSTALL_FAILED_INVALID_URI";
- break;
- case PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE:
- s = "INSTALL_FAILED_INSUFFICIENT_STORAGE";
- break;
- case PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE:
- s = "INSTALL_FAILED_DUPLICATE_PACKAGE";
- break;
- case PackageManager.INSTALL_FAILED_NO_SHARED_USER:
- s = "INSTALL_FAILED_NO_SHARED_USER";
- break;
- case PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE:
- s = "INSTALL_FAILED_UPDATE_INCOMPATIBLE";
- break;
- case PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE:
- s = "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE";
- break;
- case PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY:
- s = "INSTALL_FAILED_MISSING_SHARED_LIBRARY";
- break;
- case PackageManager.INSTALL_FAILED_DEXOPT:
- s = "INSTALL_FAILED_DEXOPT";
- break;
- case PackageManager.INSTALL_FAILED_OLDER_SDK:
- s = "INSTALL_FAILED_OLDER_SDK";
- break;
- case PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER:
- s = "INSTALL_FAILED_CONFLICTING_PROVIDER";
- break;
- case PackageManager.INSTALL_FAILED_NEWER_SDK:
- s = "INSTALL_FAILED_NEWER_SDK";
- break;
- case PackageManager.INSTALL_FAILED_TEST_ONLY:
- s = "INSTALL_FAILED_TEST_ONLY";
- break;
- case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE:
- s = "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE";
- break;
- case PackageManager.INSTALL_FAILED_MISSING_FEATURE:
- s = "INSTALL_FAILED_MISSING_FEATURE";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_NOT_APK:
- s = "INSTALL_PARSE_FAILED_NOT_APK";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST:
- s = "INSTALL_PARSE_FAILED_BAD_MANIFEST";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION:
- s = "INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES:
- s = "INSTALL_PARSE_FAILED_NO_CERTIFICATES";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES:
- s = "INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING:
- s = "INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME:
- s = "INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID:
- s = "INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:
- s = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED";
- break;
- case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY:
- s = "INSTALL_PARSE_FAILED_MANIFEST_EMPTY";
- break;
- default:
- s = Integer.toString(result);
- break;
+ Field[] fields = PackageManager.class.getFields();
+ for (Field f: fields) {
+ if (f.getType() == int.class) {
+ int modifiers = f.getModifiers();
+ // only look at public final static fields.
+ if (((modifiers & Modifier.FINAL) != 0) &&
+ ((modifiers & Modifier.PUBLIC) != 0) &&
+ ((modifiers & Modifier.STATIC) != 0)) {
+ String fieldName = f.getName();
+ if (fieldName.startsWith("INSTALL_FAILED_") ||
+ fieldName.startsWith("INSTALL_PARSE_FAILED_")) {
+ // get the int value and compare it to result.
+ try {
+ if (result == f.getInt(null)) {
+ return fieldName;
+ }
+ } catch (IllegalAccessException e) {
+ // this shouldn't happen since we only look for public static fields.
+ }
+ }
+ }
+ }
}
- return s;
+
+ // couldn't find a matching constant? return the value
+ return Integer.toString(result);
}
-
+
private void runInstall() {
int installFlags = 0;
String installerPackageName = null;
@@ -624,7 +571,7 @@
try {
mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,
installerPackageName);
-
+
synchronized (obs) {
while (!obs.finished) {
try {
@@ -645,11 +592,11 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
boolean finished;
boolean result;
-
+
public void packageDeleted(boolean succeeded) {
synchronized (this) {
finished = true;
@@ -658,7 +605,7 @@
}
}
}
-
+
private void runUninstall() {
int unInstallFlags = 0;
@@ -712,7 +659,7 @@
}
return "unknown";
}
-
+
private void runSetEnabledSetting(int state) {
String pkg = nextArg();
if (pkg == null) {
@@ -760,11 +707,11 @@
System.err.println(PM_NOT_RUNNING_ERR);
}
}
-
+
private Resources getResources(PackageItemInfo pii) {
Resources res = mResourceCache.get(pii.packageName);
if (res != null) return res;
-
+
try {
ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0);
AssetManager am = new AssetManager();
@@ -778,7 +725,7 @@
return null;
}
}
-
+
private String nextOption() {
if (mNextArg >= mArgs.length) {
return null;
@@ -830,7 +777,7 @@
System.err.println(" pm list packages [-f]");
System.err.println(" pm list permission-groups");
System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
- System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
+ System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH");
System.err.println(" pm uninstall [-k] PACKAGE");
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 6aec52c..776c923 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -297,7 +297,7 @@
* Turn on the local Bluetooth adapter.
* <p>This powers on the underlying Bluetooth hardware, and starts all
* Bluetooth system services.
- * <p>This is an asynchronous call: it will return immediatley, and
+ * <p>This is an asynchronous call: it will return immediately, and
* clients should listen for {@link #ACTION_STATE_CHANGED}
* to be notified of subsequent adapter state changes. If this call returns
* true, then the adapter state will immediately transition from {@link
@@ -322,7 +322,7 @@
* Turn off the local Bluetooth adapter.
* <p>This gracefully shuts down all Bluetooth connections, stops Bluetooth
* system services, and powers down the underlying Bluetooth hardware.
- * <p>This is an asynchronous call: it will return immediatley, and
+ * <p>This is an asynchronous call: it will return immediately, and
* clients should listen for {@link #ACTION_STATE_CHANGED}
* to be notified of subsequent adapter state changes. If this call returns
* true, then the adapter state will immediately transition from {@link
diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java
index 2404a43..e01bd3c 100644
--- a/core/java/android/pim/vcard/VCardComposer.java
+++ b/core/java/android/pim/vcard/VCardComposer.java
@@ -29,9 +29,9 @@
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.CommonDataKinds.Birthday;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Birthday;
import android.provider.ContactsContract.CommonDataKinds.Nickname;
import android.provider.ContactsContract.CommonDataKinds.Note;
import android.provider.ContactsContract.CommonDataKinds.Organization;
@@ -40,9 +40,6 @@
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.provider.CallLog.Calls;
-import android.provider.CallLog;
-import android.text.format.Time;
import android.text.TextUtils;
import android.text.format.Time;
import android.util.CharsetUtils;
@@ -86,6 +83,17 @@
private final static String DEFAULT_EMAIL_TYPE = Constants.ATTR_TYPE_INTERNET;
+ public static final String FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO =
+ "Failed to get database information";
+
+ public static final String FAILURE_REASON_NO_ENTRY =
+ "There's no exportable in the database";
+
+ public static final String FAILURE_REASON_NOT_INITIALIZED =
+ "The vCard composer object is not correctly initialized";
+
+ public static final String NO_ERROR = "No error";
+
public static interface OneEntryHandler {
public boolean onInit(Context context);
@@ -276,7 +284,7 @@
private boolean mTerminateIsCalled;
private List<OneEntryHandler> mHandlerList;
- private String mErrorReason = "No error";
+ private String mErrorReason = NO_ERROR;
private static final Map<Integer, String> sImMap;
@@ -293,12 +301,12 @@
private boolean mIsCallLogComposer = false;
- private static final String[] CONTACTS_PROJECTION = new String[] {
- Contacts._ID,
+ private static final String[] sRawContactsProjection = new String[] {
+ RawContacts._ID,
};
/** The projection to use when querying the call log table */
- private static final String[] CALL_LOG_PROJECTION = new String[] {
+ private static final String[] sCallLogProjection = new String[] {
Calls.NUMBER, Calls.DATE, Calls.TYPE, Calls.CACHED_NAME, Calls.CACHED_NUMBER_TYPE,
Calls.CACHED_NUMBER_LABEL
};
@@ -312,17 +320,23 @@
private static final String FLAG_TIMEZONE_UTC = "Z";
public VCardComposer(Context context) {
- this(context, VCardConfig.VCARD_TYPE_DEFAULT, true);
+ this(context, VCardConfig.VCARD_TYPE_DEFAULT, true, false);
}
public VCardComposer(Context context, String vcardTypeStr,
boolean careHandlerErrors) {
this(context, VCardConfig.getVCardTypeFromString(vcardTypeStr),
- careHandlerErrors);
+ careHandlerErrors, false);
+ }
+
+ public VCardComposer(Context context, int vcardType, boolean careHandlerErrors) {
+ this(context, vcardType, careHandlerErrors, false);
}
/**
- * Construct for supporting call log entry vCard composing
+ * Construct for supporting call log entry vCard composing.
+ *
+ * @param isCallLogComposer true if this composer is for creating Call Log vCard.
*/
public VCardComposer(Context context, int vcardType, boolean careHandlerErrors,
boolean isCallLogComposer) {
@@ -359,10 +373,6 @@
}
}
- public VCardComposer(Context context, int vcardType, boolean careHandlerErrors) {
- this(context, vcardType, careHandlerErrors, false);
- }
-
/**
* This static function is to compose vCard for phone own number
*/
@@ -429,25 +439,27 @@
}
if (mIsCallLogComposer) {
- mCursor = mContentResolver.query(CallLog.Calls.CONTENT_URI, CALL_LOG_PROJECTION,
+ mCursor = mContentResolver.query(CallLog.Calls.CONTENT_URI, sCallLogProjection,
selection, selectionArgs, null);
} else {
- // TODO: thorow an appropriate exception!
- mCursor = mContentResolver.query(RawContacts.CONTENT_URI, CONTACTS_PROJECTION,
+ mCursor = mContentResolver.query(RawContacts.CONTENT_URI, sRawContactsProjection,
selection, selectionArgs, null);
}
- if (mCursor == null || !mCursor.moveToFirst()) {
- if (mCursor != null) {
- try {
- mCursor.close();
- } catch (SQLiteException e) {
- Log.e(LOG_TAG, "SQLiteException on Cursor#close(): "
- + e.getMessage());
- }
+ if (mCursor == null) {
+ mErrorReason = FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO;
+ return false;
+ }
+
+ if (mCursor.getCount() == 0 || !mCursor.moveToFirst()) {
+ try {
+ mCursor.close();
+ } catch (SQLiteException e) {
+ Log.e(LOG_TAG, "SQLiteException on Cursor#close(): " + e.getMessage());
+ } finally {
mCursor = null;
+ mErrorReason = FAILURE_REASON_NO_ENTRY;
}
- mErrorReason = "Getting database information failed.";
return false;
}
@@ -462,8 +474,7 @@
public boolean createOneEntry() {
if (mCursor == null || mCursor.isAfterLast()) {
- // TODO: ditto
- mErrorReason = "Not initialized or database has some problem.";
+ mErrorReason = FAILURE_REASON_NOT_INITIALIZED;
return false;
}
String name = null;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6ac1f07..3ce1815 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -356,7 +356,10 @@
// Whether to prevent drag during touch. The initial value depends on
// mForwardTouchEvents. If WebCore wants touch events, we assume it will
// take control of touch events unless it says no for touch down event.
- private boolean mPreventDrag;
+ private static final int PREVENT_DRAG_NO = 0;
+ private static final int PREVENT_DRAG_MAYBE_YES = 1;
+ private static final int PREVENT_DRAG_YES = 2;
+ private int mPreventDrag = PREVENT_DRAG_NO;
// To keep track of whether the current drag was initiated by a WebTextView,
// so that we know not to hide the cursor
@@ -3710,7 +3713,8 @@
}
} else {
mTouchMode = TOUCH_INIT_MODE;
- mPreventDrag = mForwardTouchEvents;
+ mPreventDrag = mForwardTouchEvents ? PREVENT_DRAG_MAYBE_YES
+ : PREVENT_DRAG_NO;
mWebViewCore.sendMessage(
EventHub.UPDATE_FRAME_CACHE_IF_LOADING);
if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
@@ -3751,11 +3755,15 @@
invalidate();
break;
}
- if (mPreventDrag || (deltaX * deltaX + deltaY * deltaY)
- < mTouchSlopSquare) {
+ if ((deltaX * deltaX + deltaY * deltaY) < mTouchSlopSquare) {
break;
}
-
+ if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+ // track mLastTouchTime as we may need to do fling at
+ // ACTION_UP
+ mLastTouchTime = eventTime;
+ break;
+ }
if (mTouchMode == TOUCH_SHORTPRESS_MODE
|| mTouchMode == TOUCH_SHORTPRESS_START_MODE) {
mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
@@ -3884,15 +3892,6 @@
mTouchMode = TOUCH_DONE_MODE;
doDoubleTap();
break;
- case TOUCH_INIT_MODE: // tap
- mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
- if (!mPreventDrag) {
- mPrivateHandler.sendMessageDelayed(
- mPrivateHandler.obtainMessage(
- RELEASE_SINGLE_TAP),
- ViewConfiguration.getDoubleTapTimeout());
- }
- break;
case TOUCH_SHORTPRESS_START_MODE:
case TOUCH_SHORTPRESS_MODE:
mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
@@ -3904,6 +3903,34 @@
commitCopy();
mTouchSelection = false;
break;
+ case TOUCH_INIT_MODE: // tap
+ mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
+ if ((deltaX * deltaX + deltaY * deltaY) > mTouchSlopSquare) {
+ Log.w(LOGTAG, "Miss a drag as we are waiting for" +
+ " WebCore's response for touch down.");
+ if (computeHorizontalScrollExtent() < computeHorizontalScrollRange()
+ || computeVerticalScrollExtent() < computeVerticalScrollRange()) {
+ // we will not rewrite drag code here, but we
+ // will try fling if it applies.
+ WebViewCore.pauseUpdate(mWebViewCore);
+ // fall through to TOUCH_DRAG_MODE
+ } else {
+ break;
+ }
+ } else {
+ if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+ // if mPreventDrag is not confirmed, treat it as
+ // no so that it won't block tap or double tap.
+ mPreventDrag = PREVENT_DRAG_NO;
+ }
+ if (mPreventDrag == PREVENT_DRAG_NO) {
+ mPrivateHandler.sendMessageDelayed(
+ mPrivateHandler.obtainMessage(
+ RELEASE_SINGLE_TAP),
+ ViewConfiguration.getDoubleTapTimeout());
+ }
+ break;
+ }
case TOUCH_DRAG_MODE:
// redraw in high-quality, as we're done dragging
invalidate();
@@ -4821,6 +4848,11 @@
break;
}
case SWITCH_TO_SHORTPRESS: {
+ // if mPreventDrag is not confirmed, treat it as no so that
+ // it won't block panning the page.
+ if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+ mPreventDrag = PREVENT_DRAG_NO;
+ }
if (mTouchMode == TOUCH_INIT_MODE) {
mTouchMode = TOUCH_SHORTPRESS_START_MODE;
updateSelection();
@@ -4830,7 +4862,7 @@
break;
}
case SWITCH_TO_LONGPRESS: {
- if (!mPreventDrag) {
+ if (mPreventDrag == PREVENT_DRAG_NO) {
mTouchMode = TOUCH_DONE_MODE;
performLongClick();
rebuildWebTextView();
@@ -4838,7 +4870,7 @@
break;
}
case RELEASE_SINGLE_TAP: {
- if (!mPreventDrag) {
+ if (mPreventDrag == PREVENT_DRAG_NO) {
mTouchMode = TOUCH_DONE_MODE;
doShortPress();
}
@@ -5064,9 +5096,14 @@
case PREVENT_TOUCH_ID:
if (msg.arg1 == MotionEvent.ACTION_DOWN) {
- mPreventDrag = msg.arg2 == 1;
- if (mPreventDrag) {
- mTouchMode = TOUCH_DONE_MODE;
+ // dont override if mPreventDrag has been set to no due
+ // to time out
+ if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+ mPreventDrag = msg.arg2 == 1 ? PREVENT_DRAG_YES
+ : PREVENT_DRAG_NO;
+ if (mPreventDrag == PREVENT_DRAG_YES) {
+ mTouchMode = TOUCH_DONE_MODE;
+ }
}
}
break;
diff --git a/core/res/res/drawable-hdpi/gallery_unselected_default.9.png b/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
index 855dca1..3d10b86 100644
--- a/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
+++ b/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png b/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
index 5ec400c..2fa7c46 100644
--- a/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
+++ b/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
Binary files differ
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index 0ef73fa..059e899 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -188,11 +188,6 @@
</FrameLayout>
</LinearLayout>
- <View
- android:background="@drawable/code_lock_left"
- android:layout_width="2dip"
- android:layout_height="fill_parent" />
-
<!-- right side: lock pattern -->
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="wrap_content"
diff --git a/include/ui/CameraParameters.h b/include/ui/CameraParameters.h
index 9ca1806..9c3d4f0 100644
--- a/include/ui/CameraParameters.h
+++ b/include/ui/CameraParameters.h
@@ -69,11 +69,203 @@
void dump() const;
status_t dump(int fd, const Vector<String16>& args) const;
+ // Parameter keys to communicate between camera application and driver.
+ // The access (read/write, read only, or write only) is viewed from the
+ // perspective of applications, not driver.
+
+ // Preview frame size in pixels (width x height).
+ // Example value: "480x320". Read/Write.
+ static const char KEY_PREVIEW_SIZE[];
+ // Supported preview frame sizes in pixels.
+ // Example value: "800x600,480x320". Read only.
+ static const char KEY_SUPPORTED_PREVIEW_SIZES[];
+ // The image format for preview frames.
+ // Example value: "yuv420sp" or PIXEL_FORMAT_XXX constants. Read/write.
+ static const char KEY_PREVIEW_FORMAT[];
+ // Supported image formats for preview frames.
+ // Example value: "yuv420sp,yuv422i-yuyv". Read only.
+ static const char KEY_SUPPORTED_PREVIEW_FORMATS[];
+ // Number of preview frames per second.
+ // Example value: "15". Read/write.
+ static const char KEY_PREVIEW_FRAME_RATE[];
+ // Supported number of preview frames per second.
+ // Example value: "24,15,10". Read.
+ static const char KEY_SUPPORTED_PREVIEW_FRAME_RATES[];
+ // The dimensions for captured pictures in pixels (width x height).
+ // Example value: "1024x768". Read/write.
+ static const char KEY_PICTURE_SIZE[];
+ // Supported dimensions for captured pictures in pixels.
+ // Example value: "2048x1536,1024x768". Read only.
+ static const char KEY_SUPPORTED_PICTURE_SIZES[];
+ // The image format for captured pictures.
+ // Example value: "jpeg" or PIXEL_FORMAT_XXX constants. Read/write.
+ static const char KEY_PICTURE_FORMAT[];
+ // Supported image formats for captured pictures.
+ // Example value: "jpeg,rgb565". Read only.
+ static const char KEY_SUPPORTED_PICTURE_FORMATS[];
+ // The width (in pixels) of EXIF thumbnail in Jpeg picture.
+ // Example value: "512". Read/write.
+ static const char KEY_JPEG_THUMBNAIL_WIDTH[];
+ // The height (in pixels) of EXIF thumbnail in Jpeg picture.
+ // Example value: "384". Read/write.
+ static const char KEY_JPEG_THUMBNAIL_HEIGHT[];
+ // Supported EXIF thumbnail sizes (width x height).
+ // Example value: "512x384,320x240". Read only.
+ static const char KEY_SUPPORTED_THUMBNAIL_SIZES[];
+ // The quality of the EXIF thumbnail in Jpeg picture. The range is 1 to 100,
+ // with 100 being the best.
+ // Example value: "90". Read/write.
+ static const char KEY_JPEG_THUMBNAIL_QUALITY[];
+ // Jpeg quality of captured picture. The range is 1 to 100, with 100 being
+ // the best.
+ // Example value: "90". Read/write.
+ static const char KEY_JPEG_QUALITY[];
+ // The orientation of the device in degrees. For example, suppose the
+ // natural position of the device is landscape. If the user takes a picture
+ // in landscape mode in 2048x1536 resolution, the rotation will be set to
+ // "0". If the user rotates the phone 90 degrees clockwise, the rotation
+ // should be set to "90".
+ // The camera driver can set orientation in the EXIF header without rotating
+ // the picture. Or the driver can rotate the picture and the EXIF thumbnail.
+ // If the Jpeg picture is rotated, the orientation in the EXIF header should
+ // be missing or 1 (row #0 is top and column #0 is left side). The driver
+ // should not set default value for this parameter.
+ // Example value: "0" or "90" or "180" or "270". Write only.
+ static const char KEY_ROTATION[];
+ // GPS latitude coordinate. This will be stored in JPEG EXIF header.
+ // Example value: "25.032146". Write only.
+ static const char KEY_GPS_LATITUDE[];
+ // GPS longitude coordinate. This will be stored in JPEG EXIF header.
+ // Example value: "121.564448". Write only.
+ static const char KEY_GPS_LONGITUDE[];
+ // GPS altitude. This will be stored in JPEG EXIF header.
+ // Example value: "21.0". Write only.
+ static const char KEY_GPS_ALTITUDE[];
+ // GPS timestamp (UTC in seconds since January 1, 1970). This should be
+ // stored in JPEG EXIF header.
+ // Example value: "1251192757". Write only.
+ static const char KEY_GPS_TIMESTAMP[];
+ // Current white balance setting.
+ // Example value: "auto" or WHITE_BALANCE_XXX constants. Read/write.
+ static const char KEY_WHITE_BALANCE[];
+ // Supported white balance settings.
+ // Example value: "auto,incandescent,daylight". Read only.
+ static const char KEY_SUPPORTED_WHITE_BALANCE[];
+ // Current color effect setting.
+ // Example value: "none" or EFFECT_XXX constants. Read/write.
+ static const char KEY_EFFECT[];
+ // Supported color effect settings.
+ // Example value: "none,mono,sepia". Read only.
+ static const char KEY_SUPPORTED_EFFECTS[];
+ // Current antibanding setting.
+ // Example value: "auto" or ANTIBANDING_XXX constants. Read/write.
+ static const char KEY_ANTIBANDING[];
+ // Supported antibanding settings.
+ // Example value: "auto,50hz,60hz,off". Read only.
+ static const char KEY_SUPPORTED_ANTIBANDING[];
+ // Current scene mode.
+ // Example value: "auto" or SCENE_MODE_XXX constants. Read/write.
+ static const char KEY_SCENE_MODE[];
+ // Supported scene mode settings.
+ // Example value: "auto,night,fireworks". Read only.
+ static const char KEY_SUPPORTED_SCENE_MODES[];
+ // Current flash mode.
+ // Example value: "auto" or FLASH_MODE_XXX constants. Read/write.
+ static const char KEY_FLASH_MODE[];
+ // Supported flash modes.
+ // Example value: "auto,on,off". Read only.
+ static const char KEY_SUPPORTED_FLASH_MODES[];
+ // Current focus mode. If the camera does not support auto-focus, the value
+ // should be FOCUS_MODE_FIXED. If the focus mode is not FOCUS_MODE_FIXED or
+ // or FOCUS_MODE_INFINITY, applications should call
+ // CameraHardwareInterface.autoFocus to start the focus.
+ // Example value: "auto" or FOCUS_MODE_XXX constants. Read/write.
+ static const char KEY_FOCUS_MODE[];
+ // Supported focus modes.
+ // Example value: "auto,macro,fixed". Read only.
+ static const char KEY_SUPPORTED_FOCUS_MODES[];
+
+ // Values for white balance settings.
+ static const char WHITE_BALANCE_AUTO[];
+ static const char WHITE_BALANCE_INCANDESCENT[];
+ static const char WHITE_BALANCE_FLUORESCENT[];
+ static const char WHITE_BALANCE_WARM_FLUORESCENT[];
+ static const char WHITE_BALANCE_DAYLIGHT[];
+ static const char WHITE_BALANCE_CLOUDY_DAYLIGHT[];
+ static const char WHITE_BALANCE_TWILIGHT[];
+ static const char WHITE_BALANCE_SHADE[];
+
+ // Values for effect settings.
+ static const char EFFECT_NONE[];
+ static const char EFFECT_MONO[];
+ static const char EFFECT_NEGATIVE[];
+ static const char EFFECT_SOLARIZE[];
+ static const char EFFECT_SEPIA[];
+ static const char EFFECT_POSTERIZE[];
+ static const char EFFECT_WHITEBOARD[];
+ static const char EFFECT_BLACKBOARD[];
+ static const char EFFECT_AQUA[];
+
+ // Values for antibanding settings.
+ static const char ANTIBANDING_AUTO[];
+ static const char ANTIBANDING_50HZ[];
+ static const char ANTIBANDING_60HZ[];
+ static const char ANTIBANDING_OFF[];
+
+ // Values for flash mode settings.
+ // Flash will not be fired.
+ static const char FLASH_MODE_OFF[];
+ // Flash will be fired automatically when required. The timing is decided by
+ // camera driver.
+ static const char FLASH_MODE_AUTO[];
+ // Flash will always be fired. The timing is decided by camera driver.
+ static const char FLASH_MODE_ON[];
+ // Flash will be fired in red-eye reduction mode.
+ static const char FLASH_MODE_RED_EYE[];
+ // Constant emission of light. This can be used for video recording.
+ static const char FLASH_MODE_VIDEO_LIGHT[];
+
+ // Values for scene mode settings.
+ static const char SCENE_MODE_AUTO[];
+ static const char SCENE_MODE_ACTION[];
+ static const char SCENE_MODE_PORTRAIT[];
+ static const char SCENE_MODE_LANDSCAPE[];
+ static const char SCENE_MODE_NIGHT[];
+ static const char SCENE_MODE_NIGHT_PORTRAIT[];
+ static const char SCENE_MODE_THEATRE[];
+ static const char SCENE_MODE_BEACH[];
+ static const char SCENE_MODE_SNOW[];
+ static const char SCENE_MODE_SUNSET[];
+ static const char SCENE_MODE_STEADYPHOTO[];
+ static const char SCENE_MODE_FIREWORKS[];
+ static const char SCENE_MODE_SPORTS[];
+ static const char SCENE_MODE_PARTY[];
+ static const char SCENE_MODE_CANDLELIGHT[];
+
+ // Formats for setPreviewFormat and setPictureFormat.
+ static const char PIXEL_FORMAT_YUV422SP[];
+ static const char PIXEL_FORMAT_YUV420SP[]; // NV21
+ static const char PIXEL_FORMAT_YUV422I[]; // YUY2
+ static const char PIXEL_FORMAT_RGB565[];
+ static const char PIXEL_FORMAT_JPEG[];
+
+ // Values for focus mode settings.
+ // Auto-focus mode.
+ static const char FOCUS_MODE_AUTO[];
+ // Focus is set at infinity. Applications should not call
+ // CameraHardwareInterface.autoFocus in this mode.
+ static const char FOCUS_MODE_INFINITY[];
+ static const char FOCUS_MODE_MACRO[];
+ // Focus is fixed. The camera is always in this mode if the focus is not
+ // adjustable. If the camera has auto-focus, this mode can fix the
+ // focus, which is usually at hyperfocal distance. Applications should
+ // not call CameraHardwareInterface.autoFocus in this mode.
+ static const char FOCUS_MODE_FIXED[];
+
private:
DefaultKeyedVector<String8,String8> mMap;
};
-
}; // namespace android
#endif
diff --git a/libs/ui/CameraParameters.cpp b/libs/ui/CameraParameters.cpp
index 6c25836..9200a97 100644
--- a/libs/ui/CameraParameters.cpp
+++ b/libs/ui/CameraParameters.cpp
@@ -2,16 +2,16 @@
**
** Copyright 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
+** 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
+** 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
+** 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.
*/
@@ -23,6 +23,103 @@
#include <ui/CameraParameters.h>
namespace android {
+// Parameter keys to communicate between camera application and driver.
+const char CameraParameters::KEY_PREVIEW_SIZE[] = "preview-size";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES[] = "preview-size-values";
+const char CameraParameters::KEY_PREVIEW_FORMAT[] = "preview-format";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS[] = "preview-format-values";
+const char CameraParameters::KEY_PREVIEW_FRAME_RATE[] = "preview-frame-rate";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES[] = "preview-frame-rate-values";
+const char CameraParameters::KEY_PICTURE_SIZE[] = "picture-size";
+const char CameraParameters::KEY_SUPPORTED_PICTURE_SIZES[] = "picture-size-values";
+const char CameraParameters::KEY_PICTURE_FORMAT[] = "picture-format";
+const char CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS[] = "picture-format-values";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH[] = "jpeg-thumbnail-width";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT[] = "jpeg-thumbnail-height";
+const char CameraParameters::KEY_SUPPORTED_THUMBNAIL_SIZES[] = "jpeg-thumbnail-size-values";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY[] = "jpeg-thumbnail-quality";
+const char CameraParameters::KEY_JPEG_QUALITY[] = "jpeg-quality";
+const char CameraParameters::KEY_ROTATION[] = "rotation";
+const char CameraParameters::KEY_GPS_LATITUDE[] = "gps-latitude";
+const char CameraParameters::KEY_GPS_LONGITUDE[] = "gps-longitude";
+const char CameraParameters::KEY_GPS_ALTITUDE[] = "gps-altitude";
+const char CameraParameters::KEY_GPS_TIMESTAMP[] = "gps-timestamp";
+const char CameraParameters::KEY_WHITE_BALANCE[] = "whitebalance";
+const char CameraParameters::KEY_SUPPORTED_WHITE_BALANCE[] = "whitebalance-values";
+const char CameraParameters::KEY_EFFECT[] = "effect";
+const char CameraParameters::KEY_SUPPORTED_EFFECTS[] = "effect-values";
+const char CameraParameters::KEY_ANTIBANDING[] = "antibanding";
+const char CameraParameters::KEY_SUPPORTED_ANTIBANDING[] = "antibanding-values";
+const char CameraParameters::KEY_SCENE_MODE[] = "scene-mode";
+const char CameraParameters::KEY_SUPPORTED_SCENE_MODES[] = "scene-mode-values";
+const char CameraParameters::KEY_FLASH_MODE[] = "flash-mode";
+const char CameraParameters::KEY_SUPPORTED_FLASH_MODES[] = "flash-mode-values";
+const char CameraParameters::KEY_FOCUS_MODE[] = "focus-mode";
+const char CameraParameters::KEY_SUPPORTED_FOCUS_MODES[] = "focus-mode-values";
+
+// Values for white balance settings.
+const char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
+const char CameraParameters::WHITE_BALANCE_INCANDESCENT[] = "incandescent";
+const char CameraParameters::WHITE_BALANCE_FLUORESCENT[] = "fluorescent";
+const char CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT[] = "warm-fluorescent";
+const char CameraParameters::WHITE_BALANCE_DAYLIGHT[] = "daylight";
+const char CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT[] = "cloudy-daylight";
+const char CameraParameters::WHITE_BALANCE_TWILIGHT[] = "twilight";
+const char CameraParameters::WHITE_BALANCE_SHADE[] = "shade";
+
+// Values for effect settings.
+const char CameraParameters::EFFECT_NONE[] = "none";
+const char CameraParameters::EFFECT_MONO[] = "mono";
+const char CameraParameters::EFFECT_NEGATIVE[] = "negative";
+const char CameraParameters::EFFECT_SOLARIZE[] = "solarize";
+const char CameraParameters::EFFECT_SEPIA[] = "sepia";
+const char CameraParameters::EFFECT_POSTERIZE[] = "posterize";
+const char CameraParameters::EFFECT_WHITEBOARD[] = "whiteboard";
+const char CameraParameters::EFFECT_BLACKBOARD[] = "blackboard";
+const char CameraParameters::EFFECT_AQUA[] = "aqua";
+
+// Values for antibanding settings.
+const char CameraParameters::ANTIBANDING_AUTO[] = "auto";
+const char CameraParameters::ANTIBANDING_50HZ[] = "50hz";
+const char CameraParameters::ANTIBANDING_60HZ[] = "60hz";
+const char CameraParameters::ANTIBANDING_OFF[] = "off";
+
+// Values for flash mode settings.
+const char CameraParameters::FLASH_MODE_OFF[] = "off";
+const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
+const char CameraParameters::FLASH_MODE_ON[] = "on";
+const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
+const char CameraParameters::FLASH_MODE_VIDEO_LIGHT[] = "video-light";
+
+// Values for scene mode settings.
+const char CameraParameters::SCENE_MODE_AUTO[] = "auto";
+const char CameraParameters::SCENE_MODE_ACTION[] = "action";
+const char CameraParameters::SCENE_MODE_PORTRAIT[] = "portrait";
+const char CameraParameters::SCENE_MODE_LANDSCAPE[] = "landscape";
+const char CameraParameters::SCENE_MODE_NIGHT[] = "night";
+const char CameraParameters::SCENE_MODE_NIGHT_PORTRAIT[] = "night-portrait";
+const char CameraParameters::SCENE_MODE_THEATRE[] = "theatre";
+const char CameraParameters::SCENE_MODE_BEACH[] = "beach";
+const char CameraParameters::SCENE_MODE_SNOW[] = "snow";
+const char CameraParameters::SCENE_MODE_SUNSET[] = "sunset";
+const char CameraParameters::SCENE_MODE_STEADYPHOTO[] = "steadyphoto";
+const char CameraParameters::SCENE_MODE_FIREWORKS[] = "fireworks";
+const char CameraParameters::SCENE_MODE_SPORTS[] = "sports";
+const char CameraParameters::SCENE_MODE_PARTY[] = "party";
+const char CameraParameters::SCENE_MODE_CANDLELIGHT[] = "candlelight";
+
+// Formats for setPreviewFormat and setPictureFormat.
+const char CameraParameters::PIXEL_FORMAT_YUV422SP[] = "yuv422sp";
+const char CameraParameters::PIXEL_FORMAT_YUV420SP[] = "yuv420sp";
+const char CameraParameters::PIXEL_FORMAT_YUV422I[] = "yuv422i-yuyv";
+const char CameraParameters::PIXEL_FORMAT_RGB565[] = "rgb565";
+const char CameraParameters::PIXEL_FORMAT_JPEG[] = "jpeg";
+
+// Values for focus mode settings.
+const char CameraParameters::FOCUS_MODE_AUTO[] = "auto";
+const char CameraParameters::FOCUS_MODE_INFINITY[] = "infinity";
+const char CameraParameters::FOCUS_MODE_MACRO[] = "macro";
+const char CameraParameters::FOCUS_MODE_FIXED[] = "fixed";
static const char* portrait = "portrait";
static const char* landscape = "landscape";
@@ -91,7 +188,7 @@
void CameraParameters::set(const char *key, const char *value)
{
- // XXX i think i can do this with strspn()
+ // XXX i think i can do this with strspn()
if (strchr(key, '=') || strchr(key, ';')) {
//XXX LOGE("Key \"%s\"contains invalid character (= or ;)", key);
return;
@@ -150,7 +247,7 @@
{
char str[32];
sprintf(str, "%dx%d", width, height);
- set("preview-size", str);
+ set(KEY_PREVIEW_SIZE, str);
}
void CameraParameters::getPreviewSize(int *width, int *height) const
@@ -159,7 +256,7 @@
*height = -1;
// Get the current string, if it doesn't exist, leave the -1x-1
- const char *p = get("preview-size");
+ const char *p = get(KEY_PREVIEW_SIZE);
if (p == 0)
return;
@@ -172,17 +269,17 @@
void CameraParameters::setPreviewFrameRate(int fps)
{
- set("preview-frame-rate", fps);
+ set(KEY_PREVIEW_FRAME_RATE, fps);
}
int CameraParameters::getPreviewFrameRate() const
{
- return getInt("preview-frame-rate");
+ return getInt(KEY_PREVIEW_FRAME_RATE);
}
void CameraParameters::setPreviewFormat(const char *format)
{
- set("preview-format", format);
+ set(KEY_PREVIEW_FORMAT, format);
}
int CameraParameters::getOrientation() const
@@ -196,22 +293,22 @@
void CameraParameters::setOrientation(int orientation)
{
if (orientation == CAMERA_ORIENTATION_PORTRAIT) {
- set("preview-format", portrait);
+ set("orientation", portrait);
} else {
- set("preview-format", landscape);
+ set("orientation", landscape);
}
}
const char *CameraParameters::getPreviewFormat() const
{
- return get("preview-format");
+ return get(KEY_PREVIEW_FORMAT);
}
void CameraParameters::setPictureSize(int width, int height)
{
char str[32];
sprintf(str, "%dx%d", width, height);
- set("picture-size", str);
+ set(KEY_PICTURE_SIZE, str);
}
void CameraParameters::getPictureSize(int *width, int *height) const
@@ -220,7 +317,7 @@
*height = -1;
// Get the current string, if it doesn't exist, leave the -1x-1
- const char *p = get("picture-size");
+ const char *p = get(KEY_PICTURE_SIZE);
if (p == 0)
return;
@@ -233,12 +330,12 @@
void CameraParameters::setPictureFormat(const char *format)
{
- set("picture-format", format);
+ set(KEY_PICTURE_FORMAT, format);
}
const char *CameraParameters::getPictureFormat() const
{
- return get("picture-format");
+ return get(KEY_PICTURE_FORMAT);
}
void CameraParameters::dump() const
diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java
index 170a9f8..aacae18 100644
--- a/services/java/com/android/server/TelephonyRegistry.java
+++ b/services/java/com/android/server/TelephonyRegistry.java
@@ -109,7 +109,13 @@
// handler before they get to app code.
TelephonyRegistry(Context context) {
- CellLocation.getEmpty().fillInNotifierBundle(mCellLocation);
+ CellLocation location = CellLocation.getEmpty();
+
+ // Note that location can be null for non-phone builds like
+ // like the generic one.
+ if (location != null) {
+ location.fillInNotifierBundle(mCellLocation);
+ }
mContext = context;
mBatteryStats = BatteryStatsService.getService();
}
diff --git a/telephony/java/android/telephony/NeighboringCellInfo.java b/telephony/java/android/telephony/NeighboringCellInfo.java
index f492abd..d698169 100644
--- a/telephony/java/android/telephony/NeighboringCellInfo.java
+++ b/telephony/java/android/telephony/NeighboringCellInfo.java
@@ -18,6 +18,15 @@
import android.os.Parcel;
import android.os.Parcelable;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
+
+
/**
* Represents the neighboring cell information, including
@@ -34,19 +43,53 @@
*/
static final public int UNKNOWN_CID = -1;
+ /**
+ * In GSM, mRssi is the Received RSSI;
+ * In UMTS, mRssi is the Level index of CPICH Received Signal Code Power
+ */
private int mRssi;
+ /**
+ * CID in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
+ */
private int mCid;
+ /**
+ * LAC in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
+ */
+ private int mLac;
+ /**
+ * Primary Scrambling Code in 9 bits format in UMTS
+ * Return UNKNOWN_CID in GSM and CMDA.
+ */
+ private int mPsc;
+ /**
+ * Radio network type, value is one of following
+ * TelephonyManager.NETWORK_TYPE_XXXXXX.
+ */
+ private int mNetworkType;
/**
+ * @deprecated
* Empty constructor. Initializes the RSSI and CID.
+ *
+ * NeighboringCellInfo is one time shot for the neighboring cells based on
+ * the radio network type at that moment. Its constructor needs radio network
+ * type.
*/
public NeighboringCellInfo() {
mRssi = UNKNOWN_RSSI;
+ mLac = UNKNOWN_CID;
mCid = UNKNOWN_CID;
+ mPsc = UNKNOWN_CID;
+ mNetworkType = NETWORK_TYPE_UNKNOWN;
}
/**
+ * @deprecated
* Initialize the object from rssi and cid.
+ *
+ * NeighboringCellInfo is one time shot for the neighboring cells based on
+ * the radio network type at that moment. Its constructor needs radio network
+ * type.
*/
public NeighboringCellInfo(int rssi, int cid) {
mRssi = rssi;
@@ -54,40 +97,148 @@
}
/**
+ * @hide
+ * Initialize the object from rssi, location string, and radioType
+ * radioType is one of following
+ * {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS},
+ * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE},
+ * {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
+ * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
+ * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
+ * and {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}.
+ */
+ public NeighboringCellInfo(int rssi, String location, int radioType) {
+ // set default value
+ mRssi = rssi;
+ mNetworkType = NETWORK_TYPE_UNKNOWN;
+ mPsc = UNKNOWN_CID;
+ mLac = UNKNOWN_CID;
+ mCid = UNKNOWN_CID;
+
+
+ // pad location string with leading "0"
+ int l = location.length();
+ if (l > 8) return;
+ if (l < 8) {
+ for (int i = 0; i < (8-l); i++) {
+ location = "0" + location;
+ }
+ }
+
+ try {// set LAC/CID or PSC based on radioType
+ switch (radioType) {
+ case NETWORK_TYPE_GPRS:
+ case NETWORK_TYPE_EDGE:
+ mNetworkType = radioType;
+ mLac = Integer.valueOf(location.substring(0, 4), 16);
+ mCid = Integer.valueOf(location.substring(4), 16);
+ break;
+ case NETWORK_TYPE_UMTS:
+ case NETWORK_TYPE_HSDPA:
+ case NETWORK_TYPE_HSUPA:
+ case NETWORK_TYPE_HSPA:
+ mNetworkType = radioType;
+ mPsc = Integer.valueOf(location, 16);
+ break;
+ }
+ } catch (NumberFormatException e) {
+ // parsing location error
+ mPsc = UNKNOWN_CID;
+ mLac = UNKNOWN_CID;
+ mCid = UNKNOWN_CID;
+ mNetworkType = NETWORK_TYPE_UNKNOWN;
+ }
+ }
+
+ /**
* Initialize the object from a parcel.
*/
public NeighboringCellInfo(Parcel in) {
mRssi = in.readInt();
+ mLac = in.readInt();
mCid = in.readInt();
+ mPsc = in.readInt();
+ mNetworkType = in.readInt();
}
/**
- * @return received signal strength in "asu", ranging from 0 - 31,
- * or UNKNOWN_RSSI if unknown
+ * @return received signal strength or UNKNOWN_RSSI if unknown
*
- * For GSM, dBm = -113 + 2*asu,
+ * For GSM, it is in "asu" ranging from 0 to 31 (dBm = -113 + 2*asu)
* 0 means "-113 dBm or less" and 31 means "-51 dBm or greater"
+ * For UMTS, it is the Level index of CPICH RSCP defined in TS 25.125
*/
public int getRssi() {
return mRssi;
}
/**
- * @return cell id, UNKNOWN_CID if unknown, 0xffffffff max legal value
+ * @return LAC in GSM, 0xffff max legal value
+ * UNKNOWN_CID if in UMTS or CMDA or unknown
+ */
+ public int getLac() {
+ return mLac;
+ }
+
+ /**
+ * @return cell id in GSM, 0xffff max legal value
+ * UNKNOWN_CID if in UMTS or CDMA or unknown
*/
public int getCid() {
return mCid;
}
/**
+ * @return Primary Scrambling Code in 9 bits format in UMTS, 0x1ff max value
+ * UNKNOWN_CID if in GSM or CMDA or unknown
+ */
+ public int getPsc() {
+ return mPsc;
+ }
+
+ /**
+ * @return Radio network type while neighboring cell location is stored.
+ *
+ * Return {@link TelephonyManager#NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_UNKNOWN}
+ * means that the location information is unavailable.
+ *
+ * Return {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS} or
+ * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE}
+ * means that Neighboring Cell information is stored for GSM network, in
+ * which {@link NeighboringCellInfo#getLac NeighboringCellInfo.getLac} and
+ * {@link NeighboringCellInfo#getCid NeighboringCellInfo.getCid} should be
+ * called to access location.
+ *
+ * Return {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
+ * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
+ * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
+ * or {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}
+ * means that Neighboring Cell information is stored for UMTS network, in
+ * which {@link NeighboringCellInfo#getPsc NeighboringCellInfo.getPsc}
+ * should be called to access location.
+ */
+ public int getNetworkType() {
+ return mNetworkType;
+ }
+ /**
+ * @deprecated
* Set the cell id.
+ *
+ * NeighboringCellInfo is a one time shot for the neighboring cells based on
+ * the radio network type at that moment. It shouldn't be changed after
+ * creation.
*/
public void setCid(int cid) {
mCid = cid;
}
/**
+ * @deprecated
* Set the signal strength of the cell.
+ *
+ * NeighboringCellInfo is a one time shot for the neighboring cells based on
+ * the radio network type at that moment. It shouldn't be changed after
+ * creation.
*/
public void setRssi(int rssi) {
mRssi = rssi;
@@ -95,8 +246,20 @@
@Override
public String toString() {
- return "["+ ((mCid == UNKNOWN_CID) ? "/" : Integer.toHexString(mCid))
- + " at " + ((mRssi == UNKNOWN_RSSI)? "/" : mRssi) + "]";
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("[");
+ if (mPsc != UNKNOWN_CID) {
+ sb.append(Integer.toHexString(mPsc))
+ .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
+ } else if(mLac != UNKNOWN_CID && mCid != UNKNOWN_CID) {
+ sb.append(Integer.toHexString(mLac))
+ .append(Integer.toHexString(mCid))
+ .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
+ }
+ sb.append("]");
+
+ return sb.toString();
}
public int describeContents() {
@@ -105,7 +268,10 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mRssi);
+ dest.writeInt(mLac);
dest.writeInt(mCid);
+ dest.writeInt(mPsc);
+ dest.writeInt(mNetworkType);
}
public static final Parcelable.Creator<NeighboringCellInfo> CREATOR
@@ -118,6 +284,4 @@
return new NeighboringCellInfo[size];
}
};
-}
-
-
+}
\ No newline at end of file
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 6664b08..fb96b2a 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -254,13 +254,13 @@
* (@link android.Manifest.permission#ACCESS_COARSE_UPDATES}
*/
public List<NeighboringCellInfo> getNeighboringCellInfo() {
- try {
- return getITelephony().getNeighboringCellInfo();
- } catch (RemoteException ex) {
- return null;
- } catch (NullPointerException ex) {
- return null;
- }
+ try {
+ return getITelephony().getNeighboringCellInfo();
+ } catch (RemoteException ex) {
+ return null;
+ } catch (NullPointerException ex) {
+ return null;
+ }
}
/** No phone radio. */
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index d1b446b..f3b59a8 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -17,6 +17,14 @@
package com.android.internal.telephony;
import static com.android.internal.telephony.RILConstants.*;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -30,6 +38,7 @@
import android.os.Message;
import android.os.Parcel;
import android.os.PowerManager;
+import android.os.SystemProperties;
import android.os.PowerManager.WakeLock;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneNumberUtils;
@@ -2876,21 +2885,44 @@
private Object
responseCellList(Parcel p) {
- int num;
+ int num, rssi;
+ String location;
ArrayList<NeighboringCellInfo> response;
NeighboringCellInfo cell;
num = p.readInt();
- response = new ArrayList<NeighboringCellInfo>(num);
+ response = new ArrayList<NeighboringCellInfo>();
- for (int i = 0 ; i < num ; i++) {
- int rssi = p.readInt();
- int cid = Integer.valueOf(p.readString(), 16);
- cell = new NeighboringCellInfo(rssi, cid);
- response.add(cell);
+ // Determine the radio access type
+ String radioString = SystemProperties.get(
+ TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, "unknown");
+ int radioType;
+ if (radioString.equals("GPRS")) {
+ radioType = NETWORK_TYPE_GPRS;
+ } else if (radioString.equals("EDGE")) {
+ radioType = NETWORK_TYPE_EDGE;
+ } else if (radioString.equals("UMTS")) {
+ radioType = NETWORK_TYPE_UMTS;
+ } else if (radioString.equals("HSDPA")) {
+ radioType = NETWORK_TYPE_HSDPA;
+ } else if (radioString.equals("HSUPA")) {
+ radioType = NETWORK_TYPE_HSUPA;
+ } else if (radioString.equals("HSPA")) {
+ radioType = NETWORK_TYPE_HSPA;
+ } else {
+ radioType = NETWORK_TYPE_UNKNOWN;
}
- return response;
+ // Interpret the location based on radio access type
+ if (radioType != NETWORK_TYPE_UNKNOWN) {
+ for (int i = 0 ; i < num ; i++) {
+ rssi = p.readInt();
+ location = p.readString();
+ cell = new NeighboringCellInfo(rssi, location, radioType);
+ response.add(cell);
+ }
+ }
+ return response;
}
private Object responseGmsBroadcastConfig(Parcel p) {
diff --git a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java b/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
index 2bdf1dd..7252aa9 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
@@ -15,41 +15,65 @@
*/
package com.android.unit_tests;
+import android.os.Parcel;
import android.test.AndroidTestCase;
import android.telephony.NeighboringCellInfo;
import android.test. suitebuilder.annotation.SmallTest;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+
public class NeighboringCellInfoTest extends AndroidTestCase {
@SmallTest
public void testConstructor() {
- NeighboringCellInfo empty = new NeighboringCellInfo();
- assertEquals(NeighboringCellInfo.UNKNOWN_RSSI, empty.getRssi());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, empty.getCid());
-
int rssi = 31;
- int cid = 0xffffffff;
- NeighboringCellInfo max = new NeighboringCellInfo(rssi, cid);
- assertEquals(rssi, max.getRssi());
- assertEquals(cid, max.getCid());
- }
+ NeighboringCellInfo nc;
- @SmallTest
- public void testGetAndSet() {
- int rssi = 16;
- int cid = 0x12345678;
- NeighboringCellInfo nc = new NeighboringCellInfo();
- nc.setRssi(rssi);
- nc.setCid(cid);
+ nc = new NeighboringCellInfo(rssi, "FFFFFFF", NETWORK_TYPE_EDGE);
+ assertEquals(NETWORK_TYPE_EDGE, nc.getNetworkType());
assertEquals(rssi, nc.getRssi());
- assertEquals(cid, nc.getCid());
+ assertEquals(0xfff, nc.getLac());
+ assertEquals(0xffff, nc.getCid());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
+
+ nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UMTS);
+ assertEquals(NETWORK_TYPE_UMTS, nc.getNetworkType());
+ assertEquals(rssi, nc.getRssi());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
+ assertEquals(0x1ff, nc.getPsc());
+
+ nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UNKNOWN);
+ assertEquals(NETWORK_TYPE_UNKNOWN, nc.getNetworkType());
+ assertEquals(rssi, nc.getRssi());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
}
@SmallTest
- public void testToString() {
- NeighboringCellInfo empty = new NeighboringCellInfo();
- assertEquals("[/ at /]", empty.toString());
+ public void testParcel() {
+ int rssi = 20;
- NeighboringCellInfo nc = new NeighboringCellInfo(16, 0x12345678);
- assertEquals("[12345678 at 16]", nc.toString());
- }
+ NeighboringCellInfo nc = new NeighboringCellInfo(rssi, "12345678", NETWORK_TYPE_GPRS);
+ assertEquals(NETWORK_TYPE_GPRS, nc.getNetworkType());
+ assertEquals(rssi, nc.getRssi());
+ assertEquals(0x1234, nc.getLac());
+ assertEquals(0x5678, nc.getCid());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
+
+ Parcel p = Parcel.obtain();
+ p.setDataPosition(0);
+ nc.writeToParcel(p, 0);
+
+ p.setDataPosition(0);
+ NeighboringCellInfo nw = new NeighboringCellInfo(p);
+ assertEquals(NETWORK_TYPE_GPRS, nw.getNetworkType());
+ assertEquals(rssi, nw.getRssi());
+ assertEquals(0x1234, nw.getLac());
+ assertEquals(0x5678, nw.getCid());
+ assertEquals(NeighboringCellInfo.UNKNOWN_CID, nw.getPsc());
+ }
}