Merge "Handle Surface::lock errors in TextureView Bug #8689535"
diff --git a/Android.mk b/Android.mk
index ef6fb91..ae098b2 100644
--- a/Android.mk
+++ b/Android.mk
@@ -250,7 +250,7 @@
$(framework_res_source_path)/com/android/internal/R.java
LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := bouncycastle core core-junit ext okhttp
+LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt core core-junit ext okhttp
LOCAL_MODULE := framework
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
@@ -412,19 +412,24 @@
$(FRAMEWORKS_BASE_JAVA_SRC_DIRS)
framework_docs_LOCAL_INTERMEDIATE_SOURCES := \
- $(framework_res_source_path)/android/R.java \
- $(framework_res_source_path)/android/Manifest.java \
- $(framework_res_source_path)/com/android/internal/R.java
+ $(framework_res_source_path)/android/R.java \
+ $(framework_res_source_path)/android/Manifest.java \
+ $(framework_res_source_path)/com/android/internal/R.java
+
+framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES := \
+ bouncycastle \
+ conscrypt \
+ core \
+ okhttp \
+ ext \
+ framework \
+ mms-common \
+ telephony-common \
+ voip-common
framework_docs_LOCAL_JAVA_LIBRARIES := \
- bouncycastle \
- core \
- okhttp \
- ext \
- framework \
- mms-common \
- telephony-common \
- voip-common \
+ $(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES) \
+ $(FRAMEWORKS_SUPPORT_JAVA_LIBRARIES)
framework_docs_LOCAL_MODULE_CLASS := JAVA_LIBRARIES
framework_docs_LOCAL_DROIDDOC_HTML_DIR := docs/html
@@ -453,7 +458,12 @@
-werror -hide 113 \
-overview $(LOCAL_PATH)/core/java/overview.html
-framework_docs_LOCAL_ADDITIONAL_JAVA_DIR:= $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)
+framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR:= \
+ $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)
+
+framework_docs_LOCAL_ADDITIONAL_JAVA_DIR:= \
+ $(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR) \
+ $(foreach lib,$(FRAMEWORKS_SUPPORT_JAVA_LIBRARIES),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON))
framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES := \
frameworks/base/docs/knowntags.txt
@@ -575,11 +585,11 @@
LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
LOCAL_INTERMEDIATE_SOURCES:=$(framework_docs_LOCAL_INTERMEDIATE_SOURCES)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES)
+LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_ADDITIONAL_JAVA_DIR)
+LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
LOCAL_MODULE := api-stubs
diff --git a/api/current.txt b/api/current.txt
index bdeb5b4..c1c550d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6480,7 +6480,6 @@
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int TYPE_BOOLEAN = 1; // 0x1
field public static final int TYPE_CHOICE = 2; // 0x2
- field public static final int TYPE_CHOICE_LEVEL = 3; // 0x3
field public static final int TYPE_MULTI_SELECT = 4; // 0x4
field public static final int TYPE_NULL = 0; // 0x0
}
@@ -7168,7 +7167,7 @@
package android.content.res {
- public class AssetFileDescriptor implements android.os.Parcelable {
+ public class AssetFileDescriptor implements java.io.Closeable android.os.Parcelable {
ctor public AssetFileDescriptor(android.os.ParcelFileDescriptor, long, long);
method public void close() throws java.io.IOException;
method public java.io.FileInputStream createInputStream() throws java.io.IOException;
@@ -12409,7 +12408,7 @@
method public android.database.Cursor getCursor();
method public static int getDefaultType(android.net.Uri);
method public static android.net.Uri getDefaultUri(int);
- method public boolean getIncludeDrm();
+ method public deprecated boolean getIncludeDrm();
method public android.media.Ringtone getRingtone(int);
method public static android.media.Ringtone getRingtone(android.content.Context, android.net.Uri);
method public int getRingtonePosition(android.net.Uri);
@@ -12419,14 +12418,14 @@
method public int inferStreamType();
method public static boolean isDefault(android.net.Uri);
method public static void setActualDefaultRingtoneUri(android.content.Context, int, android.net.Uri);
- method public void setIncludeDrm(boolean);
+ method public deprecated void setIncludeDrm(boolean);
method public void setStopPreviousRingtone(boolean);
method public void setType(int);
method public void stopPreviousRingtone();
field public static final java.lang.String ACTION_RINGTONE_PICKER = "android.intent.action.RINGTONE_PICKER";
field public static final java.lang.String EXTRA_RINGTONE_DEFAULT_URI = "android.intent.extra.ringtone.DEFAULT_URI";
field public static final java.lang.String EXTRA_RINGTONE_EXISTING_URI = "android.intent.extra.ringtone.EXISTING_URI";
- field public static final java.lang.String EXTRA_RINGTONE_INCLUDE_DRM = "android.intent.extra.ringtone.INCLUDE_DRM";
+ field public static final deprecated java.lang.String EXTRA_RINGTONE_INCLUDE_DRM = "android.intent.extra.ringtone.INCLUDE_DRM";
field public static final java.lang.String EXTRA_RINGTONE_PICKED_URI = "android.intent.extra.ringtone.PICKED_URI";
field public static final java.lang.String EXTRA_RINGTONE_SHOW_DEFAULT = "android.intent.extra.ringtone.SHOW_DEFAULT";
field public static final java.lang.String EXTRA_RINGTONE_SHOW_SILENT = "android.intent.extra.ringtone.SHOW_SILENT";
@@ -17652,7 +17651,6 @@
method public java.lang.String getUserName();
method public android.os.Bundle getUserRestrictions();
method public android.os.Bundle getUserRestrictions(android.os.UserHandle);
- method public boolean isLinkedUser();
method public boolean isUserAGoat();
method public boolean isUserRunning(android.os.UserHandle);
method public boolean isUserRunningOrStopping(android.os.UserHandle);
@@ -21237,8 +21235,9 @@
public abstract class NotificationListenerService extends android.app.Service {
ctor public NotificationListenerService();
- method public final void clearAllNotifications();
- method public final void clearNotification(java.lang.String, java.lang.String, int);
+ method public final void cancelAllNotifications();
+ method public final void cancelNotification(java.lang.String, java.lang.String, int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.os.IBinder onBind(android.content.Intent);
method public abstract void onNotificationPosted(android.service.notification.StatusBarNotification);
method public abstract void onNotificationRemoved(android.service.notification.StatusBarNotification);
@@ -21250,17 +21249,16 @@
ctor public StatusBarNotification(android.os.Parcel);
method public android.service.notification.StatusBarNotification clone();
method public int describeContents();
+ method public int getId();
+ method public android.app.Notification getNotification();
+ method public java.lang.String getPackageName();
+ method public long getPostTime();
+ method public java.lang.String getTag();
method public int getUserId();
method public boolean isClearable();
method public boolean isOngoing();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
- field public final int id;
- field public final android.app.Notification notification;
- field public final java.lang.String pkg;
- field public final long postTime;
- field public final java.lang.String tag;
- field public final android.os.UserHandle user;
}
}
diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java
index e43501c..bb26443 100644
--- a/cmds/input/src/com/android/commands/input/Input.java
+++ b/cmds/input/src/com/android/commands/input/Input.java
@@ -56,13 +56,19 @@
return;
}
} else if (command.equals("keyevent")) {
- if (args.length == 2) {
- int keyCode = KeyEvent.keyCodeFromString(args[1]);
- if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
- keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[1]);
+ if (args.length >= 2) {
+ final boolean longpress = "--longpress".equals(args[1]);
+ final int start = longpress ? 2 : 1;
+ if (args.length > start) {
+ for (int i = start; i < args.length; i++) {
+ int keyCode = KeyEvent.keyCodeFromString(args[i]);
+ if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
+ keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]);
+ }
+ sendKeyEvent(keyCode, longpress);
+ }
+ return;
}
- sendKeyEvent(keyCode);
- return;
}
} else if (command.equals("tap")) {
if (args.length == 3) {
@@ -166,10 +172,15 @@
}
}
- private void sendKeyEvent(int keyCode) {
+ private void sendKeyEvent(int keyCode, boolean longpress) {
long now = SystemClock.uptimeMillis();
injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
+ if (longpress) {
+ injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 1, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_LONG_PRESS,
+ InputDevice.SOURCE_KEYBOARD));
+ }
injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
}
@@ -237,7 +248,7 @@
DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID,
DEFAULT_EDGE_FLAGS);
event.setSource(inputSource);
- Log.i("Input", "injectMotionEvent: " + event);
+ Log.i(TAG, "injectMotionEvent: " + event);
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
@@ -249,7 +260,7 @@
private void showUsage() {
System.err.println("usage: input ...");
System.err.println(" input text <string>");
- System.err.println(" input keyevent <key code number or name>");
+ System.err.println(" input keyevent [--longpress] <key code number or name> ...");
System.err.println(" input [touchscreen|touchpad|touchnavigation] tap <x> <y>");
System.err.println(" input [touchscreen|touchpad|touchnavigation] swipe "
+ "<x1> <y1> <x2> <y2> [duration(ms)]");
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 7e21db3..de58a33 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -378,23 +378,6 @@
/**
* Creates a new instance.
*
- * @param isAutomation Whether this is a test automation service.
- *
- * @hide
- */
- public AccessibilityServiceInfo(boolean isAutomation) {
- // Automation service can do anything.
- if (isAutomation) {
- mCapabilities |= CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
- | CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
- | CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
- | CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
- }
- }
-
- /**
- * Creates a new instance.
- *
* @param resolveInfo The service resolve info.
* @param context Context for accessing resources.
* @throws XmlPullParserException If a XML parsing error occurs.
@@ -461,8 +444,8 @@
mCapabilities |= CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
- .AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
- mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
+ .AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
+ mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
.AccessibilityService_canRequestFilterKeyEvents, false)) {
@@ -574,6 +557,23 @@
}
/**
+ * Sets the bit mask of capabilities this accessibility service has such as
+ * being able to retrieve the active window content, etc.
+ *
+ * @param capabilities The capability bit mask.
+ *
+ * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+ * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+ * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+ * @see #CAPABILITY_FILTER_KEY_EVENTS
+ *
+ * @hide
+ */
+ public void setCapabilities(int capabilities) {
+ mCapabilities = capabilities;
+ }
+
+ /**
* Gets the non-localized description of the accessibility service.
* <p>
* <strong>Statically set from
diff --git a/core/java/android/animation/ObjectAnimator.java b/core/java/android/animation/ObjectAnimator.java
index 173ee73..9c88ccf 100644
--- a/core/java/android/animation/ObjectAnimator.java
+++ b/core/java/android/animation/ObjectAnimator.java
@@ -123,9 +123,37 @@
* in a call to the function <code>setFoo()</code> on the target object. If either
* <code>valueFrom</code> or <code>valueTo</code> is null, then a getter function will
* also be derived and called.
+ *
+ * <p>If this animator was created with a {@link Property} object instead of the
+ * string name of a property, then this method will return the {@link
+ * Property#getName() name} of that Property object instead. If this animator was
+ * created with one or more {@link PropertyValuesHolder} objects, then this method
+ * will return the {@link PropertyValuesHolder#getPropertyName() name} of that
+ * object (if there was just one) or a comma-separated list of all of the
+ * names (if there are more than one).</p>
*/
public String getPropertyName() {
- return mPropertyName;
+ String propertyName = null;
+ if (mPropertyName != null) {
+ propertyName = mPropertyName;
+ } else if (mProperty != null) {
+ propertyName = mProperty.getName();
+ } else if (mValues != null && mValues.length > 0) {
+ for (int i = 0; i < mValues.length; ++i) {
+ if (i == 0) {
+ propertyName = "";
+ } else {
+ propertyName += ",";
+ }
+ propertyName += mValues[i].getPropertyName();
+ }
+ }
+ return propertyName;
+ }
+
+ @Override
+ String getNameForTrace() {
+ return "animator:" + getPropertyName();
}
/**
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index cb44264..f8ae616 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -869,7 +869,7 @@
*
* <p>If this ValueAnimator has only one set of values being animated between, this evaluator
* will be used for that set. If there are several sets of values being animated, which is
- * the case if PropertyValuesHOlder objects were set on the ValueAnimator, then the evaluator
+ * the case if PropertyValuesHolder objects were set on the ValueAnimator, then the evaluator
* is assigned just to the first PropertyValuesHolder object.</p>
*
* @param value the evaluator to be used this animation
@@ -1024,7 +1024,7 @@
mStarted = false;
mStartListenersCalled = false;
mPlayingBackwards = false;
- Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "animator",
+ Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, getNameForTrace(),
System.identityHashCode(this));
}
@@ -1033,7 +1033,7 @@
* called on the UI thread.
*/
private void startAnimation(AnimationHandler handler) {
- Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "animator",
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, getNameForTrace(),
System.identityHashCode(this));
initAnimation();
handler.mAnimations.add(this);
@@ -1045,6 +1045,14 @@
}
/**
+ * Returns the name of this animator for debugging purposes.
+ */
+ String getNameForTrace() {
+ return "animator";
+ }
+
+
+ /**
* Internal function called to process an animation frame on an animation that is currently
* sleeping through its <code>startDelay</code> phase. The return value indicates whether it
* should be woken up and put on the active animations queue.
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index d4056c9..4268fa6 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -92,8 +92,7 @@
import com.android.internal.os.RuntimeInit;
import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.util.Objects;
-
-import org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl;
+import com.android.org.conscrypt.OpenSSLSocketImpl;
import java.io.File;
import java.io.FileDescriptor;
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 92ec3ad..9f933ca 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -44,6 +44,8 @@
void registerListener(in INotificationListener listener, in ComponentName component, int userid);
void unregisterListener(in INotificationListener listener, int userid);
- void clearNotificationFromListener(in INotificationListener token, String pkg, String tag, int id);
- void clearAllNotificationsFromListener(in INotificationListener token);
+ void cancelNotificationFromListener(in INotificationListener token, String pkg, String tag, int id);
+ void cancelAllNotificationsFromListener(in INotificationListener token);
+
+ StatusBarNotification[] getActiveNotificationsFromListener(in INotificationListener token);
}
\ No newline at end of file
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 5bc17fa..607930c 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -158,11 +158,15 @@
private void registerUiTestAutomationServiceLocked(IAccessibilityServiceClient client) {
IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
- AccessibilityServiceInfo info = new AccessibilityServiceInfo(true);
+ AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
| AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
+ info.setCapabilities(AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS);
try {
// Calling out with a lock held is fine since if the system
// process is gone the client calling in will be killed.
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 3498bb8..cfbfb48 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1434,7 +1434,7 @@
* <p>Results of the scan are reported using the
* {@link LeScanCallback#onLeScan} callback.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param callback the callback LE scan results are delivered
* @return true, if the scan was started successfully
@@ -1450,7 +1450,7 @@
* <p>Devices which advertise all specified services are reported using the
* {@link LeScanCallback#onLeScan} callback.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param serviceUuids Array of services to look for
* @param callback the callback LE scan results are delivered
@@ -1490,7 +1490,7 @@
/**
* Stops an ongoing Bluetooth LE device scan.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param callback used to identify which scan to stop
* must be the same handle used to start the scan
diff --git a/core/java/android/bluetooth/BluetoothOutputStream.java b/core/java/android/bluetooth/BluetoothOutputStream.java
index 62242a2..117dd47 100644
--- a/core/java/android/bluetooth/BluetoothOutputStream.java
+++ b/core/java/android/bluetooth/BluetoothOutputStream.java
@@ -84,4 +84,15 @@
}
mSocket.write(b, offset, count);
}
+ /**
+ * Wait until the data in sending queue is emptied. A polling version
+ * for flush implementation. Use it to ensure the writing data afterwards will
+ * be packed in the new RFCOMM frame.
+ * @throws IOException
+ * if an i/o error occurs.
+ * @since Android 4.2.3
+ */
+ public void flush() throws IOException {
+ mSocket.flush();
+ }
}
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index 8029a1a..a19341c 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -192,6 +192,7 @@
if (VDBG) Log.d(TAG, "socket fd passed by stack fds: " + fds);
if(fds == null || fds.length != 1) {
Log.e(TAG, "socket fd passed from stack failed, fds: " + fds);
+ as.close();
throw new IOException("bt socket acept failed");
}
as.mSocket = new LocalSocket(fds[0]);
@@ -407,6 +408,17 @@
if (VDBG) Log.d(TAG, "available: " + mSocketIS);
return mSocketIS.available();
}
+ /**
+ * Wait until the data in sending queue is emptied. A polling version
+ * for flush implementation. Used to ensure the writing data afterwards will
+ * be packed in new RFCOMM frame.
+ * @throws IOException
+ * if an i/o error occurs.
+ */
+ /*package*/ void flush() throws IOException {
+ if (VDBG) Log.d(TAG, "flush: " + mSocketOS);
+ mSocketOS.flush();
+ }
/*package*/ int read(byte[] b, int offset, int length) throws IOException {
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index fefd343..b3f0d96 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -220,6 +220,7 @@
// Always log queries which take 500ms+; shorter queries are
// sampled accordingly.
+ private static final boolean ENABLE_CONTENT_SAMPLE = false;
private static final int SLOW_THRESHOLD_MILLIS = 500;
private final Random mRandom = new Random(); // guarded by itself
@@ -1832,6 +1833,7 @@
private void maybeLogQueryToEventLog(long durationMillis,
Uri uri, String[] projection,
String selection, String sortOrder) {
+ if (!ENABLE_CONTENT_SAMPLE) return;
int samplePercent = samplePercentForDuration(durationMillis);
if (samplePercent < 100) {
synchronized (mRandom) {
@@ -1871,6 +1873,7 @@
private void maybeLogUpdateToEventLog(
long durationMillis, Uri uri, String operation, String selection) {
+ if (!ENABLE_CONTENT_SAMPLE) return;
int samplePercent = samplePercentForDuration(durationMillis);
if (samplePercent < 100) {
synchronized (mRandom) {
diff --git a/core/java/android/content/RestrictionEntry.java b/core/java/android/content/RestrictionEntry.java
index af90385..217cf76 100644
--- a/core/java/android/content/RestrictionEntry.java
+++ b/core/java/android/content/RestrictionEntry.java
@@ -60,6 +60,7 @@
* and the corresponding values, respectively.
* The presentation could imply that values in lower array indices are included when a
* particular value is chosen.
+ * @hide
*/
public static final int TYPE_CHOICE_LEVEL = 3;
@@ -102,7 +103,7 @@
private String[] currentValues;
/**
- * Constructor for {@link #TYPE_CHOICE} and {@link #TYPE_CHOICE_LEVEL} types.
+ * Constructor for {@link #TYPE_CHOICE} type.
* @param key the unique key for this restriction
* @param selectedString the current value
*/
@@ -206,7 +207,7 @@
* shown to the user. Values will be chosen from this list as the user's selection and the
* selected values can be retrieved by a call to {@link #getAllSelectedStrings()}, or
* {@link #getSelectedString()}, depending on whether it is a multi-select type or choice type.
- * This method is not relevant for types other than {@link #TYPE_CHOICE_LEVEL},
+ * This method is not relevant for types other than
* {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
* @param choiceValues an array of Strings which will be the selected values for the user's
* selections.
@@ -241,7 +242,7 @@
* user selects one or more of these choices, the corresponding value from the possible values
* are stored as the selected strings. The size of this array must match the size of the array
* set in {@link #setChoiceValues(String[])}. This method is not relevant for types other
- * than {@link #TYPE_CHOICE_LEVEL}, {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
+ * than {@link #TYPE_CHOICE}, and {@link #TYPE_MULTI_SELECT}.
* @param choiceEntries the list of user-visible choices.
* @see #setChoiceValues(String[])
*/
diff --git a/core/java/android/content/res/AssetFileDescriptor.java b/core/java/android/content/res/AssetFileDescriptor.java
index 7d46710..e4cc77f 100644
--- a/core/java/android/content/res/AssetFileDescriptor.java
+++ b/core/java/android/content/res/AssetFileDescriptor.java
@@ -20,6 +20,7 @@
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
+import java.io.Closeable;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -30,7 +31,7 @@
* opened FileDescriptor that can be used to read the data, as well as the
* offset and length of that entry's data in the file.
*/
-public class AssetFileDescriptor implements Parcelable {
+public class AssetFileDescriptor implements Parcelable, Closeable {
/**
* Length used with {@link #AssetFileDescriptor(ParcelFileDescriptor, long, long)}
* and {@link #getDeclaredLength} when a length has not been declared. This means
@@ -122,6 +123,7 @@
/**
* Convenience for calling <code>getParcelFileDescriptor().close()</code>.
*/
+ @Override
public void close() throws IOException {
mFd.close();
}
diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java
index a62b660..e3362a7 100644
--- a/core/java/android/hardware/location/GeofenceHardwareImpl.java
+++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java
@@ -48,11 +48,11 @@
private final Context mContext;
private static GeofenceHardwareImpl sInstance;
private PowerManager.WakeLock mWakeLock;
- private SparseArray<IGeofenceHardwareCallback> mGeofences =
+ private final SparseArray<IGeofenceHardwareCallback> mGeofences =
new SparseArray<IGeofenceHardwareCallback>();
- private ArrayList<IGeofenceHardwareMonitorCallback>[] mCallbacks =
+ private final ArrayList<IGeofenceHardwareMonitorCallback>[] mCallbacks =
new ArrayList[GeofenceHardware.NUM_MONITORS];
- private ArrayList<Reaper> mReapers = new ArrayList<Reaper>();
+ private final ArrayList<Reaper> mReapers = new ArrayList<Reaper>();
private IGpsGeofenceHardware mGpsService;
@@ -64,9 +64,7 @@
private static final int REMOVE_GEOFENCE_CALLBACK = 3;
private static final int PAUSE_GEOFENCE_CALLBACK = 4;
private static final int RESUME_GEOFENCE_CALLBACK = 5;
- private static final int ADD_GEOFENCE = 6;
- private static final int REMOVE_GEOFENCE = 7;
- private static final int GEOFENCE_CALLBACK_BINDER_DIED = 8;
+ private static final int GEOFENCE_CALLBACK_BINDER_DIED = 6;
// mCallbacksHandler message types
private static final int GPS_GEOFENCE_STATUS = 1;
@@ -186,17 +184,22 @@
// This API is not thread safe. Operations on the same geofence need to be serialized
// by upper layers
if (DEBUG) {
- Log.d(TAG, "addCircularFence: GeofenceId: " + geofenceId + "Latitude: " + latitude +
- "Longitude: " + longitude + "Radius: " + radius + "LastTransition: "
- + lastTransition + "MonitorTransition: " + monitorTransitions +
- "NotificationResponsiveness: " + notificationResponsivenes +
- "UnKnown Timer: " + unknownTimer + "MonitoringType: " + monitoringType);
+ Log.d(TAG, "addCircularFence: GeofenceId: " + geofenceId + " Latitude: " + latitude +
+ " Longitude: " + longitude + " Radius: " + radius + " LastTransition: "
+ + lastTransition + " MonitorTransition: " + monitorTransitions +
+ " NotificationResponsiveness: " + notificationResponsivenes +
+ " UnKnown Timer: " + unknownTimer + " MonitoringType: " + monitoringType);
}
boolean result;
- Message m = mGeofenceHandler.obtainMessage(ADD_GEOFENCE, callback);
- m.arg1 = geofenceId;
- mGeofenceHandler.sendMessage(m);
+
+ // The callback must be added before addCircularHardwareGeofence is called otherwise the
+ // callback might not be called after the geofence is added in the geofence hardware.
+ // This also means that the callback must be removed if the addCircularHardwareGeofence
+ // operations is not called or fails.
+ synchronized (mGeofences) {
+ mGeofences.put(geofenceId, callback);
+ }
switch (monitoringType) {
case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE:
@@ -214,13 +217,13 @@
result = false;
}
if (result) {
- m = mReaperHandler.obtainMessage(REAPER_GEOFENCE_ADDED, callback);
+ Message m = mReaperHandler.obtainMessage(REAPER_GEOFENCE_ADDED, callback);
m.arg1 = monitoringType;
mReaperHandler.sendMessage(m);
} else {
- m = mGeofenceHandler.obtainMessage(REMOVE_GEOFENCE);
- m.arg1 = geofenceId;
- mGeofenceHandler.sendMessage(m);
+ synchronized (mGeofences) {
+ mGeofences.remove(geofenceId);
+ }
}
if (DEBUG) Log.d(TAG, "addCircularFence: Result is: " + result);
@@ -232,6 +235,12 @@
// by upper layers
if (DEBUG) Log.d(TAG, "Remove Geofence: GeofenceId: " + geofenceId);
boolean result = false;
+
+ synchronized (mGeofences) {
+ if (mGeofences.get(geofenceId) == null) {
+ throw new IllegalArgumentException("Geofence " + geofenceId + " not registered.");
+ }
+ }
switch (monitoringType) {
case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE:
if (mGpsService == null) return false;
@@ -254,6 +263,11 @@
// by upper layers
if (DEBUG) Log.d(TAG, "Pause Geofence: GeofenceId: " + geofenceId);
boolean result;
+ synchronized (mGeofences) {
+ if (mGeofences.get(geofenceId) == null) {
+ throw new IllegalArgumentException("Geofence " + geofenceId + " not registered.");
+ }
+ }
switch (monitoringType) {
case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE:
if (mGpsService == null) return false;
@@ -277,6 +291,11 @@
// by upper layers
if (DEBUG) Log.d(TAG, "Resume Geofence: GeofenceId: " + geofenceId);
boolean result;
+ synchronized (mGeofences) {
+ if (mGeofences.get(geofenceId) == null) {
+ throw new IllegalArgumentException("Geofence " + geofenceId + " not registered.");
+ }
+ }
switch (monitoringType) {
case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE:
if (mGpsService == null) return false;
@@ -446,18 +465,11 @@
int status;
IGeofenceHardwareCallback callback;
switch (msg.what) {
- case ADD_GEOFENCE:
- geofenceId = msg.arg1;
- callback = (IGeofenceHardwareCallback) msg.obj;
- mGeofences.put(geofenceId, callback);
- break;
- case REMOVE_GEOFENCE:
- geofenceId = msg.arg1;
- mGeofences.remove(geofenceId);
- break;
case ADD_GEOFENCE_CALLBACK:
geofenceId = msg.arg1;
- callback = mGeofences.get(geofenceId);
+ synchronized (mGeofences) {
+ callback = mGeofences.get(geofenceId);
+ }
if (callback == null) return;
try {
@@ -467,19 +479,25 @@
break;
case REMOVE_GEOFENCE_CALLBACK:
geofenceId = msg.arg1;
- callback = mGeofences.get(geofenceId);
+ synchronized (mGeofences) {
+ callback = mGeofences.get(geofenceId);
+ }
if (callback == null) return;
try {
callback.onGeofenceRemove(geofenceId, msg.arg2);
} catch (RemoteException e) {}
- mGeofences.remove(geofenceId);
+ synchronized (mGeofences) {
+ mGeofences.remove(geofenceId);
+ }
releaseWakeLock();
break;
case PAUSE_GEOFENCE_CALLBACK:
geofenceId = msg.arg1;
- callback = mGeofences.get(geofenceId);
+ synchronized (mGeofences) {
+ callback = mGeofences.get(geofenceId);
+ }
if (callback == null) return;
try {
@@ -490,7 +508,9 @@
case RESUME_GEOFENCE_CALLBACK:
geofenceId = msg.arg1;
- callback = mGeofences.get(geofenceId);
+ synchronized (mGeofences) {
+ callback = mGeofences.get(geofenceId);
+ }
if (callback == null) return;
try {
@@ -501,12 +521,14 @@
case GEOFENCE_TRANSITION_CALLBACK:
GeofenceTransition geofenceTransition = (GeofenceTransition)(msg.obj);
- callback = mGeofences.get(geofenceTransition.mGeofenceId);
+ synchronized (mGeofences) {
+ callback = mGeofences.get(geofenceTransition.mGeofenceId);
+ }
if (DEBUG) Log.d(TAG, "GeofenceTransistionCallback: GPS : GeofenceId: " +
geofenceTransition.mGeofenceId +
- "Transition: " + geofenceTransition.mTransition +
- "Location: " + geofenceTransition.mLocation + ":" + mGeofences);
+ " Transition: " + geofenceTransition.mTransition +
+ " Location: " + geofenceTransition.mLocation + ":" + mGeofences);
try {
callback.onGeofenceTransition(
@@ -521,12 +543,14 @@
callback = (IGeofenceHardwareCallback) (msg.obj);
if (DEBUG) Log.d(TAG, "Geofence callback reaped:" + callback);
int monitoringType = msg.arg1;
- for (int i = 0; i < mGeofences.size(); i++) {
- if (mGeofences.valueAt(i).equals(callback)) {
- geofenceId = mGeofences.keyAt(i);
- removeGeofence(mGeofences.keyAt(i), monitoringType);
- mGeofences.remove(geofenceId);
- }
+ synchronized (mGeofences) {
+ for (int i = 0; i < mGeofences.size(); i++) {
+ if (mGeofences.valueAt(i).equals(callback)) {
+ geofenceId = mGeofences.keyAt(i);
+ removeGeofence(mGeofences.keyAt(i), monitoringType);
+ mGeofences.remove(geofenceId);
+ }
+ }
}
}
}
diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java
index 6c36a7d..8e129cb 100644
--- a/core/java/android/net/LocalSocketImpl.java
+++ b/core/java/android/net/LocalSocketImpl.java
@@ -136,8 +136,28 @@
write_native(b, myFd);
}
}
+
+ /**
+ * Wait until the data in sending queue is emptied. A polling version
+ * for flush implementation.
+ * @throws IOException
+ * if an i/o error occurs.
+ */
+ @Override
+ public void flush() throws IOException {
+ FileDescriptor myFd = fd;
+ if (myFd == null) throw new IOException("socket closed");
+ while(pending_native(fd) > 0) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException ie) {
+ return;
+ }
+ }
+ }
}
+ private native int pending_native(FileDescriptor fd) throws IOException;
private native int available_native(FileDescriptor fd) throws IOException;
private native void close_native(FileDescriptor fd) throws IOException;
private native int read_native(FileDescriptor fd) throws IOException;
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 2a2f7cf..37f04d3 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -18,6 +18,9 @@
import android.os.SystemProperties;
import android.util.Log;
+import com.android.org.conscrypt.OpenSSLContextImpl;
+import com.android.org.conscrypt.OpenSSLSocketImpl;
+import com.android.org.conscrypt.SSLClientSessionCache;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
@@ -36,9 +39,6 @@
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
/**
* SSLSocketFactory implementation with several extra features:
diff --git a/core/java/android/net/SSLSessionCache.java b/core/java/android/net/SSLSessionCache.java
index 4cbeb94..15421de 100644
--- a/core/java/android/net/SSLSessionCache.java
+++ b/core/java/android/net/SSLSessionCache.java
@@ -16,12 +16,12 @@
package android.net;
-import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-
import android.content.Context;
import android.util.Log;
+import com.android.org.conscrypt.FileClientSessionCache;
+import com.android.org.conscrypt.SSLClientSessionCache;
+
import java.io.File;
import java.io.IOException;
diff --git a/core/java/android/net/http/CertificateChainValidator.java b/core/java/android/net/http/CertificateChainValidator.java
index f66075d..3652a4c 100644
--- a/core/java/android/net/http/CertificateChainValidator.java
+++ b/core/java/android/net/http/CertificateChainValidator.java
@@ -16,21 +16,22 @@
package android.net.http;
+import com.android.org.conscrypt.SSLParametersImpl;
+import com.android.org.conscrypt.TrustManagerImpl;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyManagementException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.DefaultHostnameVerifier;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.X509TrustManager;
-import org.apache.harmony.security.provider.cert.X509CertImpl;
-import org.apache.harmony.xnet.provider.jsse.SSLParametersImpl;
-import org.apache.harmony.xnet.provider.jsse.TrustManagerImpl;
/**
* Class responsible for all server certificate validation functionality
@@ -118,8 +119,14 @@
X509Certificate[] serverCertificates = new X509Certificate[certChain.length];
- for (int i = 0; i < certChain.length; ++i) {
- serverCertificates[i] = new X509CertImpl(certChain[i]);
+ try {
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ for (int i = 0; i < certChain.length; ++i) {
+ serverCertificates[i] = (X509Certificate) cf.generateCertificate(
+ new ByteArrayInputStream(certChain[i]));
+ }
+ } catch (CertificateException e) {
+ throw new IOException("can't read certificate", e);
}
return verifyServerDomainAndCertificates(serverCertificates, domain, authType);
diff --git a/core/java/android/net/http/HttpsConnection.java b/core/java/android/net/http/HttpsConnection.java
index 84765a5..f421d29 100644
--- a/core/java/android/net/http/HttpsConnection.java
+++ b/core/java/android/net/http/HttpsConnection.java
@@ -18,9 +18,9 @@
import android.content.Context;
import android.util.Log;
-import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
+import com.android.org.conscrypt.FileClientSessionCache;
+import com.android.org.conscrypt.OpenSSLContextImpl;
+import com.android.org.conscrypt.SSLClientSessionCache;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
diff --git a/core/java/android/net/http/X509TrustManagerExtensions.java b/core/java/android/net/http/X509TrustManagerExtensions.java
index 64eacbc..cfe5f27 100644
--- a/core/java/android/net/http/X509TrustManagerExtensions.java
+++ b/core/java/android/net/http/X509TrustManagerExtensions.java
@@ -16,7 +16,7 @@
package android.net.http;
-import org.apache.harmony.xnet.provider.jsse.TrustManagerImpl;
+import com.android.org.conscrypt.TrustManagerImpl;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 499ec77..29e8d9c 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -98,6 +98,11 @@
public static final int VIBRATOR_ON = 9;
/**
+ * A constant indicating a foreground activity timer
+ */
+ public static final int FOREGROUND_ACTIVITY = 10;
+
+ /**
* Include all of the data in the stats, including previously saved data.
*/
public static final int STATS_SINCE_CHARGED = 0;
@@ -125,7 +130,7 @@
/**
* Bump the version on this if the checkin format changes.
*/
- private static final int BATTERY_STATS_CHECKIN_VERSION = 5;
+ private static final int BATTERY_STATS_CHECKIN_VERSION = 6;
private static final long BYTES_PER_KB = 1024;
private static final long BYTES_PER_MB = 1048576; // 1024^2
@@ -137,6 +142,7 @@
private static final String PROCESS_DATA = "pr";
private static final String SENSOR_DATA = "sr";
private static final String VIBRATOR_DATA = "vib";
+ private static final String FOREGROUND_DATA = "fg";
private static final String WAKELOCK_DATA = "wl";
private static final String KERNEL_WAKELOCK_DATA = "kwl";
private static final String NETWORK_DATA = "nt";
@@ -276,6 +282,8 @@
public abstract void noteAudioTurnedOffLocked();
public abstract void noteVideoTurnedOnLocked();
public abstract void noteVideoTurnedOffLocked();
+ public abstract void noteActivityResumedLocked();
+ public abstract void noteActivityPausedLocked();
public abstract long getWifiRunningTime(long batteryRealtime, int which);
public abstract long getFullWifiLockTime(long batteryRealtime, int which);
public abstract long getWifiScanTime(long batteryRealtime, int which);
@@ -283,6 +291,7 @@
int which);
public abstract long getAudioTurnedOnTime(long batteryRealtime, int which);
public abstract long getVideoTurnedOnTime(long batteryRealtime, int which);
+ public abstract Timer getForegroundActivityTimer();
public abstract Timer getVibratorOnTimer();
/**
@@ -1229,7 +1238,7 @@
final int NU = uidStats.size();
String category = STAT_NAMES[which];
-
+
// Dump "battery" stat
dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
which == STATS_SINCE_CHARGED ? getStartCount() : "N/A",
@@ -1417,22 +1426,31 @@
}
}
+ Timer fgTimer = u.getForegroundActivityTimer();
+ if (fgTimer != null) {
+ // Convert from microseconds to milliseconds with rounding
+ long totalTime = (fgTimer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000;
+ int count = fgTimer.getCountLocked(which);
+ if (totalTime != 0) {
+ dumpLine(pw, uid, category, FOREGROUND_DATA, totalTime, count);
+ }
+ }
+
Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
if (processStats.size() > 0) {
for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
: processStats.entrySet()) {
Uid.Proc ps = ent.getValue();
-
- long userTime = ps.getUserTime(which);
- long systemTime = ps.getSystemTime(which);
- int starts = ps.getStarts(which);
-
- if (userTime != 0 || systemTime != 0 || starts != 0) {
- dumpLine(pw, uid, category, PROCESS_DATA,
- ent.getKey(), // proc
- userTime * 10, // cpu time in ms
- systemTime * 10, // user time in ms
- starts); // process starts
+
+ final long userMillis = ps.getUserTime(which) * 10;
+ final long systemMillis = ps.getSystemTime(which) * 10;
+ final long foregroundMillis = ps.getForegroundTime(which) * 10;
+ final long starts = ps.getStarts(which);
+
+ if (userMillis != 0 || systemMillis != 0 || foregroundMillis != 0
+ || starts != 0) {
+ dumpLine(pw, uid, category, PROCESS_DATA, ent.getKey(), userMillis,
+ systemMillis, foregroundMillis, starts);
}
}
}
@@ -1961,6 +1979,24 @@
}
}
+ Timer fgTimer = u.getForegroundActivityTimer();
+ if (fgTimer != null) {
+ // Convert from microseconds to milliseconds with rounding
+ long totalTime = (fgTimer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000;
+ int count = fgTimer.getCountLocked(which);
+ if (totalTime != 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Foreground activities: ");
+ formatTimeMs(sb, totalTime);
+ sb.append("realtime (");
+ sb.append(count);
+ sb.append(" times)");
+ pw.println(sb.toString());
+ uidActivity = true;
+ }
+ }
+
Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
if (processStats.size() > 0) {
for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
@@ -1968,23 +2004,26 @@
Uid.Proc ps = ent.getValue();
long userTime;
long systemTime;
+ long foregroundTime;
int starts;
int numExcessive;
userTime = ps.getUserTime(which);
systemTime = ps.getSystemTime(which);
+ foregroundTime = ps.getForegroundTime(which);
starts = ps.getStarts(which);
numExcessive = which == STATS_SINCE_CHARGED
? ps.countExcessivePowers() : 0;
- if (userTime != 0 || systemTime != 0 || starts != 0
+ if (userTime != 0 || systemTime != 0 || foregroundTime != 0 || starts != 0
|| numExcessive != 0) {
sb.setLength(0);
sb.append(prefix); sb.append(" Proc ");
sb.append(ent.getKey()); sb.append(":\n");
sb.append(prefix); sb.append(" CPU: ");
formatTime(sb, userTime); sb.append("usr + ");
- formatTime(sb, systemTime); sb.append("krn");
+ formatTime(sb, systemTime); sb.append("krn ; ");
+ formatTime(sb, foregroundTime); sb.append("fg");
if (starts != 0) {
sb.append("\n"); sb.append(prefix); sb.append(" ");
sb.append(starts); sb.append(" proc starts");
@@ -2042,7 +2081,7 @@
sb.append(sent.getKey()); sb.append(":\n");
sb.append(prefix); sb.append(" Created for: ");
formatTimeMs(sb, startTime / 1000);
- sb.append(" uptime\n");
+ sb.append("uptime\n");
sb.append(prefix); sb.append(" Starts: ");
sb.append(starts);
sb.append(", launches: "); sb.append(launches);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index df065e9..cb5ed4f 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -202,6 +202,7 @@
* Used to check if the user making this call is linked to another user. Linked users may have
* a reduced number of available apps, app restrictions and account restrictions.
* @return whether the user making this call is a linked user
+ * @hide
*/
public boolean isLinkedUser() {
try {
diff --git a/core/java/android/provider/DrmStore.java b/core/java/android/provider/DrmStore.java
deleted file mode 100644
index 34f2f0d..0000000
--- a/core/java/android/provider/DrmStore.java
+++ /dev/null
@@ -1,211 +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.provider;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.drm.mobile1.DrmRawContent;
-import android.drm.mobile1.DrmRights;
-import android.drm.mobile1.DrmRightsManager;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * The DRM provider contains forward locked DRM content.
- *
- * @hide
- */
-public final class DrmStore
-{
- private static final String TAG = "DrmStore";
-
- public static final String AUTHORITY = "drm";
-
- /**
- * This is in the Manifest class of the drm provider, but that isn't visible
- * in the framework.
- */
- private static final String ACCESS_DRM_PERMISSION = "android.permission.ACCESS_DRM";
-
- /**
- * Fields for DRM database
- */
-
- public interface Columns extends BaseColumns {
- /**
- * The data stream for the file
- * <P>Type: DATA STREAM</P>
- */
- public static final String DATA = "_data";
-
- /**
- * The size of the file in bytes
- * <P>Type: INTEGER (long)</P>
- */
- public static final String SIZE = "_size";
-
- /**
- * The title of the file content
- * <P>Type: TEXT</P>
- */
- public static final String TITLE = "title";
-
- /**
- * The MIME type of the file
- * <P>Type: TEXT</P>
- */
- public static final String MIME_TYPE = "mime_type";
-
- }
-
- public interface Images extends Columns {
-
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/images");
- }
-
- public interface Audio extends Columns {
-
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/audio");
- }
-
- /**
- * Utility function for inserting a file into the DRM content provider.
- *
- * @param cr The content resolver to use
- * @param file The file to insert
- * @param title The title for the content (or null)
- * @return uri to the DRM record or null
- */
- public static final Intent addDrmFile(ContentResolver cr, File file, String title) {
- FileInputStream fis = null;
- Intent result = null;
-
- try {
- fis = new FileInputStream(file);
- if (title == null) {
- title = file.getName();
- int lastDot = title.lastIndexOf('.');
- if (lastDot > 0) {
- title = title.substring(0, lastDot);
- }
- }
- result = addDrmFile(cr, fis, title);
- } catch (Exception e) {
- Log.e(TAG, "pushing file failed", e);
- } finally {
- try {
- if (fis != null)
- fis.close();
- } catch (IOException e) {
- Log.e(TAG, "IOException in DrmStore.addDrmFile()", e);
- }
- }
-
- return result;
- }
-
- /**
- * Utility function for inserting a file stream into the DRM content provider.
- *
- * @param cr The content resolver to use
- * @param fis The FileInputStream to insert
- * @param title The title for the content (or null)
- * @return uri to the DRM record or null
- */
- public static final Intent addDrmFile(ContentResolver cr, FileInputStream fis, String title) {
- OutputStream os = null;
- Intent result = null;
-
- try {
- DrmRawContent content = new DrmRawContent(fis, (int) fis.available(),
- DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING);
- String mimeType = content.getContentType();
- long size = fis.getChannel().size();
-
- DrmRightsManager manager = manager = DrmRightsManager.getInstance();
- DrmRights rights = manager.queryRights(content);
- InputStream stream = content.getContentInputStream(rights);
-
- Uri contentUri = null;
- if (mimeType.startsWith("audio/")) {
- contentUri = DrmStore.Audio.CONTENT_URI;
- } else if (mimeType.startsWith("image/")) {
- contentUri = DrmStore.Images.CONTENT_URI;
- } else {
- Log.w(TAG, "unsupported mime type " + mimeType);
- }
-
- if (contentUri != null) {
- ContentValues values = new ContentValues(3);
- values.put(DrmStore.Columns.TITLE, title);
- values.put(DrmStore.Columns.SIZE, size);
- values.put(DrmStore.Columns.MIME_TYPE, mimeType);
-
- Uri uri = cr.insert(contentUri, values);
- if (uri != null) {
- os = cr.openOutputStream(uri);
-
- byte[] buffer = new byte[1000];
- int count;
-
- while ((count = stream.read(buffer)) != -1) {
- os.write(buffer, 0, count);
- }
- result = new Intent();
- result.setDataAndType(uri, mimeType);
-
- }
- }
- } catch (Exception e) {
- Log.e(TAG, "pushing file failed", e);
- } finally {
- try {
- if (fis != null)
- fis.close();
- if (os != null)
- os.close();
- } catch (IOException e) {
- Log.e(TAG, "IOException in DrmStore.addDrmFile()", e);
- }
- }
-
- return result;
- }
-
- /**
- * Utility function to enforce any permissions required to access DRM
- * content.
- *
- * @param context A context used for checking calling permission.
- */
- public static void enforceAccessDrmPermission(Context context) {
- if (context.checkCallingOrSelfPermission(ACCESS_DRM_PERMISSION) !=
- PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Requires DRM permission");
- }
- }
-
-}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 8b72ca9..bfea9ca 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -25,6 +25,20 @@
import android.os.ServiceManager;
import android.util.Log;
+/**
+ * A service that receives calls from the system when new notifications are posted or removed.
+ * <p>To extend this class, you must declare the service in your manifest file with
+ * the {@link android.Manifest.permission#BIND_NOTIFICATION_LISTENER_SERVICE} permission
+ * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:</p>
+ * <pre>
+ * <service android:name=".NotificationListener"
+ * android:label="@string/service_name"
+ * android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
+ * <intent-filter>
+ * <action android:name="android.service.notification.NotificationListenerService" />
+ * </intent-filter>
+ * </service></pre>
+ */
public abstract class NotificationListenerService extends Service {
// TAG = "NotificationListenerService[MySubclass]"
private final String TAG = NotificationListenerService.class.getSimpleName()
@@ -57,7 +71,7 @@
* notification listener) or because the app has withdrawn the notification.
* <P>
* NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
- * {@link StatusBarNotification#notification} member may be missing some heavyweight
+ * result from {@link StatusBarNotification#getNotification} may be missing some heavyweight
* fields such as {@link android.app.Notification#contentView} and
* {@link android.app.Notification#largeIcon}. However, all other fields on
* {@link StatusBarNotification}, sufficient to match this call with a prior call to
@@ -97,9 +111,9 @@
* @param id ID of the notification as specified by the notifying app in
* {@link android.app.NotificationManager#notify(String, int, android.app.Notification)}.
*/
- public final void clearNotification(String pkg, String tag, int id) {
+ public final void cancelNotification(String pkg, String tag, int id) {
try {
- getNotificationInterface().clearNotificationFromListener(mWrapper, pkg, tag, id);
+ getNotificationInterface().cancelNotificationFromListener(mWrapper, pkg, tag, id);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
}
@@ -114,16 +128,31 @@
* upon being informed, the notification manager will actually remove all active notifications
* and you will get multiple {@link #onNotificationRemoved(StatusBarNotification)} callbacks.
*
- * {@see #clearNotification(String, String, int)}
+ * {@see #cancelNotification(String, String, int)}
*/
- public final void clearAllNotifications() {
+ public final void cancelAllNotifications() {
try {
- getNotificationInterface().clearAllNotificationsFromListener(mWrapper);
+ getNotificationInterface().cancelAllNotificationsFromListener(mWrapper);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
}
}
+ /**
+ * Request the list of outstanding notifications (that is, those that are visible to the
+ * current user). Useful when starting up and you don't know what's already been posted.
+ *
+ * @return An array of active notifications.
+ */
+ public StatusBarNotification[] getActiveNotifications() {
+ try {
+ return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ return null;
+ }
+
@Override
public IBinder onBind(Intent intent) {
if (mWrapper == null) {
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 006518c..e8cc24b9 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -26,35 +26,21 @@
* the status bar and any {@link android.service.notification.NotificationListenerService}s.
*/
public class StatusBarNotification implements Parcelable {
- /** The package of the app that posted the notification. */
- public final String pkg;
- /** The id supplied to {@link android.app.NotificationManager#notify}. */
- public final int id;
- /** The tag supplied to {@link android.app.NotificationManager#notify}, or null if no tag
- * was specified. */
- public final String tag;
+ private final String pkg;
+ private final int id;
+ private final String tag;
- /** The notifying app's calling uid. @hide */
- public final int uid;
- /** The notifying app's base package. @hide */
- public final String basePkg;
- /** @hide */
- public final int initialPid;
+ private final int uid;
+ private final String basePkg;
+ private final int initialPid;
// TODO: make this field private and move callers to an accessor that
// ensures sourceUser is applied.
- /** The {@link android.app.Notification} supplied to
- * {@link android.app.NotificationManager#notify}. */
- public final Notification notification;
- /** The {@link android.os.UserHandle} for whom this notification is intended. */
- public final UserHandle user;
- /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
- * which may be different than {@link android.app.Notification#when}.
- */
- public final long postTime;
+ private final Notification notification;
+ private final UserHandle user;
+ private final long postTime;
- /** @hide */
- public final int score;
+ private final int score;
/** This is temporarily needed for the JB MR1 PDK.
* @hide */
@@ -198,4 +184,61 @@
public int getUserId() {
return this.user.getIdentifier();
}
+
+ /** The package of the app that posted the notification. */
+ public String getPackageName() {
+ return pkg;
+ }
+
+ /** The id supplied to {@link android.app.NotificationManager#notify}. */
+ public int getId() {
+ return id;
+ }
+
+ /** The tag supplied to {@link android.app.NotificationManager#notify}, or null if no tag
+ * was specified. */
+ public String getTag() {
+ return tag;
+ }
+
+ /** The notifying app's calling uid. @hide */
+ public int getUid() {
+ return uid;
+ }
+
+ /** The notifying app's base package. @hide */
+ public String getBasePkg() {
+ return basePkg;
+ }
+
+ /** @hide */
+ public int getInitialPid() {
+ return initialPid;
+ }
+
+ /** The {@link android.app.Notification} supplied to
+ * {@link android.app.NotificationManager#notify}. */
+ public Notification getNotification() {
+ return notification;
+ }
+
+ /**
+ * The {@link android.os.UserHandle} for whom this notification is intended.
+ * @hide
+ */
+ public UserHandle getUser() {
+ return user;
+ }
+
+ /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
+ * which may be different than {@link android.app.Notification#when}.
+ */
+ public long getPostTime() {
+ return postTime;
+ }
+
+ /** @hide */
+ public int getScore() {
+ return score;
+ }
}
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java
index 5a4f322..33964a0 100644
--- a/core/java/android/util/TimeUtils.java
+++ b/core/java/android/util/TimeUtils.java
@@ -235,7 +235,7 @@
* during the lifetime of an activity.
*/
public static String getTimeZoneDatabaseVersion() {
- return ZoneInfoDB.getVersion();
+ return ZoneInfoDB.getInstance().getVersion();
}
/** @hide Field length that can hold 999 days of time */
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 2595ee5..2a761c1 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -533,7 +533,6 @@
*
* @see MotionEvent#AXIS_X
* @see MotionEvent#AXIS_Y
- * @see #getSupportedAxes()
*/
public MotionRange getMotionRange(int axis) {
final int numRanges = mMotionRanges.size();
@@ -559,7 +558,6 @@
*
* @see MotionEvent#AXIS_X
* @see MotionEvent#AXIS_Y
- * @see #getSupportedAxes()
*/
public MotionRange getMotionRange(int axis, int source) {
final int numRanges = mMotionRanges.size();
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index b178ea8..5db3909 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -2822,7 +2822,7 @@
*
* @param symbolicName The symbolic name of the keycode.
* @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
- * @see #keycodeToString
+ * @see #keycodeToString(int)
*/
public static int keyCodeFromString(String symbolicName) {
if (symbolicName == null) {
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 78fa2d7..ee36097 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -1947,8 +1947,6 @@
* @see #TOOL_TYPE_FINGER
* @see #TOOL_TYPE_STYLUS
* @see #TOOL_TYPE_MOUSE
- * @see #TOOL_TYPE_INDIRECT_FINGER
- * @see #TOOL_TYPE_INDIRECT_STYLUS
*/
public final int getToolType(int pointerIndex) {
return nativeGetToolType(mNativePtr, pointerIndex);
@@ -2190,7 +2188,7 @@
* on the screen, before it had been adjusted for the containing window
* and views.
*
- * @see getX()
+ * @see #getX(int)
* @see #AXIS_X
*/
public final float getRawX() {
@@ -2203,7 +2201,7 @@
* on the screen, before it had been adjusted for the containing window
* and views.
*
- * @see getY()
+ * @see #getY(int)
* @see #AXIS_Y
*/
public final float getRawY() {
@@ -3063,7 +3061,7 @@
*
* @param symbolicName The symbolic name of the axis.
* @return The axis or -1 if not found.
- * @see #keycodeToString
+ * @see KeyEvent#keycodeToString(int)
*/
public static int axisFromString(String symbolicName) {
if (symbolicName == null) {
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 3957ab3..f0acba1 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -260,7 +260,7 @@
@Override
public void setLayerType(int layerType, Paint paint) {
if (paint != mLayerPaint) {
- mLayerPaint = paint;
+ mLayerPaint = paint == null ? new Paint() : paint;
invalidate();
}
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d658aac..ed6dc6c 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6632,12 +6632,7 @@
* @hide
*/
public void clearAccessibilityFocus() {
- if ((mPrivateFlags2 & PFLAG2_ACCESSIBILITY_FOCUSED) != 0) {
- mPrivateFlags2 &= ~PFLAG2_ACCESSIBILITY_FOCUSED;
- invalidate();
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
- notifyAccessibilityStateChanged();
- }
+ clearAccessibilityFocusNoCallbacks();
// Clear the global reference of accessibility focus if this
// view or any of its descendants had accessibility focus.
ViewRootImpl viewRootImpl = getViewRootImpl();
@@ -6684,6 +6679,8 @@
if ((mPrivateFlags2 & PFLAG2_ACCESSIBILITY_FOCUSED) != 0) {
mPrivateFlags2 &= ~PFLAG2_ACCESSIBILITY_FOCUSED;
invalidate();
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
+ notifyAccessibilityStateChanged();
}
}
@@ -8246,7 +8243,10 @@
// in onHoverEvent.
// Note that onGenericMotionEvent will be called by default when
// onHoverEvent returns false (refer to dispatchGenericMotionEvent).
- return dispatchGenericMotionEventInternal(event);
+ dispatchGenericMotionEventInternal(event);
+ // The event was already handled by calling setHovered(), so always
+ // return true.
+ return true;
}
return false;
@@ -8711,7 +8711,12 @@
/**
* Change the view's z order in the tree, so it's on top of other sibling
- * views
+ * views. This ordering change may affect layout, if the parent container
+ * uses an order-dependent layout scheme (e.g., LinearLayout). This
+ * method should be followed by calls to {@link #requestLayout()} and
+ * {@link View#invalidate()} on the parent.
+ *
+ * @see ViewGroup#bringChildToFront(View)
*/
public void bringToFront() {
if (mParent != null) {
@@ -13805,7 +13810,7 @@
}
if ((flags & ViewGroup.FLAG_CLIP_CHILDREN) == ViewGroup.FLAG_CLIP_CHILDREN &&
- !useDisplayListProperties && layerType == LAYER_TYPE_NONE) {
+ !useDisplayListProperties && cache == null) {
if (offsetForScroll) {
canvas.clipRect(sx, sy, sx + (mRight - mLeft), sy + (mBottom - mTop));
} else {
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index 4b70bc0..d79aa7e 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -146,9 +146,13 @@
public View focusSearch(View v, int direction);
/**
- * Change the z order of the child so it's on top of all other children
+ * Change the z order of the child so it's on top of all other children.
+ * This ordering change may affect layout, if this container
+ * uses an order-dependent layout scheme (e.g., LinearLayout). This
+ * method should be followed by calls to {@link #requestLayout()} and
+ * {@link View#invalidate()} on this parent.
*
- * @param child
+ * @param child The child to bring to the top of the z order
*/
public void bringChildToFront(View child);
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index c111a52..6955d14 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -40,13 +40,13 @@
import junit.framework.Assert;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.URLEncoder;
-import java.nio.charset.Charsets;
import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
@@ -55,9 +55,8 @@
import java.util.Map;
import java.util.Set;
-import org.apache.harmony.security.provider.cert.X509CertImpl;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLKey;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
+import com.android.org.conscrypt.OpenSSLKey;
+import com.android.org.conscrypt.OpenSSLKeyHolder;
class BrowserFrame extends Handler {
@@ -757,13 +756,16 @@
return null;
}
} else if (url.startsWith(ANDROID_ASSET)) {
- url = url.replaceFirst(ANDROID_ASSET, "");
+ String assetUrl = url.replaceFirst(ANDROID_ASSET, "");
try {
AssetManager assets = mContext.getAssets();
- Uri uri = Uri.parse(url);
+ Uri uri = Uri.parse(assetUrl);
return assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING);
} catch (IOException e) {
return null;
+ } catch (Exception e) {
+ Log.w(LOGTAG, "Problem loading url: " + url, e);
+ return null;
}
} else if (mSettings.getAllowContentAccess() &&
url.startsWith(ANDROID_CONTENT)) {
@@ -1078,10 +1080,12 @@
String url) {
final SslError sslError;
try {
- X509Certificate cert = new X509CertImpl(certDER);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate) cf.generateCertificate(
+ new ByteArrayInputStream(certDER));
SslCertificate sslCert = new SslCertificate(cert);
sslError = SslError.SslErrorFromChromiumErrorCode(certError, sslCert, url);
- } catch (IOException e) {
+ } catch (Exception e) {
// Can't get the certificate, not much to do.
Log.e(LOGTAG, "Can't get the certificate from WebKit, canceling");
nativeSslCertErrorCancel(handle, certError);
@@ -1199,9 +1203,11 @@
*/
private void setCertificate(byte cert_der[]) {
try {
- X509Certificate cert = new X509CertImpl(cert_der);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate) cf.generateCertificate(
+ new ByteArrayInputStream(cert_der));
mCallbackProxy.onReceivedCertificate(new SslCertificate(cert));
- } catch (IOException e) {
+ } catch (Exception e) {
// Can't get the certificate, not much to do.
Log.e(LOGTAG, "Can't get the certificate from WebKit, canceling");
return;
diff --git a/core/java/android/webkit/ClientCertRequestHandler.java b/core/java/android/webkit/ClientCertRequestHandler.java
index f5a60f6..d7a6806 100644
--- a/core/java/android/webkit/ClientCertRequestHandler.java
+++ b/core/java/android/webkit/ClientCertRequestHandler.java
@@ -20,9 +20,9 @@
import java.security.PrivateKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
-import org.apache.harmony.xnet.provider.jsse.NativeCrypto;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLKey;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
+import com.android.org.conscrypt.NativeCrypto;
+import com.android.org.conscrypt.OpenSSLKey;
+import com.android.org.conscrypt.OpenSSLKeyHolder;
/**
* ClientCertRequestHandler: class responsible for handling client
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index d816200..5392a96 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -184,6 +184,7 @@
* @attr ref android.R.styleable#ProgressBar_maxWidth
* @attr ref android.R.styleable#ProgressBar_minHeight
* @attr ref android.R.styleable#ProgressBar_minWidth
+ * @attr ref android.R.styleable#ProgressBar_mirrorForRtl
* @attr ref android.R.styleable#ProgressBar_progress
* @attr ref android.R.styleable#ProgressBar_progressDrawable
* @attr ref android.R.styleable#ProgressBar_secondaryProgress
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index a564c96..b3b95d9 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -95,6 +95,7 @@
*
* @see #setFormat12Hour(CharSequence)
* @see #getFormat12Hour()
+ *
* @deprecated Let the system use locale-appropriate defaults instead.
*/
public static final CharSequence DEFAULT_FORMAT_12_HOUR = "h:mm a";
@@ -108,6 +109,7 @@
*
* @see #setFormat24Hour(CharSequence)
* @see #getFormat24Hour()
+ *
* @deprecated Let the system use locale-appropriate defaults instead.
*/
public static final CharSequence DEFAULT_FORMAT_24_HOUR = "H:mm";
@@ -162,9 +164,7 @@
};
/**
- * Creates a new clock using the default patterns
- * {@link #DEFAULT_FORMAT_24_HOUR} and {@link #DEFAULT_FORMAT_12_HOUR}
- * respectively for the 24-hour and 12-hour modes.
+ * Creates a new clock using the default patterns for the current locale.
*
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
@@ -258,20 +258,26 @@
}
/**
- * Specifies the formatting pattern used to display the date and/or time
+ * <p>Specifies the formatting pattern used to display the date and/or time
* in 12-hour mode. The formatting pattern syntax is described in
- * {@link DateFormat}.
+ * {@link DateFormat}.</p>
*
- * If this pattern is set to null, {@link #getFormat24Hour()} will be used
+ * <p>If this pattern is set to null, {@link #getFormat24Hour()} will be used
* even in 12-hour mode. If both 24-hour and 12-hour formatting patterns
- * are set to null, {@link #DEFAULT_FORMAT_24_HOUR} and
- * {@link #DEFAULT_FORMAT_12_HOUR} will be used instead.
+ * are set to null, the default pattern for the current locale will be used
+ * instead.</p>
+ *
+ * <p><strong>Note:</strong> if styling is not needed, it is highly recommended
+ * you supply a format string generated by
+ * {@link DateFormat#getBestDateTimePattern(java.util.Locale, String)}. This method
+ * takes care of generating a format string adapted to the desired locale.</p>
+ *
*
* @param format A date/time formatting pattern as described in {@link DateFormat}
*
* @see #getFormat12Hour()
* @see #is24HourModeEnabled()
- * @see #DEFAULT_FORMAT_12_HOUR
+ * @see DateFormat#getBestDateTimePattern(java.util.Locale, String)
* @see DateFormat
*
* @attr ref android.R.styleable#TextClock_format12Hour
@@ -300,20 +306,25 @@
}
/**
- * Specifies the formatting pattern used to display the date and/or time
+ * <p>Specifies the formatting pattern used to display the date and/or time
* in 24-hour mode. The formatting pattern syntax is described in
- * {@link DateFormat}.
+ * {@link DateFormat}.</p>
*
- * If this pattern is set to null, {@link #getFormat12Hour()} will be used
- * even in 24-hour mode. If both 24-hour and 12-hour formatting patterns
- * are set to null, {@link #DEFAULT_FORMAT_24_HOUR} and
- * {@link #DEFAULT_FORMAT_12_HOUR} will be used instead.
+ * <p>If this pattern is set to null, {@link #getFormat24Hour()} will be used
+ * even in 12-hour mode. If both 24-hour and 12-hour formatting patterns
+ * are set to null, the default pattern for the current locale will be used
+ * instead.</p>
+ *
+ * <p><strong>Note:</strong> if styling is not needed, it is highly recommended
+ * you supply a format string generated by
+ * {@link DateFormat#getBestDateTimePattern(java.util.Locale, String)}. This method
+ * takes care of generating a format string adapted to the desired locale.</p>
*
* @param format A date/time formatting pattern as described in {@link DateFormat}
*
* @see #getFormat24Hour()
* @see #is24HourModeEnabled()
- * @see #DEFAULT_FORMAT_24_HOUR
+ * @see DateFormat#getBestDateTimePattern(java.util.Locale, String)
* @see DateFormat
*
* @attr ref android.R.styleable#TextClock_format24Hour
@@ -334,8 +345,7 @@
* returned by {@link #getFormat12Hour()} is used instead.
*
* If either one of the formats is null, the other format is used. If
- * both formats are null, the default values {@link #DEFAULT_FORMAT_12_HOUR}
- * and {@link #DEFAULT_FORMAT_24_HOUR} are used instead.
+ * both formats are null, the default formats for the current locale are used.
*
* @return true if time should be displayed in 24-hour format, false if it
* should be displayed in 12-hour format.
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 04b9884..85f7653 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -83,7 +83,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 64 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 65 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -663,7 +663,7 @@
}
public void logState(Printer pw, String prefix) {
- pw.println(prefix + " mCount=" + mCount
+ pw.println(prefix + "mCount=" + mCount
+ " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
+ " mUnpluggedCount=" + mUnpluggedCount);
pw.println(prefix + "mTotalTime=" + mTotalTime
@@ -1048,7 +1048,7 @@
public void logState(Printer pw, String prefix) {
super.logState(pw, prefix);
- pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
+ pw.println(prefix + "mNesting=" + mNesting + " mUpdateTime=" + mUpdateTime
+ " mAcquireTime=" + mAcquireTime);
}
@@ -2240,6 +2240,14 @@
getUidStatsLocked(uid).noteVideoTurnedOffLocked();
}
+ public void noteActivityResumedLocked(int uid) {
+ getUidStatsLocked(uid).noteActivityResumedLocked();
+ }
+
+ public void noteActivityPausedLocked(int uid) {
+ getUidStatsLocked(uid).noteActivityPausedLocked();
+ }
+
public void noteVibratorOnLocked(int uid, long durationMillis) {
getUidStatsLocked(uid).noteVibratorOnLocked(durationMillis);
}
@@ -2541,6 +2549,8 @@
boolean mVideoTurnedOn;
StopwatchTimer mVideoTurnedOnTimer;
+ StopwatchTimer mForegroundActivityTimer;
+
BatchTimer mVibratorOnTimer;
Counter[] mUserActivityCounters;
@@ -2776,6 +2786,27 @@
}
}
+ public StopwatchTimer createForegroundActivityTimerLocked() {
+ if (mForegroundActivityTimer == null) {
+ mForegroundActivityTimer = new StopwatchTimer(
+ Uid.this, FOREGROUND_ACTIVITY, null, mUnpluggables);
+ }
+ return mForegroundActivityTimer;
+ }
+
+ @Override
+ public void noteActivityResumedLocked() {
+ // We always start, since we want multiple foreground PIDs to nest
+ createForegroundActivityTimerLocked().startRunningLocked(BatteryStatsImpl.this);
+ }
+
+ @Override
+ public void noteActivityPausedLocked() {
+ if (mForegroundActivityTimer != null) {
+ mForegroundActivityTimer.stopRunningLocked(BatteryStatsImpl.this);
+ }
+ }
+
public BatchTimer createVibratorOnTimerLocked() {
if (mVibratorOnTimer == null) {
mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON,
@@ -2844,6 +2875,11 @@
}
@Override
+ public Timer getForegroundActivityTimer() {
+ return mForegroundActivityTimer;
+ }
+
+ @Override
public Timer getVibratorOnTimer() {
return mVibratorOnTimer;
}
@@ -2919,6 +2955,9 @@
active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
active |= mVideoTurnedOn;
}
+ if (mForegroundActivityTimer != null) {
+ active |= !mForegroundActivityTimer.reset(BatteryStatsImpl.this, false);
+ }
if (mVibratorOnTimer != null) {
if (mVibratorOnTimer.reset(BatteryStatsImpl.this, false)) {
mVibratorOnTimer.detach();
@@ -3018,6 +3057,10 @@
mVideoTurnedOnTimer.detach();
mVideoTurnedOnTimer = null;
}
+ if (mForegroundActivityTimer != null) {
+ mForegroundActivityTimer.detach();
+ mForegroundActivityTimer = null;
+ }
if (mUserActivityCounters != null) {
for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
mUserActivityCounters[i].detach();
@@ -3099,6 +3142,12 @@
} else {
out.writeInt(0);
}
+ if (mForegroundActivityTimer != null) {
+ out.writeInt(1);
+ mForegroundActivityTimer.writeToParcel(out, batteryRealtime);
+ } else {
+ out.writeInt(0);
+ }
if (mVibratorOnTimer != null) {
out.writeInt(1);
mVibratorOnTimer.writeToParcel(out, batteryRealtime);
@@ -3204,6 +3253,12 @@
mVideoTurnedOnTimer = null;
}
if (in.readInt() != 0) {
+ mForegroundActivityTimer = new StopwatchTimer(
+ Uid.this, FOREGROUND_ACTIVITY, null, mUnpluggables, in);
+ } else {
+ mForegroundActivityTimer = null;
+ }
+ if (in.readInt() != 0) {
mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON,
mUnpluggables, BatteryStatsImpl.this.mOnBatteryInternal, in);
} else {
@@ -3372,16 +3427,16 @@
long mSystemTime;
/**
- * Number of times the process has been started.
- */
- int mStarts;
-
- /**
* Amount of time the process was running in the foreground.
*/
long mForegroundTime;
/**
+ * Number of times the process has been started.
+ */
+ int mStarts;
+
+ /**
* The amount of user time loaded from a previous save.
*/
long mLoadedUserTime;
@@ -3392,16 +3447,16 @@
long mLoadedSystemTime;
/**
- * The number of times the process has started from a previous save.
- */
- int mLoadedStarts;
-
- /**
* The amount of foreground time loaded from a previous save.
*/
long mLoadedForegroundTime;
/**
+ * The number of times the process has started from a previous save.
+ */
+ int mLoadedStarts;
+
+ /**
* The amount of user time loaded from the previous run.
*/
long mLastUserTime;
@@ -3412,16 +3467,16 @@
long mLastSystemTime;
/**
- * The number of times the process has started from the previous run.
- */
- int mLastStarts;
-
- /**
* The amount of foreground time loaded from the previous run
*/
long mLastForegroundTime;
/**
+ * The number of times the process has started from the previous run.
+ */
+ int mLastStarts;
+
+ /**
* The amount of user time when last unplugged.
*/
long mUnpluggedUserTime;
@@ -3432,15 +3487,15 @@
long mUnpluggedSystemTime;
/**
- * The number of times the process has started before unplugged.
- */
- int mUnpluggedStarts;
-
- /**
* The amount of foreground time since unplugged.
*/
long mUnpluggedForegroundTime;
+ /**
+ * The number of times the process has started before unplugged.
+ */
+ int mUnpluggedStarts;
+
SamplingCounter[] mSpeedBins;
ArrayList<ExcessivePower> mExcessivePower;
@@ -3453,8 +3508,8 @@
public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) {
mUnpluggedUserTime = mUserTime;
mUnpluggedSystemTime = mSystemTime;
- mUnpluggedStarts = mStarts;
mUnpluggedForegroundTime = mForegroundTime;
+ mUnpluggedStarts = mStarts;
}
public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) {
@@ -5362,6 +5417,9 @@
u.createVideoTurnedOnTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createVibratorOnTimerLocked().readSummaryFromParcelLocked(in);
}
@@ -5415,6 +5473,7 @@
Uid.Proc p = u.getProcessStatsLocked(procName);
p.mUserTime = p.mLoadedUserTime = in.readLong();
p.mSystemTime = p.mLoadedSystemTime = in.readLong();
+ p.mForegroundTime = p.mLoadedForegroundTime = in.readLong();
p.mStarts = p.mLoadedStarts = in.readInt();
int NSB = in.readInt();
if (NSB > 100) {
@@ -5564,6 +5623,12 @@
} else {
out.writeInt(0);
}
+ if (u.mForegroundActivityTimer != null) {
+ out.writeInt(1);
+ u.mForegroundActivityTimer.writeSummaryFromParcelLocked(out, NOWREAL);
+ } else {
+ out.writeInt(0);
+ }
if (u.mVibratorOnTimer != null) {
out.writeInt(1);
u.mVibratorOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
@@ -5633,6 +5698,7 @@
Uid.Proc ps = ent.getValue();
out.writeLong(ps.mUserTime);
out.writeLong(ps.mSystemTime);
+ out.writeLong(ps.mForegroundTime);
out.writeInt(ps.mStarts);
final int N = ps.mSpeedBins.length;
out.writeInt(N);
diff --git a/core/java/com/android/internal/os/ProcessStats.java b/core/java/com/android/internal/os/ProcessStats.java
index b1bb8c1..bd0914d 100644
--- a/core/java/com/android/internal/os/ProcessStats.java
+++ b/core/java/com/android/internal/os/ProcessStats.java
@@ -518,6 +518,10 @@
return pids;
}
+ /**
+ * Returns the total time (in clock ticks, or 1/100 sec) spent executing in
+ * both user and system code.
+ */
public long getCpuTimeForPid(int pid) {
final String statFile = "/proc/" + pid + "/stat";
final long[] statsData = mSinglePidStatsData;
@@ -531,9 +535,9 @@
}
/**
- * Returns the times spent at each CPU speed, since the last call to this method. If this
- * is the first time, it will return 1 for each value.
- * @return relative times spent at different speed steps.
+ * Returns the delta time (in clock ticks, or 1/100 sec) spent at each CPU
+ * speed, since the last call to this method. If this is the first call, it
+ * will return 1 for each value.
*/
public long[] getLastCpuSpeedTimes() {
if (mCpuSpeedTimes == null) {
diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp
index 1426b2c..f2b69c6 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -371,7 +371,31 @@
return;
}
}
+static jint socket_pending (JNIEnv *env, jobject object,
+ jobject fileDescriptor)
+{
+ int fd;
+ fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ return (jint)-1;
+ }
+
+ int pending;
+ int ret = ioctl(fd, TIOCOUTQ, &pending);
+
+ // If this were a non-socket fd, there would be other cases to worry
+ // about...
+
+ //ALOGD("socket_pending, ioctl ret:%d, pending:%d", ret, pending);
+ if (ret < 0) {
+ jniThrowIOException(env, errno);
+ return (jint) 0;
+ }
+
+ return (jint)pending;
+}
static jint socket_available (JNIEnv *env, jobject object,
jobject fileDescriptor)
{
@@ -893,6 +917,7 @@
{"accept", "(Ljava/io/FileDescriptor;Landroid/net/LocalSocketImpl;)Ljava/io/FileDescriptor;", (void*)socket_accept},
{"shutdown", "(Ljava/io/FileDescriptor;Z)V", (void*)socket_shutdown},
{"available_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_available},
+ {"pending_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_pending},
{"close_native", "(Ljava/io/FileDescriptor;)V", (void*) socket_close},
{"read_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_read},
{"readba_native", "([BIILjava/io/FileDescriptor;)I", (void*) socket_readba},
diff --git a/core/jni/android_opengl_EGL14.cpp b/core/jni/android_opengl_EGL14.cpp
index ac4bc1d..59ba4a7 100644
--- a/core/jni/android_opengl_EGL14.cpp
+++ b/core/jni/android_opengl_EGL14.cpp
@@ -136,7 +136,7 @@
(JNIEnv *_env, jobject _this) {
EGLint _returnValue = (EGLint) 0;
_returnValue = eglGetError();
- return _returnValue;
+ return (jint)_returnValue;
}
/* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
@@ -230,7 +230,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglTerminate ( EGLDisplay dpy ) */
@@ -243,7 +243,7 @@
_returnValue = eglTerminate(
(EGLDisplay)dpy_native
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* const char * eglQueryString ( EGLDisplay dpy, EGLint name ) */
@@ -331,7 +331,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglChooseConfig ( EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config ) */
@@ -454,7 +454,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglGetConfigAttrib ( EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value ) */
@@ -509,7 +509,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
@@ -753,7 +753,7 @@
(EGLDisplay)dpy_native,
(EGLSurface)surface_native
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglQuerySurface ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value ) */
@@ -808,7 +808,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglBindAPI ( EGLenum api ) */
@@ -819,7 +819,7 @@
_returnValue = eglBindAPI(
(EGLenum)api
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLenum eglQueryAPI ( void ) */
@@ -828,7 +828,7 @@
(JNIEnv *_env, jobject _this) {
EGLenum _returnValue = (EGLenum) 0;
_returnValue = eglQueryAPI();
- return _returnValue;
+ return (jint)_returnValue;
}
/* EGLBoolean eglWaitClient ( void ) */
@@ -837,7 +837,7 @@
(JNIEnv *_env, jobject _this) {
EGLBoolean _returnValue = (EGLBoolean) 0;
_returnValue = eglWaitClient();
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglReleaseThread ( void ) */
@@ -846,7 +846,7 @@
(JNIEnv *_env, jobject _this) {
EGLBoolean _returnValue = (EGLBoolean) 0;
_returnValue = eglReleaseThread();
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) */
@@ -927,7 +927,7 @@
(EGLint)attribute,
(EGLint)value
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglBindTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
@@ -943,7 +943,7 @@
(EGLSurface)surface_native,
(EGLint)buffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglReleaseTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
@@ -959,7 +959,7 @@
(EGLSurface)surface_native,
(EGLint)buffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglSwapInterval ( EGLDisplay dpy, EGLint interval ) */
@@ -973,7 +973,7 @@
(EGLDisplay)dpy_native,
(EGLint)interval
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLContext eglCreateContext ( EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list ) */
@@ -1052,7 +1052,7 @@
(EGLDisplay)dpy_native,
(EGLContext)ctx_native
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglMakeCurrent ( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx ) */
@@ -1071,7 +1071,7 @@
(EGLSurface)read_native,
(EGLContext)ctx_native
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLContext eglGetCurrentContext ( void ) */
@@ -1155,7 +1155,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglWaitGL ( void ) */
@@ -1164,7 +1164,7 @@
(JNIEnv *_env, jobject _this) {
EGLBoolean _returnValue = (EGLBoolean) 0;
_returnValue = eglWaitGL();
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglWaitNative ( EGLint engine ) */
@@ -1175,7 +1175,7 @@
_returnValue = eglWaitNative(
(EGLint)engine
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglSwapBuffers ( EGLDisplay dpy, EGLSurface surface ) */
@@ -1190,7 +1190,7 @@
(EGLDisplay)dpy_native,
(EGLSurface)surface_native
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* EGLBoolean eglCopyBuffers ( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target ) */
@@ -1215,7 +1215,7 @@
(EGLSurface)sur_native,
(EGLnsecsANDROID)time
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
static const char *classPathName = "android/opengl/EGL14";
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 336c0ec..cc34e99 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -63,6 +63,12 @@
glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
}
#endif
+#ifdef GL_ES_VERSION_3_0
+static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer, GLsizei count) {
+ glVertexAttribIPointer(indx, size, type, stride, pointer);
+}
+#endif
}
/* Cache method IDs each time the class is loaded. */
@@ -288,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
@@ -1184,7 +1191,7 @@
(JNIEnv *_env, jobject _this) {
GLenum _returnValue;
_returnValue = glGetError();
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glGetIntegerv ( GLenum pname, GLint *params ) */
diff --git a/core/jni/android_opengl_GLES10Ext.cpp b/core/jni/android_opengl_GLES10Ext.cpp
index 59e63e1..9284384 100644
--- a/core/jni/android_opengl_GLES10Ext.cpp
+++ b/core/jni/android_opengl_GLES10Ext.cpp
@@ -63,6 +63,12 @@
glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
}
#endif
+#ifdef GL_ES_VERSION_3_0
+static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer, GLsizei count) {
+ glVertexAttribIPointer(indx, size, type, stride, pointer);
+}
+#endif
}
/* Cache method IDs each time the class is loaded. */
@@ -288,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
@@ -395,7 +402,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
@@ -452,7 +459,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
static const char *classPathName = "android/opengl/GLES10Ext";
diff --git a/core/jni/android_opengl_GLES11.cpp b/core/jni/android_opengl_GLES11.cpp
index 352f5bf..871e84d 100644
--- a/core/jni/android_opengl_GLES11.cpp
+++ b/core/jni/android_opengl_GLES11.cpp
@@ -63,6 +63,12 @@
glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
}
#endif
+#ifdef GL_ES_VERSION_3_0
+static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer, GLsizei count) {
+ glVertexAttribIPointer(indx, size, type, stride, pointer);
+}
+#endif
}
/* Cache method IDs each time the class is loaded. */
@@ -288,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
@@ -571,7 +578,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -672,7 +679,7 @@
(GLenum)mode,
(GLsizei)count,
(GLenum)type,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -2263,7 +2270,7 @@
_returnValue = glIsBuffer(
(GLuint)buffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsEnabled ( GLenum cap ) */
@@ -2274,7 +2281,7 @@
_returnValue = glIsEnabled(
(GLenum)cap
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsTexture ( GLuint texture ) */
@@ -2285,7 +2292,7 @@
_returnValue = glIsTexture(
(GLuint)texture
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glNormalPointer ( GLenum type, GLsizei stride, GLint offset ) */
@@ -2295,7 +2302,7 @@
glNormalPointer(
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -2522,7 +2529,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -2930,7 +2937,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
diff --git a/core/jni/android_opengl_GLES11Ext.cpp b/core/jni/android_opengl_GLES11Ext.cpp
index c91baa2..3e038ad 100644
--- a/core/jni/android_opengl_GLES11Ext.cpp
+++ b/core/jni/android_opengl_GLES11Ext.cpp
@@ -63,6 +63,12 @@
glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
}
#endif
+#ifdef GL_ES_VERSION_3_0
+static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer, GLsizei count) {
+ glVertexAttribIPointer(indx, size, type, stride, pointer);
+}
+#endif
}
/* Cache method IDs each time the class is loaded. */
@@ -288,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
@@ -2129,7 +2136,7 @@
_returnValue = glIsRenderbufferOES(
(GLuint)renderbuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glBindRenderbufferOES ( GLenum target, GLuint renderbuffer ) */
@@ -2422,7 +2429,7 @@
_returnValue = glIsFramebufferOES(
(GLuint)framebuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glBindFramebufferOES ( GLenum target, GLuint framebuffer ) */
@@ -2615,7 +2622,7 @@
_returnValue = glCheckFramebufferStatusOES(
(GLenum)target
);
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glFramebufferRenderbufferOES ( GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer ) */
diff --git a/core/jni/android_opengl_GLES20.cpp b/core/jni/android_opengl_GLES20.cpp
index 4179785..9bc69ae 100644
--- a/core/jni/android_opengl_GLES20.cpp
+++ b/core/jni/android_opengl_GLES20.cpp
@@ -63,6 +63,12 @@
glVertexAttribPointer(indx, size, type, normalized, stride, pointer);
}
#endif
+#ifdef GL_ES_VERSION_3_0
+static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer, GLsizei count) {
+ glVertexAttribIPointer(indx, size, type, stride, pointer);
+}
+#endif
}
/* Cache method IDs each time the class is loaded. */
@@ -288,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
@@ -549,7 +556,7 @@
_returnValue = glCheckFramebufferStatus(
(GLenum)target
);
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glClear ( GLbitfield mask ) */
@@ -709,7 +716,7 @@
(JNIEnv *_env, jobject _this) {
GLuint _returnValue;
_returnValue = glCreateProgram();
- return _returnValue;
+ return (jint)_returnValue;
}
/* GLuint glCreateShader ( GLenum type ) */
@@ -720,7 +727,7 @@
_returnValue = glCreateShader(
(GLenum)type
);
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glCullFace ( GLenum mode ) */
@@ -1172,7 +1179,7 @@
(GLenum)mode,
(GLsizei)count,
(GLenum)type,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -2466,7 +2473,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glGetBooleanv ( GLenum pname, GLboolean *params ) */
@@ -2576,7 +2583,7 @@
(JNIEnv *_env, jobject _this) {
GLenum _returnValue;
_returnValue = glGetError();
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glGetFloatv ( GLenum pname, GLfloat *params ) */
@@ -3614,7 +3621,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glGetVertexAttribfv ( GLuint index, GLenum pname, GLfloat *params ) */
@@ -3855,7 +3862,7 @@
_returnValue = glIsBuffer(
(GLuint)buffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsEnabled ( GLenum cap ) */
@@ -3866,7 +3873,7 @@
_returnValue = glIsEnabled(
(GLenum)cap
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsFramebuffer ( GLuint framebuffer ) */
@@ -3877,7 +3884,7 @@
_returnValue = glIsFramebuffer(
(GLuint)framebuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsProgram ( GLuint program ) */
@@ -3888,7 +3895,7 @@
_returnValue = glIsProgram(
(GLuint)program
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsRenderbuffer ( GLuint renderbuffer ) */
@@ -3899,7 +3906,7 @@
_returnValue = glIsRenderbuffer(
(GLuint)renderbuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsShader ( GLuint shader ) */
@@ -3910,7 +3917,7 @@
_returnValue = glIsShader(
(GLuint)shader
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsTexture ( GLuint texture ) */
@@ -3921,7 +3928,7 @@
_returnValue = glIsTexture(
(GLuint)texture
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glLineWidth ( GLfloat width ) */
@@ -5975,7 +5982,7 @@
(GLenum)type,
(GLboolean)normalized,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp
index ac294bd..4cf9313 100644
--- a/core/jni/android_opengl_GLES30.cpp
+++ b/core/jni/android_opengl_GLES30.cpp
@@ -294,6 +294,7 @@
int _needed = 0;
params = (CTYPE *)getPointer(_env, params_buf, &_array, &_remaining, &_bufferOffset);
+ _remaining /= sizeof(CTYPE); // convert from bytes to item count
_needed = getNeededCount(pname);
// if we didn't find this pname, we just assume the user passed
// an array of the right size -- this might happen with extensions
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 8766cf9..1c92803 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -986,6 +986,7 @@
}
// From frameworks/base/core/java/android/content/EventLogTags.logtags:
+#define ENABLE_BINDER_SAMPLE 0
#define LOGTAG_BINDER_OPERATION 52004
static void conditionally_log_binder_call(int64_t start_millis,
@@ -1063,6 +1064,7 @@
ALOGV("Java code calling transact on %p in Java object %p with code %d\n",
target, obj, code);
+#if ENABLE_BINDER_SAMPLE
// Only log the binder call duration for things on the Java-level main thread.
// But if we don't
const bool time_binder_calls = should_time_binder_calls();
@@ -1071,12 +1073,15 @@
if (time_binder_calls) {
start_millis = uptimeMillis();
}
+#endif
//printf("Transact from Java code to %p sending: ", target); data->print();
status_t err = target->transact(code, *data, reply, flags);
//if (reply) printf("Transact from Java code to %p received: ", target); reply->print();
+#if ENABLE_BINDER_SAMPLE
if (time_binder_calls) {
conditionally_log_binder_call(start_millis, target, code);
}
+#endif
if (err == NO_ERROR) {
return JNI_TRUE;
diff --git a/core/jni/com_google_android_gles_jni_GLImpl.cpp b/core/jni/com_google_android_gles_jni_GLImpl.cpp
index badd697..b0c26c51 100644
--- a/core/jni/com_google_android_gles_jni_GLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_GLImpl.cpp
@@ -1181,7 +1181,7 @@
(JNIEnv *_env, jobject _this) {
GLenum _returnValue;
_returnValue = glGetError();
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glGetIntegerv ( GLenum pname, GLint *params ) */
@@ -4017,7 +4017,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
@@ -4074,7 +4074,7 @@
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glBindBuffer ( GLenum target, GLuint buffer ) */
@@ -4359,7 +4359,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -4460,7 +4460,7 @@
(GLenum)mode,
(GLsizei)count,
(GLenum)type,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -6067,7 +6067,7 @@
_returnValue = glIsBuffer(
(GLuint)buffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsEnabled ( GLenum cap ) */
@@ -6078,7 +6078,7 @@
_returnValue = glIsEnabled(
(GLenum)cap
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsTexture ( GLuint texture ) */
@@ -6089,7 +6089,7 @@
_returnValue = glIsTexture(
(GLuint)texture
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glNormalPointer ( GLenum type, GLsizei stride, GLint offset ) */
@@ -6099,7 +6099,7 @@
glNormalPointer(
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -6326,7 +6326,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -6756,7 +6756,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -7196,7 +7196,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -7232,7 +7232,7 @@
(GLint)size,
(GLenum)type,
(GLsizei)stride,
- (const GLvoid *)offset
+ (GLvoid *)offset
);
}
@@ -7325,7 +7325,7 @@
_returnValue = glCheckFramebufferStatusOES(
(GLint)target
);
- return _returnValue;
+ return (jint)_returnValue;
}
/* void glDeleteFramebuffersOES ( GLint n, GLuint *framebuffers ) */
@@ -8166,7 +8166,7 @@
_returnValue = glIsFramebufferOES(
(GLint)framebuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* GLboolean glIsRenderbufferOES ( GLint renderbuffer ) */
@@ -8182,7 +8182,7 @@
_returnValue = glIsRenderbufferOES(
(GLint)renderbuffer
);
- return _returnValue;
+ return (jboolean)_returnValue;
}
/* void glRenderbufferStorageOES ( GLint target, GLint internalformat, GLint width, GLint height ) */
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f336255..83d6061 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -938,6 +938,15 @@
android:label="@string/permlab_camera"
android:description="@string/permdesc_camera" />
+ <!-- Allows disabling the transmit-indicator LED that is normally on when
+ a camera is in use by an application.
+ @hide -->
+ <permission android:name="android.permission.CAMERA_DISABLE_TRANSMIT_LED"
+ android:permissionGroup="android.permission-group.CAMERA"
+ android:protectionLevel="signature|system"
+ android:label="@string/permlab_cameraDisableTransmitLed"
+ android:description="@string/permdesc_cameraDisableTransmitLed" />
+
<!-- =========================================== -->
<!-- Permissions associated with telephony state -->
<!-- =========================================== -->
@@ -2200,6 +2209,13 @@
android:label="@string/permlab_access_keyguard_secure_storage"
android:description="@string/permdesc_access_keyguard_secure_storage" />
+ <!-- Allows an application to control keyguard. Only allowed for system processes.
+ @hide -->
+ <permission android:name="android.permission.CONTROL_KEYGUARD"
+ android:protectionLevel="signature"
+ android:label="@string/permlab_control_keyguard"
+ android:description="@string/permdesc_control_keyguard" />
+
<!-- Must be required by an {@link
android.service.notification.NotificationListenerService},
to ensure that only the system can bind to it. -->
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 629e1db..4a4dd9d 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Laat die program toe om klank met die mikrofoon op te neem. Hierdie toestemming laat die program toe om klank te eniger tyd, sonder jou bevestiging, op te neem."</string>
<string name="permlab_camera" msgid="3616391919559751192">"neem foto\'s en video\'s"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Laat die program toe om foto\'s en video\'s met die kamera te neem. Hierdie toestemming laat die program toe om die kamera te eniger tyd sonder jou bevestiging te gebruik."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiveer tablet permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktiveer foon permanent"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Laat die program toe om die hele tablet permanent uitvee. Dit is baie gevaarlik."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Laat \'n program toe om media-uitvoere na ander eksterne toestelle te roeteer."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Kry toegang tot keyguard se veilige berging"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Laat \'n program toe om toegang tot keyguard se veilige berging te kry."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Raak twee keer vir zoembeheer"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Kon nie legstuk byvoeg nie."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Gaan"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="owner_name" msgid="2716755460376028154">"Eienaar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fout"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Hierdie program werk nie met rekeninge vir beperkte gebruikers nie"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Geen program gevind om hierdie handeling te hanteer nie"</string>
<string name="revoke" msgid="5404479185228271586">"Herroep"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index a9f6783..f233939 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"መተግበሪያው ድምጽን በማይክሮፎን እንዲቀዳ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው ያላንተ ማረጋገጫ በማንኛውም ጊዜ ድምጽ እንዲቀዳ ይፈቅድለታል።"</string>
<string name="permlab_camera" msgid="3616391919559751192">"ፎቶዎች እና ቪዲዮዎች አንሳ"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"መተግበሪያው በካሜራው ፎቶዎችንና ቪዲዮዎችን እንዲያነሳ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው ካሜራውን በማንኛውም ጊዜ ያላንተ ማረጋገጫ እንዲጠቀም ይፈቅድለታል።"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"በቋሚነት ጡባዊ አቦዝን"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"በቋሚነት ስልኩን አቦዝን"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"ትግበራው ጡባዊ ተኮውን በቋሚነት ማቦዘን ይፈቅዳል። ይህ በጣም አደገኛ ነው።"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"አንድ መተግበሪያ የሚዲያ ውፅአትን ወደ ሌላ ውጫዊ መሳሪያ እንዲመራ ይፈቅድለታል።"</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ደህንነቱ በቁልፍ የተጠበቀ ማከማቻን ይድረሱ"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"አንድ መተግበሪያ ደህንነቱ በቁልፍ የተጠበቀ ማከማቻ እንዲደርስ ያስችለዋል።"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ለአጉላ መቆጣጠሪያ ሁለት ጊዜ ነካ አድርግ"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"ምግብር ማከል አልተቻለም።"</string>
<string name="ime_action_go" msgid="8320845651737369027">"ሂድ"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string>
<string name="owner_name" msgid="2716755460376028154">"ባለቤት"</string>
<string name="error_message_title" msgid="4510373083082500195">"ስህተት"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"ይህ መተግበሪያ የተገደቡ ተጠቃሚዎች መለያዎችን አይደግፍም"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"ይህን እርምጃ የሚያከናውን ምንም መተግበሪያ አልተገኘም"</string>
<string name="revoke" msgid="5404479185228271586">"ሻር"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index e4870e0..c540f6d 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"للسماح للتطبيق بتسجيل الصوت باستخدام الميكروفون. ويتيح هذا الإذن للتطبيق تسجيل الصوت في أي وقت وبدون موافقة منك."</string>
<string name="permlab_camera" msgid="3616391919559751192">"التقاط صور ومقاطع فيديو"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"للسماح للتطبيق بالتقاط صور ومقاطع فيديو من خلال الكاميرا. ويتيح هذا الإذن للتطبيق استخدام الكاميرا في أي وقت وبدون موافقة منك."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"تعطيل الجهاز اللوحي نهائيًا"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"تعطيل الهاتف على الدوام"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"للسماح للتطبيق بتعطيل الجهاز اللوحي بالكامل بشكل دائم. هذا خطير للغاية."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"للسماح للتطبيق بتوجيه إخراج الوسائط إلى أجهزة خارجية أخرى."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"الدخول إلى التخزين المحمي بقفل المفاتيح"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"السماح لأحد التطبيقات بالدخول إلى التخزين المحمي بقفل المفاتيح."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"المس مرتين للتحكم في التكبير/التصغير"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"تعذرت إضافة أداة."</string>
<string name="ime_action_go" msgid="8320845651737369027">"تنفيذ"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"المالك"</string>
<string name="error_message_title" msgid="4510373083082500195">"خطأ"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"لا يوفر هذا التطبيق حسابات للمستخدمين المقيّدين"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"لم يتم العثور على تطبيق يمكنه التعامل مع هذا الإجراء."</string>
<string name="revoke" msgid="5404479185228271586">"إلغاء"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index ddad584..d623f0c 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Дазваляе прыкладанню запісваць аўдыё з дапамогай мікрафона. Дзякуючы гэтаму дазволу прыкладаннi могуць запiсваць аўдыё ў любы час без вашага пацвярджэння."</string>
<string name="permlab_camera" msgid="3616391919559751192">"рабіць фатаграфіі і відэа"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Дазваляе прыкладанню рабiць фотаздымкi і здымаць відэа з дапамогай камеры. Дзякуючы ггэтаму дазволу прыкладанне можа ў любы час выкарыстоўваць камеру без вашага пацверджання."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"цалкам адключыць планшэт"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"цалкам адключаць тэлефон"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дазваляе прыкладанням цалкам адключаць планшэт. Гэта вельмі небяспечна."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Дазваляе прыкладанням маршрутызаваць мультымедыйны выхад на iншыя знешнiя прылады."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Доступ да блакіроўкі клавіятуры бяспечнага сховішча"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Дазваляе прыкладанню атрымліваць доступ да блакіроўкі клавіятуры бяспечнага сховішча."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Двойчы дакраніцеся, каб змянiць маштаб"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Немагчыма дадаць віджэт."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Пачаць"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Бягучы карыстальнік <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Уладальнік"</string>
<string name="error_message_title" msgid="4510373083082500195">"Памылка"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Гэтае прыкладанне не падтрымлівае уліковыя запісы для карыстальнікаў з абмежаванымі правамі"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Прыкладанне для гэтага дзеяння не знойдзенае"</string>
<string name="revoke" msgid="5404479185228271586">"Ануляваць"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 3e7a3f8..bebb540 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Разрешава на приложението да записва звук с микрофона. Това разрешение му позволява да го прави по всяко време без потвърждение от ваша страна."</string>
<string name="permlab_camera" msgid="3616391919559751192">"правене на снимки и видеоклипове"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Разрешава на приложението да прави снимки и видеоклипове с камерата. Това разрешение му позволява да я използва по всяко време без потвърждение от ваша страна."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"деактивиране на таблета за постоянно"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"деактивиране на телефона за постоянно"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Разрешава на приложението да деактивира целия таблет за постоянно. Това е много опасно."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Разрешава на приложението да насочва изходящата мултимедия към други външни устройства."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Достъп до надеждното хранилище, свързано с функцията за защита на клавишите"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Позволява на приложението да осъществява достъп до надеждното хранилище, свързано с функцията за защита на клавишите."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Докоснете двукратно за управление на промяната на мащаба"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Приспособлението не можа да бъде добавено."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Старт"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Собственик"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Това приложение не поддържа профили за потребители с ограничения"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Няма намерено приложение за извършване на това действие"</string>
<string name="revoke" msgid="5404479185228271586">"Отмяна"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 2637dce..2d80ac0 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permet que l\'aplicació enregistri àudio amb el micròfon. Aquest permís permet que l\'aplicació enregistri àudio en qualsevol moment sense la teva confirmació."</string>
<string name="permlab_camera" msgid="3616391919559751192">"fes fotos i vídeos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permet que l\'aplicació faci fotos i vídeos amb la càmera. Aquest permís permet que l\'aplicació utilitzi la càmera en qualsevol moment sense la teva confirmació."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactiva la tauleta de manera permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar definitivament el telèfon"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permet que l\'aplicació desactivi tota la tauleta de manera permanent. Aquesta acció és molt perillosa."</string>
@@ -492,7 +496,7 @@
<string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Permet que l\'aplicació instal·li/desinstal·li l\'emmagatzematge intern."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"canvia el nom de l\'emmagatzematge intern"</string>
<string name="permdesc_asec_rename" msgid="1794757588472127675">"Permet que l\'aplicació canviï el nom de l\'emmagatzematge intern."</string>
- <string name="permlab_vibrate" msgid="7696427026057705834">"control de la vibració"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"controlar la vibració"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"Permet que l\'aplicació controli el vibrador."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"controlar el flaix"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"Permet que l\'aplicació controli el flaix."</string>
@@ -517,10 +521,10 @@
<string name="permdesc_bindGadget" msgid="8261326938599049290">"Permet que l\'aplicació indiqui al sistema quins widgets pot utilitzar cada aplicació. Amb aquest permís, les aplicacions poden concedir accés a les dades personals a altres aplicacions. No indicat per a les aplicacions normals."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"modificar l\'estat del telèfon"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Permet que l\'aplicació controli les funcions de telèfon del dispositiu. Una aplicació amb aquest permís pot canviar de xarxa, activar i desactivar la ràdio del telèfon i dur a terme accions semblants sense notificar-t\'ho."</string>
- <string name="permlab_readPhoneState" msgid="9178228524507610486">"lectura de l\'estat i la identitat del telèfon"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"veure l\'estat i la identitat del telèfon"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permet que l\'aplicació accedeixi a les funcions de telèfon del dispositiu. Aquest permís permet que l\'aplicació determini el número de telèfon i els identificadors del dispositiu, si hi ha una trucada activa i el número remot connectat amb una trucada."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"evita que la tauleta entri en mode d\'inactivitat"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir que el telèfon se suspengui"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir que el telèfon entri en mode de repòs"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permet que l\'aplicació impedeixi que la tauleta entri en repòs."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permet que l\'aplicació impedeixi que el telèfon entri en repòs."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"activa o desactiva la tauleta"</string>
@@ -544,16 +548,16 @@
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Permet que l\'aplicació canviï la zona horària del telèfon."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"actuar com a AccountManagerService"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"Permet que una aplicació faci trucades a autenticadors de comptes."</string>
- <string name="permlab_getAccounts" msgid="1086795467760122114">"cerca de comptes al dispositiu"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"cercar comptes al dispositiu"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Permet que l\'aplicació obtingui la llista de comptes coneguts per la tauleta. Això pot incloure tots els comptes que hagin creat les aplicacions que tens instal·lades."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Permet que l\'aplicació obtingui la llista de comptes coneguts pel telèfon. Això pot incloure tots els comptes que hagin creat les aplicacions que tens instal·lades."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"creació de comptes i definició de contrasenyes"</string>
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Permet que l\'aplicació utilitzi les funcions d\'autenticador de comptes del gestor de comptes, incloses la creació de comptes i l\'obtenció i la definició de les seves contrasenyes."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"addició o eliminació de comptes"</string>
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"Permet que l\'aplicació dugui a terme operacions com ara afegir i eliminar comptes i suprimir-ne la contrasenya."</string>
- <string name="permlab_useCredentials" msgid="235481396163877642">"ús dels comptes al dispositiu"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"fer servir comptes del dispositiu"</string>
<string name="permdesc_useCredentials" msgid="7984227147403346422">"Permet que l\'aplicació sol·liciti testimonis d\'autenticació."</string>
- <string name="permlab_accessNetworkState" msgid="4951027964348974773">"visualització de les connexions de xarxa"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"veure connexions de xarxa"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Permet que l\'aplicació visualitzi informació sobre connexions de xarxa, com ara quines xarxes hi ha i quines estan connectades."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"accés total a la xarxa"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Permet que l\'aplicació creï sòcols de xarxa i que utilitzi protocols de xarxa personalitzats. El navegador i altres aplicacions proporcionen mitjans per enviar dades a Internet, de manera que aquest permís no és obligatori per enviar-n\'hi."</string>
@@ -565,9 +569,9 @@
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permet que l\'aplicació canviï l\'estat de la connectivitat de la xarxa d\'ancoratge."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"canviar la configuració d\'ús de dades de referència"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Permet que l\'aplicació canviï la configuració d\'ús de les dades de fons."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"visualització de les connexions Wi-Fi"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"veure connexions Wi-Fi"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Permet que l\'aplicació visualitzi informació sobre les xarxes Wi-Fi, com ara si la Wi-Fi està activada i el nom dels dispositius Wi-Fi connectats."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"connexió i desconnexió de la Wi-Fi"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"connectar-se a xarxes Wi-Fi i desconnectar-se"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"Permet que l\'aplicació es connecti i es desconnecti de punts d\'accés Wi-Fi i que faci canvis a la configuració de les xarxes Wi-Fi dels dispositius."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"permetre la recepció de multidifusió Wi-fi"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Permet que l\'aplicació rebi paquets enviats a tots els dispositius d\'una xarxa Wi-Fi mitjançant les adreces multidifusió, no només a la teva tauleta. Fa servir més energia que el mode que no és multidifusió."</string>
@@ -601,11 +605,11 @@
<string name="permdesc_readDictionary" msgid="659614600338904243">"Permet que l\'aplicació llegeixi les paraules, els noms i les frases que l\'usuari pot haver emmagatzemat al seu diccionari."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"afegeix paraules al diccionari definit per l\'usuari"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permet que l\'aplicació escrigui paraules noves al diccionari de l\'usuari."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"accés de prova a emmagatzematge protegit"</string>
- <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"accés de prova a emmagatzematge protegit"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"provar l\'accés a emmagatzematge protegit"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"provar l\'accés a emmagatzematge protegit"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Permet que l\'aplicació provi un permís per a emmagatzematge USB que estarà disponible a propers dispositius."</string>
<string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Permet que l\'aplicació provi un permís per a la targeta SD que estarà disponible als dispositius en el futur."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificació o supressió del contingut de l\'emmagatzematge USB"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"editar o suprimir contingut d\'USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modifica o suprimeix el contingut de la targeta SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permet que l\'aplicació escrigui a l\'emmagatzematge USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet a l\'aplicació escriure a la targeta SD."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet que una aplicació indiqui la ruta de sortida de contingut multimèdia a altres dispositius externs."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Accedeix a l\'emmagatzematge protegit per contrasenya"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permet que una aplicació accedeixi a l\'emmagatzematge protegit per contrasenya."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toca dos cops per controlar el zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"No s\'ha pogut afegir el widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Vés"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Propietari"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Aquesta aplicació no admet comptes per a usuaris limitats"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"No s\'ha trobat cap aplicació per processar aquesta acció"</string>
<string name="revoke" msgid="5404479185228271586">"Revoca"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 44fbc7e..6d071c1 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Umožňuje aplikaci zaznamenat zvuk pomocí mikrofonu. Toto oprávnění umožňuje aplikaci kdykoliv zaznamenat zvuk bez vašeho svolení."</string>
<string name="permlab_camera" msgid="3616391919559751192">"pořizování fotografií a videí"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Umožňuje aplikaci pořizovat fotografie a videa pomocí fotoaparátu. Toto oprávnění umožňuje aplikaci používat fotoaparát kdykoliv i bez vašeho svolení."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trvalé vypnutí tabletu"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"trvalé vypnutí telefonu"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Umožňuje aplikaci trvale vypnout celý tablet. To je velmi nebezpečné oprávnění."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Umožňuje aplikaci směrovat výstup médií do dalších externích zařízení."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Přístup k bezpečnému úložišti keyguard"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Umožňuje aplikaci přístup k bezpečnému úložišti keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Dvojitým dotykem můžete ovládat přiblížení"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget nelze přidat."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Přejít"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlastník"</string>
<string name="error_message_title" msgid="4510373083082500195">"Chyba"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Tato aplikace u omezeného počtu uživatelů nepodporuje účty"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Aplikace potřebná k provedení této akce nebyla nalezena"</string>
<string name="revoke" msgid="5404479185228271586">"Zrušit"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index dbe2c55..f00a9a9 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Tillader, at appen kan optage lyd med mikrofonen. Med denne tilladelse kan appen til enhver tid optage lyd uden din bekræftelse."</string>
<string name="permlab_camera" msgid="3616391919559751192">"tag billeder og optag video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Tillader, at appen kan tage billeder og videoer med kameraet. Med denne tilladelse kan appen til enhver tid bruge kameraet uden din bekræftelse."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiver tabletcomputeren permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktiver telefonen permanent"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillader, at appen kan deaktivere hele din tablet permanent. Dette er meget farligt."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Tillader, at en applikation viderefører medieoutput til andre eksterne enheder."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Få adgang nøglebeskyttet lager"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Tillader, at en applikation får adgang til et nøglebeskyttet lager."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Tryk to gange for zoomstyring"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget kunne ikke tilføjes."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Gå"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Ejer"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fejl"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Denne applikation understøtter ikke konti for brugere med begrænsede rettigheder"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Der blev ikke fundet nogen applikation, der kan håndtere denne handling"</string>
<string name="revoke" msgid="5404479185228271586">"Tilbagekald"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 472929e..fea1c78 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Ermöglicht der App, Ton mithilfe des Mikrofons aufzunehmen. Die Berechtigung erlaubt der App, Tonaufnahmen jederzeit und ohne Ihre Bestätigung durchzuführen."</string>
<string name="permlab_camera" msgid="3616391919559751192">"Bilder und Videos aufnehmen"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Ermöglicht der App, Bilder und Videos mit der Kamera aufzunehmen. Die Berechtigung erlaubt der App, die Kamera jederzeit und ohne Ihre Bestätigung zu nutzen."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"Tablet dauerhaft deaktivieren"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"Telefon dauerhaft deaktivieren"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ermöglicht der App, das gesamte Tablet dauerhaft zu deaktivieren. Dies birgt hohe Risiken."</string>
@@ -553,7 +557,7 @@
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"Ermöglicht der App, Konten hinzuzufügen und zu entfernen oder deren Passwörter zu löschen"</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"Konten auf dem Gerät verwenden"</string>
<string name="permdesc_useCredentials" msgid="7984227147403346422">"Ermöglicht der App, Authentifizierungs-Token anzufordern"</string>
- <string name="permlab_accessNetworkState" msgid="4951027964348974773">"Netzwerkverbindungen anzeigen"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"Netzwerkverbindungen abrufen"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Ermöglicht der App, Informationen zu Netzwerkverbindungen abzurufen, etwa welche Netzwerke existieren und verbunden sind."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"Voller Netzwerkzugriff"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Ermöglicht der App die Erstellung von Netzwerk-Sockets und die Verwendung benutzerdefinierter Netzwerkprotokolle. Der Browser und andere Apps bieten die Möglichkeit, Daten über das Internet zu versenden. Daher ist diese Berechtigung nicht erforderlich, um Daten über das Internet versenden zu können."</string>
@@ -565,7 +569,7 @@
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"Ermöglicht der App, den Status der Tethering-Konnektivität zu ändern"</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"Einstellung zur Verwendung von Hintergrunddaten ändern"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Ermöglicht der App, die Einstellung zur Verwendung von Hintergrunddaten zu ändern"</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"WLAN-Verbindungen anzeigen"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"WLAN-Verbindungen abrufen"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Ermöglicht der App, Informationen zu WLANs abzurufen, etwa ob ein WLAN aktiviert ist, und den Namen verbundener WLAN-Geräte."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"WLAN-Verbindungen herstellen und trennen"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ermöglicht der App, eine Verbindung zu WLAN-Zugriffspunkten herzustellen und solche zu trennen und Änderungen an der Gerätekonfiguration für WLAN-Netzwerke vorzunehmen."</string>
@@ -613,7 +617,7 @@
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Ermöglicht der App, den Inhalt des internen Medienspeichers zu ändern"</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"Auf externen Speicher aller Nutzer zugreifen"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Ermöglicht der App, auf externen Speicher aller Nutzer zuzugreifen."</string>
- <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Zugriff auf das Cache-Dateisystem"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Auf das Cache-Dateisystem zugreifen"</string>
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ermöglicht der App Lese- und Schreibzugriff auf das Cache-Dateisystem"</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"Internetanrufe tätigen/annehmen"</string>
<string name="permdesc_use_sip" msgid="4717632000062674294">"Ermöglicht der App die Verwendung des SIP-Dienstes zum Tätigen und Annehmen von Internetanrufen"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ermöglicht einer App, die Medienausgabe auf andere externe Geräte umzuleiten."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Zugriff auf mit Keyguard geschützten Speicher"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ermöglicht einer App den Zugriff auf mit Keyguard geschützten Speicher"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Für Zoomeinstellung zweimal berühren"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget konnte nicht hinzugefügt werden."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Los"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Eigentümer"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fehler"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Diese App unterstützt keine Konten für eingeschränkte Nutzer."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Für diese Aktion wurde keine App gefunden."</string>
<string name="revoke" msgid="5404479185228271586">"Aufheben"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 93614f6..b8fe259 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Επιτρέπει στην εφαρμογή την εγγραφή ήχου με το μικρόφωνο. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να εγγράφει ήχο ανά πάσα στιγμή χωρίς την έγκρισή σας."</string>
<string name="permlab_camera" msgid="3616391919559751192">"λήψη φωτογραφιών και βίντεο"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Επιτρέπει στην εφαρμογή τη λήψη φωτογραφιών και βίντεο με τη φωτογραφική μηχανή. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να χρησιμοποιεί τη φωτογραφική μηχανή ανά πάσα στιγμή χωρίς την έγκρισή σας."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"μόνιμη απενεργοποίηση του tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"μόνιμη απενεργοποίηση τηλεφώνου"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Επιτρέπει στην εφαρμογή τη μόνιμη απενεργοποίηση όλων των λειτουργιών του tablet, το οποίο είναι εξαιρετικά επικίνδυνο."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Επιτρέπει σε μια εφαρμογή τη διαγραφή διαδρομής δεδομένων εξόδου μέσων σε άλλες εξωτερικές συσκευές."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Πρόσβαση στον ασφαλή αποθηκευτικό χώρο με κλείδωμα"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Επιτρέπει σε μια εφαρμογή να αποκτήσει πρόσβαση στον ασφαλή αποθηκευτικό χώρο με κλείδωμα."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Αγγίξτε δύο φορές για έλεγχο εστίασης"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Δεν ήταν δυνατή η προσθήκη του γραφικού στοιχείου."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Μετάβαση"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Κάτοχος"</string>
<string name="error_message_title" msgid="4510373083082500195">"Σφάλμα"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Αυτή η εφαρμογή δεν υποστηρίζει λογαριασμούς για περιορισμένους χρήστες"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Δεν υπάρχει εφαρμογή για τη διαχείριση αυτής της ενέργειας"</string>
<string name="revoke" msgid="5404479185228271586">"Ανάκληση"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index fd18e33..3ee9b0b 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Allows the app to record audio with the microphone. This permission allows the app to record audio at any time without your confirmation."</string>
<string name="permlab_camera" msgid="3616391919559751192">"take pictures and videos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Allows the app to take pictures and videos with the camera. This permission allows the app to use the camera at any time without your confirmation."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanently disable tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"permanently disable phone"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Allows the app to permanently disable the entire tablet. This is very dangerous."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Allows an application to route media output to other external devices."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Access keyguard secure storage"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Allows an application to access keyguard secure storage."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Touch twice for zoom control"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Couldn\'t add widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Go"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Owner"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"This application does not support accounts for limited users"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"No application found to handle this action"</string>
<string name="revoke" msgid="5404479185228271586">"Revoke"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index caaa129..44eb6ad 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que la aplicación grabe audio con el micrófono. La aplicación puede utilizar este permiso para grabar audio en cualquier momento sin tener tu confirmación."</string>
<string name="permlab_camera" msgid="3616391919559751192">"tomar fotografías y grabar videos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permite que la aplicación saque fotos o grabe videos con la cámara. Este permiso autoriza a la aplicación a utilizar la cámara en cualquier momento sin tu confirmación."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactivar tablet de forma permanente"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar dispositivo de manera permanente"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que la aplicación inhabilite toda la tableta de manera permanente. Esto es muy peligroso."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que la aplicación dirija salidas de medios a otros dispositivos externos."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Acceder al almacenamiento seguro de bloqueos"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite que una aplicación acceda al almacenamiento seguro de bloqueos."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toca dos veces para acceder al control de zoom."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"No se pudo agregar el widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Esta aplicación no admite cuentas para usuarios restringidos."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"No se encontró una aplicación para manejar esta acción."</string>
<string name="revoke" msgid="5404479185228271586">"Revocar"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 8ad1404..2fffebb5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que la aplicación grabe audio con el micrófono. La aplicación puede utilizar este permiso para grabar audio en cualquier momento sin tener la confirmación del usuario."</string>
<string name="permlab_camera" msgid="3616391919559751192">"realizar fotografías y vídeos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permite que la aplicación haga fotos o grabe vídeos con la cámara. Este permiso autoriza a la aplicación a utilizar la cámara en cualquier momento sin tu confirmación."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"inhabilitar tablet de forma permanente"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"inhabilitar el teléfono de forma permanente"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que la aplicación inhabilite todas las funciones del tablet de forma permanente. Este permiso es muy peligroso."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que la aplicación dirija salidas de medios a otros dispositivos externos."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Acceder al almacenamiento seguro de bloqueos"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite que una aplicación acceda al almacenamiento seguro de bloqueos."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toca dos veces para acceder al control de zoom."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"No se ha podido añadir el widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Esta aplicación no admite cuentas de usuarios limitados."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string>
<string name="revoke" msgid="5404479185228271586">"Revocar"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 9b4f1c9..edf59d6 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Võimaldab rakendusel salvestada mikrofoniga heli. See luba võimaldab rakendusel salvestada heli igal ajal ilma teie kinnituseta."</string>
<string name="permlab_camera" msgid="3616391919559751192">"piltide ja videote tegemine"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Võimaldab rakendusel teha kaameraga pilte ja videoid. See luba võimaldab rakendusel kasutada kaamerat mis tahes ajal teie kinnituseta."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"blokeeri tahvelarvuti jäädavalt"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"blokeeri telefon jäädavalt"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Võimaldab rakendusel kogu tahvelarvuti jäädavalt keelata. See on väga ohtlik."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Võimaldab rakendusel koostada teekonna meediaväljundist teistesse välistesse seadmetesse."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Juurdepääs võtmekaitsega turvalisele talletusruumile"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Lubab rakendusel hankida juurdepääsu võtmekaitsega turvalisele talletusruumile."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Suumi juhtimiseks puudutage kaks korda"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Vidinat ei saanud lisada."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Mine"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Omanik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Viga"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Rakendus ei toeta piiratud õigustega kasutajate kontosid"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Selle toimingu käsitlemiseks ei leitud ühtegi rakendust"</string>
<string name="revoke" msgid="5404479185228271586">"Tühista"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 06b983d..36d831b 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"به برنامه اجازه میدهد صدا را با میکروفن ضبط کند. این مجوز به برنامه اجازه میدهد صدا را در هر زمان که بخواهید بدون تأیید شما ضبط کند."</string>
<string name="permlab_camera" msgid="3616391919559751192">"عکسبرداری و فیلمبرداری"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"به برنامه اجازه میدهد با دوربین به عکسبرداری و فیلمبرداری بپردازد. این مجوز به برنامه اجازه میدهد از دوربین در هر زمانی بدون تأیید شما استفاده کند."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"غیر فعال کردن دائم رایانهٔ لوحی"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"تلفن بطور دائمی غیرفعال شود"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"به برنامه اجازه میدهد تا رایانهٔ لوحی را به طور کلی و دائمی غیرفعال کند. این کار بسیار خطرناک است."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"به یک برنامه اجازه میدهد خروجی رسانه را به دستگاههای خارجی دیگر تعیین مسیر کند."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"دسترسی به فضای ذخیرهسازی ایمن محافظ کلید"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"به یک برنامه کاربردی برای دسترسی به فضای ذخیرهسازی ایمن محافظ کلید اجازه میدهد."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"دوبار لمس کنید تا بزرگنمایی کنترل شود"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"افزودن ابزارک انجام نشد."</string>
<string name="ime_action_go" msgid="8320845651737369027">"برو"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"دارنده"</string>
<string name="error_message_title" msgid="4510373083082500195">"خطا"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"این برنامه حسابهای تعداد محدودی از کاربران را پشتیبانی نمیکند"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"برنامهای برای انجام این عملکرد موجود نیست"</string>
<string name="revoke" msgid="5404479185228271586">"لغو"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index faa3e5a..546eaf4 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Antaa sovelluksen tallentaa ääntä mikrofonin avulla. Sovellus voi tallentaa ääntä milloin tahansa pyytämättä sinulta lupaa."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ota kuvia ja videoita"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Antaa sovelluksen ottaa kuvia ja kuvata videoita kameralla. Sovellus voi käyttää kameraa milloin tahansa ilman lupaasi."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"poista tablet-laite käytöstä lopullisesti"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"poista puhelin käytöstä pysyvästi"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Antaa sovelluksen poistaa koko tablet-laitteen käytöstä lopullisesti. Tämä on hyvin vaarallista."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Antaa sovelluksen reitittää mediaa muihin ulkoisiin laitteisiin."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Salasanalla suojatun tallennustilan hallinta"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Sallii sovelluksen käyttää salasanalla suojattua tallennustilaa."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Ohjaa zoomausta napauttamalla kahdesti"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widgetin lisääminen epäonnistui."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Siirry"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Omistaja"</string>
<string name="error_message_title" msgid="4510373083082500195">"Virhe"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Tämä sovellus ei tue rajoitettujen käyttäjien tilejä"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Tätä toimintoa käsittelevää sovellusta ei löydy"</string>
<string name="revoke" msgid="5404479185228271586">"Peruuta"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 82aaca9..3d991d4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -464,10 +464,14 @@
<string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Permet à l\'application de contrôler les fonctionnalités de base des écrans Wi-Fi."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string>
- <string name="permlab_recordAudio" msgid="3876049771427466323">"Enregistrement de fichier audio"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"Enregistrer des fichiers audio"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permet à l\'application d\'enregistrer des contenus audio à l\'aide du microphone. Cette autorisation lui donne la possibilité d\'enregistrer du contenu audio à tout moment sans votre consentement."</string>
<string name="permlab_camera" msgid="3616391919559751192">"prendre des photos et enregistrer des vidéos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permet à l\'application de prendre des photos et de filmer des vidéos avec l\'appareil photo. Cette autorisation lui permet d\'utiliser l\'appareil photo à tout moment sans votre consentement."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"désactiver définitivement la tablette"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"désactiver définitivement le téléphone"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permet à l\'application de désactiver définitivement la tablette. Cette fonctionnalité peut avoir des répercussions très sérieuses."</string>
@@ -502,7 +506,7 @@
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Permet l\'accès au pilote MTP du noyau à des fins de mise en œuvre du protocole USB MTP."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"Tests du matériel"</string>
<string name="permdesc_hardware_test" msgid="6597964191208016605">"Permet à l\'application de contrôler différents périphériques à des fins de test matériel."</string>
- <string name="permlab_callPhone" msgid="3925836347681847954">"Appel direct des numéros de téléphone"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"Appeler directement les numéros de téléphone"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Permet à l\'application d\'appeler des numéros de téléphone sans votre intervention. Cette autorisation peut entraîner des frais ou des appels imprévus et ne permet pas à l\'application d\'appeler des numéros d\'urgence. Les applications malveillantes peuvent générer des frais en passant des appels sans votre consentement."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"Appel direct de tout numéro de téléphone"</string>
<string name="permdesc_callPrivileged" msgid="1689024901509996810">"Permet à l\'application d\'appeler n\'importe quel numéro de téléphone, y compris les numéros d\'urgence, sans votre intervention. Des applications malveillantes peuvent passer des appels inutiles et interdits aux services d\'urgence."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet à une application de diriger la sortie multimédia vers d\'autres appareils externes."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Accéder au stockage sécurisé keyguard"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permet à une application d\'accéder au stockage sécurisé keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Appuyez deux fois pour régler le zoom."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Impossible d\'ajouter le widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"OK"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propriétaire"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erreur"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Les comptes des utilisateurs en accès limité ne sont pas acceptés pour cette application."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Aucune application trouvée pour gérer cette action."</string>
<string name="revoke" msgid="5404479185228271586">"Révoquer"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 3d2ca2b..9c57a23 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"एप्लिकेशन को माइक्रोफ़ोन द्वारा ऑडियो रिकार्ड करने देता है. यह अनुमति एप्लिकेशन को आपकी पुष्टि के बिना किसी भी समय ऑडियो रिकार्ड करने देती है."</string>
<string name="permlab_camera" msgid="3616391919559751192">"चित्र और वीडियो लें"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"एप्लिकेशन को कैमरे से चित्र और वीडियो लेने देता है. यह अनुमति एप्लिकेशन को किसी भी समय आपकी पुष्टि के बिना कैमरे का उपयोग करने देती है."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"स्थायी रूप से टेबलेट अक्षम करें"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"फ़ोन को स्थायी रूप से अक्षम करें"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"एप्लिकेशन को संपूर्ण टेबलेट को स्थायी रूप से अक्षम करने देता है. यह बहुत खतरनाक है."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"एप्लिकेशन को मीडिया आउटपुट को अन्य बाहरी उपकरणों पर रूट करने देता है."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"कीगार्ड सुरक्षित संग्रहण एक्सेस करें"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"एप्लिकेशन को कीगार्ड सुरक्षित संग्रहण एक्सेस करने देती है."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ज़ूम नियंत्रण के लिए दो बार स्पर्श करें"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"विजेट नहीं जोड़ा जा सका."</string>
<string name="ime_action_go" msgid="8320845651737369027">"जाएं"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"वर्तमान उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"स्वामी"</string>
<string name="error_message_title" msgid="4510373083082500195">"त्रुटि"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"यह एप्लिकेशन सीमित उपयोगकर्ताओं के खातों का समर्थन नहीं करता है"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"इस कार्यवाही को प्रबंधित करने के लिए कोई एप्लिकेशन नहीं मिला"</string>
<string name="revoke" msgid="5404479185228271586">"निरस्त करें"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 2ecd8e4..8b677ed 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Aplikaciji omogućuje snimanje zvuka mikrofonom. Ta dozvola aplikaciji omogućuje snimanje zvuka u bilo kojem trenutku bez vašeg odobrenja."</string>
<string name="permlab_camera" msgid="3616391919559751192">"snimi fotografije i videozapise"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Aplikaciji omogućuje snimanje slika i videozapisa fotoaparatom. Ta dozvola aplikaciji omogućuje upotrebu fotoaparata u bilo kojem trenutku bez vašeg odobrenja."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogući tabletni uređaj"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogućavanje telefona"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Aplikaciji omogućuje trajno isključivanje cijelog tabletnog računala. To je vrlo opasno."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Aplikaciji omogućuje usmjeravanje medijskog izlaza na druge vanjske uređaje."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Pristup zaključanoj sigurnoj pohrani"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Omogućuje aplikaciji pristupanje zaključanoj sigurnoj pohrani."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Dodirnite dvaput za upravljanje zumiranjem"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget nije moguće dodati."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Idi"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlasnik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Pogreška"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Aplikacija ne podržava račune za ograničene korisnike"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nije pronađena aplikacija za upravljanje ovom radnjom"</string>
<string name="revoke" msgid="5404479185228271586">"Opozovi"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 542f8a0..3611469 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Lehetővé teszi az alkalmazás számára a mikrofonnal való hangfelvételt.Az engedéllyel rendelkező alkalmazás az Ön jóváhagyása nélkül, bármikor rögzíthet hanganyagot."</string>
<string name="permlab_camera" msgid="3616391919559751192">"fotók és videók készítése"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Lehetővé teszi az alkalmazás számára, hogy a fényképezőgéppel fotókat és videókat készítsen. Az engedéllyel rendelkező alkalmazás bármikor, az Ön jóváhagyása nélkül használhatja a fényképezőgépet."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"a táblagép végleges deaktiválása"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"telefon végleges letiltása"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Lehetővé teszi az alkalmazás számára, hogy teljesen deaktiválják a táblagépet. Ez nagyon veszélyes."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Lehetővé teszi az alkalmazás számára, hogy más külső eszközökre irányítsa a médiafájlok lejátszását."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Hozzáférés a kóddal védett tárhelyhez"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Lehetővé teszi egy alkalmazás számára, hogy hozzáférjen a kóddal védett tárhelyhez."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Érintse meg kétszer a nagyítás beállításához"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Nem sikerült hozzáadni a modult."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ugrás"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string>
<string name="owner_name" msgid="2716755460376028154">"Tulajdonos"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hiba"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ez az alkalmazás nem támogatja a korlátozott jogokkal rendelkező felhasználói fiókokat."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nincs megfelelő alkalmazás a művelet elvégzésére."</string>
<string name="revoke" msgid="5404479185228271586">"Visszavonás"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a49ab4f84..0d0f804 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Memungkinkan aplikasi merekam audio dengan mikrofon. Izin ini memungkinkan aplikasi merekam audio kapan saja tanpa konfirmasi Anda."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ambil gambar dan video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Memungkinkan aplikasi mengambil gambar dan video dengan kamera. Izin ini memungkinkan aplikasi menggunakan kamera kapan saja tanpa konfirmasi Anda."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"noaktifkan tablet secara permanen"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"nonaktifkan ponsel secara permanen"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Mengizinkan apl menonaktifkan seluruh tablet secara permanen. Ini sangat berbahaya."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Memungkinkan aplikasi menentukan rute keluaran media ke perangkat eksternal lainnya."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Mengakses pengaman penyimpanan aman"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Mengizinkan aplikasi mengakses pengaman penyimpanan aman."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Sentuh dua kali untuk mengontrol perbesar/perkecil"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Tidak dapat menambahkan widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Buka"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Pemilik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Kesalahan"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Aplikasi ini tidak mendukung akun untuk pengguna terbatas"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Tidak ada aplikasi yang ditemukan untuk menangani tindakan ini"</string>
<string name="revoke" msgid="5404479185228271586">"Cabut"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 4c80a7b..a9593f0 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Consente all\'applicazione di registrare audio con il microfono. Questa autorizzazione consente all\'applicazione di registrare audio in qualsiasi momento senza la tua conferma."</string>
<string name="permlab_camera" msgid="3616391919559751192">"acquisizione di foto e video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Consente all\'applicazione di scattare foto e riprendere video con la fotocamera. Questa autorizzazione consente all\'applicazione di utilizzare la fotocamera in qualsiasi momento senza la tua conferma."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"disattivazione definitiva tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"disattivazione telefono"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Consente all\'applicazione di disattivare l\'intero tablet in modo definitivo. Questa autorizzazione è molto pericolosa."</string>
@@ -605,7 +609,7 @@
<string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"test dell\'accesso all\'archivio protetto"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Consente all\'applicazione di testare un\'autorizzazione relativa all\'archivio USB che sarà disponibile su dispositivi futuri."</string>
<string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Consente all\'applicazione di testare un\'autorizzazione relativa alla scheda SD che sarà disponibile su dispositivi futuri."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"mod./elimin. cont. archivio USB"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"mod./elimin. contenuti USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modifica o eliminazione dei contenuti della scheda SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Consente all\'applicazione di scrivere nell\'archivio USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Consente all\'applicazione di scrivere sulla scheda SD."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Consente a un\'applicazione di indirizzare l\'uscita di media verso altri dispositivi esterni."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Accesso all\'archivio sicuro keyguard"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Consente a un\'applicazione di accedere all\'archivio sicuro keguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Tocca due volte per il comando dello zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Aggiunta del widget non riuscita."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Vai"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Errore"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Questa applicazione non supporta account di utenti con limitazioni"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nessuna applicazione trovata in grado di gestire questa azione"</string>
<string name="revoke" msgid="5404479185228271586">"Revoca"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 888dae2..cb4cdee 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"מאפשר ליישום להקליט אודיו באמצעות המיקרופון. אישור זה מתיר ליישום להקליט אודיו בכל עת ללא אישורך."</string>
<string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות וסרטונים"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"מאפשר ליישום לצלם תמונות וסרטונים באמצעות המצלמה. אישור זה מאפשר ליישום להשתמש במצלמה בכל עת ללא אישורך."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"השבת טאבלט לצמיתות"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"השבת טלפון לצמיתות"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"מאפשר ליישום להשבית את הטבלט כולו לצמיתות. זו הרשאה מסוכנת מאוד."</string>
@@ -931,8 +935,8 @@
<string name="searchview_description_submit" msgid="2688450133297983542">"שלח שאילתה"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"חיפוש קולי"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"האם להפעיל את התכונה \'חקור על ידי מגע\'?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטאבלט באמצעות מחוות."</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטלפון באמצעות מחוות."</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטאבלט באמצעות תנועות אצבע."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"לפני חודש אחד"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"לפני חודש אחד"</string>
<plurals name="num_seconds_ago">
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"מאפשר ליישום לנתב פלט מדיה למכשירים חיצוניים אחרים."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"גישה לאחסון המוגן באמצעות מפתח"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"מאפשר ליישום לגשת לאחסון המוגן באמצעות מפתח."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"גע פעמיים לבקרת מרחק מתצוגה"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"לא ניתן להוסיף widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"התחל"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"בעלים"</string>
<string name="error_message_title" msgid="4510373083082500195">"שגיאה"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"היישום הזה לא תומך בחשבונות עבור משתמשים מוגבלים"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"לא נמצא יישום שתומך בפעולה זו"</string>
<string name="revoke" msgid="5404479185228271586">"בטל"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 2355966..8458243 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"マイクを使った録音をアプリに許可します。これにより、アプリがいつでも確認なしで録音できるようになります。"</string>
<string name="permlab_camera" msgid="3616391919559751192">"写真と動画の撮影"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"カメラでの写真と動画の撮影をアプリに許可します。これにより、アプリが確認なしでいつでもカメラを使用できるようになります。"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"タブレットを完全に無効化"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"端末を永続的に無効にする"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"タブレット全体を完全に無効にすることをアプリに許可します。この許可は危険です。"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"メディア出力を他の外部デバイスにルーティングすることをアプリに許可します。"</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"キーガードセキュアストレージへのアクセス"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"キーガードセキュアストレージへのアクセスをアプリに許可する"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ダブルタップでズームコントロール"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"ウィジェットを追加できませんでした。"</string>
<string name="ime_action_go" msgid="8320845651737369027">"移動"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string>
<string name="owner_name" msgid="2716755460376028154">"所有者"</string>
<string name="error_message_title" msgid="4510373083082500195">"エラー"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"このアプリでは限定ユーザー用のアカウントはサポートしていません"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"この操作を行うアプリが見つかりません"</string>
<string name="revoke" msgid="5404479185228271586">"取り消し"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 52b9ed3..1f4cbbf 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"앱이 마이크로 오디오를 녹음할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 사용자의 확인 없이 언제든지 오디오를 녹음할 수 있습니다."</string>
<string name="permlab_camera" msgid="3616391919559751192">"사진과 동영상 찍기"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"앱이 카메라로 사진과 동영상을 찍을 수 있도록 허용합니다. 이 권한을 사용하면 앱이 언제든지 사용자의 확인 없이 카메라를 사용할 수 있습니다."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"영구적으로 태블릿 사용 안함"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"휴대전화를 영구적으로 사용 중지"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"앱이 태블릿을 영구적으로 사용중지할 수 있게 합니다. 이 기능은 매우 위험합니다."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"앱이 미디어 출력을 기타 외부 기기에 연결할 수 있도록 허용합니다."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"키가드 보안 저장소 액세스"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"애플리케이션에서 키가드 보안 저장소에 액세스하도록 허용합니다."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"확대/축소하려면 두 번 터치하세요."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"위젯을 추가할 수 없습니다."</string>
<string name="ime_action_go" msgid="8320845651737369027">"이동"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string>
<string name="owner_name" msgid="2716755460376028154">"소유자"</string>
<string name="error_message_title" msgid="4510373083082500195">"오류"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"이 애플리케이션은 제한된 사용자를 위한 계정을 지원하지 않습니다."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"이 작업을 처리하는 애플리케이션을 찾을 수 없습니다."</string>
<string name="revoke" msgid="5404479185228271586">"취소"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index e6d48f2..7ae45b7 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Leidžiama programai įrašyti garsą naudojant mikrofoną. Šis leidimas suteikia galimybę programai įrašyti garsą bet kada be jūsų patvirtinimo."</string>
<string name="permlab_camera" msgid="3616391919559751192">"fotografuoti ir filmuoti"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Leidžiama programai fotografuoti ir filmuoti kamera. Šis leidimas suteikia teisę programai naudoti kamerą bet kada be jūsų patvirtinimo."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"visam laikui neleisti planšetinio kompiuterio"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"visam laikui išjungti telefoną"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Leidžiama programai visam laikui išjungti visą planšetinį kompiuterį. Tai labai pavojinga."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Leidžiama programai nukreipti medijos išvestį į kitus išorinius įrenginius."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Pasiekti „KeyGuard“ saugyklą"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Programai leidžiama pasiekti „KeyGuard“ saugyklą."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Dukart palieskite, kad valdytumėte mastelio keitimą"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Nepavyko pridėti."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Pradėti"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Savininkas"</string>
<string name="error_message_title" msgid="4510373083082500195">"Klaida"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ši programa nepalaiko apribotų naudotojų paskyrų"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nerasta programa šiam veiksmui apdoroti"</string>
<string name="revoke" msgid="5404479185228271586">"Anuliuoti"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index fc28057..f0eed6b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Ļauj lietotnei ierakstīt audio, izmantojot mikrofonu. Šī atļauja ļauj lietotnei ierakstīt audio jebkurā brīdī bez jūsu apstiprinājuma."</string>
<string name="permlab_camera" msgid="3616391919559751192">"uzņemt attēlus un videoklipus"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Ļauj lietotnei uzņemt attēlus un videoklipus ar kameru. Ar šo atļauju lietotne var jebkurā brīdī izmantot kameru bez jūsu apstiprinājuma."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"neatgriezeniski atspējot planšetdatoru"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"neatgriezeniski atspējot tālruni"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ļauj lietotnei neatgriezeniski atspējot visu planšetdatoru. Tas ir ļoti bīstami."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ļauj lietojumprogrammai maršrutēt multivides datu izeju uz citām ārējām ierīcēm."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Piekļūt krātuvei, kas aizsargāta ar atslēgu"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ļauj lietojumprogrammai piekļūt krātuvei, kas aizsargāta ar atslēgu."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Pieskarieties divreiz, lai kontrolētu tālummaiņu."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Nevarēja pievienot logrīku."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Doties uz"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Īpašnieks"</string>
<string name="error_message_title" msgid="4510373083082500195">"Kļūda"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Šajā lietojumprogrammā netiek atbalstīti ierobežotu lietotāju konti."</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Netika atrasta neviena lietojumprogramma, kas var veikt šo darbību."</string>
<string name="revoke" msgid="5404479185228271586">"Atsaukt"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 158bf82..4588efd 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Membenarkan apl untuk merakam audio menggunakan mikrofon. Kebenaran ini membenarkan apl untuk merakam audio pada bila-bila masa tanpa pengesahan anda."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ambil gambar dan video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Membenarkan apl mengambil gambar dan video menggunakan kamera. Kebenaran ini membenarkan apl untuk menggunakan kamera pada bila-bila masa tanpa pengesahan anda."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"melumpuhkan tablet secara kekal"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"lumpuhkan telefon secara kekal"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Membenarkan apl melumpuhkan keseluruhan tablet secara kekal. Ini amat berbahaya."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Membenarkan apl untuk membuat laluan output media ke peranti luaran lain."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Akses storan selamat pengawal kekunci"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Membenarkan aplikasi mengakses storan selamat pengawal kekunci."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Sentuh dua kali untuk mendapatkan kawalan zum"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Tidak dapat menambahkan widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Pergi"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Pemilik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Ralat"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Aplikasi ini tidak menyokong akaun untuk pengguna terhad"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Tidak menemui aplikasi untuk mengendalikan tindakan ini"</string>
<string name="revoke" msgid="5404479185228271586">"Batalkan"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index e425542..0a41aee 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Lar appen ta opp lyd med mikrofonen. Dette betyr at appen kan ta opp lyd når som helst uten at du har bedt om det."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ta bilder og videoer"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Lar appen ta bilder og filme med kameraet. Denne tillatelsen gjør at appen kan bruke kameraet når som helst uten bekreftelse fra deg."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiver nettbrett permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktivere telefonen permanent"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Lar appen deaktivere hele nettbrettet permanent. Dette er svært risikabelt."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Lar en app videresende medieutdata til andre eksterne enheter."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Bruk av sikker lagring via keyguard."</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Lar en app bruke sikker lagring via keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Trykk to ganger for zoomkontroll"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Kunne ikke legge til modulen."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Utfør"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Eier"</string>
<string name="error_message_title" msgid="4510373083082500195">"Feil"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Denne appen støtter ikke kontoer for brukere med begrensninger"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Finner ingen apper som kan utføre denne handlingen"</string>
<string name="revoke" msgid="5404479185228271586">"Opphev"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index e5a90f8..70eeedd 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Hiermee kan de app audio opnemen met de microfoon. Met deze toestemming kan de app op elk moment audio opnemen, zonder om uw bevestiging te vragen."</string>
<string name="permlab_camera" msgid="3616391919559751192">"foto\'s en video\'s maken"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Hiermee kan de app foto\'s en video\'s maken met de camera. Met deze toestemming kan de app de camera altijd gebruiken, zonder uw bevestiging."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"tablet permanent uitschakelen"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"telefoon permanent uitschakelen"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Hiermee kan de app de gehele tablet permanent uitschakelen. Dit is erg gevaarlijk."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Hiermee kan een app media-uitvoer naar andere externe apparaten doorsturen."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Toegang tot opslag met toetsbeveiliging"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Hiermee krijgt een app toegang tot opslag met toetsbeveiliging."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Raak twee keer aan voor zoomregeling"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Kan widget niet toevoegen."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ga"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Eigenaar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fout"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Deze app ondersteunt geen accounts voor beperkte gebruikers"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Er is geen app gevonden om deze actie uit te voeren"</string>
<string name="revoke" msgid="5404479185228271586">"Intrekken"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 58d3cfd..f622133 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Pozwala aplikacji na nagrywanie dźwięku przez mikrofon. Aplikacja z tym uprawnieniem może nagrywać dźwięk w dowolnym momencie bez Twojego potwierdzenia."</string>
<string name="permlab_camera" msgid="3616391919559751192">"wykonywanie zdjęć i filmów wideo"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Pozwala aplikacji na robienie zdjęć i nagrywanie filmów przy użyciu aparatu. Aplikacja z tym uprawnieniem może użyć aparatu w dowolnym momencie bez Twojego potwierdzenia."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trwałe wyłączenie tabletu"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"wyłączenie telefonu na stałe"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Pozwala aplikacji na całkowite i trwałe wyłączenie tabletu. To bardzo niebezpieczne."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Pozwala aplikacji na kierowanie wyjściowych danych multimedialnych do innych urządzeń zewnętrznych."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Dostęp do bezpiecznego magazynu kluczy"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Zezwala aplikacji na dostęp do bezpiecznego magazynu kluczy."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Dotknij dwukrotnie, aby sterować powiększeniem."</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Nie można dodać widżetu."</string>
<string name="ime_action_go" msgid="8320845651737369027">"OK"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Właściciel"</string>
<string name="error_message_title" msgid="4510373083082500195">"Błąd"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ta aplikacja nie obsługuje kont użytkowników z ograniczeniami"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nie znaleziono aplikacji do obsługi tej akcji"</string>
<string name="revoke" msgid="5404479185228271586">"Cofnij"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 6e25d07..b775656 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que a aplicação grave áudio com o microfone. Esta autorização permite que a aplicação grave áudio em qualquer altura sem a confirmação do utilizador."</string>
<string name="permlab_camera" msgid="3616391919559751192">"tirar fotografias e vídeos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permite que a aplicação tire fotografias e grave vídeos com a câmara. Esta autorização permite que a aplicação utilize a câmara sem a sua confirmação em qualquer altura."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactivar tablet de forma permanente"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar telefone de forma permanente"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que a aplicação desative definitivamente todo o tablet. Esta ação é muito perigosa."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que a aplicação encaminhe a saída de som multimédia para outros dispositivos externos."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Aceder ao armazenamento seguro de proteção de teclado"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite a uma aplicação aceder ao armazenamento seguro de proteção de teclado."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toque duas vezes para controlar o zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Não foi possível adicionar widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietário"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Esta aplicação não suporta contas de utilizadores limitados"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Não foram encontradas aplicações para executar esta ação"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index ff43080..072b0ad 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que o aplicativo grave áudio com o microfone. Esta permissão autoriza o aplicativo a gravar áudio a qualquer momento, sem sua confirmação."</string>
<string name="permlab_camera" msgid="3616391919559751192">"tirar fotos e gravar vídeos"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permite que o aplicativo tire fotos e filme vídeos com a câmera. Esta permissão autoriza o aplicativo a usar a câmera a qualquer momento sem sua confirmação."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desativar permanentemente o tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"desativar permanentemente o telefone"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que o aplicativo desative todo o tablet permanentemente. Isso é muito perigoso."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que um aplicativo faça o roteamento de saída de mídia para outros dispositivos externos."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Acessar o armazenamento seguro do bloqueio de teclado"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite que o aplicativo acesse o armazenamento seguro do bloqueio de teclado."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toque duas vezes para controlar o zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Não foi possível adicionar widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietário"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"O aplicativo não suporta contas para usuários limitados"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nenhum aplicativo encontrado para executar a ação"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
</resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 8f853f8..3be6e68 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -762,6 +762,10 @@
<string name="permlab_camera" msgid="3616391919559751192">"fotografar e registrar videos"</string>
<!-- no translation found for permdesc_camera (8497216524735535009) -->
<skip />
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<!-- no translation found for permlab_brick (2961292205764488304) -->
<skip />
<string name="permlab_brick" product="default" msgid="8337817093326370537">"deactivar permanentamain il telefonin"</string>
@@ -1981,6 +1985,10 @@
<skip />
<!-- no translation found for permdesc_access_keyguard_secure_storage (5866245484303285762) -->
<skip />
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<!-- no translation found for tutorial_double_tap_to_zoom_message_short (4070433208160063538) -->
<skip />
<!-- no translation found for gadget_host_error_inflating (4882004314906466162) -->
@@ -2421,7 +2429,7 @@
<skip />
<!-- no translation found for error_message_title (4510373083082500195) -->
<skip />
- <!-- no translation found for app_no_restricted_accounts (5322164210667258876) -->
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
<skip />
<!-- no translation found for app_not_found (3429141853498927379) -->
<skip />
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 6fdfe8e..c8ad1c2 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite aplicaţiei să efectueze înregistrări audio cu ajutorul microfonului. Cu această permisiune aplicaţia efectuează oricând înregistrări audio fără confirmare."</string>
<string name="permlab_camera" msgid="3616391919559751192">"realizarea de fotografii şi videoclipuri"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Permite aplicaţiei să realizeze fotografii şi videoclipuri cu camera foto. Cu această permisiune aplicaţia utilizează camera foto oricând şi fără confirmare."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"dezactivarea permanentă a computerului tablet PC"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"dezactivare permanentă a telefonului"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite aplicaţiei să dezactiveze definitiv întreaga tabletă. Acest lucru este foarte periculos."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite unei aplicaţii să direcţioneze rezultate media către alte dispozitive externe."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Accesează stocarea securizată când tastatura este blocată"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite unei aplicații să acceseze stocarea securizată când tastatura este blocată."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Atingeţi de două ori pentru a mări/micşora"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Nu s-a putut adăuga widgetul."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Accesaţi"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Eroare"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Această aplicație nu acceptă conturile pentru utilizatori cu permisiuni limitate"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Nicio aplicație pentru gestionarea acestei acțiuni"</string>
<string name="revoke" msgid="5404479185228271586">"Revocați"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 49537ed..6b4a552 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -237,9 +237,9 @@
<string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"При необходимости устанавливать скрипты, чтобы получить больше специальных возможностей."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Следить за тем, что вы печатаете."</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Фильтровать личные данные, например номера кредитных карт и пароли."</string>
- <string name="permlab_statusBar" msgid="7417192629601890791">"отключать или изменять строку состояния"</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"Отключение/изменение строки состояния"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Приложение сможет отключать строку состояния, а также добавлять и удалять системные значки."</string>
- <string name="permlab_statusBarService" msgid="7247281911387931485">"строка состояния"</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"Строка состояния"</string>
<string name="permdesc_statusBarService" msgid="716113660795976060">"Приложение сможет заменять собой строку состояния."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"Разворачивание/сворачивание строки состояния"</string>
<string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Приложение сможет разворачивать и сворачивать строку состояния."</string>
@@ -249,13 +249,13 @@
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Приложение сможет получать и обрабатывать SMS. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"Прием MMS-сообщений"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"Приложение сможет получать и обрабатывать MMS. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
- <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"принимать экстренные вызовы"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Получение экстренных сообщений"</string>
<string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Приложение сможет получать и обрабатывать экстренные сообщения рассылок. Это разрешение доступно только для системных приложений."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Читать сообщения массовой рассылки"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Приложение получит доступ к сообщениям широковещательных SMS-служб, которые в некоторых странах используются для информирования населения об экстренных ситуациях. Вредоносные программы могут помешать работе устройства, на которое поступают такие сообщения."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"Отправка SMS-сообщений"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"Приложение сможет отправлять SMS. Учтите, что вредоносные программы смогут отправлять сообщения без уведомления, что может привести к непредвиденным расходам."</string>
- <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"отвечать на звонки текстовыми сообщениями"</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"Отправка текстовых сообщений в ответ на звонки"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Приложение сможет отправлять запросы другим программам обмена сообщениями, чтобы на звонки можно было отвечать текстовыми сообщениями."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"Просмотр SMS и MMS"</string>
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Приложение сможет просматривать SMS-сообщения, сохраненные на устройстве или SIM-карте, независимо от содержания или настроек конфиденциальности."</string>
@@ -269,73 +269,73 @@
<string name="permdesc_getTasks" msgid="7454215995847658102">"Приложение сможет получать информацию о недавно запущенных и выполняемых задачах, а следовательно, и о приложениях, используемых на устройстве."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"разрешить взаимодействие со всеми аккаунтами"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Приложение сможет выполнять действия во всех аккаунтах на этом устройстве. При этом защита от вредоносных приложений может быть недостаточной."</string>
- <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"разрешить полное взаимодействие со всеми аккаунтами"</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"Полное взаимодействие со всеми аккаунтами"</string>
<string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Приложение сможет выполнять любые действия во всех аккаунтах на этом устройстве."</string>
<string name="permlab_manageUsers" msgid="1676150911672282428">"Управлять аккаунтами"</string>
<string name="permdesc_manageUsers" msgid="8409306667645355638">"Приложения смогут управлять аккаунтами на этом устройстве (выполнять поиск, создавать и удалять их)"</string>
- <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"получение сведений о работающих приложениях"</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"Получение сведений о работающих приложениях"</string>
<string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Приложение сможет получать подробные сведения о недавно запущенных и выполняемых задачах. При этом конфиденциальная информация о других приложениях не будет защищена от вредоносных программ."</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"Упорядочивание запущенных приложений"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"Приложение сможет переключать активный и фоновый режимы выполнения задач без вашего ведома."</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"остановка запущенных приложений"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"Остановка работающих приложений"</string>
<string name="permdesc_removeTasks" msgid="1394714352062635493">"Приложение сможет удалять задачи и собственные программы. Вредоносное ПО при этом сможет нарушать работу других приложений."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"Совершать любые действия"</string>
<string name="permdesc_startAnyActivity" msgid="997823695343584001">"Приложение сможет совершать любые действия независимо от наличия разрешений и состояния."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"Установка режима совместимости"</string>
<string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Приложение сможет управлять режимом совместимости экрана других приложений. Вредоносное ПО может привести к сбоям в работе других программ."</string>
- <string name="permlab_setDebugApp" msgid="3022107198686584052">"включение отладки приложений"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"Включение отладки приложений"</string>
<string name="permdesc_setDebugApp" msgid="4474512416299013256">"Приложение сможет включать отладку для другой программы. Вредоносное ПО сможет таким образом останавливать работу других приложений."</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"Изменение настроек экрана"</string>
<string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Приложение сможет изменять текущую конфигурацию, например, региональные настройки или размер шрифта."</string>
- <string name="permlab_enableCarMode" msgid="5684504058192921098">"включить режим громкой связи"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"Включение режима громкой связи"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"Приложение сможет включать режим \"Штурман\"."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"Закрытие других приложений"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Приложение сможет завершать фоновые процессы других приложений. Из-за этого другие приложения могут прекратить работу."</string>
- <string name="permlab_forceStopPackages" msgid="2329627428832067700">"принудительное закрытие других приложений"</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"Принудительное закрытие других приложений"</string>
<string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Приложение сможет принудительно останавливать работу других программ."</string>
- <string name="permlab_forceBack" msgid="652935204072584616">"принудительное закрытие приложений"</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"Принудительное закрытие приложений"</string>
<string name="permdesc_forceBack" msgid="3892295830419513623">"Приложение сможет завершать процессы, выполняемые в активном режиме. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_dump" msgid="1681799862438954752">"Получение данных о состоянии системы"</string>
<string name="permdesc_dump" msgid="1778299088692290329">"Приложение сможет получать данные о внутреннем состоянии системы. Вредоносные программы смогут получать личную и защищенную информацию, к которой у них не должно быть доступа."</string>
- <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"получать доступ к содержанию экрана"</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"Доступ к данным на экране"</string>
<string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Приложение сможет получать контент активного окна. Вредоносные программы смогут перехватывать такой контент и анализировать любой текст, кроме паролей."</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"Включение специальных возможностей"</string>
<string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Приложение сможет временно включать на устройстве специальные возможности. Вредоносные приложения смогут включать их без вашего ведома."</string>
- <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"доступ к информации в окне"</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"Доступ к информации в окне"</string>
<string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Открывает приложению доступ к информации из диспетчера окон. Обратите внимание, что вредоносное ПО может получить доступ к некоторой системной информации устройства."</string>
<string name="permlab_filter_events" msgid="8675535648807427389">"Фильтрация событий"</string>
<string name="permdesc_filter_events" msgid="8006236315888347680">"Разрешает приложению зарегистрировать входной фильтр, который анализирует весь поток пользовательских событий. Обратите внимание, что вредоносное ПО может получить доступ к управлению интерфейсом без ведома пользователя."</string>
- <string name="permlab_magnify_display" msgid="5973626738170618775">"увеличивать изображение"</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"Увеличение изображений"</string>
<string name="permdesc_magnify_display" msgid="7121235684515003792">"Приложение сможет увеличивать содержимое экрана. Вредоносные программы смогут изменять изображение таким образом, что устройством нельзя будет пользоваться."</string>
- <string name="permlab_shutdown" msgid="7185747824038909016">"частичное завершение работы"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"Частичное завершение работы"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"Завершает работу диспетчера активности. Не выполняет полное завершение работы."</string>
- <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"запретить переключение приложений"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"Защита от переключения приложений"</string>
<string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Запрещает пользователям переключаться между приложениями."</string>
- <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"показывать информацию о текущем приложении"</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"Показ информации о текущем приложении"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"На экране будут отображаться сведения о текущем приложении."</string>
- <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"отслеживание и управление запуском всех приложений"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Отслеживание и управление запуском всех приложений"</string>
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Приложение сможет отслеживать запуск системных процессов и управлять им. Вредоносные программы смогут получить полный контроль над системой. Это разрешение необходимо только для разработки и не нужно в обычном режиме."</string>
- <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"отправлять рассылку об удалении пакета"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Отправка оповещений об удалении пакетов"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Приложение сможет рассылать уведомления об удалении пакета программы. Вредоносные программы смогут таким образом прекращать работу других программ."</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"отправлять рассылку уведомлений о получении SMS"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"Отправка уведомлений о получении SMS"</string>
<string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Приложение сможет уведомлять о получении SMS. Вредоносные программы смогут таким образом подделывать входящие SMS."</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"отправлять рассылку уведомлений о получении WAP-сообщений поставщика услуг"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Отправка уведомлений о доставке SMS с ссылкой на WAP-страницу"</string>
<string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Приложение сможет уведомлять о получении сообщений WAP PUSH. Вредоносные программы смогут таким образом фальсифицировать получение MMS или незаметно подменять содержание любой страницы вредоносными данными."</string>
- <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ограничивать количество запущенных процессов"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Ограничение количества запущенных процессов"</string>
<string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Приложение сможет управлять максимальным количеством процессов, которые могут быть запущены. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"Закрытие фоновых приложений"</string>
<string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Приложение сможет управлять завершением процессов после их перехода в фоновый режим. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_batteryStats" msgid="2789610673514103364">"считывать статистики батареи"</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"Доступ к данным об использовании батареи"</string>
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Разрешает приложению получать данные об использовании батареи на низшем уровне. В результате оно может иметь доступ к информации об используемых вами программах."</string>
- <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"изменять статистику батареи"</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"Изменение данных об использовании батареи"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Приложение сможет изменять собранную статистику использования заряда батареи. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"получать статистику операций в приложениях"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Получение рабочего журнала приложений"</string>
<string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Приложение сможет получать собранную статистику операций в приложениях. Это разрешение не используется обычными программами."</string>
- <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"изменять статистику операций в приложениях"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"Изменение рабочего журнала приложений"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Приложение сможет изменять собранную статистику операций в приложениях. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_backup" msgid="470013022865453920">"управление резервным копированием и восстановлением системы"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"Управление резервным копированием и восстановлением системы"</string>
<string name="permdesc_backup" msgid="6912230525140589891">"Приложение сможет управлять механизмами резервного копирования и восстановления системы. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"подтверждать полное резервное копирование или восстановление"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"Подтверждаение полного резервного копирования и восстановления"</string>
<string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Приложение сможет отображать окно подтверждения полного резервного копирования. Это разрешение не предназначено для всех приложений."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Неавторизованное открытие окон"</string>
<string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Приложение сможет создавать окна для интерфейса внутренней системы. Это разрешение не используется обычными приложениями."</string>
@@ -343,68 +343,68 @@
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Разрешает приложению отображать элементы своего интерфейса поверх окон других программ. Это может мешать вашему взаимодействию с другими приложениями и вести к недоразумениям."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"Изменение глобальной скорости анимации"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Приложение сможет в любой момент изменить общую скорость анимации."</string>
- <string name="permlab_manageAppTokens" msgid="1286505717050121370">"управление токенами приложений"</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"Управление токенами приложений"</string>
<string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Приложение сможет создавать собственные токены и управлять ими в обход обычной Z-последовательности. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_freezeScreen" msgid="4708181184441880175">"замораживать изображение"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"Приостановка изображения"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"Приложение сможет приостанавливать изображение на время перехода в полноэкранный режим."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"Использование клавиш и кнопок управления"</string>
<string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Приложение сможет передавать собственные входные события (нажатия клавиш и пр.) другим программам. Вредоносные программы смогут таким образом перехватить управление планшетным ПК."</string>
<string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Приложение сможет передавать собственные входные события (нажатия клавиш и пр.) другим программам. Вредоносные программы смогут таким образом перехватить управление телефоном."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"Запись вводимого текста и совершаемых действий"</string>
<string name="permdesc_readInputState" msgid="8387754901688728043">"Приложение сможет отслеживать нажатие пользователем клавиш даже при работе с другими программами (например, при вводе пароля). Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindInputMethod" msgid="3360064620230515776">"связывать с методом ввода"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"Привязка к методу ввода"</string>
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Приложение сможет подключаться к базовому интерфейсу системы ввода. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"подключаться к службе спецвозможностей"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"Подключение к службе специальных возможностей"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Приложение сможет подключаться к базовому интерфейсу службы специальных возможностей. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindTextService" msgid="7358378401915287938">"привязка к службе текстовых сообщений"</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"Подключение к службе текстовых сообщений"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Позволяет подключаться к базовому интерфейсу службы текстовых сообщений (например, SpellCheckerService). Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindVpnService" msgid="4708596021161473255">"подключаться к VPN-службе"</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"Подключение к VPN-службе"</string>
<string name="permdesc_bindVpnService" msgid="2067845564581693905">"Приложение сможет подключаться к базовому интерфейсу службы VPN. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindWallpaper" msgid="8716400279937856462">"связать с фоновым рисунком"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"Привязка к фоновому рисунку"</string>
<string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Приложение сможет подключаться к базовому интерфейсу службы обоев. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"привязка к службе виджетов"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"Подключение к службе виджетов"</string>
<string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Приложение сможет подключаться к базовому интерфейсу службы виджетов. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаимодействовать с администратором устройства"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"Взаимодействие с администратором устройства"</string>
<string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Приложение сможет отправлять объекты intent администратору устройства. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_setOrientation" msgid="3365947717163866844">"изменять ориентацию экрана"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"Изменение ориентации экрана"</string>
<string name="permdesc_setOrientation" msgid="3046126619316671476">"Приложение сможет менять ориентацию экрана. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"изменять скорость указателя"</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"Изменение скорости указателя"</string>
<string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Приложение сможет в любой момент изменить скорость движения указателя мыши или сенсорной панели. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"менять раскладку автоматически"</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"Автоматическая смена раскладки"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Разрешить автоматическую смену раскладки клавиатуры (используется лишь в некоторых приложениях)."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"отправка сигналов Linux приложениям"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"Отправка сигналов Linux приложениям"</string>
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Приложение сможет запрашивать передачу полученного сигнала всем постоянным процессам."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"Поддержание приложения в рабочем режиме"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Приложение сможет постоянно хранить свои компоненты в памяти. Это может уменьшить объем памяти, доступный другим приложениям, и замедлить работу устройства."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Приложение сможет постоянно хранить свои компоненты в памяти. Это может уменьшить объем памяти, доступный другим приложениям, и замедлить работу устройства."</string>
- <string name="permlab_deletePackages" msgid="184385129537705938">"удаление приложений"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"Удаление приложений"</string>
<string name="permdesc_deletePackages" msgid="7411480275167205081">"Приложение сможет удалять пакеты Android. Вредоносные программы смогут таким образом удалять важные программы."</string>
- <string name="permlab_clearAppUserData" msgid="274109191845842756">"удаление данных других приложений"</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"Удаление данных других приложений"</string>
<string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Приложение сможет удалять пользовательские данные."</string>
- <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"очистка кэш-памяти других приложений"</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"Удаление данных из кэш-памяти других приложений"</string>
<string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Приложение сможет удалять файлы из кэша."</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"определение объема памяти приложений"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"Вычисление объема памяти приложений"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Приложение сможет получать сведения о размере кода, данных и кэша."</string>
- <string name="permlab_installPackages" msgid="2199128482820306924">"непосредственная установка приложений"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"Прямая установка приложений"</string>
<string name="permdesc_installPackages" msgid="5628530972548071284">"Приложение сможет устанавливать новые или обновленные пакеты Android. Вредоносные программы смогут таким образом добавлять новые программы с любыми разрешениями."</string>
<string name="permlab_clearAppCache" msgid="7487279391723526815">"Очистка кэша приложений"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Разрешает приложению освобождать место на планшетном ПК, удаляя кэшированные файлы других программ. В результате другие приложения могут запускаться медленнее, так как им потребуется повторно извлекать необходимые данные."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Разрешает приложению освобождать место на телефоне, удаляя кэшированные файлы других программ. В результате другие приложения могут запускаться медленнее, так как им потребуется повторно извлекать необходимые данные."</string>
- <string name="permlab_movePackage" msgid="3289890271645921411">"перемещение ресурсов приложения"</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"Перемещение ресурсов приложения"</string>
<string name="permdesc_movePackage" msgid="319562217778244524">"Приложение сможет перемещать ресурсы из внутреннего накопителя на внешний и наоборот."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"Просмотр конфиденциальных данных в журнале"</string>
<string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Приложение сможет считывать информацию из различных системных журналов. Приложение может получать сведения о работе пользователя на планшетном ПК, в том числе к личной и конфиденциальной информации."</string>
<string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Приложение сможет считывать информацию из различных системных журналов, а также получать сведения о работе пользователя на телефоне, в том числе к личной и конфиденциальной информации."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"Использование любых дешифраторов"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Приложение сможет использовать любой установленный дешифратор."</string>
- <string name="permlab_diagnostic" msgid="8076743953908000342">"считывать/записывать данные в ресурсы, принадлежащие группе диагностики"</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"Чтение/запись данных в системы диагностики"</string>
<string name="permdesc_diagnostic" msgid="6608295692002452283">"Приложение сможет считывать и записывать данные системы диагностики (например, файлы в каталоге /dev). Это может повлиять на стабильность и безопасность системы. Это разрешение должно использоваться ТОЛЬКО производителем или оператором для диагностики аппаратного обеспечения."</string>
- <string name="permlab_changeComponentState" msgid="6335576775711095931">"включение и отключение компонентов приложения"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"Включение/отключение компонентов приложения"</string>
<string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Приложение сможет включать и отключать компоненты других программ. Вредоносные программы смогут таким образом отключать важные функции планшетного ПК. Используйте это разрешение с особой осторожностью, чтобы случайно не нарушить работу компонентов приложения."</string>
<string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Приложение сможет включать и отключать компоненты других программ. Вредоносные программы смогут таким образом отключать важные функции телефона. Используйте это разрешение с особой осторожностью, чтобы случайно не нарушить работу компонентов приложения."</string>
- <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"предоставление и отзыв разрешений"</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"Предоставление и отзыв разрешений"</string>
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Позволяет приложению предоставлять и отзывать разрешения самому себе и другим программам. Вредоносные приложения могут использовать эту функцию для получения прав, которых вы им не предоставляли."</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"настройка предпочтительных приложений"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"Настройка предпочтительных приложений"</string>
<string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Приложение сможет изменять предпочтительные приложения. Вредоносные программы смогут незаметно изменять запускаемые вами программы и собирать ваши личные данные от имени существующих приложений."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"Изменение настроек системы"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"Приложение сможет изменять настройки системы. Вредоносные программы смогут повредить конфигурацию системы."</string>
@@ -448,11 +448,11 @@
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Приложение сможет создавать фиктивные местоположения для тестирования или установки нового источника геоданных и переопределять местоположение и/или статус, возвращаемые другими источниками, такими как система GPS."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Доступ к дополнительным командам управления источниками геоданных"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Приложение получит доступ к дополнительным командам управления источниками геоданных и сможет вмешиваться в работу системы GPS или других источников геоданных."</string>
- <string name="permlab_installLocationProvider" msgid="6578101199825193873">"разрешение на установку поставщика местоположения"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Добавление источника геоданных"</string>
<string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Приложение сможет создавать фиктивные местоположения для тестирования или установки нового источника геоданных и переопределять местоположение и/или статус, возвращаемые другими источниками, такими как система GPS или службы геопозиционирования."</string>
- <string name="permlab_accessFineLocation" msgid="1191898061965273372">"точное местоположение (на основе сети и сигналов GPS)"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"Точное местоположение (на основе сети и сигналов GPS)"</string>
<string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Разрешает приложению получать данные о вашем точном местоположении с помощью глобального позиционирования (GPS), вышек сотовой связи и точек доступа Wi-Fi. Эти службы должны быть включены на устройстве, а приложению должно быть разрешено их использовать. Это может вести к дополнительному расходу заряда батареи."</string>
- <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"примерное местоположение (на основе сети)"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"Примерное местоположение (на основе сети)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Разрешает приложению получать данные о вашем примерном местоположении с помощью служб определения местоположения, вышек сотовой связи и точек доступа Wi-Fi. Эти службы должны быть включены на устройстве, а приложению должно быть разрешено их использовать."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"Доступ к SurfaceFlinger"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Приложение сможет использовать низкоуровневые функции SurfaceFlinger."</string>
@@ -460,7 +460,7 @@
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Приложение сможет считывать содержание буфера фреймов."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"настраивать экраны, подключенные через Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Приложение сможет подключаться к экранам с помощью Wi-Fi и настраивать их."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"управлять экранами, подключенными через Wi-Fi"</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Управление мониторами, подключенными через Wi-Fi"</string>
<string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Приложение сможет управлять низкоуровневыми функциями экранов, подключенных через Wi-Fi."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Изменение настроек аудио"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Приложение сможет изменять системные настройки звука, например уровень громкости и активный динамик."</string>
@@ -468,12 +468,16 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Приложение сможет записывать аудио с помощью микрофона в любое время без уведомления."</string>
<string name="permlab_camera" msgid="3616391919559751192">"Фото- и видеосъемка"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Приложение сможет снимать фотографии и видеоролики с помощью камеры в любое время без вашего разрешения."</string>
- <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"отключить планшетный ПК навсегда"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"Выключение планшета"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"Отключение телефона"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Приложение сможет отключить все функции планшетного ПК. Это очень опасно."</string>
<string name="permdesc_brick" product="default" msgid="5788903297627283099">"Приложение сможет отключить все функции телефона. Это очень опасно."</string>
- <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"принудительно перезагружать планшетный ПК"</string>
- <string name="permlab_reboot" product="default" msgid="2898560872462638242">"принудительно перезагружать телефон"</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"Принудительная перезагрузка планшета"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"Принудительная перезагрузка телефона"</string>
<string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Приложение сможет принудительно перезагружать планшетный ПК."</string>
<string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Приложение сможет принудительно перезагружать телефон."</string>
<string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"Доступ к файловой системе USB-накопителя"</string>
@@ -482,21 +486,21 @@
<string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"Удаление данных с USB-накопителя"</string>
<string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"Удаление данных с SD-карты"</string>
<string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Приложение сможет форматировать съемный накопитель."</string>
- <string name="permlab_asec_access" msgid="3411338632002193846">"получать сведения о внутреннем накопителе"</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"Получение сведений о внутренней памяти"</string>
<string name="permdesc_asec_access" msgid="3094563844593878548">"Приложение сможет получать сведения о внутреннем хранилище."</string>
- <string name="permlab_asec_create" msgid="6414757234789336327">"создавать внутренний накопитель"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"Создание внутренней памяти"</string>
<string name="permdesc_asec_create" msgid="4558869273585856876">"Приложение сможет создать внутреннее хранилище."</string>
- <string name="permlab_asec_destroy" msgid="526928328301618022">"удалять внутренний накопитель"</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"Удаление внутренней памяти"</string>
<string name="permdesc_asec_destroy" msgid="7218749286145526537">"Приложение сможет удалить внутреннее хранилище."</string>
- <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"подключение и отключение внутреннего хранилища"</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"Подключение/отключение внутренней памяти"</string>
<string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Приложение сможет подключать и отключать внутреннее хранилище."</string>
- <string name="permlab_asec_rename" msgid="7496633954080472417">"переименовывать внутренний накопитель"</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"Переименование внутренней памяти"</string>
<string name="permdesc_asec_rename" msgid="1794757588472127675">"Приложение сможет переименовывать внутреннее хранилище."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"Управление функцией вибросигнала"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"Приложение сможет контролировать вибросигналы."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"Управление вспышкой"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"Приложение сможет контролировать вспышку."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"управлять настройками и разрешениями для USB-устройств"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"Управление настройками и разрешениями для USB-устройств"</string>
<string name="permdesc_manageUsb" msgid="7776155430218239833">"Приложение сможет управлять настройками и разрешениями для USB-устройств."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"Реализовать протокол MTP"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Разрешает доступ к драйверу основного устройства MTP для реализации протокола MTP USB"</string>
@@ -506,25 +510,25 @@
<string name="permdesc_callPhone" msgid="3740797576113760827">"Приложение сможет без вашего участия звонить на любой номер телефона. Это не относится к номерам экстренных служб. Вредоносные программы смогут совершать вызовы без вашего разрешения, что может привести к непредвиденным расходам."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"Осуществление телефонных вызовов"</string>
<string name="permdesc_callPrivileged" msgid="1689024901509996810">"Приложение сможет без вашего участия звонить по любому номеру телефона, включая номера экстренного вызова. Вредоносные программы смогут помещать ненужные или незаконные номера в список служб экстренного вызова."</string>
- <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"напрямую запускать настройку CDMA планшетного ПК"</string>
- <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"прямой запуск настройки телефона CDMA"</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"Прямой запуск настройки CDMA на планшете"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"Прямой запуск настройки телефона CDMA"</string>
<string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Приложение сможет запускать настройку CDMA. Вредоносные программы также смогут делать это без необходимости."</string>
- <string name="permlab_locationUpdates" msgid="7785408253364335740">"управлять уведомлениями об обновлении местоположения"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"Управление уведомлениями об обновлении местоположения"</string>
<string name="permdesc_locationUpdates" msgid="1120741557891438876">"Приложение сможет включать и отключать уведомления об обновлении местоположения на основе данных приемопередачика. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"Доступ к регистрационным данным"</string>
<string name="permdesc_checkinProperties" msgid="4024526968630194128">"Предоставляет приложению доступ для чтения и записи к значениям свойств, добавленным с помощью службы регистрации. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_bindGadget" msgid="776905339015863471">"выбирать виджеты"</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"Выбор виджетов"</string>
<string name="permdesc_bindGadget" msgid="8261326938599049290">"Приложение сможет настраивать в системе возможность использования виджетов различными программами. Приложение с таким разрешением может предоставлять другим программам доступ к личным данным. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"изменять состояние телефона"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"Изменение состояния телефона"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Приложение сможет управлять на устройстве функциями телефона: переключать сети, включать и выключать приемопередатчик, а также выполнять другие подобные действия без уведомления."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"Получение данных о статусе телефона"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Приложение получит доступ к функциям телефона на устройстве. Кроме того, оно сможет определять номера телефонов и серийные номера моделей, состояние активности вызова, а также удаленные номера, с которыми установлено соединение."</string>
- <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"не разрешать переключение планшетного ПК в спящий режим"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"Отключение спящего режима"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"Отключение спящего режима"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Приложение сможет запрещать перевод планшетного ПК в спящий режим."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Приложение сможет запрещать перевод телефона в спящий режим."</string>
- <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"включать или выключать питание планшетного ПК"</string>
- <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"включать и выключать питание телефона"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"Включение/выключение планшета"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"Включение/выключение телефона"</string>
<string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Приложение сможет включать и выключать планшетный ПК."</string>
<string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Приложение сможет включать и выключать телефон."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"Включение тестового режима"</string>
@@ -534,15 +538,15 @@
<string name="permdesc_setWallpaper" msgid="7373447920977624745">"Приложение сможет устанавливать системные обои."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"Изменение размера обоев"</string>
<string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Приложение сможет устанавливать подсказки по размеру системных обоев."</string>
- <string name="permlab_masterClear" msgid="2315750423139697397">"восстанавливать параметры системы по умолчанию, установленные на заводе-изготовителе"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"Восстановление заводских настроек устройства"</string>
<string name="permdesc_masterClear" msgid="3665380492633910226">"Приложение сможет выполнить полный сброс системы до заводских настроек, удалив все данные, параметры и установленные программы."</string>
- <string name="permlab_setTime" msgid="2021614829591775646">"установить время"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"Настройка времени"</string>
<string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Приложение сможет изменять время в настройках устройства."</string>
<string name="permdesc_setTime" product="default" msgid="1855702730738020">"Приложение сможет изменять время в настройках устройства."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"Настройка часового пояса"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Приложение сможет изменять часовой пояс в настройках устройства."</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Приложение сможет изменять часовой пояс в настройках устройства."</string>
- <string name="permlab_accountManagerService" msgid="4829262349691386986">"выступать в качестве службы управления аккаунтом"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"Поддержка функции управления аккаунтом"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"Приложение сможет вызывать службы аутентификации аккаунта."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"Поиск аккаунтов на устройстве"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Приложение сможет получить список всех используемых на устройстве аккаунтов, в том числе созданных установленными приложениями."</string>
@@ -557,13 +561,13 @@
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Приложение сможет просматривать информацию о сетевых подключениях, например о том, какие сети доступны и к каким из них вы подключены."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"Неограниченный доступ в Интернет"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Приложение сможет создавать сетевые сокеты и использовать различные сетевые протоколы. Так как браузер и другие приложения обеспечивают средства для отправки данных в Интернет, это разрешение предоставлять не обязательно."</string>
- <string name="permlab_writeApnSettings" msgid="505660159675751896">"изменение/перехват сетевых настроек и трафика"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"Изменение/перехват сетевых настроек и трафика"</string>
<string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Приложение сможет изменять сетевые настройки, а также перехватывать и просматривать весь сетевой трафик (например, изменять прокси-сервер или порт для APN). Вредоносные программы смогут отслеживать, перенаправлять и изменять сетевые пакеты без вашего ведома."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"Изменение сетевых настроек"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Приложение сможет изменять состояние подключения к сети."</string>
- <string name="permlab_changeTetherState" msgid="5952584964373017960">"изменить подключение к компьютеру"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"Изменение подключения к компьютеру"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"Приложение сможет включать и выключать режим модема."</string>
- <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"изменять настройки использования данных в фоновом режиме"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"Настройка использования данных в фоновом режиме"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Приложение сможет изменять настройки использования трафика в фоновом режиме."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"Просмотр подключений Wi-Fi"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Приложение сможет просматривать информацию о сети Wi-Fi: состояние сети и имена подключенных устройств."</string>
@@ -599,7 +603,7 @@
<string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Приложение сможет изменять фиды, синхронизируемые в настоящее время. Вредоносные программы смогут изменять синхронизированные фиды."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"Просмотр добавленных в словарь слов"</string>
<string name="permdesc_readDictionary" msgid="659614600338904243">"Приложение получит доступ ко всем словам и фразам, которые хранятся в пользовательском словаре."</string>
- <string name="permlab_writeDictionary" msgid="2183110402314441106">"добавлять слова в пользовательский словарь"</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"Добавление слов в словарь пользователя"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Приложение сможет добавлять слова в пользовательский словарь."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"Проверка доступа к защищенному хранилищу"</string>
<string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"Проверка доступа к защищенному хранилищу"</string>
@@ -609,23 +613,23 @@
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Изменение или удаление содержимого SD-карты"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Приложение сможет записывать данные на USB-накопитель."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Приложение сможет записывать данные на SD-карту."</string>
- <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"изм./удал. данных мультимедиа"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Доступ к данным мультимедиа"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Приложение сможет изменять контент внутреннего хранилища мультимедиа."</string>
- <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"разрешить доступ к внешним накопителям из всех аккаунтов"</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"Доступ к внешним накопителям из всех аккаунтов"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Приложение сможет обращаться к внешним накопителям из всех аккаунтов."</string>
- <string name="permlab_cache_filesystem" msgid="5656487264819669824">"получать доступ к кэшу файловой системы"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Доступ к файловой системе кэша"</string>
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Приложение сможет выполнять чтение и запись в файловую систему кэша."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"Осуществление/прием интернет-вызовов"</string>
<string name="permdesc_use_sip" msgid="4717632000062674294">"Приложение сможет использовать службу SIP для интернет-вызовов."</string>
- <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"читать журнал использования сети"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"Просмотр журнала использования сети"</string>
<string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Приложение сможет считывать сохраненную историю использования определенных сетей и приложений."</string>
- <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"управление сетевой политикой"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"Управление сетевой политикой"</string>
<string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Приложение сможет управлять сетевыми политиками и определять правила для отдельных приложений."</string>
- <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"изменение учета использования сети"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Изменение учета использования сети"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Приложение сможет изменять порядок расчета использования сетевых ресурсов различными программами. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_accessNotifications" msgid="7673416487873432268">"доступ к уведомлениям"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"Доступ к уведомлениям"</string>
<string name="permdesc_accessNotifications" msgid="458457742683431387">"Приложение сможет получать, проверять и удалять уведомления, включая те, что опубликованы другими приложениями."</string>
- <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"подключить к службе просмотра уведомлений"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"Подключение к службе просмотра уведомлений"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Приложение сможет подключаться к базовому интерфейсу службы просмотра уведомлений. Это разрешение не используется обычными приложениями."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Правила выбора паролей"</string>
<string name="policydesc_limitPassword" msgid="3252114203919510394">"Контролировать длину и символы при вводе паролей для снятия блокировки экрана."</string>
@@ -901,17 +905,17 @@
<string name="permdesc_setAlarm" msgid="316392039157473848">"Приложение сможет настраивать будильник. Функция поддерживается не во всех программах."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"Добавление голосовых сообщений"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"Приложение сможет добавлять голосовые сообщения в папку \"Входящие\"."</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"изменение прав доступа к геоданным в браузере"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Изменение прав доступа к геоданным в браузере"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Приложение сможет изменять настройки доступа к геоданным в браузере. Вредоносные программы смогут таким образом отправлять информацию о местоположении на любые веб-сайты."</string>
- <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"проверять пакеты"</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"Проверка пакетов"</string>
<string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Приложение сможет проверять возможность установки пакетов."</string>
- <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"связываться с верификатором пакетов"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"Подключение к верификаторам пакетов"</string>
<string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Приложение сможет запрашивать проверку пакетов. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_serialPort" msgid="546083327654631076">"доступ к последовательным портам"</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"Доступ к последовательным портам"</string>
<string name="permdesc_serialPort" msgid="2991639985224598193">"Открыть владельцу доступ к последовательным портам с помощью SerialManager API."</string>
- <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"доступ к контенту без приложения"</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"Доступ к контенту без приложения"</string>
<string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Владелец сможет получить доступ к контенту без использования приложения. Это разрешение не применяется в обычных приложениях."</string>
- <string name="permlab_updateLock" msgid="3527558366616680889">"предотвращать авт. обновления устройства"</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"Предотвращение автоматических обновлений устройства"</string>
<string name="permdesc_updateLock" msgid="1655625832166778492">"Позволяет владельцу сообщить системе о подходящем моменте для неинтерактивной перезагрузки в ходе обновления устройства."</string>
<string name="save_password_message" msgid="767344687139195790">"Вы хотите, чтобы браузер запомнил этот пароль?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Не сейчас"</string>
@@ -1247,14 +1251,18 @@
<string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB-накопитель отключен. Вставьте другой накопитель."</string>
<string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD-карта извлечена. Вставьте новую карту."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Подходящих действий не найдено."</string>
- <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"обновлять статистику использования компонентов"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"Обновление статистики использования компонентов"</string>
<string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Приложение сможет изменять собранную статистику использования компонентов. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_copyProtectedData" msgid="4341036311211406692">"копирование контента"</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"Копирование контента"</string>
<string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Приложение сможет вызывать службу контейнеров по умолчанию для копирования данных. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Перенаправление мультимедийных данных"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Приложение сможет направлять поток мультимедиа на другие внешние устройства."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Доступ к хранилищу ключей"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Приложение сможет получить доступ к хранилищу ключей."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Нажмите дважды для изменения масштаба"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Не удалось добавить виджет."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Выбрать"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Владелец"</string>
<string name="error_message_title" msgid="4510373083082500195">"Ошибка"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Приложение не поддерживает аккаунты с ограниченным доступом"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Невозможно обработать это действие"</string>
<string name="revoke" msgid="5404479185228271586">"Отменить"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index ce265a4..a47963f 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Umožňuje aplikácii zaznamenávať zvuk pomocou mikrofónu. Toto povolenie umožňuje aplikácii zaznamenávať zvuk kedykoľvek bez vášho potvrdenia."</string>
<string name="permlab_camera" msgid="3616391919559751192">"snímanie fotografií a natáčanie videí"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Umožňuje aplikácii fotografovať a nahrávať videá pomocou fotoaparátu. Toto povolenie umožňuje aplikácii používať fotoaparát kedykoľvek a bez vášho potvrdenia."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trvalé zakázanie tabletu"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"trvalé vypnutie telefónu"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Umožňuje aplikácii natrvalo zakázať celý tablet. Toto je veľmi nebezpečné nastavenie."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Umožňuje aplikácii smerovať výstup médií do ďalších externých zariadení."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Prístup k ukladaciemu priestoru zabezpečenému technológiou keyguard"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Umožňuje aplikácii získať prístup k ukladaciemu priestoru zabezpečenému technológiou keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Ovládacie prvky lupy zobrazíte dvojitým dotknutím"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Miniaplikáciu sa nepodarilo pridať."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Hľadať"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlastník"</string>
<string name="error_message_title" msgid="4510373083082500195">"Chyba"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Táto aplikácia nepodporuje účty v prípade používateľov s obmedzením"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Aplikácia potrebná na spracovanie tejto akcie sa nenašla"</string>
<string name="revoke" msgid="5404479185228271586">"Odvolať"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 1187b9f..f1499fa 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -434,9 +434,9 @@
<string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Aplikaciji omogoča branje osebnih podatkov v profilu, ki so shranjeni v napravi, na primer ime in podatki za stik. To pomeni, da vas lahko aplikacija prepozna in vaše podatke v profilu pošlje drugim."</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"spreminj. vaše osebne vizitke"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Aplikaciji omogoča spreminjanje ali dodajanje osebnih podatkov v profilu, ki so shranjeni v napravi, na primer ime in podatki za stik. To pomeni, da vas lahko aplikacija prepozna in vaše podatke v profilu pošlje drugim."</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"preberite svoj družabni tok"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"branje vašega družabnega toka"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Aplikaciji omogoča dostop do vaših objav in objav vaših prijateljev v družabnih omrežjih ter njihovo sinhronizacijo. Previdno pri objavljanju informacij – aplikacija lahko s tem bere komunikacijo med vami in prijatelji v družabnih omrežjih, ne glede na zasebnost. Opomba: Tega dovoljenja ni mogoče uveljaviti v vseh družabnih omrežjih."</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"pišite v svoj družabni tok"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"pisanje v vaš družabni tok"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Aplikaciji omogoča prikaz objav vaših prijateljev v družabnih omrežjih. Previdno pri objavljanju informacij – aplikacija lahko s tem ustvari sporočila, za katera je videti, da jih pošiljajo prijatelji. Opomba: Tega dovoljenja ni mogoče uveljaviti v vseh družabnih omrežjih."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"branje dogodkov v koledarju in zaupnih podatkov"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Aplikaciji omogoča branje vseh dogodkov v koledarju, ki so shranjeni v tabličnem računalniku, vključno z dogodki prijateljev in sodelavcev. S tem lahko aplikacija objavi ali shrani podatke v koledarju, ne glede na njihovo zaupnost ali občutljivost."</string>
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Aplikaciji omogoča snemanje zvoka z mikrofonom. S tem dovoljenjem lahko aplikacija kadar koli snema zvok brez vaše potrditve."</string>
<string name="permlab_camera" msgid="3616391919559751192">"fotografiranje in snemanje videoposnetkov"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Aplikaciji omogoča fotografiranje in snemanje videoposnetkov s kamero. S tem dovoljenjem lahko aplikacija kadar koli uporablja kamero brez vaše potrditve."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogočenje tabličnega računalnika"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogočenje telefona"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Programu omogoča trajno onemogočenje celotnega tabličnega računalnika. To je zelo nevarno dejanje."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Aplikaciji omogoča preusmerjanje predstavnosti v druge zunanje naprave."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Dostop do varne shrambe Keyguard."</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Aplikaciji omogoča dostop do varne shrambe Keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Dvakrat se dotaknite za nadzor povečave/pomanjšave"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Pripomočka ni bilo mogoče dodati."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Pojdi"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Lastnik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Napaka"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ta aplikacija ne podpira računov za uporabnike z omejitvami"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Najdena ni bila nobena aplikacija za izvedbo tega dejanja"</string>
<string name="revoke" msgid="5404479185228271586">"Prekliči"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index dadcc36..ee7e21d 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Дозвољава апликацији да снима звук помоћу микрофона. Ова дозвола омогућава апликацији да снима звук у било ком тренутку без ваше потврде."</string>
<string name="permlab_camera" msgid="3616391919559751192">"снимање фотографија и видео снимака"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Дозвољава апликацији да снима слике и видео снимке камером. Ова дозвола омогућава апликацији да у било ком тренутку користи камеру без ваше потврде."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"трајно онемогућавање таблета"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"трајно онемогућавање телефона"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дозвољава апликацији да трајно онемогући цео таблет. Ово је веома опасно."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Дозвољава апликацији да усмерава излаз медија на друге спољне уређаје."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Приступај безбедној меморији заштићеној шифром"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Дозвољава апликацији да приступа безбедној меморији заштићеној шифром."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Додирните двапут да бисте контролисали зум"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Није могуће додати виџет."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Иди"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Власник"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ова апликација не подржава налоге за кориснике са ограничењем"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Није пронађена ниједна апликација која би могла да обави ову радњу"</string>
<string name="revoke" msgid="5404479185228271586">"Опозови"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 5008039..cbfc6bb 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Tillåter att appen spelar in ljud med mikrofonen. Med den här behörigheten tillåts appen att spela in ljud när som helst utan ditt godkännande."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ta bilder och spela in videoklipp"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Tillåter att appen tar bilder och spelar in videor med kameran. Med den här behörigheten tillåts appen att använda kameran när som helst utan ditt godkännande."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"inaktivera surfplattan permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"inaktivera telefonen permanent"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillåter att appen inaktiverar hela surfplattan permanent. Detta är mycket farligt."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Tillåter att appen omdirigerar medieuppspelningar till andra externa enheter."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Åtkomst till säkert keyguard-lagringsutrymme"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Tillåter att en app får åtkomst till säkert keyguard-lagringsutrymme."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Tryck två gånger för zoomkontroll"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Det gick inte att lägga till widgeten."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Kör"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Ägare"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fel"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Appen har inte stöd för användarkonton med begränsningar"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Ingen app som kan hantera åtgärden hittades"</string>
<string name="revoke" msgid="5404479185228271586">"Återkalla"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index c88da04..c15bc50 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -466,8 +466,12 @@
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Inaruhusu programu kurekebisha mipangilio ya sauti kila mahali kama vile sauti na ni kipaza sauti kipi ambacho kinatumika kwa kutoa."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"rekodi sauti"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Inaruhusu programu kurekodi sauti kwa kinasa sauti. Idhini hii inaruhusu programu kurekodi sauti wakati wowote bila ya uthibitisho wako."</string>
- <string name="permlab_camera" msgid="3616391919559751192">"chukua picha na video"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"Kupiga picha na kurekodi video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Inaruhusu programu kupiga picha na video kwa kamera. Kibali hiki kinaruhusu programu kutumia kamera kwa wakati wowote bila uthibitisho wako."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"zima kompyuta ndogo kabisa"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"simu iliyolemazwa kabisa"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Inaruhusu programu kulemaza kompyuta yote kibao kabisa. Hii ni hatari sana."</string>
@@ -583,7 +587,7 @@
<string name="permlab_bluetooth" msgid="6127769336339276828">"oanisha na vifaa vya Bluetooth"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Inaruhusu programu kuona usanidi wa Bluetooth kwenye kompyuta kibao, na kuunda na kukubali miunganisho kwa vifaa vilivyooanishwa."</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Inaruhusu programu kuona usanidi wa Bluetooth kwenye simu, na kuunda na kukubali miunganisho kwa vifaa vilivyooanishwa."</string>
- <string name="permlab_nfc" msgid="4423351274757876953">"dhibiti Mawasiliano Karibu na Uga"</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"dhibiti Mawasiliano ya vifaa vilivyo Karibu"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"Inaruhusu programu kuwasiliana na lebo, kadi na wasomaji wa Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"zima kufuli la skrini yako"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Inaruhusu programu kulemaza ufunguo wa vitufe na usalama mwingine ambata wa nenosiri. Kwa mfano, simu inalemaza ufunguo wa viitufe inapopokea simu inayoingia, kisha inawezesha upya ufunguo wa vitufe wakati simu inapokamilika."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Inaruhusu programu kufuatilia utoaji wa habari kwa vifaa vingine vya nje."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Kufikia hifadhi salama ya ufunguo wa ulinzi"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Inaruhusu programu kufikia hifadhi salama ya ufunguo wa ulinzi."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Gusa mara mbili kwa udhibiti cha kuza"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Haikuweza kuongeza wijeti."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Nenda"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Mmiliki"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hitilafu"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Programu hii haiwezi kutumiwa na akaunti za watumiaji waliowekewa vizuizi"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Hakuna programu iliyopatikana ili kushughulikia kitendo hiki"</string>
<string name="revoke" msgid="5404479185228271586">"Batilisha"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 6a66df6..b99e169 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"อนุญาตให้แอปพลิเคชันบันทึกเสียงด้วยไมโครโฟน การอนุญาตนี้ทำให้แอปพลิเคชันสามารถบันทึกเสียงได้ทุกเมื่อโดยไม่ต้องรอการยืนยันจากคุณ"</string>
<string name="permlab_camera" msgid="3616391919559751192">"ถ่ายภาพและวิดีโอ"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"อนุญาตให้แอปพลิเคชันถ่ายภาพและวิดีโอด้วยกล้องถ่ายรูปนี้ การอนุญาตนี้จะทำให้แอปพลิเคชันสามารถใช้กล้องถ่ายรูปได้ทุกเมื่อโดยไม่ต้องรอการยืนยันจากคุณ"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"ปิดการใช้งานแท็บเล็ตอย่างถาวร"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"ปิดการใช้งานโทรศัพท์ถาวร"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"อนุญาตให้แอปพลิเคชันปิดใช้งานแท็บเล็ตทั้งเครื่องอย่างถาวร การดำเนินการนี้เป็นอันตรายอย่างยิ่ง"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"อนุญาตให้แอปพลิเคชันกำหนดเส้นทางเอาต์พุตของสื่อไปยังอุปกรณ์ภายนอกอื่นๆ"</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"เข้าถึงพื้นที่จัดเก็บที่รักษาความปลอดภัยด้วยคีย์การ์ด"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"อนุญาตให้แอปพลิเคชันเข้าถึงพื้นที่จัดเก็บที่รักษาความปลอดภัยด้วยคีย์การ์ด"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"แตะสองครั้งเพื่อควบคุมการซูม"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"ไม่สามารถเพิ่มวิดเจ็ต"</string>
<string name="ime_action_go" msgid="8320845651737369027">"ไป"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"เจ้าของ"</string>
<string name="error_message_title" msgid="4510373083082500195">"ข้อผิดพลาด"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"แอปพลิเคชันนี้ไม่สนับสนุนบัญชีผู้ใช้ที่ถูกจำกัด"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"ไม่พบแอปพลิเคชันสำหรับการทำงานนี้"</string>
<string name="revoke" msgid="5404479185228271586">"เพิกถอน"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 908a00e5..a54fa30 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Pinapayagan ang app na mag-record ng audio gamit ang mikropono. Pinapayagan ng pahintulot na ito ang app na mag-record ng audio anumang oras nang wala ng iyong kumpirmasyon."</string>
<string name="permlab_camera" msgid="3616391919559751192">"kumuha ng mga larawan at video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Pinapayagan ang app na kumuha ng mga larawan at video gamit ang camera. Pinapayagan ng pahintulot na ito ang app na gamitin ang camera anumang oras nang wala ng iyong kumpirmasyon."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanenteng huwag paganahin ang tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"permanenteng huwag paganahin ang telepono"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Pinapayagan ang app na huwag paganahin nang permanente ang buong tablet. Lubos itong mapanganib."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Pinapayagan ang application na mag-route ng output ng media sa iba pang mga panlabas na device."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"I-access ang secure na storage ng keyguard"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Nagbibigay-daan sa isang application na i-access ang secure na storage ng keyguard."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Pindutin nang dalawang beses para sa pagkontrol ng zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Hindi maidagdag ang widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Pumunta"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"May-ari"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Hindi sinusuportahan ng application na ito ang mga account para sa mga limitadong user"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Walang nakitang application na mangangasiwa sa pagkilos na ito"</string>
<string name="revoke" msgid="5404479185228271586">"Bawiin"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 4f9c978..f31d7e0 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Uygulamaya mikrofonla ses kaydetme izni verir. Bu izin, uygulamanın istediği zaman onayınız olmadan ses kaydetmesine olanak sağlar."</string>
<string name="permlab_camera" msgid="3616391919559751192">"resim çekme ve görüntü kaydetme"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Uygulamaya kamerayla fotoğraf ve video çekme izni verir. Bu izin, uygulamanın sizin onayınız olmadan istediği zaman kamerayı kullanmasına olanak sağlar."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"tableti kalıcı olarak devre dışı bırak"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"telefonu tamamen devre dışı bırak"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Uygulamaya, tüm tableti kalıcı olarak devre dışı bırakma izni verir. Bu çok tehlikelidir."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Uygulamaya medya çıktısını başka harici cihazlara yönlendirme izni verir."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Tuş kilitli güvenli depolamaya erişim"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Bir uygulamanın tuş kilitli güvenli depolamaya erişimine izin verir."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Yakınlaştırma denetimi için iki kez dokunun"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget eklenemedi."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Git"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Sahibi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hata"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Bu uygulama, kısıtlı kullanıcı hesaplarını desteklemiyor"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"</string>
<string name="revoke" msgid="5404479185228271586">"İptal et"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 7904d35..0a6e180 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Дозволяє програмі записувати звук за допомогою мікрофона. Такий дозвіл дає програмі змогу будь-коли записувати звук без вашого підтвердження."</string>
<string name="permlab_camera" msgid="3616391919559751192">"фотограф. та знімати відео"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Дозволяє програмі фотографувати та знімати відео за допомогою камери. Такий дозвіл дає програмі змогу будь-коли використовувати камеру без вашого підтвердження."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"остаточно вимкнути пристрій"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"остаточно вимкнути телефон"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дозволяє програмі назавжди вимикати весь планшетний ПК. Це дуже небезпечно."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Дозволяє програмі скеровувати вивід медіа-даних на інші зовнішні пристрої."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Отримувати доступ до безпечного сховища через клавіатуру"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Дозволяє програмі отримувати доступ до безпечного сховища через клавіатуру."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Двічі торкніться, щоб керувати масштабом"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Не вдалося додати віджет."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Йти"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Власник"</string>
<string name="error_message_title" msgid="4510373083082500195">"Помилка"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ця програма не підтримує облікові записи для обмежених користувачів"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Не знайдено програму для обробки цієї дії"</string>
<string name="revoke" msgid="5404479185228271586">"Анулювати"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 756a7aa..e43b945 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Cho phép ứng dụng ghi âm bằng micrô. Quyền này cho phép ứng dụng ghi âm bất kỳ lúc nào mà không cần sự xác nhận của bạn."</string>
<string name="permlab_camera" msgid="3616391919559751192">"chụp ảnh và quay video"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Cho phép ứng dụng chụp ảnh và quay video bằng máy ảnh. Quyền này cho phép ứng dụng sử dụng máy ảnh bất kỳ lúc nào mà không cần sự xác nhận của bạn."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vô hiệu hóa vĩnh viễn máy tính bảng"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"vĩnh viễn vô hiệu hóa điện thoại"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Cho phép ứng dụng vô hiệu hóa vĩnh viễn toàn bộ máy tính bảng. Điều này rất nguy hiểm."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Cho phép ứng dụng định tuyến thiết bị ra phương tiện đến các thiết bị bên ngoài khác."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Truy cập bộ nhớ an toàn khóa bàn phím"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Cho phép ứng dụng truy cập bộ nhớ an toàn khóa"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Chạm hai lần để kiểm soát thu phóng"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Không thể thêm tiện ích."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Đến"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Chủ sở hữu"</string>
<string name="error_message_title" msgid="4510373083082500195">"Lỗi"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Ứng dụng này không hỗ trợ tài khoản cho người dùng giới hạn"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Không tìm thấy ứng dụng nào để xử lý tác vụ này"</string>
<string name="revoke" msgid="5404479185228271586">"Thu hồi"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 0429395..d10549a 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"允许该应用使用麦克风录制音频。此权限可让该应用不经您的确认即可随时录制音频。"</string>
<string name="permlab_camera" msgid="3616391919559751192">"拍摄照片和视频"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"允许该应用使用相机拍摄照片和视频。此权限可让该应用随时使用相机,而无需您的确认。"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"永久停用平板电脑"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"永久停用手机"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"允许应用永久停用整个平板电脑,但这样非常危险。"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"允许该应用将媒体输出线路更改到其他外部设备。"</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"访问密钥保护安全存储空间"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"允许应用访问密钥保护安全存储空间。"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"触摸两次可进行缩放控制"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加小部件。"</string>
<string name="ime_action_go" msgid="8320845651737369027">"开始"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"机主"</string>
<string name="error_message_title" msgid="4510373083082500195">"错误"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"受限用户无法使用此应用"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"找不到可处理此操作的应用"</string>
<string name="revoke" msgid="5404479185228271586">"撤消"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d62a5bb..911b01c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"允許應用程式使用麥克風錄音。這項權限可讓應用程式隨時錄音,不需經過您的確認。"</string>
<string name="permlab_camera" msgid="3616391919559751192">"拍攝相片和影片"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"允許應用程式使用相機拍照和錄影。這項權限可讓應用程式隨時使用相機,而不需請求您進行確認。"</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"永久停用平板電腦"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"永久停用電話"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"允許應用程式永久停用平板電腦所有功能 (這類權限具有高度風險)。"</string>
@@ -542,7 +546,7 @@
<string name="permlab_setTimeZone" msgid="2945079801013077340">"設定時區"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"允許應用程式變更平板電腦的時區。"</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"允許應用程式變更手機的時區。"</string>
- <string name="permlab_accountManagerService" msgid="4829262349691386986">"作為 AccountManagerService"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"做為 AccountManagerService"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"允許應用程式呼叫 AccountAuthenticators。"</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"尋找裝置上的帳戶"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"允許應用程式取得平板電腦上所記憶的帳戶清單,其中可能包括您安裝的應用程式所建立的任何帳戶。"</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"允許應用程式將媒體輸出轉送至其他外部裝置。"</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"存取 Keyguard 安全儲存空間"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"允許應用程式存取 Keyguard 安全儲存空間。"</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"輕觸兩下即可控制縮放"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"無法新增小工具。"</string>
<string name="ime_action_go" msgid="8320845651737369027">"開始"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"擁有者"</string>
<string name="error_message_title" msgid="4510373083082500195">"錯誤"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"這個應用程式不支援受限的使用者帳戶。"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"找不到支援此操作的應用程式"</string>
<string name="revoke" msgid="5404479185228271586">"撤銷"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index b37d837..b15bc74 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -468,6 +468,10 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"Ivumela uhlelo lokusebenza ukurekhoda umsindo nge-microphone. Le mvume ivumela uhlelo lokusebenza ukuqopha umsindo noma kunini ngaphandle kokuqinisekisa kwakho."</string>
<string name="permlab_camera" msgid="3616391919559751192">"thatha izithombe namavidiyo"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"Ivumela uhlelo lokusebenza ukuthatha izithombe namavidiyo ngekhamera. Le mvume ivumela uhlelo lokusebenza ukusebenzisa ikhamera nganoma isiphi isikhathi ngaphandle kwemvume yakho."</string>
+ <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) -->
+ <skip />
+ <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) -->
+ <skip />
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vimbela ngokuphelele ithebhulethi"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"ngokwaphakade vimbela ifoni"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ivumela uhlelo lokusebenza ukuvimbela yonke ithebhulethi ngokuphelele. Lokhu kuyingozi kakhulu."</string>
@@ -1255,6 +1259,10 @@
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ivumela uhlelo lokusebenza ukwenza umzila wokukhiphayo wemidiya kuya kumadivayisi angaphandle."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Finyelela kusitoreji esiqashwa ngesikhiya esiphephile"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ivumela uhlelo lokusebenza ukuthi lufinyelele kusitoreji esiqashwa ngesikhiya esiphephile."</string>
+ <!-- no translation found for permlab_control_keyguard (172195184207828387) -->
+ <skip />
+ <!-- no translation found for permdesc_control_keyguard (3043732290518629061) -->
+ <skip />
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Thinta kabili ukulawula ukusondeza"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Yehlulekile ukwengeza i-widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Iya"</string>
@@ -1491,7 +1499,8 @@
<string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Umnikazi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Iphutha"</string>
- <string name="app_no_restricted_accounts" msgid="5322164210667258876">"Lolu hlelo lokusebenza alusekeli ama-akhawunti wabasebenzisi abakhawulelwe"</string>
+ <!-- no translation found for app_no_restricted_accounts (4011285085817350390) -->
+ <skip />
<string name="app_not_found" msgid="3429141853498927379">"Alukho uhlelo lokusebenza olutholakele lokuphatha lesi senzo"</string>
<string name="revoke" msgid="5404479185228271586">"Chitha"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 9653020..5d71f75 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3548,7 +3548,7 @@
<attr name="dropDownWidth" />
<!-- Reference to a layout to use for displaying a prompt in the dropdown for
spinnerMode="dropdown". This layout must contain a TextView with the id
- @android:id/text1 to be populated with the prompt text. -->
+ {@code @android:id/text1} to be populated with the prompt text. -->
<attr name="popupPromptView" format="reference" />
<!-- Gravity setting for positioning the currently selected item. -->
<attr name="gravity" />
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index ae68925..09be719 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1377,6 +1377,10 @@
<string name="permdesc_camera">Allows the app to take pictures and videos
with the camera. This permission allows the app to use the camera at any
time without your confirmation.</string>
+ <!-- Title of a camera app permission, listed so the user can choose whether or not they want to allow it to disable the may-transmit light indicator. -->
+ <string name="permlab_cameraDisableTransmitLed">disable transmit indicator LED when camera is in use</string>
+ <!-- Description of a camera app permission, listed so the user can choose whether or not they want to allow it to disable the may-transmit light indicator. -->
+ <string name="permdesc_cameraDisableTransmitLed">Allows a pre-installed system application to disable the camera use indicator LED.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_brick" product="tablet">permanently disable tablet</string>
@@ -3470,6 +3474,11 @@
<!-- Description of an application permission that lets an application access keyguard secure storage. -->
<string name="permdesc_access_keyguard_secure_storage">Allows an application to access keguard secure storage.</string>
+ <!-- Title of an application permission that lets it control keyguard. -->
+ <string name="permlab_control_keyguard">Control displaying and hiding keyguard</string>
+ <!-- Description of an application permission that lets it control keyguard. -->
+ <string name="permdesc_control_keyguard">Allows an application to control keguard.</string>
+
<!-- Shown in the tutorial for tap twice for zoom control. -->
<string name="tutorial_double_tap_to_zoom_message_short">Touch twice for zoom control</string>
@@ -4106,7 +4115,7 @@
<!-- Error message title [CHAR LIMIT=35] -->
<string name="error_message_title">Error</string>
<!-- Message informing user that app is not permitted to access accounts. [CHAR LIMIT=none] -->
- <string name="app_no_restricted_accounts">This application does not support accounts for limited users</string>
+ <string name="app_no_restricted_accounts">This application does not support accounts for restricted profiles</string>
<!-- Message informing user that the requested activity could not be found [CHAR LIMIT=none] -->
<string name="app_not_found">No application found to handle this action</string>
<string name="revoke">Revoke</string>
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index b6b15c4..22fa7fc 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -23,7 +23,7 @@
LOCAL_DX_FLAGS := --core-library
LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib mockwebserver guava littlemock
-LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
+LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common
LOCAL_PACKAGE_NAME := FrameworksCoreTests
LOCAL_CERTIFICATE := platform
diff --git a/core/tests/coretests/src/android/net/http/X509TrustManagerExtensionsTest.java b/core/tests/coretests/src/android/net/http/X509TrustManagerExtensionsTest.java
index 60c40db..04aa62a 100644
--- a/core/tests/coretests/src/android/net/http/X509TrustManagerExtensionsTest.java
+++ b/core/tests/coretests/src/android/net/http/X509TrustManagerExtensionsTest.java
@@ -25,7 +25,7 @@
import junit.framework.TestCase;
-import org.apache.harmony.xnet.provider.jsse.TrustManagerImpl;
+import com.android.org.conscrypt.TrustManagerImpl;
public class X509TrustManagerExtensionsTest extends TestCase {
diff --git a/data/keyboards/Vendor_1d79_Product_0009.kl b/data/keyboards/Vendor_1d79_Product_0009.kl
index bbfbc37..a3d5bbd 100644
--- a/data/keyboards/Vendor_1d79_Product_0009.kl
+++ b/data/keyboards/Vendor_1d79_Product_0009.kl
@@ -25,6 +25,10 @@
key 172 HOME
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBR
+key 103 DPAD_UP
+key 105 DPAD_LEFT
+key 106 DPAD_RIGHT
+key 108 DPAD_DOWN
axis 0x00 X
axis 0x01 Y
diff --git a/docs/html/distribute/googleplay/quality/tablet.jd b/docs/html/distribute/googleplay/quality/tablet.jd
index a54348b..192aae9 100644
--- a/docs/html/distribute/googleplay/quality/tablet.jd
+++ b/docs/html/distribute/googleplay/quality/tablet.jd
@@ -16,7 +16,7 @@
<li><a href="#hardware-requirements">9. Declare dependencies properly</a></li>
<li><a href="#support-screens">10. Declare tablet screens support</a></li>
<li><a href="#google-play">11. Showcase your tablet UI</a></li>
-<li><a href="#google-play-bp">12. Follow publishing best practices</a></li>
+<li><a href="#google-play-best-practices">12. Follow publishing best practices</a></li>
</ol>
<h2>Testing</h2>
@@ -68,8 +68,10 @@
<li><a href="#google-play">Screenshots are uploaded to Google Play</a></li>
</ul>
-<p>The sections that follow provide more information about these and other
-quality guidelines for tablet apps.</p>
+<p>If your app is already uploaded to the Google Play Developer Console, you
+ can see how it is doing against these checks
+ by visiting the <a href="#google-play-optimization-tips">Optimization
+ Tips page</a>.</p>
<h2 id="optimize-layouts">2. Optimize your layouts for larger screens</h2>
@@ -312,7 +314,15 @@
gets loaded.</li>
</ul>
-<p>At a minimum, your app should supply custom drawables and assets for common tablet screen densities, tagged with the qualifiers <code>hdpi</code>, <code>xhdpi</code>, or <code>xxhdpi</code>.</p>
+<p style="margin-bottom:.5em;">At a minimum, your app should supply sets of
+ custom drawables and assets for common tablet screen densities,
+ tagged with these qualifiers as appropriate:</p>
+
+<ul>
+ <li><code>hdpi</code>, OR</li>
+ <li><code>xhdpi</code>, OR</li>
+ <li><code>xxhdpi</code></li>
+</ul>
<div class="rel-resources">
<h3>
@@ -482,62 +492,103 @@
<h2 id="android-versions">8. Target Android versions properly</h2>
<p>To ensure the broadest possible distribution to tablets, make sure that your
-app is targeting the Android versions that support tablets. You can declare
-the targeted range of Android versions in the
-<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
-element in the app manifest.</p>
+app properly targets the Android versions that support tablets. Initial support for
+tablets was added in <a href="{@docRoot}about/versions/android-3.0">Android 3.0</a> (API level 11). Unified UI
+framework support for tablets, phones, and other devices was introduced in <a href="{@docRoot}about/versions/android-4.0">Android 4.0</a> (API level 14) and is supported in later versions.
-<p>At a minimum, your app's
-<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
-should declare support for Android versions as follows:</p>
+<p>You can set the app's
+range of targeted Android versions in the manifest file, in the
+<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a> element. In most cases, you can target Android versions properly by setting the element's <code>targetSdkVersion</code> attribute to the highest API level available.</p>
- <ul>
- <li>If a <code>targetSdkVersion</code> attribute is declared, it should have a value of 11 or higher, OR</li>
- <li>If a <code>minSdkVersion</code> attribute is declared, it should have a value of 11 or higher.</li>
- <li>Also, if a <code>maxSdkVersion</code> attribute is declared, it must have a value of 12 or higher. Note that, in most cases, the use of <code>maxSdkVersion</code> is <em>not recommended</em>.</li>
+<p style="margin-bottom:.5em;">At a minimum, check the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
+ element to make sure that:</p>
+
+ <ol style="list-style-type:lower-alpha;margin-top:0em;">
+ <li><code>targetSdkVersion</code> is declared with value 11 or higher (14 or higher is recommended), OR</li>
+ <li><code>minSdkVersion</code> is declared with value 11 or higher.</li>
+ <li>If a <code>maxSdkVersion</code> attribute is declared, it must have a value of 11 or higher. Note that, in general, the use of <code>maxSdkVersion</code> is <em>not recommended</em>.</li>
+</ol>
+
+<div class="rel-resources">
+<h3>
+ Related resources
+</h3>
+
+<ul>
+ <li>
+ <a href=
+ "{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Android API
+ Levels</a>—Introduces API levels and how they relate to compatibility.
+ A reference of available API levels is included.
+ </li>
+ <li>
+ <a href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different Platform Versions</a>—Training class showing how to declare support for
+ minimum and target API levels in your app.
+ </li>
</ul>
+</div>
<h2 id="hardware-requirements">9. Declare hardware feature dependencies properly</h2>
-<p>Handsets and tablets typically offer slightly different hardware support for
-sensors, camera, telephony, and other features. For example, many tablets are
-available in a "Wi-Fi" configuration that does not include telephony support.</p>
+<p>
+ Handsets and tablets typically offer slightly different hardware support for
+ sensors, camera, telephony, and other features. For example, many tablets are
+ available in a "Wi-Fi" configuration that does not include telephony support.
+</p>
-<p>To ensure that you can deliver a single APK broadly across the
-your full customer base, make sure that your app does not have built-in
-requirements for hardware features that aren't commonly available on tablets.
+<p>
+ So that you can distribute a single APK broadly across your full customer
+ base of phones and tablets, make sure that your app doesn't declare
+ requirements for hardware features that aren't commonly available on tablets.
+ Instead, properly declare the hardware features as <em>not required</em> in the app
+ manifest, as described below.
</p>
<ul>
-<li>Your app's manifest should not include <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a>
-elements for hardware features or capabilities that might not be
-available on tablets, except when they are declared with the
-<code>android:required=”false”</code> attribute. For example, your app should
-not <em>require</em> features such as:
+<li>In your app manifest, locate any <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a>
+elements. In particular, look for hardware features that might not be
+available on some tablets, such as:
+
<ul>
<li><code>android.hardware.telephony</code></li>
<li><code>android.hardware.camera</code> (refers to back camera), or</li>
<li><code>android.hardware.camera.front</code></li>
-</ul>
-</li>
-<li>Similarly, your app manifest should not include any <a
-href="{@docRoot}guide/topics/manifest/permission-element.html"><code><permission></code></a> elements that <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions">imply
-feature requirements</a> that might not be appropriate for tablets, except when
-accompanied by a corresponding <code><uses-feature></code> element
-declared with the <code>android:required=”false”</code> attribute.
-<p>Here's an example of a dependency that's properly declared as "not required", so that
-it does not limit distribution to devices that do not support the dependency:</p>
-<p><code><uses-feature android:name="android.hardware.telephony"
-android:required="false" /></code></p></li>
+</ul></li>
+
+<li>Declare the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a>
+elements as <em>not required</em> by including the <code>android:required=”false”</code>
+attribute.
+
+<p>
+ For example, here's the proper way to declare a dependency on
+ <code>android.hardware.telephony</code>, such that you can still
+ distribute the app broadly, even to devices that don't offer telephony:
+</p>
+
+<pre><uses-feature android:name="android.hardware.telephony" android:required="false" /></pre></li>
+
+<li>Similarly, check the manifest for <a href="/guide/topics/manifest/permission-element.html"><code><permission></code></a> elements that
+<a href="/guide/topics/manifest/uses-feature-element.html#permissions">imply hardware
+feature requirements</a> that not be appropriate for tablets. If you find such
+permissions, make sure to explicitly declare a corresponding
+<code><uses-feature></code> element for the features and includes the
+<code>android:required=”false”</code> attribute.</li>
</ul>
-<p>In all cases, the app must function normally when the hardware features it
-uses are not available and should offer "graceful degradation" and alternative
-functionality where appropriate. For example, if GPS is not supported on the device,
-your app could let the user set their location manually. The app should do
-run-time checking for the hardware capability that it needs and handle as needed.</p>
+
+<p>
+ After declaring hardware features as <em>not required</em>, make sure to test
+ your app on a variety of devices. The app should function normally when the
+ hardware features it uses are not available, and it should offer "graceful
+ degradation" and alternative functionality where appropriate.
+</p>
+
+<p>
+ For example, if an app normally uses GPS to set the location but GPS is not
+ supported on the device, the app could let the user set the location manually
+ instead. The app can check for device hardware capabilities at runtime and handle
+ as needed.
+</p>
<div class="rel-resources">
<h3>
@@ -570,9 +621,7 @@
<h2 id="support-screens">10. Declare support for tablet screens</h2>
<p>To ensure that you can distribute your app to a broad range of tablets, your app should
-declare support for tablet screen sizes in the
-<a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code><supports-screens></code></a>
-element in the app manifest, as follows:</p>
+declare support for tablet screen sizes in its manifest file, as follows:</p>
<ul>
<li>A
@@ -590,7 +639,7 @@
element in the manifest, the element should include attributes that specify
<em>all of the size and density combinations for tablet screens</em> that the
app supports. Note that, if possible, you should avoid using the
-<a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code><supports-screens></code></a>
+<a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code><compatible-screens></code></a>
element in your app.</p>
<div class="rel-resources">
@@ -617,14 +666,14 @@
ways to promote your tablet app to users on Google Play.
</p>
-<h5>
+<h4>
Upload screenshots of your tablet UI
-</h5>
+</h4>
<p>
Tablet users want to know what your app is like on a tablet device, not on a
phone. If you developed a tablet app, make sure to upload screenshots
- of your tablet UI to the Developer Console. Here are some guidelines:
+ of your tablet UI to the Google Play Developer Console. Here are some guidelines:
</p>
<ul style="margin-top:0;">
@@ -652,9 +701,9 @@
</li>
</ul>
-<h5>
+<h4>
Update your app description and release notes
-</h5>
+</h4>
<ul>
<li>In your app description, make sure to highlight that your app offers
@@ -667,9 +716,9 @@
</li>
</ul>
-<h5>
+<h4>
Update your promotional video
-</h5>
+</h4>
<p>
Many users view an app's promotional video to get an idea of what the app is
@@ -698,9 +747,9 @@
</li>
</ul>
-<h5>
+<h4>
Feature your tablet UI in your promotional campaigns
-</h5>
+</h4>
<p>
Make sure to let tablet users know about your tablet UI in your promotional
@@ -759,15 +808,59 @@
</ul>
</div>
-<h2 id="google-play-bp">12. Follow best practices for publishing in Google Play</h2>
+<h2 id="google-play-best-practices">12. Follow best practices for publishing in Google Play</h2>
-Here are some best practices to consider when publishing a tablet app on Google Play.</p>
+<p>Here are some best practices for delivering a successful tablet app on Google Play.</p>
-<h5>Check the app's filtering</h5>
+<h4 id="google-play-optimization-tips">Check out your app's Optimization Tips</h4>
+
+<p>The Google Play Developer Console now offers an Optimization Tips page that
+lets you quickly check how your app is doing against basic guidelines for tablet app
+distribution and quality. To visit the page, sign into the Developer Console,
+load the app from All Applications, and click Optimization Tips in
+the left navigation.</p>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2 style="line-height:1em;">How to Send Feedback</h2>
+
+<p>Please use the link below to send
+feedback or request a manual review of your Optimization Tips.</p>
+
+<p>Make sure to read the relevant sections of the Tablet App Quality
+Guidelines prior to sending feedback.</p>
+
+<p><strong><a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
+target="_googleplay" style="white-space:nowrap">Tablet Optimization
+Tips Feedback Form »</a></strong></p>
+</div>
+</div>
+
+<p>The Developer Console creates your app's Optimization Tips page
+by running a series of checks to verify basic quality
+criteria. If it finds any issues, it alerts you to them as "To Do"
+items in the Optimization Tips page.</p>
+
+<p>If you've developed a tablet experience for your app, make sure
+to visit the Optimization Tips page to see how your app is doing
+against the basic checks. If there are any issues listed, we
+recommend addressing them in your app and uploading a new binary for
+distribution, if needed.</p>
+
+<p>If the Optimization Tips page lists "To Do" issues that you feel don't
+apply to your app or affect its quality on tablets, please notify us
+using the <a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
+target="_googleplay" style="white-space:nowrap">Tablet Optimization
+Tips Feedback Form</a>. We
+will review your app and update your Optimization Tips page as
+appropriate.</p>
+
+
+<h4>Confirm the app's filtering</h4>
<p>After you've uploaded the app to the <a href="https://play.google.com/apps/publish/">Developer Console</a>, check the APK's Supported Devices list to make sure that the app is not filtered from tablet devices that you want to target.</p>
-<h5>Distribute as a single APK</h5>
+<h4>Distribute as a single APK</h4>
<p>
It's recommended that you publish your app as a single APK for all screen
diff --git a/docs/html/guide/topics/manifest/application-element.jd b/docs/html/guide/topics/manifest/application-element.jd
index 42cfdd5..6bfa3dc 100644
--- a/docs/html/guide/topics/manifest/application-element.jd
+++ b/docs/html/guide/topics/manifest/application-element.jd
@@ -1,11 +1,11 @@
page.title=<application>
-parent.title=The AndroidManifest.xml File
-parent.link=manifest-intro.html
+
@jd:body
<dl class="xml">
<dt>syntax:</dt>
<dd><pre class="stx"><application android:<a href="#reparent">allowTaskReparenting</a>=["true" | "false"]
+ android:<a href="#allowbackup">allowBackup</a>=["true" | "false"]
android:<a href="#agent">backupAgent</a>="<i>string</i>"
android:<a href="#debug">debuggable</a>=["true" | "false"]
android:<a href="#desc">description</a>="<i>string resource</i>"
@@ -23,10 +23,14 @@
android:<a href="#persistent">persistent</a>=["true" | "false"]
android:<a href="#proc">process</a>="<i>string</i>"
android:<a href="#restoreany">restoreAnyVersion</a>=["true" | "false"]
+ android:<a href="#requiredAccountType">requiredAccountType</a>="<i>string</i>"
+ android:<a href="#restrictedAccountType">restrictedAccountType</a>="<i>string</i>"
android:<a href="#supportsrtl">supportsRtl</a>=["true" | "false"]
android:<a href="#aff">taskAffinity</a>="<i>string</i>"
+ android:<a href="#testOnly">testOnly</a>=["true" | "false"]
android:<a href="#theme">theme</a>="<i>resource or theme</i>"
- android:<a href="#uioptions">uiOptions</a>=["none" | "splitActionBarWhenNarrow"] >
+ android:<a href="#uioptions">uiOptions</a>=["none" | "splitActionBarWhenNarrow"]
+ android:<a href="#vmSafeMode">vmSafeMode</a>=["true" | "false"] >
. . .
</application></pre></dd>
@@ -52,6 +56,10 @@
{@code allowClearUserData}) set values for the application as a whole and
cannot be overridden by the components.</dd>
+
+
+
+
<dt>attributes</dt>
<dd><dl class="attr">
@@ -71,6 +79,15 @@
information.
</p></dd>
+
+<dt><a name="allowbackup"></a>{@code android:allowbackup}</dt>
+<dd>Whether to allow the application to participate in the backup
+and restore infrastructure. If this attribute is set to false, no backup
+or restore of the application will ever be performed, even by a full-system
+backup that would otherwise cause all application data to be saved via adb.
+The default value of this attribute is true.</dd>
+
+
<dt><a name="agent"></a>{@code android:backupAgent}</dt>
<dd>The name of the class that implement's the application's backup agent,
a subclass of {@link android.app.backup.BackupAgent}. The attribute value should be
@@ -282,6 +299,57 @@
<p>The default value of this attribute is {@code false}.
</p></dd>
+
+
+<dt><a name="requiredAccountType"></a>{@code android:requiredAccountType}</dt>
+<dd>Specifies the account type required by the application in order to function.
+If your app requires an {@link android.accounts.Account}, the value for this attribute must
+correspond to the account authenticator
+type used by your app (as defined by {@link android.accounts.AuthenticatorDescription}),
+such as "com.google".
+
+<p>The default value is null and indicates that the application
+can work <em>without</em> any accounts.
+
+<p>Because restricted profiles currently
+cannot add accounts, specifying this attribute <strong>makes your app
+unavailable from a restricted profile</strong> unless you also declare
+<a href="#restrictedAccountType">{@code android:restrictedAccountType}</a> with
+the same value.</p>
+
+<p class="caution"><strong>Caution:</strong>
+If the account data may reveal personally identifiable information, it's important
+that you declare this attribute and leave <a href="#restrictedAccountType">{@code android:restrictedAccountType}</a> null, so that restricted profiles cannot use
+your app to access personal information that belongs to the owner user.</p>
+
+<p>This attribute was added in API level 18.</p>
+</dd>
+
+
+<dt><a name="restrictedAccountType"></a>{@code android:restrictedAccountType}</dt>
+<dd>Specifies the account type required by this application and indicates that restricted profiles
+are allowed to access such accounts that belong to the owner user. If your app requires an
+{@link android.accounts.Account} and restricted profiles <strong>are allowed to
+access</strong> the primary user's accounts, the value for this attribute must
+correspond to the account authenticator type used by your app (as
+defined by {@link android.accounts.AuthenticatorDescription}), such as "com.google".
+
+<p>The default value is null and indicates that the application can work <em>without</em> any
+accounts.
+
+<p class="caution"><strong>Caution:</strong>
+Specifying this attribute allows restricted profiles to use your
+app with accounts that belong to the owner user, which may reveal personally identifiable
+information. If the account may reveal personal details, you <strong>should not</strong>
+use this attribute and you should instead declare the <a
+href="#requiredAccountType">{@code android:requiredAccountType}</a> attribute
+to make your app unavailable to restricted profiles.</p>
+
+<p>This attribute was added in API level 18.</p>
+</dd>
+
+
+
<dt><a name="supportsrtl"></a>{@code android:supportsRtl}</dt>
<dd>Declares whether your application is willing to support right-to-left (RTL) layouts.
<p>If set to {@code true} and <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target"
@@ -310,6 +378,13 @@
<code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code> element.
</p></dd>
+<dt><a name="testOnly"></a>{@code android:testOnly}</dt>
+<dd>Indicates whether this application is only for testing purposes. For example,
+it may expose functionality or data outside of itself that would cause a security
+hole, but is useful for testing. This kind of application can be installed
+only through adb.</dd>
+
+
<dt><a name="theme"></a>{@code android:theme}</dt>
<dd>A reference to a style resource defining a default theme for all
activities in the application. Individual activities can override
@@ -340,6 +415,14 @@
<p>This attribute was added in API level 14.</p>
</dd>
+<dt><a name="vmSafeMode"></a>{@code android:vmSafeMode}</dt>
+<dd>Indicates whether the app would like the virtual machine (VM) to operate
+in safe mode. The default value is {@code "false"}.
+</dd>
+
+
+
+
</dl></dd>
<!-- ##api level indication## -->
diff --git a/docs/html/guide/topics/resources/drawable-resource.jd b/docs/html/guide/topics/resources/drawable-resource.jd
index a34ed6c..dee28fe 100644
--- a/docs/html/guide/topics/resources/drawable-resource.jd
+++ b/docs/html/guide/topics/resources/drawable-resource.jd
@@ -174,6 +174,7 @@
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
+ android:mipMap=["true" | "false"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
</pre>
</dd>
@@ -245,6 +246,12 @@
</td></tr>
</table>
</dd>
+
+ <dt><code>android:mipMap</code></dt>
+ <dd><em>Boolean</em>. Enables or disables the mipmap hint. See {@link
+ android.graphics.Bitmap#setHasMipMap setHasMipMap()} for more information.
+ Default value is false.</dd>
+
<dt><code>android:tileMode</code></dt>
<dd><em>Keyword</em>. Defines the tile mode. When the tile mode is enabled, the bitmap is
repeated. Gravity is ignored when the tile mode is enabled.
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index 41765b3..7578110 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -53,6 +53,7 @@
* @attr ref android.R.styleable#BitmapDrawable_filter
* @attr ref android.R.styleable#BitmapDrawable_dither
* @attr ref android.R.styleable#BitmapDrawable_gravity
+ * @attr ref android.R.styleable#BitmapDrawable_mipMap
* @attr ref android.R.styleable#BitmapDrawable_tileMode
*/
public class BitmapDrawable extends Drawable {
@@ -283,6 +284,7 @@
* is null, this method always returns false.
*
* @see #setMipMap(boolean)
+ * @attr ref android.R.styleable#BitmapDrawable_mipMap
*/
public boolean hasMipMap() {
return mBitmapState.mBitmap != null && mBitmapState.mBitmap.hasMipMap();
diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h
index 5b45d70..ccccc2e 100644
--- a/include/androidfw/ResourceTypes.h
+++ b/include/androidfw/ResourceTypes.h
@@ -1553,7 +1553,7 @@
static bool getIdmapInfo(const void* idmap, size_t size,
uint32_t* pOriginalCrc, uint32_t* pOverlayCrc);
-#ifndef HAVE_ANDROID_OS
+#ifdef STATIC_ANDROIDFW_FOR_TOOLS
void print(bool inclValues) const;
static String8 normalizeForOutput(const char* input);
#endif
diff --git a/keystore/java/android/security/AndroidKeyPairGenerator.java b/keystore/java/android/security/AndroidKeyPairGenerator.java
index 43d1eb6..390e732 100644
--- a/keystore/java/android/security/AndroidKeyPairGenerator.java
+++ b/keystore/java/android/security/AndroidKeyPairGenerator.java
@@ -18,7 +18,7 @@
import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLEngine;
+import com.android.org.conscrypt.OpenSSLEngine;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
diff --git a/keystore/java/android/security/AndroidKeyStore.java b/keystore/java/android/security/AndroidKeyStore.java
index 04ee8c4..acbae8f 100644
--- a/keystore/java/android/security/AndroidKeyStore.java
+++ b/keystore/java/android/security/AndroidKeyStore.java
@@ -16,8 +16,8 @@
package android.security;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLEngine;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
+import com.android.org.conscrypt.OpenSSLEngine;
+import com.android.org.conscrypt.OpenSSLKeyHolder;
import android.util.Log;
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index c99dff0..6c10287 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -37,8 +37,8 @@
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLEngine;
-import org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore;
+import com.android.org.conscrypt.OpenSSLEngine;
+import com.android.org.conscrypt.TrustedCertificateStore;
/**
* The {@code KeyChain} class provides access to private keys and
diff --git a/keystore/tests/Android.mk b/keystore/tests/Android.mk
index 61cf640..35388d7 100644
--- a/keystore/tests/Android.mk
+++ b/keystore/tests/Android.mk
@@ -5,7 +5,7 @@
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle conscrypt
# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/keystore/tests/src/android/security/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
index 8798fb5..b7129db 100644
--- a/keystore/tests/src/android/security/AndroidKeyStoreTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
@@ -18,7 +18,7 @@
import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLEngine;
+import com.android.org.conscrypt.OpenSSLEngine;
import android.test.AndroidTestCase;
diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk
index 3ed75a2..018ed40 100644
--- a/libs/androidfw/Android.mk
+++ b/libs/androidfw/Android.mk
@@ -52,6 +52,8 @@
LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
+
LOCAL_C_INCLUDES := \
external/zlib
@@ -92,6 +94,7 @@
ifeq ($(TARGET_OS),linux)
include $(CLEAR_VARS)
+LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
LOCAL_C_INCLUDES += \
external/skia/include/core \
external/zlib \
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index a730065..9c58513 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -5324,7 +5324,7 @@
}
-#ifndef HAVE_ANDROID_OS
+#ifdef STATIC_ANDROIDFW_FOR_TOOLS
#define CHAR16_TO_CSTR(c16, len) (String8(String16(c16,len)).string())
#define CHAR16_ARRAY_EQ(constant, var, len) \
@@ -5621,6 +5621,6 @@
}
}
-#endif // HAVE_ANDROID_OS
+#endif // STATIC_ANDROIDFW_FOR_TOOLS
} // namespace android
diff --git a/media/java/android/drm/mobile1/DrmConstraintInfo.java b/media/java/android/drm/mobile1/DrmConstraintInfo.java
deleted file mode 100644
index 50ae8bd..0000000
--- a/media/java/android/drm/mobile1/DrmConstraintInfo.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2007 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.drm.mobile1;
-
-import java.util.Date;
-
-/**
- * This class provides interfaces to access the DRM constraint.
- */
-public class DrmConstraintInfo {
- /**
- * The constraint of count.
- */
- private int count;
-
- /**
- * The constraint of start date.
- */
- private long startDate;
-
- /**
- * The constraint of end date.
- */
- private long endDate;
-
- /**
- * The constraint of interval.
- */
- private long interval;
-
- /**
- * Construct the DrmConstraint.
- */
- DrmConstraintInfo() {
- count = -1;
- startDate = -1;
- endDate = -1;
- interval = -1;
- }
-
- /**
- * Get the count constraint.
- *
- * @return the count or -1 if no limit.
- */
- public int getCount() {
- return count;
- }
-
- /**
- * Get the start date constraint.
- *
- * @return the start date or null if no limit.
- */
- public Date getStartDate() {
- if (startDate == -1)
- return null;
-
- return new Date(startDate);
- }
-
- /**
- * Get the end date constraint.
- *
- * @return the end date or null if no limit.
- */
- public Date getEndDate() {
- if (endDate == -1)
- return null;
-
- return new Date(endDate);
- }
-
- /**
- * Get the Interval constraint.
- *
- * @return the interval or -1 if no limit.
- */
- public long getInterval() {
- return interval;
- }
-}
diff --git a/media/java/android/drm/mobile1/DrmException.java b/media/java/android/drm/mobile1/DrmException.java
deleted file mode 100644
index 7b06c92..0000000
--- a/media/java/android/drm/mobile1/DrmException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2007 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.drm.mobile1;
-
-import java.io.IOException;
-
-/**
- * A DrmException is thrown to report errors specific to handle DRM content and rights.
- */
-public class DrmException extends Exception
-{
- // TODO: add more specific DRM error codes.
-
- private DrmException() {
- }
-
- public DrmException(String message) {
- super(message);
- }
-}
diff --git a/media/java/android/drm/mobile1/DrmRawContent.java b/media/java/android/drm/mobile1/DrmRawContent.java
deleted file mode 100644
index 046b84a..0000000
--- a/media/java/android/drm/mobile1/DrmRawContent.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- * Copyright (C) 2007 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.drm.mobile1;
-
-import java.io.*;
-
-/**
- * This class provides interfaces to access the DRM raw content.
- */
-public class DrmRawContent {
- /**
- * The "application/vnd.oma.drm.message" mime type.
- */
- public static final String DRM_MIMETYPE_MESSAGE_STRING = "application/vnd.oma.drm.message";
-
- /**
- * The "application/vnd.oma.drm.content" mime type.
- */
- public static final String DRM_MIMETYPE_CONTENT_STRING = "application/vnd.oma.drm.content";
-
- /**
- * The DRM delivery type: Forward-Lock
- */
- public static final int DRM_FORWARD_LOCK = 1;
-
- /**
- * The DRM delivery type: Combined Delivery
- */
- public static final int DRM_COMBINED_DELIVERY = 2;
-
- /**
- * The DRM delivery type: Separate Delivery
- */
- public static final int DRM_SEPARATE_DELIVERY = 3;
-
- /**
- * The DRM delivery type: Separate Delivery in DRM message
- */
- public static final int DRM_SEPARATE_DELIVERY_DM = 4;
-
- /**
- * The DRM media content length is unknown currently
- */
- public static final int DRM_UNKNOWN_DATA_LEN = -1;
-
-
- /**
- * The id of "application/vnd.oma.drm.message" mime type.
- */
- private static final int DRM_MIMETYPE_MESSAGE = 1;
-
- /**
- * The id of "application/vnd.oma.drm.content" mime type.
- */
- private static final int DRM_MIMETYPE_CONTENT = 2;
-
- /**
- * Successful operation.
- */
- private static final int JNI_DRM_SUCCESS = 0;
-
- /**
- * General failure.
- */
- private static final int JNI_DRM_FAILURE = -1;
-
- /**
- * Indicates the end of the DRM content is reached.
- */
- private static final int JNI_DRM_EOF = -2;
-
- /**
- * The media content length is unknown from native method
- */
- private static final int JNI_DRM_UNKNOWN_DATA_LEN = -3;
-
- /**
- * The member to save the original InputStream data.
- */
- private BufferedInputStream inData;
-
- /**
- * The member to save the original InputStream data length.
- */
- private int inDataLen;
-
- /**
- * The unique id to this DRM content. It will be initialized
- * in constructor by native method. And it will not be changed
- * after initialization.
- */
- private int id;
-
- /**
- * The rights issuer address of this DRM object.
- */
- private String rightsIssuer;
-
- /**
- * The media content type of this DRM object.
- */
- private String mediaType;
-
- /**
- * The delivery method type of this DRM object.
- */
- private int rawType;
-
-
- /**
- * Construct a DrmRawContent object.
- *
- * @param inRawdata object of DRM raw data stream.
- * @param len the length of raw data can be read.
- * @param mimeTypeStr the mime type of the DRM content.
- */
- public DrmRawContent(InputStream inRawdata, int len, String mimeTypeStr) throws DrmException, IOException {
- int mimeType;
-
- id = -1;
- inData = new BufferedInputStream(inRawdata, 1024);
- inDataLen = len;
-
- if (DRM_MIMETYPE_MESSAGE_STRING.equals(mimeTypeStr))
- mimeType = DRM_MIMETYPE_MESSAGE;
- else if (DRM_MIMETYPE_CONTENT_STRING.equals(mimeTypeStr))
- mimeType = DRM_MIMETYPE_CONTENT;
- else
- throw new IllegalArgumentException("mimeType must be DRM_MIMETYPE_MESSAGE or DRM_MIMETYPE_CONTENT");
-
- if (len <= 0)
- throw new IllegalArgumentException("len must be > 0");
-
- /* call native method to initialize this DRM content */
- id = nativeConstructDrmContent(inData, inDataLen, mimeType);
-
- if (JNI_DRM_FAILURE == id)
- throw new DrmException("nativeConstructDrmContent() returned JNI_DRM_FAILURE");
-
- /* init the rights issuer field. */
- rightsIssuer = nativeGetRightsAddress();
-
- /* init the raw content type. */
- rawType = nativeGetDeliveryMethod();
- if (JNI_DRM_FAILURE == rawType)
- throw new DrmException("nativeGetDeliveryMethod() returned JNI_DRM_FAILURE");
-
- /* init the media content type. */
- mediaType = nativeGetContentType();
- if (null == mediaType)
- throw new DrmException("nativeGetContentType() returned null");
- }
-
- /**
- * Get rights address from raw Seperate Delivery content.
- *
- * @return the string of the rights issuer address,
- * or null if no rights issuer.
- */
- public String getRightsAddress() {
- return rightsIssuer;
- }
-
- /**
- * Get the type of the raw DRM content.
- *
- * @return one of the following delivery type of this DRM content:
- * #DRM_FORWARD_LOCK
- * #DRM_COMBINED_DELIVERY
- * #DRM_SEPARATE_DELIVERY
- * #DRM_SEPARATE_DELIVERY_DM
- */
- public int getRawType() {
- return rawType;
- }
-
- /**
- * Get one InputStream object to read decrypted content.
- *
- * @param rights the rights object contain decrypted key.
- *
- * @return the InputStream object of decrypted media content.
- */
- public InputStream getContentInputStream(DrmRights rights) {
- if (null == rights)
- throw new NullPointerException();
-
- return new DrmInputStream(rights);
- }
-
- /**
- * Get the type of the decrypted media content.
- *
- * @return the decrypted media content type of this DRM content.
- */
- public String getContentType() {
- return mediaType;
- }
-
- /**
- * Get the length of the decrypted media content.
- *
- * @param rights the rights object contain decrypted key.
- *
- * @return the length of the decrypted media content.
- * #DRM_UNKNOWN_DATA_LEN if the length is unknown currently.
- */
- public int getContentLength(DrmRights rights) throws DrmException {
- /**
- * Because currently the media object associate with rights object
- * has been handled in native logic, so here it is not need to deal
- * the rights. But for the apps, it is mandatory for user to get
- * the rights object before get the media content length.
- */
- if (null == rights)
- throw new NullPointerException();
-
- int mediaLen = nativeGetContentLength();
-
- if (JNI_DRM_FAILURE == mediaLen)
- throw new DrmException("nativeGetContentLength() returned JNI_DRM_FAILURE");
-
- if (JNI_DRM_UNKNOWN_DATA_LEN == mediaLen)
- return DRM_UNKNOWN_DATA_LEN;
-
- return mediaLen;
- }
-
- /**
- * This class provide a InputStream to the DRM media content.
- */
- class DrmInputStream extends InputStream
- {
- /**
- * The flag to indicate whether this stream is closed or not.
- */
- private boolean isClosed;
-
- /**
- * The offset of this DRM content to be reset.
- */
- private int offset;
-
- /**
- * A byte of data to be readed.
- */
- private byte[] b;
-
- /**
- * Construct a DrmInputStream instance.
- */
- public DrmInputStream(DrmRights rights) {
- /**
- * Because currently the media object associate with rights object
- * has been handled in native logic, so here it is not need to deal
- * the rights. But for the apps, it is mandatory for user to get
- * the rights object before get the media content data.
- */
-
- isClosed = false;
- offset = 0;
- b = new byte[1];
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#available()
- */
- public int available() throws IOException {
- /* call native method to get this DRM decrypted media content length */
- int len = nativeGetContentLength();
-
- if (JNI_DRM_FAILURE == len)
- throw new IOException();
-
- /* if the length is unknown, just return 0 for available value */
- if (JNI_DRM_UNKNOWN_DATA_LEN == len)
- return 0;
-
- int availableLen = len - offset;
- if (availableLen < 0)
- throw new IOException();
-
- return availableLen;
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- int res;
-
- res = read(b, 0, 1);
-
- if (-1 == res)
- return -1;
-
- return b[0] & 0xff;
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#read(byte)
- */
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#read(byte, int, int)
- */
- public int read(byte[] b, int off, int len) throws IOException {
- if (null == b)
- throw new NullPointerException();
- if (off < 0 || len < 0 || off + len > b.length)
- throw new IndexOutOfBoundsException();
- if (true == isClosed)
- throw new IOException();
-
- if (0 == len)
- return 0;
-
- len = nativeReadContent(b, off, len, offset);
-
- if (JNI_DRM_FAILURE == len)
- throw new IOException();
- else if (JNI_DRM_EOF == len)
- return -1;
-
- offset += len;
-
- return len;
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#markSupported()
- */
- public boolean markSupported() {
- return false;
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#mark(int)
- */
- public void mark(int readlimit) {
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#reset()
- */
- public void reset() throws IOException {
- throw new IOException();
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#skip()
- */
- public long skip(long n) throws IOException {
- return 0;
- }
-
- /* Non-javadoc
- * @see java.io.InputStream#close()
- */
- public void close() {
- isClosed = true;
- }
- }
-
- /**
- * native method: construct a DRM content according the mime type.
- *
- * @param data input DRM content data to be parsed.
- * @param len the length of the data.
- * @param mimeType the mime type of this DRM content. the value of this field includes:
- * #DRM_MIMETYPE_MESSAGE
- * #DRM_MIMETYPE_CONTENT
- *
- * @return #the id of the DRM content if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeConstructDrmContent(InputStream data, int len, int mimeType);
-
- /**
- * native method: get this DRM content rights issuer.
- *
- * @return the address of rights issuer if in case of separate delivery.
- * null if not separete delivery, or otherwise.
- */
- private native String nativeGetRightsAddress();
-
- /**
- * native method: get this DRM content delivery type.
- *
- * @return the delivery method, the value may be one of the following:
- * #DRM_FORWARD_LOCK
- * #DRM_COMBINED_DELIVERY
- * #DRM_SEPARATE_DELIVERY
- * #DRM_SEPARATE_DELIVERY_DM
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeGetDeliveryMethod();
-
- /**
- * native method: get a piece of media content data.
- *
- * @param buf the buffer to save DRM media content data.
- * @param bufOff the offset of the buffer to start to save data.
- * @param len the number of byte to read.
- * @param mediaOff the offset of the media content data to start to read.
- *
- * @return the length of the media content data has been read.
- * #JNI_DRM_EOF if reach to end of the media content.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeReadContent(byte[] buf, int bufOff, int len, int mediaOff);
-
- /**
- * native method: get this DRM content type.
- *
- * @return the decrypted media content type.
- * null if fail.
- */
- private native String nativeGetContentType();
-
- /**
- * native method: get this DRM decrypted media content length.
- *
- * @return the length of decrypted media content.
- * #JNI_DRM_FAILURE if fail.
- * #JNI_DRM_UNKNOWN_DATA_LEN if the length is unknown currently.
- */
- private native int nativeGetContentLength();
-
- /**
- * The finalizer of the DRMRawContent. Do some cleanup.
- */
- protected native void finalize();
-
-
- /**
- * Load the shared library to link the native methods.
- */
- static {
- try {
- System.loadLibrary("drm1_jni");
- }
- catch (UnsatisfiedLinkError ule) {
- System.err.println("WARNING: Could not load libdrm1_jni.so");
- }
- }
-}
diff --git a/media/java/android/drm/mobile1/DrmRights.java b/media/java/android/drm/mobile1/DrmRights.java
deleted file mode 100644
index bcccb6a..0000000
--- a/media/java/android/drm/mobile1/DrmRights.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2007 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.drm.mobile1;
-
-/**
- * This class provides interfaces to access the DRM rights.
- */
-public class DrmRights {
- /**
- * The DRM permission of play.
- */
- public static final int DRM_PERMISSION_PLAY = 1;
-
- /**
- * The DRM permission of display.
- */
- public static final int DRM_PERMISSION_DISPLAY = 2;
-
- /**
- * The DRM permission of execute.
- */
- public static final int DRM_PERMISSION_EXECUTE = 3;
-
- /**
- * The DRM permission of print.
- */
- public static final int DRM_PERMISSION_PRINT = 4;
-
- /**
- * Successful operation.
- */
- private static final int JNI_DRM_SUCCESS = 0;
-
- /**
- * General failure.
- */
- private static final int JNI_DRM_FAILURE = -1;
-
- /**
- * The uid of this rights object.
- */
- private String roId = "";
-
-
- /**
- * Construct the DrmRights.
- */
- public DrmRights() {
- }
-
- /**
- * Get the constraint of the given permission on this rights object.
- *
- * @param permission the given permission.
- *
- * @return a DrmConstraint instance.
- */
- public DrmConstraintInfo getConstraint(int permission) {
- DrmConstraintInfo c = new DrmConstraintInfo();
-
- /* call native method to get latest constraint information */
- int res = nativeGetConstraintInfo(permission, c);
-
- if (JNI_DRM_FAILURE == res)
- return null;
-
- return c;
- }
-
- /**
- * Consume the rights of the given permission.
- *
- * @param permission the given permission.
- *
- * @return true if consume success.
- * false if consume failure.
- */
- public boolean consumeRights(int permission) {
- /* call native method to consume and update rights */
- int res = nativeConsumeRights(permission);
-
- if (JNI_DRM_FAILURE == res)
- return false;
-
- return true;
- }
-
-
- /**
- * native method: get the constraint information of the given permission.
- *
- * @param permission the given permission.
- * @param constraint the instance of constraint.
- *
- * @return #JNI_DRM_SUCCESS if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeGetConstraintInfo(int permission, DrmConstraintInfo constraint);
-
- /**
- * native method: consume the rights of the given permission.
- *
- * @param permission the given permission.
- *
- * @return #JNI_DRM_SUCCESS if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeConsumeRights(int permission);
-
-
- /**
- * Load the shared library to link the native methods.
- */
- static {
- try {
- System.loadLibrary("drm1_jni");
- }
- catch (UnsatisfiedLinkError ule) {
- System.err.println("WARNING: Could not load libdrm1_jni.so");
- }
- }
-}
diff --git a/media/java/android/drm/mobile1/DrmRightsManager.java b/media/java/android/drm/mobile1/DrmRightsManager.java
deleted file mode 100644
index 1bc36ec..0000000
--- a/media/java/android/drm/mobile1/DrmRightsManager.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2007 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.drm.mobile1;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * This class provides interfaces to access the DRM right manager.
- */
-public class DrmRightsManager {
- /**
- * The "application/vnd.oma.drm.rights+xml" mime type.
- */
- public static final String DRM_MIMETYPE_RIGHTS_XML_STRING = "application/vnd.oma.drm.rights+xml";
-
- /**
- * The "application/vnd.oma.drm.rights+wbxml" mime type.
- */
- public static final String DRM_MIMETYPE_RIGHTS_WBXML_STRING = "application/vnd.oma.drm.rights+wbxml";
-
- /**
- * The id of "application/vnd.oma.drm.rights+xml" mime type.
- */
- private static final int DRM_MIMETYPE_RIGHTS_XML = 3;
-
- /**
- * The id of "application/vnd.oma.drm.rights+wbxml" mime type.
- */
- private static final int DRM_MIMETYPE_RIGHTS_WBXML = 4;
-
- /**
- * The id of "application/vnd.oma.drm.message" mime type.
- */
- private static final int DRM_MIMETYPE_MESSAGE = 1;
-
- /**
- * Successful operation.
- */
- private static final int JNI_DRM_SUCCESS = 0;
-
- /**
- * General failure.
- */
- private static final int JNI_DRM_FAILURE = -1;
-
- /**
- * The instance of the rights manager.
- */
- private static DrmRightsManager singleton = null;
-
-
- /**
- * Construct a DrmRightsManager
- */
- protected DrmRightsManager() {
- }
-
- /**
- * Get the DrmRightsManager instance.
- *
- * @return the instance of DrmRightsManager.
- */
- public static synchronized DrmRightsManager getInstance() {
- if (singleton == null) {
- singleton = new DrmRightsManager();
- }
-
- return singleton;
- }
-
- /**
- * Install one DRM rights and return one instance of DrmRights.
- *
- * @param rightsData raw rights data.
- * @param mimeTypeStr the mime type of the rights object.
- *
- * @return the instance of the installed DrmRights.
- */
- public synchronized DrmRights installRights(InputStream rightsData, int len, String mimeTypeStr) throws DrmException, IOException {
- int mimeType = 0;
-
- if (DRM_MIMETYPE_RIGHTS_XML_STRING.equals(mimeTypeStr))
- mimeType = DRM_MIMETYPE_RIGHTS_XML;
- else if (DRM_MIMETYPE_RIGHTS_WBXML_STRING.equals(mimeTypeStr))
- mimeType = DRM_MIMETYPE_RIGHTS_WBXML;
- else if (DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING.equals(mimeTypeStr))
- mimeType = DRM_MIMETYPE_MESSAGE;
- else
- throw new IllegalArgumentException("mimeType must be DRM_MIMETYPE_RIGHTS_XML or DRM_MIMETYPE_RIGHTS_WBXML or DRM_MIMETYPE_MESSAGE");
-
- if (len <= 0)
- return null;
-
- DrmRights rights = new DrmRights();
-
- /* call native method to install this rights object. */
- int res = nativeInstallDrmRights(rightsData, len, mimeType, rights);
-
- if (JNI_DRM_FAILURE == res)
- throw new DrmException("nativeInstallDrmRights() returned JNI_DRM_FAILURE");
-
- return rights;
- }
-
- /**
- * Query DRM rights of specified DRM raw content.
- *
- * @param content raw content object.
- *
- * @return the instance of DrmRights, or null if there is no rights.
- */
- public synchronized DrmRights queryRights(DrmRawContent content) {
- DrmRights rights = new DrmRights();
-
- /* call native method to query the rights */
- int res = nativeQueryRights(content, rights);
-
- if (JNI_DRM_FAILURE == res)
- return null;
-
- return rights;
- }
-
- /**
- * Get the list of all DRM rights saved in local client.
- *
- * @return the list of all the rights object.
- */
- public synchronized List getRightsList() {
- List rightsList = new ArrayList();
-
- /* call native method to get how many rights object in current agent */
- int num = nativeGetNumOfRights();
-
- if (JNI_DRM_FAILURE == num)
- return null;
-
- if (num > 0) {
- DrmRights[] rightsArray = new DrmRights[num];
- int i;
-
- for (i = 0; i < num; i++)
- rightsArray[i] = new DrmRights();
-
- /* call native method to get all the rights information */
- num = nativeGetRightsList(rightsArray, num);
-
- if (JNI_DRM_FAILURE == num)
- return null;
-
- /* add all rights informations to ArrayList */
- for (i = 0; i < num; i++)
- rightsList.add(rightsArray[i]);
- }
-
- return rightsList;
- }
-
- /**
- * Delete the specified DRM rights object.
- *
- * @param rights the specified rights object to be deleted.
- */
- public synchronized void deleteRights(DrmRights rights) {
- /* call native method to delete the specified rights object */
- int res = nativeDeleteRights(rights);
-
- if (JNI_DRM_FAILURE == res)
- return;
- }
-
-
- /**
- * native method: install rights object to local client.
- *
- * @param data input DRM rights object data to be installed.
- * @param len the length of the data.
- * @param mimeType the mime type of this DRM rights object. the value of this field includes:
- * #DRM_MIMETYPE_RIGHTS_XML
- * #DRM_MIMETYPE_RIGHTS_WBXML
- * @parma rights the instance of DRMRights to be filled.
- *
- * @return #JNI_DRM_SUCCESS if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeInstallDrmRights(InputStream data, int len, int mimeType, DrmRights rights);
-
- /**
- * native method: query the given DRM content's rights object.
- *
- * @param content the given DRM content.
- * @param rights the instance of rights to set if have.
- *
- * @return #JNI_DRM_SUCCESS if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeQueryRights(DrmRawContent content, DrmRights rights);
-
- /**
- * native method: get how many rights object in current DRM agent.
- *
- * @return the number of the rights object.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeGetNumOfRights();
-
- /**
- * native method: get all the rights object in current local agent.
- *
- * @param rights the array instance of rights object.
- * @param numRights how many rights can be saved.
- *
- * @return the number of the rights object has been gotten.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeGetRightsList(DrmRights[] rights, int numRights);
-
- /**
- * native method: delete a specified rights object.
- *
- * @param rights the specified rights object to be deleted.
- *
- * @return #JNI_DRM_SUCCESS if succeed.
- * #JNI_DRM_FAILURE if fail.
- */
- private native int nativeDeleteRights(DrmRights rights);
-
-
- /**
- * Load the shared library to link the native methods.
- */
- static {
- try {
- System.loadLibrary("drm1_jni");
- }
- catch (UnsatisfiedLinkError ule) {
- System.err.println("WARNING: Could not load libdrm1_jni.so");
- }
- }
-}
diff --git a/media/java/android/drm/mobile1/package.html b/media/java/android/drm/mobile1/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/media/java/android/drm/mobile1/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
- {@hide}
-</body>
-</html>
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index ebbfad9..c335e55 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -24,7 +24,6 @@
import android.net.Uri;
import android.os.Binder;
import android.os.RemoteException;
-import android.provider.DrmStore;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
@@ -50,12 +49,6 @@
MediaStore.Audio.Media.TITLE
};
- private static final String[] DRM_COLUMNS = new String[] {
- DrmStore.Audio._ID,
- DrmStore.Audio.DATA,
- DrmStore.Audio.TITLE
- };
-
private final Context mContext;
private final AudioManager mAudioManager;
private final boolean mAllowRemote;
@@ -101,8 +94,8 @@
}
/**
- * Returns a human-presentable title for ringtone. Looks in media and DRM
- * content providers. If not in either, uses the filename
+ * Returns a human-presentable title for ringtone. Looks in media
+ * content provider. If not in either, uses the filename
*
* @param context A context used for querying.
*/
@@ -131,9 +124,7 @@
}
} else {
try {
- if (DrmStore.AUTHORITY.equals(authority)) {
- cursor = res.query(uri, DRM_COLUMNS, null, null, null);
- } else if (MediaStore.AUTHORITY.equals(authority)) {
+ if (MediaStore.AUTHORITY.equals(authority)) {
cursor = res.query(uri, MEDIA_COLUMNS, null, null, null);
}
} catch (SecurityException e) {
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index 5e18bfa..8e4004b 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -27,7 +27,6 @@
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
-import android.provider.DrmStore;
import android.provider.MediaStore;
import android.provider.Settings;
import android.provider.Settings.System;
@@ -85,7 +84,6 @@
* {@link #EXTRA_RINGTONE_SHOW_DEFAULT},
* {@link #EXTRA_RINGTONE_SHOW_SILENT}, {@link #EXTRA_RINGTONE_TYPE},
* {@link #EXTRA_RINGTONE_DEFAULT_URI}, {@link #EXTRA_RINGTONE_TITLE},
- * {@link #EXTRA_RINGTONE_INCLUDE_DRM}.
* <p>
* Output: {@link #EXTRA_RINGTONE_PICKED_URI}.
*/
@@ -113,7 +111,9 @@
/**
* Given to the ringtone picker as a boolean. Whether to include DRM ringtones.
+ * @deprecated DRM ringtones are no longer supported
*/
+ @Deprecated
public static final String EXTRA_RINGTONE_INCLUDE_DRM =
"android.intent.extra.ringtone.INCLUDE_DRM";
@@ -183,12 +183,6 @@
MediaStore.Audio.Media.TITLE_KEY
};
- private static final String[] DRM_COLUMNS = new String[] {
- DrmStore.Audio._ID, DrmStore.Audio.TITLE,
- "\"" + DrmStore.Audio.CONTENT_URI + "\"",
- DrmStore.Audio.TITLE + " AS " + MediaStore.Audio.Media.TITLE_KEY
- };
-
private static final String[] MEDIA_COLUMNS = new String[] {
MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
"\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "\"",
@@ -228,8 +222,6 @@
private boolean mStopPreviousRingtone = true;
private Ringtone mPreviousRingtone;
-
- private boolean mIncludeDrm;
/**
* Constructs a RingtoneManager. This constructor is recommended as its
@@ -328,18 +320,26 @@
*
* @return Whether DRM ringtones will be included.
* @see #setIncludeDrm(boolean)
+ * Obsolete - always returns false
+ * @deprecated DRM ringtones are no longer supported
*/
+ @Deprecated
public boolean getIncludeDrm() {
- return mIncludeDrm;
+ return false;
}
/**
* Sets whether to include DRM ringtones.
*
* @param includeDrm Whether to include DRM ringtones.
+ * Obsolete - no longer has any effect
+ * @deprecated DRM ringtones are no longer supported
*/
+ @Deprecated
public void setIncludeDrm(boolean includeDrm) {
- mIncludeDrm = includeDrm;
+ if (includeDrm) {
+ Log.w(TAG, "setIncludeDrm no longer supported");
+ }
}
/**
@@ -363,10 +363,9 @@
}
final Cursor internalCursor = getInternalRingtones();
- final Cursor drmCursor = mIncludeDrm ? getDrmRingtones() : null;
final Cursor mediaCursor = getMediaRingtones();
- return mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor, mediaCursor },
+ return mCursor = new SortCursor(new Cursor[] { internalCursor, mediaCursor },
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}
@@ -462,10 +461,6 @@
uri = getValidRingtoneUriFromCursorAndClose(context, rm.getMediaRingtones());
}
- if (uri == null) {
- uri = getValidRingtoneUriFromCursorAndClose(context, rm.getDrmRingtones());
- }
-
return uri;
}
@@ -487,16 +482,9 @@
private Cursor getInternalRingtones() {
return query(
MediaStore.Audio.Media.INTERNAL_CONTENT_URI, INTERNAL_COLUMNS,
- constructBooleanTrueWhereClause(mFilterColumns, mIncludeDrm),
+ constructBooleanTrueWhereClause(mFilterColumns),
null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}
-
- private Cursor getDrmRingtones() {
- // DRM store does not have any columns to use for filtering
- return query(
- DrmStore.Audio.CONTENT_URI, DRM_COLUMNS,
- null, null, DrmStore.Audio.TITLE);
- }
private Cursor getMediaRingtones() {
// Get the external media cursor. First check to see if it is mounted.
@@ -506,7 +494,7 @@
status.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
? query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MEDIA_COLUMNS,
- constructBooleanTrueWhereClause(mFilterColumns, mIncludeDrm), null,
+ constructBooleanTrueWhereClause(mFilterColumns), null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER)
: null;
}
@@ -536,7 +524,7 @@
* @param columns The columns that must be true.
* @return The where clause.
*/
- private static String constructBooleanTrueWhereClause(List<String> columns, boolean includeDrm) {
+ private static String constructBooleanTrueWhereClause(List<String> columns) {
if (columns == null) return null;
@@ -554,15 +542,6 @@
sb.append(")");
- if (!includeDrm) {
- // If not DRM files should be shown, the where clause
- // will be something like "(is_notification=1) and is_drm=0"
- sb.append(" and ");
- sb.append(MediaStore.MediaColumns.IS_DRM);
- sb.append("=0");
- }
-
-
return sb.toString();
}
diff --git a/media/libdrm/Android.mk b/media/libdrm/Android.mk
deleted file mode 100644
index 5053e7d..0000000
--- a/media/libdrm/Android.mk
+++ /dev/null
@@ -1 +0,0 @@
-include $(call all-subdir-makefiles)
diff --git a/media/libdrm/MODULE_LICENSE_APACHE2 b/media/libdrm/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/media/libdrm/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/media/libdrm/NOTICE b/media/libdrm/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/media/libdrm/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-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.
-
- 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.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/media/libdrm/mobile1/Android.mk b/media/libdrm/mobile1/Android.mk
deleted file mode 100644
index 7356f46..0000000
--- a/media/libdrm/mobile1/Android.mk
+++ /dev/null
@@ -1,83 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-# ---------------------------------------
-# First project
-#
-# Build DRM1 core library
-#
-# Output: libdrm1.so
-# ---------------------------------------
-include $(CLEAR_VARS)
-
-ifeq ($(TARGET_ARCH), arm)
-LOCAL_DRM_CFLAG = -DDRM_DEVICE_ARCH_ARM
-endif
-
-ifeq ($(TARGET_ARCH), x86)
-LOCAL_DRM_CFLAG = -DDRM_DEVICE_ARCH_X86
-endif
-
-# DRM 1.0 core source files
-LOCAL_SRC_FILES := \
- src/objmng/drm_decoder.c \
- src/objmng/drm_file.c \
- src/objmng/drm_i18n.c \
- src/objmng/drm_time.c \
- src/objmng/drm_api.c \
- src/objmng/drm_rights_manager.c \
- src/parser/parser_dcf.c \
- src/parser/parser_dm.c \
- src/parser/parser_rel.c \
- src/xml/xml_tinyparser.c
-
-# Header files path
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/include/objmng \
- $(LOCAL_PATH)/include/parser \
- $(LOCAL_PATH)/include/xml \
- external/openssl/include \
- $(call include-path-for, system-core)/cutils
-
-LOCAL_CFLAGS := $(LOCAL_DRM_CFLAG)
-
-LOCAL_SHARED_LIBRARIES := \
- libutils \
- libcutils \
- liblog \
- libcrypto
-
-LOCAL_MODULE := libdrm1
-
-include $(BUILD_SHARED_LIBRARY)
-
-# ---------------------------------------
-# Second project
-#
-# Build DRM1 Java Native Interface(JNI) library
-#
-# Output: libdrm1_jni.so
-# ------------------------------------------------
-include $(CLEAR_VARS)
-
-# Source files of DRM1 Java Native Interfaces
-LOCAL_SRC_FILES := \
- src/jni/drm1_jni.c
-
-# Header files path
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/include/parser \
- $(JNI_H_INCLUDE) \
- $(call include-path-for, system-core)/cutils
-
-
-LOCAL_SHARED_LIBRARIES := libdrm1 \
- libnativehelper \
- libutils \
- libcutils \
- liblog
-
-LOCAL_MODULE := libdrm1_jni
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libdrm/mobile1/include/drm_common_types.h b/media/libdrm/mobile1/include/drm_common_types.h
deleted file mode 100644
index c6bea61..0000000
--- a/media/libdrm/mobile1/include/drm_common_types.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __COMMON_TYPES_H__
-#define __COMMON_TYPES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#define Trace(...)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __COMMON_TYPES_H__ */
diff --git a/media/libdrm/mobile1/include/jni/drm1_jni.h b/media/libdrm/mobile1/include/jni/drm1_jni.h
deleted file mode 100644
index 64e78ad..0000000
--- a/media/libdrm/mobile1/include/jni/drm1_jni.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __DRM1_JNI_H__
-#define __DRM1_JNI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class android_drm_mobile1_DrmRawContent */
-
-#undef android_drm_mobile1_DrmRawContent_DRM_FORWARD_LOCK
-#define android_drm_mobile1_DrmRawContent_DRM_FORWARD_LOCK 1L
-#undef android_drm_mobile1_DrmRawContent_DRM_COMBINED_DELIVERY
-#define android_drm_mobile1_DrmRawContent_DRM_COMBINED_DELIVERY 2L
-#undef android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY
-#define android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY 3L
-#undef android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY_DM
-#define android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY_DM 4L
-#undef android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_MESSAGE
-#define android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_MESSAGE 1L
-#undef android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_CONTENT
-#define android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_CONTENT 2L
-#undef android_drm_mobile1_DrmRawContent_JNI_DRM_SUCCESS
-#define android_drm_mobile1_DrmRawContent_JNI_DRM_SUCCESS 0L
-#undef android_drm_mobile1_DrmRawContent_JNI_DRM_FAILURE
-#define android_drm_mobile1_DrmRawContent_JNI_DRM_FAILURE -1L
-#undef android_drm_mobile1_DrmRawContent_JNI_DRM_EOF
-#define android_drm_mobile1_DrmRawContent_JNI_DRM_EOF -2L
-#undef android_drm_mobile1_DrmRawContent_JNI_DRM_UNKNOWN_DATA_LEN
-#define android_drm_mobile1_DrmRawContent_JNI_DRM_UNKNOWN_DATA_LEN -3L
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeConstructDrmContent
- * Signature: (Ljava/io/InputStream;II)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRawContent_nativeConstructDrmContent
- (JNIEnv *, jobject, jobject, jint, jint);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeGetRightsAddress
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_android_drm_mobile1_DrmRawContent_nativeGetRightsAddress
- (JNIEnv *, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeGetDeliveryMethod
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRawContent_nativeGetDeliveryMethod
- (JNIEnv *, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeReadPieceOfContent
- * Signature: ([BIII)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRawContent_nativeReadContent
- (JNIEnv *, jobject, jbyteArray, jint, jint, jint);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeGetContentType
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_android_drm_mobile1_DrmRawContent_nativeGetContentType
- (JNIEnv *, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: nativeGetContentLength
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRawContent_nativeGetContentLength
- (JNIEnv *, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRawContent
- * Method: finalize
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_android_drm_mobile1_DrmRawContent_finalize
- (JNIEnv *, jobject);
-
-/* Header for class android_drm_mobile1_DrmRights */
-
-#undef android_drm_mobile1_DrmRights_DRM_PERMISSION_PLAY
-#define android_drm_mobile1_DrmRights_DRM_PERMISSION_PLAY 1L
-#undef android_drm_mobile1_DrmRights_DRM_PERMISSION_DISPLAY
-#define android_drm_mobile1_DrmRights_DRM_PERMISSION_DISPLAY 2L
-#undef android_drm_mobile1_DrmRights_DRM_PERMISSION_EXECUTE
-#define android_drm_mobile1_DrmRights_DRM_PERMISSION_EXECUTE 3L
-#undef android_drm_mobile1_DrmRights_DRM_PERMISSION_PRINT
-#define android_drm_mobile1_DrmRights_DRM_PERMISSION_PRINT 4L
-#undef android_drm_mobile1_DrmRights_DRM_CONSUME_RIGHTS_SUCCESS
-#define android_drm_mobile1_DrmRights_DRM_CONSUME_RIGHTS_SUCCESS 0L
-#undef android_drm_mobile1_DrmRights_DRM_CONSUME_RIGHTS_FAILURE
-#define android_drm_mobile1_DrmRights_DRM_CONSUME_RIGHTS_FAILURE -1L
-#undef android_drm_mobile1_DrmRights_JNI_DRM_SUCCESS
-#define android_drm_mobile1_DrmRights_JNI_DRM_SUCCESS 0L
-#undef android_drm_mobile1_DrmRights_JNI_DRM_FAILURE
-#define android_drm_mobile1_DrmRights_JNI_DRM_FAILURE -1L
-/*
- * Class: android_drm_mobile1_DrmRights
- * Method: nativeGetConstraintInfo
- * Signature: (ILandroid/drm/mobile1/DrmConstraintInfo;)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRights_nativeGetConstraintInfo
- (JNIEnv *, jobject, jint, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRights
- * Method: nativeConsumeRights
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRights_nativeConsumeRights
- (JNIEnv *, jobject, jint);
-
-/* Header for class android_drm_mobile1_DrmRightsManager */
-
-#undef android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_XML
-#define android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_XML 3L
-#undef android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_WBXML
-#define android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_WBXML 4L
-#undef android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_MESSAGE
-#define android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_MESSAGE 1L
-#undef android_drm_mobile1_DrmRightsManager_JNI_DRM_SUCCESS
-#define android_drm_mobile1_DrmRightsManager_JNI_DRM_SUCCESS 0L
-#undef android_drm_mobile1_DrmRightsManager_JNI_DRM_FAILURE
-#define android_drm_mobile1_DrmRightsManager_JNI_DRM_FAILURE -1L
-/* Inaccessible static: singleton */
-/*
- * Class: android_drm_mobile1_DrmRightsManager
- * Method: nativeInstallDrmRights
- * Signature: (Ljava/io/InputStream;IILandroid/drm/mobile1/DrmRights;)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRightsManager_nativeInstallDrmRights
- (JNIEnv *, jobject, jobject, jint, jint, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRightsManager
- * Method: nativeQueryRights
- * Signature: (Landroid/drm/mobile1/DrmRawContent;Landroid/drm/mobile1/DrmRights;)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRightsManager_nativeQueryRights
- (JNIEnv *, jobject, jobject, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRightsManager
- * Method: nativeGetRightsNumber
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRightsManager_nativeGetNumOfRights
- (JNIEnv *, jobject);
-
-/*
- * Class: android_drm_mobile1_DrmRightsManager
- * Method: nativeGetRightsList
- * Signature: ([Landroid/drm/mobile1/DrmRights;I)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRightsManager_nativeGetRightsList
- (JNIEnv *, jobject, jobjectArray, jint);
-
-/*
- * Class: android_drm_mobile1_DrmRightsManager
- * Method: nativeDeleteRights
- * Signature: (Landroid/drm/mobile1/DrmRights;)I
- */
-JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRightsManager_nativeDeleteRights
- (JNIEnv *, jobject, jobject);
-
-/**
- * DRM return value defines
- */
-#define JNI_DRM_SUCCESS \
- android_drm_mobile1_DrmRawContent_JNI_DRM_SUCCESS /**< Successful operation */
-#define JNI_DRM_FAILURE \
- android_drm_mobile1_DrmRawContent_JNI_DRM_FAILURE /**< General failure */
-#define JNI_DRM_EOF \
- android_drm_mobile1_DrmRawContent_JNI_DRM_EOF /**< Indicates the end of the DRM content is reached */
-#define JNI_DRM_UNKNOWN_DATA_LEN \
- android_drm_mobile1_DrmRawContent_JNI_DRM_UNKNOWN_DATA_LEN /**< Indicates the data length is unknown */
-
-/**
- * DRM MIME type defines
- */
-#define JNI_DRM_MIMETYPE_MESSAGE \
- android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_MESSAGE /**< The "application/vnd.oma.drm.message" MIME type */
-#define JNI_DRM_MIMETYPE_CONTENT \
- android_drm_mobile1_DrmRawContent_DRM_MIMETYPE_CONTENT /**< The "application/vnd.oma.drm.content" MIME type */
-#define JNI_DRM_MIMETYPE_RIGHTS_XML \
- android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_XML /**< The "application/vnd.oma.drm.rights+xml" MIME type */
-#define JNI_DRM_MIMETYPE_RIGHTS_WBXML \
- android_drm_mobile1_DrmRightsManager_DRM_MIMETYPE_RIGHTS_WBXML /**< The "application/vnd.oma.drm.rights+wbxml" MIME type */
-
-/**
- * DRM permission defines
- */
-#define JNI_DRM_PERMISSION_PLAY \
- android_drm_mobile1_DrmRights_DRM_PERMISSION_PLAY /**< The permission to play */
-#define JNI_DRM_PERMISSION_DISPLAY \
- android_drm_mobile1_DrmRights_DRM_PERMISSION_DISPLAY /**< The permission to display */
-#define JNI_DRM_PERMISSION_EXECUTE \
- android_drm_mobile1_DrmRights_DRM_PERMISSION_EXECUTE /**< The permission to execute */
-#define JNI_DRM_PERMISSION_PRINT \
- android_drm_mobile1_DrmRights_DRM_PERMISSION_PRINT /**< The permission to print */
-
-/**
- * DRM delivery type defines
- */
-#define JNI_DRM_FORWARD_LOCK \
- android_drm_mobile1_DrmRawContent_DRM_FORWARD_LOCK /**< forward lock */
-#define JNI_DRM_COMBINED_DELIVERY \
- android_drm_mobile1_DrmRawContent_DRM_COMBINED_DELIVERY /**< combined delivery */
-#define JNI_DRM_SEPARATE_DELIVERY \
- android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY /**< separate delivery */
-#define JNI_DRM_SEPARATE_DELIVERY_DM \
- android_drm_mobile1_DrmRawContent_DRM_SEPARATE_DELIVERY_DM /**< separate delivery DRM message */
-#ifdef __cplusplus
-}
-#endif
-#endif /* __DRM1_JNI_H__ */
-
diff --git a/media/libdrm/mobile1/include/objmng/drm_decoder.h b/media/libdrm/mobile1/include/objmng/drm_decoder.h
deleted file mode 100644
index a769c81..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_decoder.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-/**
- * @file drm_decoder.h
- *
- * provide service to decode base64 data.
- *
- * <!-- #interface list begin -->
- * \section drm decoder interface
- * - drm_decodeBase64()
- * <!-- #interface list end -->
- */
-
-#ifndef __DRM_DECODER_H__
-#define __DRM_DECODER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-/**
- * Decode base64
- * \param dest dest buffer to save decode base64 data
- * \param destLen dest buffer length
- * \param src source data to be decoded
- * \param srcLen source buffer length, and when return, give out how many bytes has been decoded
- * \return
- * -when success, return a positive integer of dest buffer length,
- * if input dest buffer is NULL or destLen is 0,
- * return dest buffer length that user should allocate to save decoding data
- * -when failed, return -1
- */
-int32_t drm_decodeBase64(uint8_t * dest, int32_t destLen, uint8_t * src, int32_t * srcLen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRM_DECODER_H__ */
diff --git a/media/libdrm/mobile1/include/objmng/drm_file.h b/media/libdrm/mobile1/include/objmng/drm_file.h
deleted file mode 100644
index b94ddd0..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_file.h
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-
-/**
- * File Porting Layer.
- */
-#ifndef __DRM_FILE_H__
-#define __DRM_FILE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-/** Type value of a regular file or file name. */
-#define DRM_FILE_ISREG 1
-/** Type value of a directory or directory name. */
-#define DRM_FILE_ISDIR 2
-/** Type value of a filter name */
-#define DRM_FILE_ISFILTER 3
-
-
-/** Return code that indicates successful completion of an operation. */
-#define DRM_FILE_SUCCESS 0
-/** Indicates that an operation failed. */
-#define DRM_FILE_FAILURE -1
-/** Indicates that the a DRM_file_read() call reached the end of the file. */
-#define DRM_FILE_EOF -2
-
-
-/** Open for read access. */
-#define DRM_FILE_MODE_READ 1
-/** Open for write access. */
-#define DRM_FILE_MODE_WRITE 2
-
-
-#ifndef MAX_FILENAME_LEN
-/** Maximum number of characters that a filename may have. By default assumes
- * that the entry results of DRM_file_listNextEntry() are returned in the async state
- * buffer, after the #DRM_file_result_s, and calculates the maximum name
- * from that.
- */
-#define MAX_FILENAME_LEN 1024
-#endif
-
-
-/**
- * Performs one-time initialization of the File System (FS).
- * This function is called once during the lifetime of an application,
- * and before any call to <code>DRM_file_*</code> functions by this application.
- * When several applications are using the file interface, this function may be called
- * several times, once per application.
- *
- * @return #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_startup(void);
-
-/**
- * Returns the length of a file (by name, opened or unopened).
- *
- * @param name Name of the file, UCS-2 encoded.
- * @param nameChars Number characters encoded in name.
- * asynchronous operation returns #DRM_FILE_WOULDBLOCK.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the file length.
- */
-int32_t DRM_file_getFileLength(const uint16_t* name,
- int32_t nameChars);
-
-/**
- * Initializes a list iteration session.
- *
- * @param prefix Prefix that must be matched, UCS-2 encoded. *
- * @param prefixChars Number characters encoded in prefix.
- * @param session List session identifier.
- * @param iteration List iteration identifier.
- *
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_listOpen(const uint16_t* prefix,
- int32_t prefixChars,
- int32_t* session,
- int32_t* iteration);
-
-/**
- * Used to fetch a list of file names that match a given name prefix.
- *
- * @param prefix See DRM_file_listOpen(). This does not change during the
- * iteration session.
- * @param prefixChars See DRM_file_listOpen(). This does not change during
- * the iteration session.
- * @param entry Buffer parameter to return the next file name that matches the
- * #prefix parameter, if any, when the function returns a positive number of
- * characters.
- * @param entryBytes Size of entry in bytes.
- * @param session See DRM_file_listOpen().
- * @param iteration See DRM_file_listOpen().
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the number of
- * characters encoded in entry. Returns 0 when the end of the list is reached.
- */
-int32_t DRM_file_listNextEntry(const uint16_t* prefix,
- int32_t prefixChars,
- uint16_t* entry,
- int32_t entryBytes,
- int32_t* session,
- int32_t* iteration);
-
-/**
- * Ends a list iteration session. Notifies the implementation
- * that the list session is over and that any session resources
- * can be released.
- *
- * @param session See DRM_file_listOpen().
- * @param iteration See DRM_file_listOpen().
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_listClose(int32_t session, int32_t iteration);
-
-/**
- * Renames a file, given its old name. The file or directory is renamed
- * immediately on the actual file system upon invocation of this method.
- * Any open handles on the file specified by oldName become invalid after
- * this method has been called.
- *
- * @param oldName Current file name (unopened), UCS-2 encoded.
- * @param oldNameChars Number of characters encoded on oldName.
- * @param newName New name for the file (unopened), UCS-2 encoded.
- * @param newNameChars Number of characters encoded on newName.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE. In particular,
- * #DRM_FILE_FAILURE if a file or directory already exists with the new name.
- */
-int32_t DRM_file_rename(const uint16_t* oldName,
- int32_t oldNameChars,
- const uint16_t* newName,
- int32_t newNameChars);
-
-/**
- * Tests if a file exists given its name.
- *
- * @param name Name of the file, UCS-2 encoded.
- * @param nameChars Number of characters encoded in name.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_ISREG, #DRM_FILE_ISDIR, #DRM_FILE_FAILURE. If name
- * exists, returns #DRM_FILE_ISREG if it is a regular file and #DRM_FILE_ISDIR if it is a directory.
- * Returns #DRM_FILE_FAILURE in all other cases, including those where name exists but is neither
- * a regular file nor a directory. Platforms that do not support directories MUST NOT return
- * #DRM_FILE_ISDIR.
- */
-int32_t DRM_file_exists(const uint16_t* name,
- int32_t nameChars);
-
-/**
- * Opens a file with the given name and returns its file handle.
- *
- * @param name Name of the file, UCS-2 encoded.
- * @param nameChars Number of characters encoded in name.
- * @param mode Any combination of the #DRM_FILE_MODE_READ and
- * #DRM_FILE_MODE_WRITE flags. If the file does not exist and mode contains the
- * #DRM_FILE_MODE_WRITE flag, then the file is automatically created. If the
- * file exists and the mode contains the #DRM_FILE_MODE_WRITE flag, the file is
- * opened so it can be modified, but the data is not modified by the open call.
- * In all cases the current position is set to the start of the file.
- * The following table shows how to map the mode semantics above to UNIX
- * fopen-style modes. For brevity in the table, R=#DRM_FILE_MODE_READ,
- * W=#DRM_FILE_MODE_WRITE, E=File exists:
- * <table>
- * <tr><td>RW</td><td>E</td><td>Maps-to</td></tr>
- * <tr><td>00</td><td>0</td><td>Return #DRM_FILE_FAILURE</td></tr>
- * <tr><td>00</td><td>1</td><td>Return #DRM_FILE_FAILURE</td></tr>
- * <tr><td>01</td><td>0</td><td>Use fopen mode "w"</td></tr>
- * <tr><td>01</td><td>1</td><td>Use fopen mode "a" and fseek to the start</td></tr>
- * <tr><td>10</td><td>0</td><td>Return #DRM_FILE_FAILURE</td></tr>
- * <tr><td>10</td><td>1</td><td>Use fopen mode "r"</td></tr>
- * <tr><td>11</td><td>0</td><td>Use fopen mode "w+"</td></tr>
- * <tr><td>11</td><td>1</td><td>Use fopen mode "r+"</td></tr>
- * </table>
- * @param handle Pointer where the result handle value is placed when the function
- * is called synchronously.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_open(const uint16_t* name,
- int32_t nameChars,
- int32_t mode,
- int32_t* handle);
-
-/**
- * Deletes a file given its name, UCS-2 encoded. The file or directory is
- * deleted immediately on the actual file system upon invocation of this
- * method. Any open handles on the file specified by name become invalid
- * after this method has been called.
- *
- * If the port needs to ensure that a specific application does not exceed a given storage
- * space quota, then the bytes freed by the deletion must be added to the available space for
- * that application.
- *
- * @param name Name of the file, UCS-2 encoded.
- * @param nameChars Number of characters encoded in name.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_delete(const uint16_t* name,
- int32_t nameChars);
-
-/**
- * Read bytes from a file at the current position to a buffer. Afterwards the
- * new file position is the byte after the last byte read.
- * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
- * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
- *
- * @param handle File handle as returned by DRM_file_open().
- * @param dst Buffer where the data is to be copied.
- * @param length Number of bytes to be copied.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE, #DRM_FILE_EOF
- * or the number of bytes that were read, i.e. in the range 0..length.
- */
-int32_t DRM_file_read(int32_t handle,
- uint8_t* dst,
- int32_t length);
-
-/**
- * Write bytes from a buffer to the file at the current position. If the
- * current position + number of bytes written > current size of the file,
- * then the file is grown. Afterwards the new file position is the byte
- * after the last byte written.
- * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
- * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
- *
- * @param handle File handle as returned by DRM_file_open().
- * @param src Buffer that contains the bytes to be written.
- * @param length Number of bytes to be written.
- * If the port needs to ensure that a specific application does not exceed a given storage
- * space quota, the implementation must make sure the call does not violate that invariant.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the number of bytes
- * that were written. This number must be in the range 0..length.
- * Returns #DRM_FILE_FAILURE when storage is full or exceeds quota.
- */
-int32_t DRM_file_write(int32_t handle,
- const uint8_t* src,
- int32_t length);
-
-/**
- * Closes a file.
- * DRM_FILE_SUCCESS is returned if the handle is invalid (e.g., as a
- * consquence of DRM_file_delete or DRM_file_rename).
- *
- * @param handle File handle as returned by DRM_file_open().
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_close(int32_t handle);
-
-/**
- * Sets the current position in an opened file.
- * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
- * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
- *
- * @param handle File handle as returned by DRM_file_open().
- * @param value The new current position of the file. If value is greater
- * than the length of the file then the file should be extended. The contents
- * of the newly extended portion of the file is undefined.
- * If the port needs to ensure that a specific application does not exceed a given storage
- * space quota, the implementation must make sure the call does not violate that invariant.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- * Returns #DRM_FILE_FAILURE when storage is full or exceeds quota.
- */
-int32_t DRM_file_setPosition(int32_t handle, int32_t value);
-
-/**
- * Creates a directory with the assigned name and full file permissions on
- * the file system. The full path to the new directory must already exist.
- * The directory is created immediately on the actual file system upon
- * invocation of this method.
- *
- * @param name Name of the directory, UCS-2 encoded.
- * @param nameChars Number of characters encoded in name.
- * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
- */
-int32_t DRM_file_mkdir(const uint16_t* name,
- int32_t nameChars);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRM_FILE_H__ */
diff --git a/media/libdrm/mobile1/include/objmng/drm_i18n.h b/media/libdrm/mobile1/include/objmng/drm_i18n.h
deleted file mode 100644
index 7487e9b..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_i18n.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-
-#ifndef __DRM_I18N_H__
-#define __DRM_I18N_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-/**
- * @name Charset value defines
- * @ingroup i18n
- *
- * Charset value defines
- * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp
- */
-typedef enum {
- DRM_CHARSET_GBK = 936, /** Simplified Chinese GBK (CP936) */
- DRM_CHARSET_GB2312 = 20936, /** Simplified Chinese GB2312 (CP936) */
- DRM_CHARSET_BIG5 = 950, /** BIG5 (CP950) */
- DRM_CHARSET_LATIN1 = 28591, /** ISO 8859-1, Latin 1 */
- DRM_CHARSET_LATIN2 = 28592, /** ISO 8859-2, Latin 2 */
- DRM_CHARSET_LATIN3 = 28593, /** ISO 8859-3, Latin 3 */
- DRM_CHARSET_LATIN4 = 28594, /** ISO 8859-4, Latin 4 */
- DRM_CHARSET_CYRILLIC = 28595, /** ISO 8859-5, Cyrillic */
- DRM_CHARSET_ARABIC = 28596, /** ISO 8859-6, Arabic */
- DRM_CHARSET_GREEK = 28597, /** ISO 8859-7, Greek */
- DRM_CHARSET_HEBREW = 28598, /** ISO 8859-8, Hebrew */
- DRM_CHARSET_LATIN5 = 28599, /** ISO 8859-9, Latin 5 */
- DRM_CHARSET_LATIN6 = 865, /** ISO 8859-10, Latin 6 (not sure here) */
- DRM_CHARSET_THAI = 874, /** ISO 8859-11, Thai */
- DRM_CHARSET_LATIN7 = 1257, /** ISO 8859-13, Latin 7 (not sure here) */
- DRM_CHARSET_LATIN8 = 38598, /** ISO 8859-14, Latin 8 (not sure here) */
- DRM_CHARSET_LATIN9 = 28605, /** ISO 8859-15, Latin 9 */
- DRM_CHARSET_LATIN10 = 28606, /** ISO 8859-16, Latin 10 */
- DRM_CHARSET_UTF8 = 65001, /** UTF-8 */
- DRM_CHARSET_UTF16LE = 1200, /** UTF-16 LE */
- DRM_CHARSET_UTF16BE = 1201, /** UTF-16 BE */
- DRM_CHARSET_HINDI = 57002, /** Hindi/Mac Devanagari */
- DRM_CHARSET_UNSUPPORTED = -1
-} DRM_Charset_t;
-
-/**
- * Convert multibyte string of specified charset to unicode string.
- * Note NO terminating '\0' will be appended to the output unicode string.
- *
- * @param charset Charset of the multibyte string.
- * @param mbs Multibyte string to be converted.
- * @param mbsLen Number of the bytes (in mbs) to be converted.
- * @param wcsBuf Buffer for the converted unicode characters.
- * If wcsBuf is NULL, the function returns the number of unicode
- * characters required for the buffer.
- * @param bufSizeInWideChar The size (in wide char) of wcsBuf
- * @param bytesConsumed The number of bytes in mbs that have been successfully
- * converted. The value of *bytesConsumed is undefined
- * if wcsBuf is NULL.
- *
- * @return Number of the successfully converted unicode characters if wcsBuf
- * is not NULL. If wcsBuf is NULL, returns required unicode buffer
- * size. -1 for unrecoverable errors.
- */
-int32_t DRM_i18n_mbsToWcs(DRM_Charset_t charset,
- const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed);
-
-/**
- * Convert unicode string to multibyte string with specified charset.
- * Note NO terminating '\0' will be appended to the output multibyte string.
- *
- * @param charset Charset of the multibyte string to be converted to.
- * @param wcs Unicode string to be converted.
- * @param wcsLen Number of the unicode characters (in wcs) to be converted.
- * @param mbsBuf Buffer for converted multibyte characters.
- * If mbsBuf is NULL, the function returns the number of bytes
- * required for the buffer.
- * @param bufSizeInByte The size (in byte) of mbsBuf.
- *
- * @return Number of the successfully converted bytes.
- */
-int32_t DRM_i18n_wcsToMbs(DRM_Charset_t charset,
- const uint16_t *wcs, int32_t wcsLen,
- uint8_t *mbsBuf, int32_t bufSizeInByte);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/media/libdrm/mobile1/include/objmng/drm_inner.h b/media/libdrm/mobile1/include/objmng/drm_inner.h
deleted file mode 100644
index 55234f8..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_inner.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __DRM_INNER_H__
-#define __DRM_INNER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define INT_2_YMD_HMS(year, mon, day, date, hour, min, sec, time) do{\
- year = date / 10000;\
- mon = date % 10000 / 100;\
- day = date %100;\
- hour = time / 10000;\
- min = time % 10000 / 100;\
- sec = time % 100;\
-}while(0)
-
-/**
- * Define the max malloc length for a DRM.
- */
-#define DRM_MAX_MALLOC_LEN (50 * 1024) /* 50K */
-
-#define DRM_ONE_AES_BLOCK_LEN 16
-#define DRM_TWO_AES_BLOCK_LEN 32
-
-typedef struct _T_DRM_DM_Binary_Node {
- uint8_t boundary[256];
-} T_DRM_DM_Binary_Node;
-
-typedef struct _T_DRM_DM_Base64_Node {
- uint8_t boundary[256];
- uint8_t b64DecodeData[4];
- int32_t b64DecodeDataLen;
-} T_DRM_DM_Base64_Node;
-
-typedef struct _T_DRM_Dcf_Node {
- uint8_t rightsIssuer[256];
- int32_t encContentLength;
- uint8_t aesDecData[16];
- int32_t aesDecDataLen;
- int32_t aesDecDataOff;
- uint8_t aesBackupBuf[16];
- int32_t bAesBackupBuf;
-} T_DRM_Dcf_Node;
-
-typedef struct _T_DRM_Session_Node {
- int32_t sessionId;
- int32_t inputHandle;
- int32_t mimeType;
- int32_t (*getInputDataLengthFunc)(int32_t inputHandle);
- int32_t (*readInputDataFunc)(int32_t inputHandle, uint8_t* buf, int32_t bufLen);
- int32_t (*seekInputDataFunc)(int32_t inputHandle, int32_t offset);
- int32_t deliveryMethod;
- int32_t transferEncoding;
- uint8_t contentType[64];
- int32_t contentLength;
- int32_t contentOffset;
- uint8_t contentID[256];
- uint8_t* rawContent;
- int32_t rawContentLen;
- int32_t bEndData;
- uint8_t* readBuf;
- int32_t readBufLen;
- int32_t readBufOff;
- void* infoStruct;
- struct _T_DRM_Session_Node* next;
-} T_DRM_Session_Node;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRM_INNER_H__ */
diff --git a/media/libdrm/mobile1/include/objmng/drm_rights_manager.h b/media/libdrm/mobile1/include/objmng/drm_rights_manager.h
deleted file mode 100644
index d81e7a1..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_rights_manager.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __DRM_RIGHTS_MANAGER_H__
-#define __DRM_RIGHTS_MANAGER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <openssl/aes.h>
-#include <drm_common_types.h>
-#include <parser_rel.h>
-
-#ifdef DRM_DEVICE_ARCH_ARM
-#define ANDROID_DRM_CORE_PATH "/data/drm/rights/"
-#define DRM_UID_FILE_PATH "/data/drm/rights/uid.txt"
-#else
-#define ANDROID_DRM_CORE_PATH "/home/user/golf/esmertec/device/out/debug/host/linux-x86/product/sim/data/data/com.android.drm.mobile1/"
-#define DRM_UID_FILE_PATH "/home/user/golf/esmertec/device/out/debug/host/linux-x86/product/sim/data/data/com.android.drm.mobile1/uid.txt"
-#endif
-
-#define EXTENSION_NAME_INFO ".info"
-
-#define GET_ID 1
-#define GET_UID 2
-
-#define GET_ROAMOUNT 1
-#define GET_ALL_RO 2
-#define SAVE_ALL_RO 3
-#define GET_A_RO 4
-#define SAVE_A_RO 5
-
-/**
- * Get the id or uid from the "uid.txt" file.
- *
- * \param Uid The content id for a specially DRM object.
- * \param id The id number managed by DRM engine for a specially DRM object.
- * \param option The option to get id or uid, the value includes: GET_ID, GET_UID.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_readFromUidTxt(uint8_t* Uid, int32_t* id, int32_t option);
-
-/**
- * Save or read the rights information on the "id.info" file.
- *
- * \param id The id number managed by DRM engine for a specially DRM object.
- * \param Ro The rights structure to save the rights information.
- * \param RoAmount The number of rights for this DRM object.
- * \param option The option include: GET_ROAMOUNT, GET_ALL_RO, SAVE_ALL_RO, GET_A_RO, SAVE_A_RO.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_writeOrReadInfo(int32_t id, T_DRM_Rights* Ro, int32_t* RoAmount, int32_t option);
-
-/**
- * Append a rights information to DRM engine storage.
- *
- * \param Ro The rights structure to save the rights information.
- *
- * return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_appendRightsInfo(T_DRM_Rights* rights);
-
-/**
- * Get the mex id number from the "uid.txt" file.
- *
- * \return
- * -an integer to indicate the max id number.
- * -(-1), if the operation failed.
- */
-int32_t drm_getMaxIdFromUidTxt();
-
-/**
- * Remove the "id.info" file if all the rights for this DRM object has been deleted.
- *
- * \param id The id number managed by DRM engine for a specially DRM object.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_removeIdInfoFile(int32_t id);
-
-/**
- * Update the "uid.txt" file when delete the rights object.
- *
- * \param id The id number managed by DRM engine for a specially DRM object.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_updateUidTxtWhenDelete(int32_t id);
-
-/**
- * Get the CEK according the given content id.
- *
- * \param uid The content id for a specially DRM object.
- * \param KeyValue The buffer to save the CEK.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_getKey(uint8_t* uid, uint8_t* KeyValue);
-
-/**
- * Discard the padding bytes in DCF decrypted data.
- *
- * \param decryptedBuf The aes decrypted data buffer to be scanned.
- * \param decryptedBufLen The length of the buffer. And save the output result.
- *
- * \return
- * -0
- */
-void drm_discardPaddingByte(uint8_t *decryptedBuf, int32_t *decryptedBufLen);
-
-/**
- * Decrypt the media data according the CEK.
- *
- * \param Buffer The buffer to decrypted and also used to save the output data.
- * \param BufferLen The length of the buffer data and also save the output data length.
- * \param key The structure of the CEK.
- *
- * \return
- * -0
- */
-int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, AES_KEY *key);
-
-/**
- * Update the DCF data length according the CEK.
- *
- * \param pDcfLastData The last several byte for the DCF.
- * \param keyValue The CEK of the DRM content.
- * \param moreBytes Output the more bytes for discarded.
- *
- * \return
- * -TRUE, if the operation successfully.
- * -FALSE, if the operation failed.
- */
-int32_t drm_updateDcfDataLen(uint8_t* pDcfLastData, uint8_t* keyValue, int32_t* moreBytes);
-
-/**
- * Check and update the rights for a specially DRM content.
- *
- * \param id The id number managed by DRM engine for a specially DRM object.
- * \param permission The permission to be check and updated.
- *
- * \return
- * -DRM_SUCCESS, if there is a valid rights and update it successfully.
- * -DRM_NO_RIGHTS, if there is no rights for this content.
- * -DRM_RIGHTS_PENDING, if the rights is pending.
- * -DRM_RIGHTS_EXPIRED, if the rights has expired.
- * -DRM_RIGHTS_FAILURE, if there is some other error occur.
- */
-int32_t drm_checkRoAndUpdate(int32_t id, int32_t permission);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRM_RIGHTS_MANAGER_H__ */
diff --git a/media/libdrm/mobile1/include/objmng/drm_time.h b/media/libdrm/mobile1/include/objmng/drm_time.h
deleted file mode 100644
index 9b013e6..0000000
--- a/media/libdrm/mobile1/include/objmng/drm_time.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-
-/**
- * @file
- * Time Porting Layer
- *
- * Basic support functions that are needed by time.
- *
- * <!-- #interface list begin -->
- * \section drm_time Interface
- * - DRM_time_getElapsedSecondsFrom1970()
- * - DRM_time_sleep()
- * - DRM_time_getSysTime()
- * <!-- #interface list end -->
- */
-
-#ifndef __DRM_TIME_H__
-#define __DRM_TIME_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <time.h>
-#include <drm_common_types.h>
-
-/** the time format */
-typedef struct __db_system_time_
-{
- uint16_t year;
- uint16_t month;
- uint16_t day;
- uint16_t hour;
- uint16_t min;
- uint16_t sec;
-} T_DB_TIME_SysTime;
-
-/**
- * Get the system time.it's up to UTC
- * \return Return the time in elapsed seconds.
- */
-uint32_t DRM_time_getElapsedSecondsFrom1970(void);
-
-/**
- * Suspend the execution of the current thread for a specified interval
- * \param ms suspended time by millisecond
- */
-void DRM_time_sleep(uint32_t ms);
-
-/**
- * function: get current system time
- * \param time_ptr[OUT] the system time got
- * \attention
- * time_ptr must not be NULL
- */
-void DRM_time_getSysTime(T_DB_TIME_SysTime *time_ptr);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRM_TIME_H__ */
diff --git a/media/libdrm/mobile1/include/objmng/svc_drm.h b/media/libdrm/mobile1/include/objmng/svc_drm.h
deleted file mode 100644
index 789343f..0000000
--- a/media/libdrm/mobile1/include/objmng/svc_drm.h
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __SVC_DRM_NEW_H__
-#define __SVC_DRM_NEW_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-/**
- * Define the mime type of DRM data.
- */
-#define TYPE_DRM_MESSAGE 0x48 /**< The mime type is "application/vnd.oma.drm.message" */
-#define TYPE_DRM_CONTENT 0x49 /**< The mime type is "application/vnd.oma.drm.content" */
-#define TYPE_DRM_RIGHTS_XML 0x4a /**< The mime type is "application/vnd.oma.drm.rights+xml" */
-#define TYPE_DRM_RIGHTS_WBXML 0x4b /**< The mime type is "application/vnd.oma.drm.rights+wbxml" */
-#define TYPE_DRM_UNKNOWN 0xff /**< The mime type is unknown */
-
-/**
- * Define the delivery methods.
- */
-#define FORWARD_LOCK 1 /**< Forward_lock */
-#define COMBINED_DELIVERY 2 /**< Combined delivery */
-#define SEPARATE_DELIVERY 3 /**< Separate delivery */
-#define SEPARATE_DELIVERY_FL 4 /**< Separate delivery but DCF is forward-lock */
-
-/**
- * Define the permissions.
- */
-#define DRM_PERMISSION_PLAY 0x01 /**< Play */
-#define DRM_PERMISSION_DISPLAY 0x02 /**< Display */
-#define DRM_PERMISSION_EXECUTE 0x04 /**< Execute */
-#define DRM_PERMISSION_PRINT 0x08 /**< Print */
-#define DRM_PERMISSION_FORWARD 0x10 /**< Forward */
-
-/**
- * Define the constraints.
- */
-#define DRM_NO_CONSTRAINT 0x80 /**< Indicate have no constraint, it can use freely */
-#define DRM_END_TIME_CONSTRAINT 0x08 /**< Indicate have end time constraint */
-#define DRM_INTERVAL_CONSTRAINT 0x04 /**< Indicate have interval constraint */
-#define DRM_COUNT_CONSTRAINT 0x02 /**< Indicate have count constraint */
-#define DRM_START_TIME_CONSTRAINT 0x01 /**< Indicate have start time constraint */
-#define DRM_NO_PERMISSION 0x00 /**< Indicate no rights */
-
-/**
- * Define the return values for those interface.
- */
-#define DRM_SUCCESS 0
-#define DRM_FAILURE -1
-#define DRM_MEDIA_EOF -2
-#define DRM_RIGHTS_DATA_INVALID -3
-#define DRM_MEDIA_DATA_INVALID -4
-#define DRM_SESSION_NOT_OPENED -5
-#define DRM_NO_RIGHTS -6
-#define DRM_NOT_SD_METHOD -7
-#define DRM_RIGHTS_PENDING -8
-#define DRM_RIGHTS_EXPIRED -9
-#define DRM_UNKNOWN_DATA_LEN -10
-
-/**
- * The input DRM data structure, include DM, DCF, DR, DRC.
- */
-typedef struct _T_DRM_Input_Data {
- /**
- * The handle of the input DRM data.
- */
- int32_t inputHandle;
-
- /**
- * The mime type of the DRM data, if the mime type set to unknown, DRM engine
- * will try to scan the input data to confirm the mime type, but we must say that
- * the scan and check of mime type is not strictly precise.
- */
- int32_t mimeType;
-
- /**
- * The function to get input data length, this function should be implement by out module,
- * and DRM engine will call-back it.
- *
- * \param inputHandle The handle of the DRM data.
- *
- * \return
- * -A positive integer indicate the length of input data.
- * -0, if some error occurred.
- */
- int32_t (*getInputDataLength)(int32_t inputHandle);
-
- /**
- * The function to read the input data, this function should be implement by out module,
- * and DRM engine will call-back it.
- *
- * \param inputHandle The handle of the DRM data.
- * \param buf The buffer mallocced by DRM engine to save the data.
- * \param bufLen The length of the buffer.
- *
- * \return
- * -A positive integer indicate the actually length of byte has been read.
- * -0, if some error occurred.
- * -(-1), if reach to the end of the data.
- */
- int32_t (*readInputData)(int32_t inputHandle, uint8_t* buf, int32_t bufLen);
-
- /**
- * The function to seek the current file pointer, this function should be implement by out module,
- * and DRM engine will call-back it.
- *
- * \param inputHandle The handle of the DRM data.
- * \param offset The offset from the start position to be seek.
- *
- * \return
- * -0, if seek operation success.
- * -(-1), if seek operation fail.
- */
- int32_t (*seekInputData)(int32_t inputHandle, int32_t offset);
-} T_DRM_Input_Data;
-
-/**
- * The constraint structure.
- */
-typedef struct _T_DRM_Constraint_Info {
- uint8_t indicator; /**< Whether there is a right */
- uint8_t unUsed[3];
- int32_t count; /**< The constraint of count */
- int32_t startDate; /**< The constraint of start date */
- int32_t startTime; /**< The constraint of start time */
- int32_t endDate; /**< The constraint of end date */
- int32_t endTime; /**< The constraint of end time */
- int32_t intervalDate; /**< The constraint of interval date */
- int32_t intervalTime; /**< The constraint of interval time */
-} T_DRM_Constraint_Info;
-
-/**
- * The rights permission and constraint information structure.
- */
-typedef struct _T_DRM_Rights_Info {
- uint8_t roId[256]; /**< The unique id for a specially rights object */
- T_DRM_Constraint_Info playRights; /**< Constraint of play */
- T_DRM_Constraint_Info displayRights; /**< Constraint of display */
- T_DRM_Constraint_Info executeRights; /**< Constraint of execute */
- T_DRM_Constraint_Info printRights; /**< Constraint of print */
-} T_DRM_Rights_Info;
-
-/**
- * The list node of the Rights information structure.
- */
-typedef struct _T_DRM_Rights_Info_Node {
- T_DRM_Rights_Info roInfo;
- struct _T_DRM_Rights_Info_Node *next;
-} T_DRM_Rights_Info_Node;
-
-/**
- * Install a rights object to DRM engine, include the rights in Combined Delivery cases.
- * Because all the rights object is managed by DRM engine, so every incoming rights object
- * must be install to the engine first, or the DRM engine will not recognize it.
- *
- * \param data The rights object data or Combined Delivery case data.
- * \param pRightsInfo The structure to save this rights information.
- *
- * \return
- * -DRM_SUCCESS, when install successfully.
- * -DRM_RIGHTS_DATA_INVALID, when the input rights data is invalid.
- * -DRM_FAILURE, when some other error occur.
- */
-int32_t SVC_drm_installRights(T_DRM_Input_Data data, T_DRM_Rights_Info* pRightsInfo);
-
-/**
- * Open a session for a special DRM object, it will parse the input DRM data, and then user
- * can try to get information for this DRM object, or try to use it if the rights is valid.
- *
- * \param data The DRM object data, DM or DCF.
- *
- * \return
- * -A handle for this opened DRM object session.
- * -DRM_MEDIA_DATA_INVALID, when the input DRM object data is invalid.
- * -DRM_FAILURE, when some other error occurred.
- */
-int32_t SVC_drm_openSession(T_DRM_Input_Data data);
-
-/**
- * Get the delivery method of the DRM object.
- *
- * \param session The handle for this DRM object session.
- *
- * \return
- * -The delivery method of this DRM object, include: FORWARD_LOCK, COMBINED_DELIVERY, SEPARATE_DELIVERY, SEPARATE_DELIVERY_FL.
- * -DRM_FAILURE, when some other error occurred.
- */
-int32_t SVC_drm_getDeliveryMethod(int32_t session);
-
-/**
- * Get DRM object media object content type.
- *
- * \param session The handle for this DRM object session.
- * \param mediaType The buffer to save the media type string, 64 bytes is enough.
- *
- * \return
- * -DRM_SUCCESS, when get the media object content type successfully.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_getContentType(int32_t session, uint8_t* mediaType);
-
-/**
- * Check whether a specific DRM object has the specific permission rights or not.
- *
- * \param session The handle for this DRM object session.
- * \param permission Specify the permission to be checked.
- *
- * \return
- * -DRM_SUCCESS, when it has the rights for the permission.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NO_RIGHTS, when it has no rights.
- * -DRM_RIGHTS_PENDING, when it has the rights, but currently it is pending.
- * -DRM_RIGHTS_EXPIRED, when the rights has expired.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_checkRights(int32_t session, int32_t permission);
-
-/**
- * Consume the rights when try to use the DRM object.
- *
- * \param session The handle for this DRM object session.
- * \param permission Specify the permission to be checked.
- *
- * \return
- * -DRM_SUCCESS, when consume rights successfully.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NO_RIGHTS, when it has no rights.
- * -DRM_RIGHTS_PENDING, when it has the rights, but currently it is pending.
- * -DRM_RIGHTS_EXPIRED, when the rights has expired.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_consumeRights(int32_t session, int32_t permission);
-
-/**
- * Get DRM media object content data length.
- *
- * \param session The handle for this DRM object session.
- *
- * \return
- * -A positive integer indicate the length of the media object content data.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NO_RIGHTS, when the rights object is not existed.
- * -DRM_UNKNOWN_DATA_LEN, when DRM object media data length is unknown in case of DCF has no rights.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_getContentLength(int32_t session);
-
-/**
- * Get DRM media object content data. Support get the data piece by piece if the content is too large.
- *
- * \param session The handle for this DRM object session.
- * \param offset The offset to start to get content.
- * \param mediaBuf The buffer to save media object data.
- * \param mediaBufLen The length of the buffer.
- *
- * \return
- * -A positive integer indicate the actually length of the data has been got.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NO_RIGHTS, when the rights object is not existed.
- * -DRM_MEDIA_EOF, when reach to the end of the media data.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_getContent(int32_t session, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen);
-
-/**
- * Get the rights issuer address, this interface is specially for Separate Delivery method.
- *
- * \param session The handle for this DRM object session.
- * \param rightsIssuer The buffer to save rights issuer, 256 bytes are enough.
- *
- * \return
- * -DRM_SUCCESS, when get the rights issuer successfully.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NOT_SD_METHOD, when it is not a Separate Delivery DRM object.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_getRightsIssuer(int32_t session, uint8_t* rightsIssuer);
-
-/**
- * Get DRM object constraint informations.
- *
- * \param session The handle for this DRM object session.
- * \param rights The structue to save the rights object information.
- *
- * \return
- * -DRM_SUCCESS, when get the rights information successfully.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_NO_RIGHTS, when this DRM object has not rights.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_getRightsInfo(int32_t session, T_DRM_Rights_Info* rights);
-
-/**
- * Close the opened session, after closed, the handle become invalid.
- *
- * \param session The handle for this DRM object session.
- *
- * \return
- * -DRM_SUCCESS, when close operation success.
- * -DRM_SESSION_NOT_OPENED, when the session is not opened or has been closed.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_closeSession(int32_t session);
-
-/**
- * Check and update the given rights according the given permission.
- *
- * \param contentID The unique id of the rights object.
- * \param permission The permission to be updated.
- *
- * \return
- * -DRM_SUCCESS, when update operation success.
- * -DRM_NO_RIGHTS, when it has no rights.
- * -DRM_RIGHTS_PENDING, when it has the rights, but currently it is pending.
- * -DRM_RIGHTS_EXPIRED, when the rights has expired.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_updateRights(uint8_t* contentID, int32_t permission);
-
-/**
- * Scan all the rights object in current DRM engine, and get all their information.
- *
- * \param ppRightsInfo The pointer to the list structure to save rights info.
- *
- * \return
- * -DRM_SUCCESS, when get information successfully.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_viewAllRights(T_DRM_Rights_Info_Node **ppRightsInfo);
-
-/**
- * Free the allocated memory when call "SVC_drm_viewAllRights".
- *
- * \param pRightsHeader The header pointer of the list to be free.
- *
- * \return
- * -DRM_SUCCESS, when free operation successfully.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_freeRightsInfoList(T_DRM_Rights_Info_Node *pRightsHeader);
-
-/**
- * Delete a specify rights.
- *
- * \param roId The unique id of the rights.
- *
- * \return
- * -DRM_SUCCESS, when free operation successfully.
- * -DRM_NO_RIGHTS, when there is not this rights object.
- * -DRM_FAILURE, when some other error occured.
- */
-int32_t SVC_drm_deleteRights(uint8_t* roId);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __SVC_DRM_NEW_H__ */
diff --git a/media/libdrm/mobile1/include/parser/parser_dcf.h b/media/libdrm/mobile1/include/parser/parser_dcf.h
deleted file mode 100644
index c63a195..0000000
--- a/media/libdrm/mobile1/include/parser/parser_dcf.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __PARSER_DCF_H__
-#define __PARSER_DCF_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define MAX_ENCRYPTION_METHOD_LEN 64
-#define MAX_RIGHTS_ISSUER_LEN 256
-#define MAX_CONTENT_NAME_LEN 64
-#define MAX_CONTENT_DESCRIPTION_LEN 256
-#define MAX_CONTENT_VENDOR_LEN 256
-#define MAX_ICON_URI_LEN 256
-#define MAX_CONTENT_TYPE_LEN 64
-#define MAX_CONTENT_URI_LEN 256
-
-#define HEADER_ENCRYPTION_METHOD "Encryption-Method: "
-#define HEADER_RIGHTS_ISSUER "Rights-Issuer: "
-#define HEADER_CONTENT_NAME "Content-Name: "
-#define HEADER_CONTENT_DESCRIPTION "Content-Description: "
-#define HEADER_CONTENT_VENDOR "Content-Vendor: "
-#define HEADER_ICON_URI "Icon-Uri: "
-
-#define HEADER_ENCRYPTION_METHOD_LEN 19
-#define HEADER_RIGHTS_ISSUER_LEN 15
-#define HEADER_CONTENT_NAME_LEN 14
-#define HEADER_CONTENT_DESCRIPTION_LEN 21
-#define HEADER_CONTENT_VENDOR_LEN 16
-#define HEADER_ICON_URI_LEN 10
-
-#define UINT_VAR_FLAG 0x80
-#define UINT_VAR_DATA 0x7F
-#define MAX_UINT_VAR_BYTE 5
-#define DRM_UINT_VAR_ERR -1
-
-typedef struct _T_DRM_DCF_Info {
- uint8_t Version;
- uint8_t ContentTypeLen; /**< Length of the ContentType field */
- uint8_t ContentURILen; /**< Length of the ContentURI field */
- uint8_t unUsed;
- uint8_t ContentType[MAX_CONTENT_TYPE_LEN]; /**< The MIME media type of the plaintext data */
- uint8_t ContentURI[MAX_CONTENT_URI_LEN]; /**< The unique identifier of this content object */
- int32_t HeadersLen; /**< Length of the Headers field */
- int32_t EncryptedDataLen; /**< Length of the encrypted data field */
- int32_t DecryptedDataLen; /**< Length of the decrypted data field */
- uint8_t Encryption_Method[MAX_ENCRYPTION_METHOD_LEN]; /**< Encryption method */
- uint8_t Rights_Issuer[MAX_RIGHTS_ISSUER_LEN]; /**< Rights issuer */
- uint8_t Content_Name[MAX_CONTENT_NAME_LEN]; /**< Content name */
- uint8_t ContentDescription[MAX_CONTENT_DESCRIPTION_LEN]; /**< Content description */
- uint8_t ContentVendor[MAX_CONTENT_VENDOR_LEN]; /**< Content vendor */
- uint8_t Icon_URI[MAX_ICON_URI_LEN]; /**< Icon URI */
-} T_DRM_DCF_Info;
-
-/**
- * Parse the DRM content format data
- *
- * \param buffer (in)Input the DCF format data
- * \param bufferLen (in)The input buffer length
- * \param pDcfInfo (out)A structure pointer which contain information of DCF headers
- * \param ppEncryptedData (out)The location of encrypted data
- *
- * \return
- * -TRUE, when success
- * -FALSE, when failed
- */
-int32_t drm_dcfParser(uint8_t *buffer, int32_t bufferLen, T_DRM_DCF_Info *pDcfInfo,
- uint8_t **ppEncryptedData);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __PARSER_DCF_H__ */
diff --git a/media/libdrm/mobile1/include/parser/parser_dm.h b/media/libdrm/mobile1/include/parser/parser_dm.h
deleted file mode 100644
index ec8b6b2..0000000
--- a/media/libdrm/mobile1/include/parser/parser_dm.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __PARSER_DM_H__
-#define __PARSER_DM_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define MAX_CONTENT_TYPE_LEN 64
-#define MAX_CONTENT_ID 256
-#define MAX_CONTENT_BOUNDARY_LEN 256
-#define MAX_RIGHTS_ISSUER_LEN 256
-
-#define DRM_MIME_TYPE_RIGHTS_XML "application/vnd.oma.drm.rights+xml"
-#define DRM_MIME_TYPE_CONTENT "application/vnd.oma.drm.content"
-
-#define HEADERS_TRANSFER_CODING "Content-Transfer-Encoding:"
-#define HEADERS_CONTENT_TYPE "Content-Type:"
-#define HEADERS_CONTENT_ID "Content-ID:"
-
-#define TRANSFER_CODING_TYPE_7BIT "7bit"
-#define TRANSFER_CODING_TYPE_8BIT "8bit"
-#define TRANSFER_CODING_TYPE_BINARY "binary"
-#define TRANSFER_CODING_TYPE_BASE64 "base64"
-
-#define DRM_UID_TYPE_FORWORD_LOCK "forwardlock"
-#define DRM_NEW_LINE_CRLF "\r\n"
-
-#define HEADERS_TRANSFER_CODING_LEN 26
-#define HEADERS_CONTENT_TYPE_LEN 13
-#define HEADERS_CONTENT_ID_LEN 11
-
-#define DRM_MESSAGE_CODING_7BIT 0 /* default */
-#define DRM_MESSAGE_CODING_8BIT 1
-#define DRM_MESSAGE_CODING_BINARY 2
-#define DRM_MESSAGE_CODING_BASE64 3
-
-#define DRM_B64_DEC_BLOCK 3
-#define DRM_B64_ENC_BLOCK 4
-
-typedef struct _T_DRM_DM_Info {
- uint8_t contentType[MAX_CONTENT_TYPE_LEN]; /**< Content type */
- uint8_t contentID[MAX_CONTENT_ID]; /**< Content ID */
- uint8_t boundary[MAX_CONTENT_BOUNDARY_LEN]; /**< DRM message's boundary */
- uint8_t deliveryType; /**< The Delivery type */
- uint8_t transferEncoding; /**< Transfer encoding type */
- int32_t contentOffset; /**< The offset of the media content from the original DRM data */
- int32_t contentLen; /**< The length of the media content */
- int32_t rightsOffset; /**< The offset of the rights object in case of combined delivery */
- int32_t rightsLen; /**< The length of the rights object in case of combined delivery */
- uint8_t rightsIssuer[MAX_RIGHTS_ISSUER_LEN];/**< The rights issuer address in case of separate delivery */
-} T_DRM_DM_Info;
-
-/**
- * Search the string in a limited length.
- *
- * \param str The original string
- * \param strSearch The sub-string to be searched
- * \param len The length limited
- *
- * \return
- * -NULL, when there is not the searched string in length
- * -The pointer of this sub-string
- */
-const uint8_t* drm_strnstr(const uint8_t* str, const uint8_t* strSearch, int32_t len);
-
-/**
- * Parse the DRM message format data.
- *
- * \param buffer (in)Input the DRM message format data
- * \param bufferLen (in)The input buffer length
- * \param pDmInfo (out)A structure pointer which contain information of DRM message headers
- *
- * \return
- * -TRUE, when success
- * -FALSE, when failed
- */
-int32_t drm_parseDM(const uint8_t* buffer, int32_t bufferLen, T_DRM_DM_Info* pDmInfo);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __PARSER_DM_H__ */
diff --git a/media/libdrm/mobile1/include/parser/parser_rel.h b/media/libdrm/mobile1/include/parser/parser_rel.h
deleted file mode 100644
index 8def199..0000000
--- a/media/libdrm/mobile1/include/parser/parser_rel.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __PARSER_REL_H__
-#define __PARSER_REL_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define WRITE_RO_FLAG(whoIsAble, boolValue, Indicator, RIGHTS) do{\
- whoIsAble = boolValue;\
- Indicator |= RIGHTS;\
-}while(0)
-
-#define CHECK_VALIDITY(ret) do{\
- if(ret == NULL){\
- if(XML_ERROR_NO_SUCH_NODE != xml_errno)\
- return FALSE;\
- }\
- else\
- {\
- if(XML_ERROR_OK != xml_errno)\
- return FALSE;\
- }\
-}while(0)
-
-#define YMD_HMS_2_INT(year, mon, day, date, hour, min, sec, time) do{\
- date = year * 10000 + mon * 100 + day;\
- time = hour * 10000 + min * 100 + sec;\
-}while(0)
-
-#define DRM_UID_LEN 256
-#define DRM_KEY_LEN 16
-
-#define XML_DOM_PARSER
-
-typedef struct _T_DRM_DATETIME {
- int32_t date; /**< year * 10000 + mon *100 + day */
- int32_t time; /**< hour * 10000 + min *100 + sec */
-} T_DRM_DATETIME;
-
-typedef struct _T_DRM_Rights_Constraint {
- uint8_t Indicator; /**< Indicate which is constrainted, the first one indicate 0001, second one indicate 0010 */
- uint8_t unUsed[3];
- int32_t Count; /**< The times that can be used */
- T_DRM_DATETIME StartTime; /**< The starting time */
- T_DRM_DATETIME EndTime; /**< The ending time */
- T_DRM_DATETIME Interval; /**< The interval time */
-} T_DRM_Rights_Constraint;
-
-typedef struct _T_DRM_Rights {
- uint8_t Version[8]; /**< Version number */
- uint8_t uid[256]; /**< record the rights object name */
- uint8_t KeyValue[16]; /**< Decode base64 */
- int32_t bIsPlayable; /**< Is playable */
- int32_t bIsDisplayable; /**< Is displayable */
- int32_t bIsExecuteable; /**< Is executeable */
- int32_t bIsPrintable; /**< Is printable */
- T_DRM_Rights_Constraint PlayConstraint; /**< Play constraint */
- T_DRM_Rights_Constraint DisplayConstraint; /**< Display constraint */
- T_DRM_Rights_Constraint ExecuteConstraint; /**< Execute constraint */
- T_DRM_Rights_Constraint PrintConstraint; /**< Print constraint */
-} T_DRM_Rights;
-
-/**
- * Input year and month, return how many days that month have
- * \param year (in)Input the year
- * \param month (in)Input the month
- * \return
- * -A positive integer, which is how many days that month have
- * -When wrong input, return -1
- */
-int32_t drm_monthDays(int32_t year, int32_t month);
-
-/**
- * Check whether the date and time is valid.
- * \param year year of the date
- * \param month month of the date
- * \param day day of the date
- * \param hour hour of the time
- * \param min minute of the time
- * \param sec second of the time
- * \return
- * -when it is a valid time, return 0
- * -when it is a invalid time, return -1
- */
-int32_t drm_checkDate(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t min, int32_t sec);
-
-/**
- * Parse the rights object include xml format and wbxml format data
- *
- * \param buffer (in)Input the DRM rights object data
- * \param bufferLen (in)The buffer length
- * \param format (in)Which format, xml or wbxml
- * \param pRights (out)A structure pointer which save the rights information
- *
- * \return
- * -TRUE, when success
- * -FALSE, when failed
- */
-int32_t drm_relParser(uint8_t* buffer, int32_t bufferLen, int32_t Format, T_DRM_Rights* pRights);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __PARSER_REL_H__ */
diff --git a/media/libdrm/mobile1/include/xml/wbxml_tinyparser.h b/media/libdrm/mobile1/include/xml/wbxml_tinyparser.h
deleted file mode 100644
index 1c40467..0000000
--- a/media/libdrm/mobile1/include/xml/wbxml_tinyparser.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __WBXML_TINYPARSER_H__
-#define __WBXML_TINYPARSER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define REL_TAG_RIGHTS 0x05
-#define REL_TAG_CONTEXT 0x06
-#define REL_TAG_VERSION 0x07
-#define REL_TAG_UID 0x08
-#define REL_TAG_AGREEMENT 0x09
-#define REL_TAG_ASSET 0x0A
-#define REL_TAG_KEYINFO 0x0B
-#define REL_TAG_KEYVALUE 0x0C
-#define REL_TAG_PERMISSION 0x0D
-#define REL_TAG_PLAY 0x0E
-#define REL_TAG_DISPLAY 0x0F
-#define REL_TAG_EXECUTE 0x10
-#define REL_TAG_PRINT 0x11
-#define REL_TAG_CONSTRAINT 0x12
-#define REL_TAG_COUNT 0x13
-#define REL_TAG_DATETIME 0x14
-#define REL_TAG_START 0x15
-#define REL_TAG_END 0x16
-#define REL_TAG_INTERVAL 0x17
-
-#define REL_CHECK_WBXML_HEADER(x) ((x != NULL) && (x[0] == 0x03) && (x[1] == 0x0E) && (x[2] == 0x6A))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __WBXML_TINYPARSER_H__ */
diff --git a/media/libdrm/mobile1/include/xml/xml_tinyParser.h b/media/libdrm/mobile1/include/xml/xml_tinyParser.h
deleted file mode 100644
index 4ad65b8..0000000
--- a/media/libdrm/mobile1/include/xml/xml_tinyParser.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef __XML_TINYPARSER_H__
-#define __XML_TINYPARSER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <drm_common_types.h>
-
-#define XML_DOM_PARSER
-#define WBXML_DOM_PARSER
-#define XML_DOM_CHECK_ENDTAG
-#define XML_ENABLE_ERRNO
-#define WBXML_OLD_VERSION /* for drm only */
-
-#ifdef DEBUG_MODE
-void XML_PrintMallocInfo();
-#endif /* DEBUG_MODE */
-
-#define XML_TRUE 1
-#define XML_FALSE 0
-#define XML_EOF 0
-#define XML_TAG_START 0
-#define XML_TAG_END 1
-#define XML_TAG_SELF 2
-
-#define XML_MAX_PROPERTY_LEN 256
-#define XML_MAX_ATTR_NAME_LEN 256
-#define XML_MAX_ATTR_VALUE_LEN 256
-#define XML_MAX_VALUE_LEN 256
-
-#define XML_ERROR_OK 0
-#define XML_ERROR_BUFFER_NULL -1
-#define XML_ERROR_ATTR_NAME -2
-#define XML_ERROR_ATTR_MISSED_EQUAL -3
-#define XML_ERROR_PROPERTY_NAME -4
-#define XML_ERROR_ATTR_VALUE -5
-#define XML_ERROR_ENDTAG -6
-#define XML_ERROR_NO_SUCH_NODE -7
-#define XML_ERROR_PROPERTY_END -8
-#define XML_ERROR_VALUE -9
-#define XML_ERROR_NO_START_TAG -14
-#define XML_ERROR_NOVALUE -15
-
-#define WBXML_ERROR_MISSED_CONTENT -10
-#define WBXML_ERROR_MBUINT32 -11
-#define WBXML_ERROR_MISSED_STARTTAG -12
-#define WBXML_ERROR_MISSED_ENDTAG -13
-
-#ifdef XML_ENABLE_ERRNO
-extern int32_t xml_errno;
-#define XML_ERROR(x) do { xml_errno = x; } while (0)
-#else /* XML_ENABLE_ERRNO */
-#define XML_ERROR
-#endif /* XML_ENABLE_ERRNO */
-
-#ifdef XML_DOM_PARSER
-uint8_t *XML_DOM_getNode(uint8_t *buffer, const uint8_t *const node);
-uint8_t *XML_DOM_getNodeValue(uint8_t *buffer, uint8_t *node,
- uint8_t **value, int32_t *valueLen);
-
-uint8_t *XML_DOM_getValue(uint8_t *buffer, uint8_t **pValue, int32_t *valueLen);
-uint8_t *XML_DOM_getAttr(uint8_t *buffer, uint8_t **pName, int32_t *nameLen,
- uint8_t **pValue, int32_t *valueLen);
-
-uint8_t *XML_DOM_getNextNode(uint8_t *buffer, uint8_t **pNodeName,
- int32_t *nodenameLen);
-
-uint8_t *XML_DOM_getTag(uint8_t *buffer, int32_t *tagLen, int32_t *tagType);
-#endif /* XML_DOM_PARSER */
-
-#ifdef WBXML_DOM_PARSER
-
-#define WBXML_WITH_ATTR 0x80
-#define WBXML_WITH_CONTENT 0x40
-#define WBXML_ATTR_END 0x01
-#define WBXML_CONTENT_END 0x01
-
-#define WBXML_SWITCH_PAGE 0x00
-#define WBXML_STR_I 0x03
-#define WBXML_END 0x00
-#define WBXML_OPAUE 0xC3
-#define WBXML_STR_T 0x83
-#define WBXML_OPAQUE 0xC3
-
-#define WBXML_GET_TAG(x) ((x) & 0x3F) /* get 6-digits */
-#define WBXML_HAS_ATTR(x) ((x) & WBXML_WITH_ATTR)
-#define WBXML_HAS_CONTENT(x) ((x) & WBXML_WITH_CONTENT)
-
-typedef struct _WBXML {
- uint8_t version;
- uint8_t unUsed[3];
- uint32_t publicid;
- uint32_t charset;
- int32_t strTableLen;
- uint8_t *strTable;
- uint8_t *Content;
- uint8_t *End;
- uint8_t *curPtr;
- int32_t depth;
-} WBXML;
-
-typedef int32_t XML_BOOL;
-
-#ifdef WBXML_OLD_VERSION
-uint8_t *WBXML_DOM_getNode(uint8_t *buffer, int32_t bufferLen,
- uint8_t *node);
-uint8_t *WBXML_DOM_getNodeValue(uint8_t *buffer, int32_t bufferLen,
- uint8_t *node,
- uint8_t **value,
- int32_t *valueLen);
-#endif /* WBXML_OLD_VERSION */
-
-XML_BOOL WBXML_DOM_Init(WBXML * pWbxml, uint8_t *buffer,
- int32_t bufferLen);
-XML_BOOL WBXML_DOM_Eof(WBXML * pWbxml);
-uint8_t WBXML_DOM_GetTag(WBXML * pWbxml);
-uint8_t WBXML_DOM_GetChar(WBXML * pWbxml);
-uint8_t WBXML_DOM_GetUIntVar(WBXML * pWbxml);
-void WBXML_DOM_Rewind(WBXML * pWbxml);
-void WBXML_DOM_Seek(WBXML * pWbxml, int32_t offset);
-int32_t WBXML_GetUintVar(const uint8_t *const buffer, int32_t *len);
-
-#endif /* WBXML_DOM_PARSER */
-
-#ifdef XML_TREE_STRUCTURE
-
-typedef struct _XML_TREE_ATTR XML_TREE_ATTR;
-struct _XML_TREE_ATTR {
- uint8_t name[XML_MAX_ATTR_VALUE_LEN];
- uint8_t value[XML_MAX_ATTR_VALUE_LEN];
- XML_TREE_ATTR *next;
-};
-
-typedef struct _XML_TREE XML_TREE;
-struct _XML_TREE {
- uint8_t tag[XML_MAX_PROPERTY_LEN];
- uint8_t value[XML_MAX_VALUE_LEN];
- XML_TREE_ATTR *attr;
- XML_TREE_ATTR *last_attr;
- XML_TREE *brother;
- XML_TREE *last_brother;
- XML_TREE *child;
-};
-
-XML_TREE *XML_makeTree(uint8_t **buf);
-void XML_freeTree(XML_TREE * pTree);
-
-#endif /* XML_TREE_STRUCTURE */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __XML_TINYPARSER_H__ */
diff --git a/media/libdrm/mobile1/src/jni/drm1_jni.c b/media/libdrm/mobile1/src/jni/drm1_jni.c
deleted file mode 100644
index 11353a7..0000000
--- a/media/libdrm/mobile1/src/jni/drm1_jni.c
+++ /dev/null
@@ -1,1166 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-/**
- * @file drm1_jni.c
- *
- * This file implement the Java Native Interface
- * for supporting OMA DRM 1.0
- */
-
-#include <jni/drm1_jni.h>
-#include <objmng/svc_drm.h>
-#include "log.h"
-#include "JNIHelp.h"
-
-
-#define MS_PER_SECOND 1000 /* Milliseconds per second */
-#define MS_PER_MINUTE 60 * MS_PER_SECOND /* Milliseconds per minute */
-#define MS_PER_HOUR 60 * MS_PER_MINUTE /* Milliseconds per hour */
-#define MS_PER_DAY 24 * MS_PER_HOUR /* Milliseconds per day */
-
-#define SECONDS_PER_MINUTE 60 /* Seconds per minute*/
-#define SECONDS_PER_HOUR 60 * SECONDS_PER_MINUTE /* Seconds per hour */
-#define SECONDS_PER_DAY 24 * SECONDS_PER_HOUR /* Seconds per day */
-
-#define DAY_PER_MONTH 30 /* Days per month */
-#define DAY_PER_YEAR 365 /* Days per year */
-
-/** Nonzero if 'y' is a leap year, else zero. */
-#define leap(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
-
-/** Number of leap years from 1970 to 'y' (not including 'y' itself). */
-#define nleap(y) (((y) - 1969) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400)
-
-/** Accumulated number of days from 01-Jan up to start of current month. */
-static const int32_t ydays[] = {
- 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
-};
-
-#define int64_const(s) (s)
-#define int64_add(dst, s1, s2) ((void)((dst) = (s1) + (s2)))
-#define int64_mul(dst, s1, s2) ((void)((dst) = (int64_t)(s1) * (int64_t)(s2)))
-
-/**
- * DRM data structure
- */
-typedef struct _DrmData {
- /**
- * The id of the DRM content.
- */
- int32_t id;
-
- /**
- * The pointer of JNI interface.
- */
- JNIEnv* env;
-
- /**
- * The pointer of DRM raw content InputStream object.
- */
- jobject* pInData;
-
- /**
- * The len of the InputStream object.
- */
- int32_t len;
-
- /**
- * The next DRM data.
- */
- struct _DrmData *next;
-} DrmData;
-
-/** The table to hold all the DRM data. */
-static DrmData *drmTable = NULL;
-
-/**
- * Allocate a new item of DrmData.
- *
- * \return a pointer to a DrmData item if allocate successfully,
- * otherwise return NULL
- */
-static DrmData * newItem(void)
-{
- DrmData *d = (DrmData *)malloc(sizeof(DrmData));
-
- if (d != NULL) {
- d->id = -1;
- d->next = NULL;
- }
-
- return d;
-}
-
-/**
- * Free the memory of the specified DrmData item <code>d</code>.
- *
- * \param d - a pointer to DrmData
- */
-static void freeItem(DrmData *d)
-{
- assert(d != NULL);
-
- free(d);
-}
-
-/**
- * Insert a DrmData item with given <code>name</code> into the head of
- * the DrmData list.
- *
- * @param d - the pointer of the JNI interface
- * @param pInData - the pointer of the DRM content InputStream object.
- *
- * @return <code>JNI_DRM_SUCCESS</code> if insert successfully, otherwise
- * return <code>JNI_DRM_FAILURE</code>
- */
-static int32_t addItem(DrmData* d)
-{
- if (NULL == d)
- return JNI_DRM_FAILURE;
-
- if (NULL == drmTable) {
- drmTable = d;
- return JNI_DRM_SUCCESS;
- }
-
- d->next = drmTable;
- drmTable = d;
-
- return JNI_DRM_SUCCESS;
-}
-
-/**
- * Get the item from the DrmData list by the specified <code>
- * id</code>.
- *
- * @param p - the pointer of the DRM content InputStream object.
- *
- * @return a pointer to the DrmData item if find it successfuly,
- * otherwise return NULL
- */
-static DrmData * getItem(int32_t id)
-{
- DrmData *d;
-
- if (NULL == drmTable)
- return NULL;
-
- for (d = drmTable; d != NULL; d = d->next) {
- if (id == d->id)
- return d;
- }
-
- return NULL;
-}
-
-/**
- * Remove the specified DrmData item <code>d</code>.
- *
- * @param p - the pointer of the DRM content InputStream object.
- *
- * @return <code>JNI_DRM_SUCCESS</code> if remove successfuly,
- * otherwise return <code>JNI_DRM_FAILURE</code>
- */
-static int32_t removeItem(int32_t id)
-{
- DrmData *curItem, *preItem, *dstItem;
-
- if (NULL == drmTable)
- return JNI_DRM_FAILURE;
-
- preItem = NULL;
- for (curItem = drmTable; curItem != NULL; curItem = curItem->next) {
- if (id == curItem->id) {
- if (curItem == drmTable)
- drmTable = curItem->next;
- else
- preItem->next = curItem->next;
-
- freeItem(curItem);
-
- return JNI_DRM_SUCCESS;
- }
-
- preItem = curItem;
- }
-
- return JNI_DRM_FAILURE;
-}
-
-
-static int32_t getInputStreamDataLength(int32_t handle)
-{
- JNIEnv* env;
- jobject* pInputStream;
- int32_t len;
- DrmData* p;
- jclass cls;
- jmethodID mid;
-
- p = (DrmData *)handle;
-
- if (NULL == p)
- return 0;
-
- env = p->env;
- pInputStream = p->pInData;
- len = p->len;
-
- if (NULL == env || p->len <= 0 || NULL == pInputStream)
- return 0;
-
- /* check the original InputStream is available or not */
- cls = (*env)->GetObjectClass(env, *pInputStream);
- mid = (*env)->GetMethodID(env, cls, "available", "()I");
- (*env)->DeleteLocalRef(env, cls);
-
- if (NULL == mid)
- return 0;
-
- if (0 > (*env)->CallIntMethod(env, *pInputStream, mid))
- return 0;
-
- return len;
-}
-
-static int32_t readInputStreamData(int32_t handle, uint8_t* buf, int32_t bufLen)
-{
- JNIEnv* env;
- jobject* pInputStream;
- int32_t len;
- DrmData* p;
- jclass cls;
- jmethodID mid;
- jbyteArray tmp;
- int tmpLen;
- jbyte* pNativeBuf;
-
- p = (DrmData *)handle;
-
- if (NULL == p || NULL == buf || bufLen <- 0)
- return 0;
-
- env = p->env;
- pInputStream = p->pInData;
- len = p->len;
-
- if (NULL == env || p->len <= 0 || NULL == pInputStream)
- return 0;
-
- cls = (*env)->GetObjectClass(env, *pInputStream);
- mid = (*env)->GetMethodID(env, cls, "read", "([BII)I");
- tmp = (*env)->NewByteArray(env, bufLen);
- bufLen = (*env)->CallIntMethod(env, *pInputStream, mid, tmp, 0, bufLen);
-
- (*env)->DeleteLocalRef(env, cls);
-
- if (-1 == bufLen)
- return -1;
-
- pNativeBuf = (*env)->GetByteArrayElements(env, tmp, NULL);
- memcpy(buf, pNativeBuf, bufLen);
- (*env)->ReleaseByteArrayElements(env, tmp, pNativeBuf, 0);
- (*env)->DeleteLocalRef(env, tmp);
-
- return bufLen;
-}
-
-static const T_DRM_Rights_Info_Node *searchRightsObject(const jbyte* roId, const T_DRM_Rights_Info_Node* pRightsList)
-{
- const T_DRM_Rights_Info_Node *pTmp;
-
- if (NULL == roId || NULL == pRightsList)
- return NULL;
-
- pTmp = pRightsList;
-
- while (NULL != pTmp) {
- if(0 == strcmp((char *)roId, (char *)pTmp->roInfo.roId))
- break;
- pTmp = pTmp->next;
- }
-
- return pTmp;
-}
-
-/**
- * Returns the difference in seconds between the given GMT time
- * and 1970-01-01 00:00:00 GMT.
- *
- * \param year the year (since 1970)
- * \param month the month (1 - 12)
- * \param day the day (1 - 31)
- * \param hour the hour (0 - 23)
- * \param minute the minute (0 - 59)
- * \param second the second (0 - 59)
- *
- * \return the difference in seconds between the given GMT time
- * and 1970-01-01 00:00:00 GMT.
- */
-static int64_t mkgmtime(
- uint32_t year, uint32_t month, uint32_t day,
- uint32_t hour, uint32_t minute, uint32_t second)
-{
- int64_t result;
-
- /*
- * FIXME: It does not check whether the specified days
- * is valid based on the specified months.
- */
- assert(year >= 1970
- && month > 0 && month <= 12
- && day > 0 && day <= 31
- && hour < 24 && minute < 60
- && second < 60);
-
- /* Set 'day' to the number of days into the year. */
- day += ydays[month - 1] + (month > 2 && leap (year)) - 1;
-
- /* Now calculate 'day' to the number of days since Jan 1, 1970. */
- day = day + 365 * (year - 1970) + nleap(year);
-
- int64_mul(result, int64_const(day), int64_const(SECONDS_PER_DAY));
- int64_add(result, result, int64_const(
- SECONDS_PER_HOUR * hour + SECONDS_PER_MINUTE * minute + second));
-
- return result;
-}
-
-/**
- * Compute the milliseconds by the specified <code>date</code>
- * and <code>time</code>.
- *
- * @param date - the specified date,
- * <code>date = year * 10000 + month * 100 + day</code>
- * @param time - the specified time,
- * <code>time = hour * 10000 + minute * 100 + second</code>
- *
- * @return the related milliseconds
- */
-static int64_t computeTime(int32_t date, int32_t time)
-{
- int32_t year, month, day, hour, minute, second;
-
- year = date / 10000;
- month = (date / 100) % 100;
- day = date % 100;
- hour = time / 10000;
- minute = (time / 100) % 100;
- second = time % 100;
-
- /* Adjust the invalid parameters. */
- if (year < 1970) year = 1970;
- if (month < 1) month = 1;
- if (month > 12) month = 12;
- if (day < 1) day = 1;
- if (day > 31) day = 31;
- if (hour < 0) hour = 0;
- if (hour > 23) hour = 23;
- if (minute < 0) minute = 0;
- if (minute > 59) minute = 59;
- if (second < 0) second = 0;
- if (second > 59) second = 59;
-
- return mkgmtime(year, month, day, hour, minute, second) * 1000;
-}
-
-/**
- * Compute the milliseconds by the specified <code>date</code>
- * and <code>time</code>.
- * Note that here we always treat 1 year as 365 days and 1 month as 30 days
- * that is not precise. But it should not be a problem since OMA DRM 2.0
- * already restricts the interval representation to be day-based,
- * i.e. there will not be an interval with year or month any more in the
- * future.
- *
- * @param date - the specified date,
- * <code>date = year * 10000 + month * 100 + day</code>
- * @param time - the specified time,
- * <code>time = hour * 10000 + minute * 100 + second</code>
- *
- * @return the related milliseconds
- */
-static int64_t computeInterval(int32_t date, int32_t time)
-{
- int32_t year, month, day, hour, minute, second;
- int64_t milliseconds;
-
- year = date / 10000;
- month = (date / 100) % 100;
- day = date % 100;
- hour = time / 10000;
- minute = (time / 100) % 100;
- second = time % 100;
-
- /* milliseconds = ((((year * 365 + month * 30 + day) * 24
- * + hour) * 60 + minute) * 60 + second) * 1000;
- */
- int64_mul(milliseconds,
- int64_const(year * DAY_PER_YEAR + month * DAY_PER_MONTH + day),
- int64_const(MS_PER_DAY));
- int64_add(milliseconds, milliseconds,
- int64_const(hour * MS_PER_HOUR + minute * MS_PER_MINUTE +
- second * MS_PER_SECOND));
-
- return milliseconds;
-}
-
-static jint getObjectIntField(JNIEnv * env, jobject obj, const char *name, jint * value)
-{
- jclass clazz;
- jfieldID field;
-
- clazz = (*env)->GetObjectClass(env, obj);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, name, "I");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- *value = (*env)->GetIntField(env, obj, field);
-
- return JNI_DRM_SUCCESS;
-}
-
-static jint setObjectIntField(JNIEnv * env, jobject obj, const char *name, jint value)
-{
- jclass clazz;
- jfieldID field;
-
- clazz = (*env)->GetObjectClass(env, obj);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, name, "I");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- (*env)->SetIntField(env, obj, field, value);
-
- return JNI_DRM_SUCCESS;
-}
-
-static jint setObjectLongField(JNIEnv * env, jobject obj, const char *name, jlong value)
-{
- jclass clazz;
- jfieldID field;
-
- clazz = (*env)->GetObjectClass(env, obj);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, name, "J");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- (*env)->SetLongField(env, obj, field, value);
-
- return JNI_DRM_SUCCESS;
-}
-
-static jint setConstraintFields(JNIEnv * env, jobject constraint, T_DRM_Constraint_Info * pConstraint)
-{
- /* if no this permission */
- if (pConstraint->indicator == (uint8_t)DRM_NO_RIGHTS) {
- if (JNI_DRM_FAILURE == setObjectIntField(env, constraint, "count", 0))
- return JNI_DRM_FAILURE;
-
- return JNI_DRM_SUCCESS;
- }
-
- /* set count field */
- if (pConstraint->indicator & DRM_COUNT_CONSTRAINT) {
- if (JNI_DRM_FAILURE == setObjectIntField(env, constraint, "count", pConstraint->count))
- return JNI_DRM_FAILURE;
- }
-
- /* set start time field */
- if (pConstraint->indicator & DRM_START_TIME_CONSTRAINT) {
- int64_t startTime;
-
- startTime = computeTime(pConstraint->startDate, pConstraint->startTime);
-
- if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "startDate", startTime))
- return JNI_DRM_FAILURE;
- }
-
- /* set end time field */
- if (pConstraint->indicator & DRM_END_TIME_CONSTRAINT) {
- int64_t endTime;
-
- endTime = computeTime(pConstraint->endDate, pConstraint->endTime);
-
- if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "endDate", endTime))
- return JNI_DRM_FAILURE;
- }
-
- /* set interval field */
- if (pConstraint->indicator & DRM_INTERVAL_CONSTRAINT) {
- int64_t interval;
-
- interval = computeInterval(pConstraint->intervalDate, pConstraint->intervalTime);
-
- if (JNI_DRM_FAILURE == setObjectLongField(env, constraint, "interval", interval))
- return JNI_DRM_FAILURE;
- }
-
- return JNI_DRM_SUCCESS;
-}
-
-static jint setRightsFields(JNIEnv * env, jobject rights, T_DRM_Rights_Info* pRoInfo)
-{
- jclass clazz;
- jfieldID field;
- jstring str;
- jint index;
-
- clazz = (*env)->GetObjectClass(env, rights);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- /* set roId field */
- field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- str = (*env)->NewStringUTF(env, (char *)pRoInfo->roId);
- if (NULL == str)
- return JNI_DRM_FAILURE;
-
- (*env)->SetObjectField(env, rights, field, str);
- (*env)->DeleteLocalRef(env, str);
-
- return JNI_DRM_SUCCESS;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeConstructDrmContent
- (JNIEnv * env, jobject rawContent, jobject data, jint len, jint mimeType)
-{
- int32_t id;
- T_DRM_Input_Data inData;
- DrmData* drmInData;
-
- switch (mimeType) {
- case JNI_DRM_MIMETYPE_MESSAGE:
- mimeType = TYPE_DRM_MESSAGE;
- break;
- case JNI_DRM_MIMETYPE_CONTENT:
- mimeType = TYPE_DRM_CONTENT;
- break;
- default:
- return JNI_DRM_FAILURE;
- }
-
- drmInData = newItem();
- if (NULL == drmInData)
- return JNI_DRM_FAILURE;
-
- drmInData->env = env;
- drmInData->pInData = &data;
- drmInData->len = len;
-
- if (JNI_DRM_FAILURE == addItem(drmInData))
- return JNI_DRM_FAILURE;
-
- inData.inputHandle = (int32_t)drmInData;
- inData.mimeType = mimeType;
- inData.getInputDataLength = getInputStreamDataLength;
- inData.readInputData = readInputStreamData;
-
- id = SVC_drm_openSession(inData);
- if (id < 0)
- return JNI_DRM_FAILURE;
-
- drmInData->id = id;
-
- return id;
-}
-
-/* native interface */
-JNIEXPORT jstring JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeGetRightsAddress
- (JNIEnv * env, jobject rawContent)
-{
- jint id;
- uint8_t rightsIssuer[256] = {0};
- jstring str = NULL;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return NULL;
-
- if (DRM_SUCCESS == SVC_drm_getRightsIssuer(id, rightsIssuer))
- str = (*env)->NewStringUTF(env, (char *)rightsIssuer);
-
- return str;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeGetDeliveryMethod
- (JNIEnv * env, jobject rawContent)
-{
- jint id;
- int32_t res;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return JNI_DRM_FAILURE;
-
- res = SVC_drm_getDeliveryMethod(id);
-
- switch (res) {
- case FORWARD_LOCK:
- return JNI_DRM_FORWARD_LOCK;
- case COMBINED_DELIVERY:
- return JNI_DRM_COMBINED_DELIVERY;
- case SEPARATE_DELIVERY:
- return JNI_DRM_SEPARATE_DELIVERY;
- case SEPARATE_DELIVERY_FL:
- return JNI_DRM_SEPARATE_DELIVERY_DM;
- default:
- return JNI_DRM_FAILURE;
- }
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeReadContent
- (JNIEnv * env, jobject rawContent, jbyteArray buf, jint bufOff, jint len, jint mediaOff)
-{
- jint id;
- jbyte *nativeBuf;
- jclass cls;
- jmethodID mid;
- DrmData* p;
- jobject inputStream;
- jfieldID field;
-
- if (NULL == buf) {
- jniThrowNullPointerException(env, "b == null");
- return JNI_DRM_FAILURE;
- }
-
- if (len < 0 || bufOff < 0 || len + bufOff > (*env)->GetArrayLength(env, buf)) {
- jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL);
- return JNI_DRM_FAILURE;
- }
-
- if (mediaOff < 0 || len == 0)
- return JNI_DRM_FAILURE;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return JNI_DRM_FAILURE;
-
- p = getItem(id);
- if (NULL == p)
- return JNI_DRM_FAILURE;
-
- cls = (*env)->GetObjectClass(env, rawContent);
- if (NULL == cls)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, cls, "inData", "Ljava/io/BufferedInputStream;");
- (*env)->DeleteLocalRef(env, cls);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- inputStream = (*env)->GetObjectField(env, rawContent, field);
-
- p->env = env;
- p->pInData = &inputStream;
-
- nativeBuf = (*env)->GetByteArrayElements(env, buf, NULL);
-
- len = SVC_drm_getContent(id, mediaOff, (uint8_t *)nativeBuf + bufOff, len);
-
- (*env)->ReleaseByteArrayElements(env, buf, nativeBuf, 0);
-
- if (DRM_MEDIA_EOF == len)
- return JNI_DRM_EOF;
- if (len <= 0)
- return JNI_DRM_FAILURE;
-
- return len;
-}
-
-/* native interface */
-JNIEXPORT jstring JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeGetContentType
- (JNIEnv * env, jobject rawContent)
-{
- jint id;
- uint8_t contentType[64] = {0};
- jstring str = NULL;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return NULL;
-
- if (DRM_SUCCESS == SVC_drm_getContentType(id, contentType))
- str = (*env)->NewStringUTF(env, (char *)contentType);
-
- return str;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRawContent_nativeGetContentLength
- (JNIEnv * env, jobject rawContent)
-{
- jint id;
- int32_t len;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return JNI_DRM_FAILURE;
-
- len = SVC_drm_getContentLength(id);
-
- if (DRM_UNKNOWN_DATA_LEN == len)
- return JNI_DRM_UNKNOWN_DATA_LEN;
-
- if (0 > len)
- return JNI_DRM_FAILURE;
-
- return len;
-}
-
-/* native interface */
-JNIEXPORT void JNICALL
-Java_android_drm_mobile1_DrmRawContent_finalize
- (JNIEnv * env, jobject rawContent)
-{
- jint id;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return;
-
- removeItem(id);
-
- SVC_drm_closeSession(id);
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRights_nativeGetConstraintInfo
- (JNIEnv * env, jobject rights, jint permission, jobject constraint)
-{
- jclass clazz;
- jfieldID field;
- jstring str;
- uint8_t *nativeStr;
- T_DRM_Rights_Info_Node *pRightsList;
- T_DRM_Rights_Info_Node *pCurNode;
- T_DRM_Constraint_Info *pConstraint;
-
- clazz = (*env)->GetObjectClass(env, rights);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- str = (*env)->GetObjectField(env, rights, field);
-
- nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL);
- if (NULL == nativeStr)
- return JNI_DRM_FAILURE;
-
- /* this means forward-lock rights */
- if (0 == strcmp((char *)nativeStr, "ForwardLock")) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_SUCCESS;
- }
-
- if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList)) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_FAILURE;
- }
-
- pCurNode = searchRightsObject((jbyte *)nativeStr, pRightsList);
- if (NULL == pCurNode) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- SVC_drm_freeRightsInfoList(pRightsList);
- return JNI_DRM_FAILURE;
- }
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
-
- switch (permission) {
- case JNI_DRM_PERMISSION_PLAY:
- pConstraint = &(pCurNode->roInfo.playRights);
- break;
- case JNI_DRM_PERMISSION_DISPLAY:
- pConstraint = &(pCurNode->roInfo.displayRights);
- break;
- case JNI_DRM_PERMISSION_EXECUTE:
- pConstraint = &(pCurNode->roInfo.executeRights);
- break;
- case JNI_DRM_PERMISSION_PRINT:
- pConstraint = &(pCurNode->roInfo.printRights);
- break;
- default:
- SVC_drm_freeRightsInfoList(pRightsList);
- return JNI_DRM_FAILURE;
- }
-
- /* set constraint field */
- if (JNI_DRM_FAILURE == setConstraintFields(env, constraint, pConstraint)) {
- SVC_drm_freeRightsInfoList(pRightsList);
- return JNI_DRM_FAILURE;
- }
-
- SVC_drm_freeRightsInfoList(pRightsList);
-
- return JNI_DRM_SUCCESS;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRights_nativeConsumeRights
- (JNIEnv * env, jobject rights, jint permission)
-{
- jclass clazz;
- jfieldID field;
- jstring str;
- uint8_t *nativeStr;
- int32_t id;
-
- switch (permission) {
- case JNI_DRM_PERMISSION_PLAY:
- permission = DRM_PERMISSION_PLAY;
- break;
- case JNI_DRM_PERMISSION_DISPLAY:
- permission = DRM_PERMISSION_DISPLAY;
- break;
- case JNI_DRM_PERMISSION_EXECUTE:
- permission = DRM_PERMISSION_EXECUTE;
- break;
- case JNI_DRM_PERMISSION_PRINT:
- permission = DRM_PERMISSION_PRINT;
- break;
- default:
- return JNI_DRM_FAILURE;
- }
-
- clazz = (*env)->GetObjectClass(env, rights);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;");
- (*env)->DeleteLocalRef(env, clazz);
-
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- str = (*env)->GetObjectField(env, rights, field);
-
- nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL);
- if (NULL == nativeStr)
- return JNI_DRM_FAILURE;
-
- if (0 == strcmp("ForwardLock", (char *)nativeStr)) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_SUCCESS;
- }
-
- if (DRM_SUCCESS != SVC_drm_updateRights(nativeStr, permission)) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_FAILURE;
- }
-
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
-
- return JNI_DRM_SUCCESS;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRightsManager_nativeInstallDrmRights
- (JNIEnv * env, jobject rightsManager, jobject data, jint len, jint mimeType, jobject rights)
-{
- int32_t id;
- T_DRM_Input_Data inData;
- DrmData* drmInData;
- jclass cls;
- jmethodID mid;
- T_DRM_Rights_Info rightsInfo;
-
- switch (mimeType) {
- case JNI_DRM_MIMETYPE_RIGHTS_XML:
- mimeType = TYPE_DRM_RIGHTS_XML;
- break;
- case JNI_DRM_MIMETYPE_RIGHTS_WBXML:
- mimeType = TYPE_DRM_RIGHTS_WBXML;
- break;
- case JNI_DRM_MIMETYPE_MESSAGE:
- mimeType = TYPE_DRM_MESSAGE;
- break;
- default:
- return JNI_DRM_FAILURE;
- }
-
- drmInData = newItem();
- if (NULL == drmInData)
- return JNI_DRM_FAILURE;
-
- drmInData->env = env;
- drmInData->pInData = &data;
- drmInData->len = len;
-
- inData.inputHandle = (int32_t)drmInData;
- inData.mimeType = mimeType;
- inData.getInputDataLength = getInputStreamDataLength;
- inData.readInputData = readInputStreamData;
-
- memset(&rightsInfo, 0, sizeof(T_DRM_Rights_Info));
- if (DRM_FAILURE == SVC_drm_installRights(inData, &rightsInfo))
- return JNI_DRM_FAILURE;
-
- freeItem(drmInData);
-
- return setRightsFields(env, rights, &rightsInfo);
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRightsManager_nativeQueryRights
- (JNIEnv * env, jobject rightsManager, jobject rawContent, jobject rights)
-{
- jint id;
- T_DRM_Rights_Info rightsInfo;
-
- if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id))
- return JNI_DRM_FAILURE;
-
- memset(&rightsInfo, 0, sizeof(T_DRM_Rights_Info));
- if (DRM_SUCCESS != SVC_drm_getRightsInfo(id, &rightsInfo))
- return JNI_DRM_FAILURE;
-
- return setRightsFields(env, rights, &rightsInfo);
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRightsManager_nativeGetNumOfRights
- (JNIEnv * env, jobject rightsManager)
-{
- T_DRM_Rights_Info_Node *pRightsList;
- T_DRM_Rights_Info_Node *pCurNode;
- int32_t num = 0;
-
- if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList))
- return JNI_DRM_FAILURE;
-
- pCurNode = pRightsList;
- while (pCurNode != NULL) {
- num++;
- pCurNode = pCurNode->next;
- }
-
- SVC_drm_freeRightsInfoList(pRightsList);
-
- return num;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRightsManager_nativeGetRightsList
- (JNIEnv * env, jobject rightsManager, jobjectArray rightsArray, jint num)
-{
- T_DRM_Rights_Info_Node *pRightsList;
- T_DRM_Rights_Info_Node *pCurNode;
- int32_t index;
-
- if (DRM_FAILURE == SVC_drm_viewAllRights(&pRightsList))
- return JNI_DRM_FAILURE;
-
- pCurNode = pRightsList;
- for (index = 0; NULL != pCurNode; index++) {
- jobject rights = (*env)->GetObjectArrayElement(env, rightsArray, index);
- if (NULL == rights)
- break;
-
- if (JNI_DRM_FAILURE == setRightsFields(env, rights, &(pCurNode->roInfo)))
- break;
-
- (*env)->SetObjectArrayElement(env, rightsArray, index, rights);
-
- pCurNode = pCurNode->next;
- }
-
- SVC_drm_freeRightsInfoList(pRightsList);
-
- return index;
-}
-
-/* native interface */
-JNIEXPORT jint JNICALL
-Java_android_drm_mobile1_DrmRightsManager_nativeDeleteRights
- (JNIEnv * env, jobject rightsManager, jobject rights)
-{
- jclass clazz;
- jfieldID field;
- jstring str;
- uint8_t *nativeStr;
-
- clazz = (*env)->GetObjectClass(env, rights);
- if (NULL == clazz)
- return JNI_DRM_FAILURE;
-
- field = (*env)->GetFieldID(env, clazz, "roId", "Ljava/lang/String;");
- if (NULL == field)
- return JNI_DRM_FAILURE;
-
- str = (*env)->GetObjectField(env, rights, field);
-
- nativeStr = (uint8_t *)(*env)->GetStringUTFChars(env, str, NULL);
- if (NULL == nativeStr)
- return JNI_DRM_FAILURE;
-
- if (0 == strcmp("ForwardLock", (char *)nativeStr))
- return JNI_DRM_SUCCESS;
-
- if (DRM_SUCCESS != SVC_drm_deleteRights(nativeStr)) {
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_FAILURE;
- }
-
- (*env)->ReleaseStringUTFChars(env, str, (char *)nativeStr);
- return JNI_DRM_SUCCESS;
-}
-
-/*
- * Table of methods associated with the DrmRawContent class.
- */
-static JNINativeMethod gDrmRawContentMethods[] = {
- /* name, signature, funcPtr */
- {"nativeConstructDrmContent", "(Ljava/io/InputStream;II)I",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeConstructDrmContent},
- {"nativeGetRightsAddress", "()Ljava/lang/String;",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetRightsAddress},
- {"nativeGetDeliveryMethod", "()I",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetDeliveryMethod},
- {"nativeReadContent", "([BIII)I",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeReadContent},
- {"nativeGetContentType", "()Ljava/lang/String;",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetContentType},
- {"nativeGetContentLength", "()I",
- (void*)Java_android_drm_mobile1_DrmRawContent_nativeGetContentLength},
- {"finalize", "()V",
- (void*)Java_android_drm_mobile1_DrmRawContent_finalize},
-};
-
-/*
- * Table of methods associated with the DrmRights class.
- */
-static JNINativeMethod gDrmRightsMethods[] = {
- /* name, signature, funcPtr */
- {"nativeGetConstraintInfo", "(ILandroid/drm/mobile1/DrmConstraintInfo;)I",
- (void*)Java_android_drm_mobile1_DrmRights_nativeGetConstraintInfo},
- {"nativeConsumeRights", "(I)I",
- (void*)Java_android_drm_mobile1_DrmRights_nativeConsumeRights},
-};
-
-/*
- * Table of methods associated with the DrmRightsManager class.
- */
-static JNINativeMethod gDrmRightsManagerMethods[] = {
- /* name, signature, funcPtr */
- {"nativeInstallDrmRights", "(Ljava/io/InputStream;IILandroid/drm/mobile1/DrmRights;)I",
- (void*)Java_android_drm_mobile1_DrmRightsManager_nativeInstallDrmRights},
- {"nativeQueryRights", "(Landroid/drm/mobile1/DrmRawContent;Landroid/drm/mobile1/DrmRights;)I",
- (void*)Java_android_drm_mobile1_DrmRightsManager_nativeQueryRights},
- {"nativeGetNumOfRights", "()I",
- (void*)Java_android_drm_mobile1_DrmRightsManager_nativeGetNumOfRights},
- {"nativeGetRightsList", "([Landroid/drm/mobile1/DrmRights;I)I",
- (void*)Java_android_drm_mobile1_DrmRightsManager_nativeGetRightsList},
- {"nativeDeleteRights", "(Landroid/drm/mobile1/DrmRights;)I",
- (void*)Java_android_drm_mobile1_DrmRightsManager_nativeDeleteRights},
-};
-
-/*
- * Register several native methods for one class.
- */
-static int registerNativeMethods(JNIEnv* env, const char* className,
- JNINativeMethod* gMethods, int numMethods)
-{
- jclass clazz;
-
- clazz = (*env)->FindClass(env, className);
- if (clazz == NULL)
- return JNI_FALSE;
-
- if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0)
- return JNI_FALSE;
-
- return JNI_TRUE;
-}
-
-/*
- * Register native methods for all classes we know about.
- */
-static int registerNatives(JNIEnv* env)
-{
- if (!registerNativeMethods(env, "android/drm/mobile1/DrmRawContent",
- gDrmRawContentMethods, sizeof(gDrmRawContentMethods) / sizeof(gDrmRawContentMethods[0])))
- return JNI_FALSE;
-
- if (!registerNativeMethods(env, "android/drm/mobile1/DrmRights",
- gDrmRightsMethods, sizeof(gDrmRightsMethods) / sizeof(gDrmRightsMethods[0])))
- return JNI_FALSE;
-
- if (!registerNativeMethods(env, "android/drm/mobile1/DrmRightsManager",
- gDrmRightsManagerMethods, sizeof(gDrmRightsManagerMethods) / sizeof(gDrmRightsManagerMethods[0])))
- return JNI_FALSE;
-
- return JNI_TRUE;
-}
-
-jint JNI_OnLoad(JavaVM* vm, void* reserved)
-{
- JNIEnv* env = NULL;
- jint result = -1;
-
- printf("Entering JNI_OnLoad\n");
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK)
- goto bail;
-
- assert(env != NULL);
-
- if (!registerNatives(env))
- goto bail;
-
- /* success -- return valid version number */
- result = JNI_VERSION_1_4;
-
-bail:
- printf("Leaving JNI_OnLoad (result=0x%x)\n", result);
- return result;
-}
diff --git a/media/libdrm/mobile1/src/objmng/drm_api.c b/media/libdrm/mobile1/src/objmng/drm_api.c
deleted file mode 100644
index 232d9f4..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_api.c
+++ /dev/null
@@ -1,1943 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <svc_drm.h>
-#include <drm_inner.h>
-#include <parser_dm.h>
-#include <parser_dcf.h>
-#include <parser_rel.h>
-#include <drm_rights_manager.h>
-#include <drm_time.h>
-#include <drm_decoder.h>
-#include "log.h"
-
-/**
- * Current id.
- */
-static int32_t curID = 0;
-
-/**
- * The header pointer for the session list.
- */
-static T_DRM_Session_Node* sessionTable = NULL;
-
-/**
- * New a session.
- */
-static T_DRM_Session_Node* newSession(T_DRM_Input_Data data)
-{
- T_DRM_Session_Node* s = (T_DRM_Session_Node *)malloc(sizeof(T_DRM_Session_Node));
-
- if (NULL != s) {
- memset(s, 0, sizeof(T_DRM_Session_Node));
-
- s->sessionId = curID++;
- s->inputHandle = data.inputHandle;
- s->mimeType = data.mimeType;
- s->getInputDataLengthFunc = data.getInputDataLength;
- s->readInputDataFunc = data.readInputData;
- s->seekInputDataFunc = data.seekInputData;
- }
-
- return s;
-}
-
-/**
- * Free a session.
- */
-static void freeSession(T_DRM_Session_Node* s)
-{
- if (NULL == s)
- return;
-
- if (NULL != s->rawContent)
- free(s->rawContent);
-
- if (NULL != s->readBuf)
- free(s->readBuf);
-
- if (NULL != s->infoStruct)
- free(s->infoStruct);
-
- free(s);
-}
-
-/**
- * Add a session to list.
- */
-static int32_t addSession(T_DRM_Session_Node* s)
-{
- if (NULL == s)
- return -1;
-
- s->next = sessionTable;
- sessionTable = s;
-
- return s->sessionId;
-}
-
-/**
- * Get a session from the list.
- */
-static T_DRM_Session_Node* getSession(int32_t sessionId)
-{
- T_DRM_Session_Node* s;
-
- if (sessionId < 0 || NULL == sessionTable)
- return NULL;
-
- for (s = sessionTable; s != NULL; s = s->next) {
- if (sessionId == s->sessionId)
- return s;
- }
-
- return NULL;
-}
-
-/**
- * Remove a session from the list.
- */
-static void removeSession(int32_t sessionId)
-{
- T_DRM_Session_Node *curS, *preS;
-
- if (sessionId < 0 || NULL == sessionTable)
- return;
-
- if (sessionId == sessionTable->sessionId) {
- curS = sessionTable;
- sessionTable = curS->next;
- freeSession(curS);
- return;
- }
-
- for (preS = sessionTable; preS->next != NULL; preS = preS->next) {
- if (preS->next->sessionId == sessionId)
- curS = preS->next;
- }
-
- if (NULL == preS->next)
- return;
-
- preS->next = curS->next;
- freeSession(curS);
-}
-
-/**
- * Try to identify the mimetype according the input DRM data.
- */
-static int32_t getMimeType(const uint8_t *buf, int32_t bufLen)
-{
- const uint8_t *p;
-
- if (NULL == buf || bufLen <= 0)
- return TYPE_DRM_UNKNOWN;
-
- p = buf;
-
- /* check if it is DRM Content Format, only check the first field of Version, it must be "0x01" */
- if (0x01 == *p)
- return TYPE_DRM_CONTENT;
-
- /* check if it is DRM Message, only check the first two bytes, it must be the start flag of boundary: "--" */
- if (bufLen >= 2 && '-' == *p && '-' == *(p + 1))
- return TYPE_DRM_MESSAGE;
-
- /* check if it is DRM Rights XML format, only check the first several bytes, it must be: "<o-ex:rights" */
- if (bufLen >= 12 && 0 == strncmp("<o-ex:rights", (char *)p, 12))
- return TYPE_DRM_RIGHTS_XML;
-
- /* check if it is DRM Rights WBXML format, only check the first two bytes, it must be: 0x03, 0x0e */
- if (bufLen >= 2 && 0x03 == *p && 0x0e == *(p + 1))
- return TYPE_DRM_RIGHTS_WBXML;
-
- return TYPE_DRM_UNKNOWN;
-}
-
-static int32_t drm_skipCRLFinB64(const uint8_t* b64Data, int32_t len)
-{
- const uint8_t* p;
- int32_t skipLen = 0;
-
- if (NULL == b64Data || len <= 0)
- return -1;
-
- p = b64Data;
- while (p - b64Data < len) {
- if ('\r' == *p || '\n'== *p)
- skipLen++;
- p++;
- }
-
- return skipLen;
-}
-
-static int32_t drm_scanEndBoundary(const uint8_t* pBuf, int32_t len, uint8_t* const boundary)
-{
- const uint8_t* p;
- int32_t leftLen;
- int32_t boundaryLen;
-
- if (NULL == pBuf || len <=0 || NULL == boundary)
- return -1;
-
- p = pBuf;
- boundaryLen = strlen((char *)boundary) + 2; /* 2 means: '\r' and '\n' */
- leftLen = len - (p - pBuf);
- while (leftLen > 0) {
- if (NULL == (p = memchr(p, '\r', leftLen)))
- break;
-
- leftLen = len - (p - pBuf);
- if (leftLen < boundaryLen)
- return -2; /* here means may be the boundary has been split */
-
- if (('\n' == *(p + 1)) && (0 == memcmp(p + 2, boundary, strlen((char *)boundary))))
- return p - pBuf; /* find the boundary here */
-
- p++;
- leftLen--;
- }
-
- return len; /* no boundary found */
-}
-
-static int32_t drm_getLicenseInfo(T_DRM_Rights* pRights, T_DRM_Rights_Info* licenseInfo)
-{
- if (NULL != licenseInfo && NULL != pRights) {
- strcpy((char *)licenseInfo->roId, (char *)pRights->uid);
-
- if (1 == pRights->bIsDisplayable) {
- licenseInfo->displayRights.indicator = pRights->DisplayConstraint.Indicator;
- licenseInfo->displayRights.count =
- pRights->DisplayConstraint.Count;
- licenseInfo->displayRights.startDate =
- pRights->DisplayConstraint.StartTime.date;
- licenseInfo->displayRights.startTime =
- pRights->DisplayConstraint.StartTime.time;
- licenseInfo->displayRights.endDate =
- pRights->DisplayConstraint.EndTime.date;
- licenseInfo->displayRights.endTime =
- pRights->DisplayConstraint.EndTime.time;
- licenseInfo->displayRights.intervalDate =
- pRights->DisplayConstraint.Interval.date;
- licenseInfo->displayRights.intervalTime =
- pRights->DisplayConstraint.Interval.time;
- }
- if (1 == pRights->bIsPlayable) {
- licenseInfo->playRights.indicator = pRights->PlayConstraint.Indicator;
- licenseInfo->playRights.count = pRights->PlayConstraint.Count;
- licenseInfo->playRights.startDate =
- pRights->PlayConstraint.StartTime.date;
- licenseInfo->playRights.startTime =
- pRights->PlayConstraint.StartTime.time;
- licenseInfo->playRights.endDate =
- pRights->PlayConstraint.EndTime.date;
- licenseInfo->playRights.endTime =
- pRights->PlayConstraint.EndTime.time;
- licenseInfo->playRights.intervalDate =
- pRights->PlayConstraint.Interval.date;
- licenseInfo->playRights.intervalTime =
- pRights->PlayConstraint.Interval.time;
- }
- if (1 == pRights->bIsExecuteable) {
- licenseInfo->executeRights.indicator = pRights->ExecuteConstraint.Indicator;
- licenseInfo->executeRights.count =
- pRights->ExecuteConstraint.Count;
- licenseInfo->executeRights.startDate =
- pRights->ExecuteConstraint.StartTime.date;
- licenseInfo->executeRights.startTime =
- pRights->ExecuteConstraint.StartTime.time;
- licenseInfo->executeRights.endDate =
- pRights->ExecuteConstraint.EndTime.date;
- licenseInfo->executeRights.endTime =
- pRights->ExecuteConstraint.EndTime.time;
- licenseInfo->executeRights.intervalDate =
- pRights->ExecuteConstraint.Interval.date;
- licenseInfo->executeRights.intervalTime =
- pRights->ExecuteConstraint.Interval.time;
- }
- if (1 == pRights->bIsPrintable) {
- licenseInfo->printRights.indicator = pRights->PrintConstraint.Indicator;
- licenseInfo->printRights.count =
- pRights->PrintConstraint.Count;
- licenseInfo->printRights.startDate =
- pRights->PrintConstraint.StartTime.date;
- licenseInfo->printRights.startTime =
- pRights->PrintConstraint.StartTime.time;
- licenseInfo->printRights.endDate =
- pRights->PrintConstraint.EndTime.date;
- licenseInfo->printRights.endTime =
- pRights->PrintConstraint.EndTime.time;
- licenseInfo->printRights.intervalDate =
- pRights->PrintConstraint.Interval.date;
- licenseInfo->printRights.intervalTime =
- pRights->PrintConstraint.Interval.time;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-static int32_t drm_addRightsNodeToList(T_DRM_Rights_Info_Node **ppRightsHeader,
- T_DRM_Rights_Info_Node *pInputRightsNode)
-{
- T_DRM_Rights_Info_Node *pRightsNode;
-
- if (NULL == ppRightsHeader || NULL == pInputRightsNode)
- return FALSE;
-
- pRightsNode = (T_DRM_Rights_Info_Node *)malloc(sizeof(T_DRM_Rights_Info_Node));
- if (NULL == pRightsNode)
- return FALSE;
-
- memcpy(pRightsNode, pInputRightsNode, sizeof(T_DRM_Rights_Info_Node));
- pRightsNode->next = NULL;
-
- /* this means it is the first node */
- if (NULL == *ppRightsHeader)
- *ppRightsHeader = pRightsNode;
- else {
- T_DRM_Rights_Info_Node *pTmp;
-
- pTmp = *ppRightsHeader;
- while (NULL != pTmp->next)
- pTmp = pTmp->next;
-
- pTmp->next = pRightsNode;
- }
- return TRUE;
-}
-
-static int32_t drm_startConsumeRights(int32_t * bIsXXable,
- T_DRM_Rights_Constraint * XXConstraint,
- int32_t * writeFlag)
-{
- T_DB_TIME_SysTime curDateTime;
- T_DRM_DATETIME CurrentTime;
- uint8_t countFlag = 0;
-
- memset(&CurrentTime, 0, sizeof(T_DRM_DATETIME));
-
- if (NULL == bIsXXable || 0 == *bIsXXable || NULL == XXConstraint || NULL == writeFlag)
- return DRM_FAILURE;
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_NO_CONSTRAINT)) /* Have utter right? */
- return DRM_SUCCESS;
-
- *bIsXXable = 0; /* Assume have invalid rights at first */
- *writeFlag = 0;
-
- if (0 != (XXConstraint->Indicator & (DRM_START_TIME_CONSTRAINT | DRM_END_TIME_CONSTRAINT | DRM_INTERVAL_CONSTRAINT))) {
- DRM_time_getSysTime(&curDateTime);
-
- if (-1 == drm_checkDate(curDateTime.year, curDateTime.month, curDateTime.day,
- curDateTime.hour, curDateTime.min, curDateTime.sec))
- return DRM_FAILURE;
-
- YMD_HMS_2_INT(curDateTime.year, curDateTime.month, curDateTime.day,
- CurrentTime.date, curDateTime.hour, curDateTime.min,
- curDateTime.sec, CurrentTime.time);
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_COUNT_CONSTRAINT)) { /* Have count restrict? */
- *writeFlag = 1;
- /* If it has only one time for use, after use this function, we will delete this rights */
- if (XXConstraint->Count <= 0) {
- XXConstraint->Indicator &= ~DRM_COUNT_CONSTRAINT;
- return DRM_RIGHTS_EXPIRED;
- }
-
- if (XXConstraint->Count-- <= 1) {
- XXConstraint->Indicator &= ~DRM_COUNT_CONSTRAINT;
- countFlag = 1;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_START_TIME_CONSTRAINT)) {
- if (XXConstraint->StartTime.date > CurrentTime.date ||
- (XXConstraint->StartTime.date == CurrentTime.date &&
- XXConstraint->StartTime.time >= CurrentTime.time)) {
- *bIsXXable = 1;
- return DRM_RIGHTS_PENDING;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_END_TIME_CONSTRAINT)) { /* Have end time restrict? */
- if (XXConstraint->EndTime.date < CurrentTime.date ||
- (XXConstraint->EndTime.date == CurrentTime.date &&
- XXConstraint->EndTime.time <= CurrentTime.time)) {
- *writeFlag = 1;
- XXConstraint->Indicator &= ~DRM_END_TIME_CONSTRAINT;
- return DRM_RIGHTS_EXPIRED;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_INTERVAL_CONSTRAINT)) { /* Have interval time restrict? */
- int32_t year, mon, day, hour, min, sec, date, time;
- int32_t ret;
-
- XXConstraint->Indicator |= DRM_END_TIME_CONSTRAINT;
- XXConstraint->Indicator &= ~DRM_INTERVAL_CONSTRAINT; /* Write off interval right */
- *writeFlag = 1;
-
- if (XXConstraint->Interval.date == 0
- && XXConstraint->Interval.time == 0) {
- return DRM_RIGHTS_EXPIRED;
- }
- date = CurrentTime.date + XXConstraint->Interval.date;
- time = CurrentTime.time + XXConstraint->Interval.time;
- INT_2_YMD_HMS(year, mon, day, date, hour, min, sec, time);
-
- if (sec > 59) {
- min += sec / 60;
- sec %= 60;
- }
- if (min > 59) {
- hour += min / 60;
- min %= 60;
- }
- if (hour > 23) {
- day += hour / 24;
- hour %= 24;
- }
- if (day > 31) {
- mon += day / 31;
- day %= 31;
- }
- if (mon > 12) {
- year += mon / 12;
- mon %= 12;
- }
- if (day > (ret = drm_monthDays(year, mon))) {
- day -= ret;
- mon++;
- if (mon > 12) {
- mon -= 12;
- year++;
- }
- }
- YMD_HMS_2_INT(year, mon, day, XXConstraint->EndTime.date, hour,
- min, sec, XXConstraint->EndTime.time);
- }
-
- if (1 != countFlag)
- *bIsXXable = 1; /* Can go here ,so right must be valid */
- return DRM_SUCCESS;
-}
-
-static int32_t drm_startCheckRights(int32_t * bIsXXable,
- T_DRM_Rights_Constraint * XXConstraint)
-{
- T_DB_TIME_SysTime curDateTime;
- T_DRM_DATETIME CurrentTime;
-
- memset(&CurrentTime, 0, sizeof(T_DRM_DATETIME));
-
- if (NULL == bIsXXable || 0 == *bIsXXable || NULL == XXConstraint)
- return DRM_FAILURE;
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_NO_CONSTRAINT)) /* Have utter right? */
- return DRM_SUCCESS;
-
- *bIsXXable = 0; /* Assume have invalid rights at first */
-
- if (0 != (XXConstraint->Indicator & (DRM_START_TIME_CONSTRAINT | DRM_END_TIME_CONSTRAINT))) {
- DRM_time_getSysTime(&curDateTime);
-
- if (-1 == drm_checkDate(curDateTime.year, curDateTime.month, curDateTime.day,
- curDateTime.hour, curDateTime.min, curDateTime.sec))
- return DRM_FAILURE;
-
- YMD_HMS_2_INT(curDateTime.year, curDateTime.month, curDateTime.day,
- CurrentTime.date, curDateTime.hour, curDateTime.min,
- curDateTime.sec, CurrentTime.time);
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_COUNT_CONSTRAINT)) { /* Have count restrict? */
- if (XXConstraint->Count <= 0) {
- XXConstraint->Indicator &= ~DRM_COUNT_CONSTRAINT;
- return DRM_RIGHTS_EXPIRED;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_START_TIME_CONSTRAINT)) {
- if (XXConstraint->StartTime.date > CurrentTime.date ||
- (XXConstraint->StartTime.date == CurrentTime.date &&
- XXConstraint->StartTime.time >= CurrentTime.time)) {
- *bIsXXable = 1;
- return DRM_RIGHTS_PENDING;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_END_TIME_CONSTRAINT)) { /* Have end time restrict? */
- if (XXConstraint->EndTime.date < CurrentTime.date ||
- (XXConstraint->EndTime.date == CurrentTime.date &&
- XXConstraint->EndTime.time <= CurrentTime.time)) {
- XXConstraint->Indicator &= ~DRM_END_TIME_CONSTRAINT;
- return DRM_RIGHTS_EXPIRED;
- }
- }
-
- if (0 != (uint8_t)(XXConstraint->Indicator & DRM_INTERVAL_CONSTRAINT)) { /* Have interval time restrict? */
- if (XXConstraint->Interval.date == 0 && XXConstraint->Interval.time == 0) {
- XXConstraint->Indicator &= ~DRM_INTERVAL_CONSTRAINT;
- return DRM_RIGHTS_EXPIRED;
- }
- }
-
- *bIsXXable = 1;
- return DRM_SUCCESS;
-}
-
-int32_t drm_checkRoAndUpdate(int32_t id, int32_t permission)
-{
- int32_t writeFlag = 0;
- int32_t roAmount;
- int32_t validRoAmount = 0;
- int32_t flag = DRM_FAILURE;
- int32_t i, j;
- T_DRM_Rights *pRo;
- T_DRM_Rights *pCurRo;
- int32_t * pNumOfPriority;
- int32_t iNum;
- T_DRM_Rights_Constraint * pCurConstraint;
- T_DRM_Rights_Constraint * pCompareConstraint;
- int priority[8] = {1, 2, 4, 3, 8, 6, 7, 5};
-
- if (FALSE == drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT))
- return DRM_FAILURE;
-
- validRoAmount = roAmount;
- if (roAmount < 1)
- return DRM_NO_RIGHTS;
-
- pRo = malloc(roAmount * sizeof(T_DRM_Rights));
- pCurRo = pRo;
- if (NULL == pRo)
- return DRM_FAILURE;
-
- if (FALSE == drm_writeOrReadInfo(id, pRo, &roAmount, GET_ALL_RO)) {
- free(pRo);
- return DRM_FAILURE;
- }
-
- /** check the right priority */
- pNumOfPriority = malloc(sizeof(int32_t) * roAmount);
- for(i = 0; i < roAmount; i++) {
- iNum = roAmount - 1;
- for(j = 0; j < roAmount; j++) {
- if(i == j)
- continue;
- switch(permission) {
- case DRM_PERMISSION_PLAY:
- pCurConstraint = &pRo[i].PlayConstraint;
- pCompareConstraint = &pRo[j].PlayConstraint;
- break;
- case DRM_PERMISSION_DISPLAY:
- pCurConstraint = &pRo[i].DisplayConstraint;
- pCompareConstraint = &pRo[j].DisplayConstraint;
- break;
- case DRM_PERMISSION_EXECUTE:
- pCurConstraint = &pRo[i].ExecuteConstraint;
- pCompareConstraint = &pRo[j].ExecuteConstraint;
- break;
- case DRM_PERMISSION_PRINT:
- pCurConstraint = &pRo[i].PrintConstraint;
- pCompareConstraint = &pRo[j].PrintConstraint;
- break;
- default:
- free(pRo);
- free(pNumOfPriority);
- return DRM_FAILURE;
- }
-
- /**get priority by Indicator*/
- if(0 == (pCurConstraint->Indicator & DRM_NO_CONSTRAINT) &&
- 0 == (pCompareConstraint->Indicator & DRM_NO_CONSTRAINT)) {
- int num1, num2;
- num1 = (pCurConstraint->Indicator & 0x0e) >> 1;
- num2 = (pCompareConstraint->Indicator & 0x0e) >> 1;
- if(priority[num1] > priority[num2]) {
- iNum--;
- continue;
- } else if(priority[pCurConstraint->Indicator] < priority[pCompareConstraint->Indicator])
- continue;
- } else if(pCurConstraint->Indicator > pCompareConstraint->Indicator) {
- iNum--;
- continue;
- } else if(pCurConstraint->Indicator < pCompareConstraint->Indicator)
- continue;
-
- if(0 != (pCurConstraint->Indicator & DRM_END_TIME_CONSTRAINT)) {
- if(pCurConstraint->EndTime.date < pCompareConstraint->EndTime.date) {
- iNum--;
- continue;
- } else if(pCurConstraint->EndTime.date > pCompareConstraint->EndTime.date)
- continue;
-
- if(pCurConstraint->EndTime.time < pCompareConstraint->EndTime.time) {
- iNum--;
- continue;
- } else if(pCurConstraint->EndTime.date > pCompareConstraint->EndTime.date)
- continue;
- }
-
- if(0 != (pCurConstraint->Indicator & DRM_INTERVAL_CONSTRAINT)) {
- if(pCurConstraint->Interval.date < pCompareConstraint->Interval.date) {
- iNum--;
- continue;
- } else if(pCurConstraint->Interval.date > pCompareConstraint->Interval.date)
- continue;
-
- if(pCurConstraint->Interval.time < pCompareConstraint->Interval.time) {
- iNum--;
- continue;
- } else if(pCurConstraint->Interval.time > pCompareConstraint->Interval.time)
- continue;
- }
-
- if(0 != (pCurConstraint->Indicator & DRM_COUNT_CONSTRAINT)) {
- if(pCurConstraint->Count < pCompareConstraint->Count) {
- iNum--;
- continue;
- } else if(pCurConstraint->Count > pCompareConstraint->Count)
- continue;
- }
-
- if(i < j)
- iNum--;
- }
- pNumOfPriority[iNum] = i;
- }
-
- for (i = 0; i < validRoAmount; i++) {
- /** check the right priority */
- if (pNumOfPriority[i] >= validRoAmount)
- break;
-
- pCurRo = pRo + pNumOfPriority[i];
-
- switch (permission) {
- case DRM_PERMISSION_PLAY:
- flag =
- drm_startConsumeRights(&pCurRo->bIsPlayable,
- &pCurRo->PlayConstraint, &writeFlag);
- break;
- case DRM_PERMISSION_DISPLAY:
- flag =
- drm_startConsumeRights(&pCurRo->bIsDisplayable,
- &pCurRo->DisplayConstraint,
- &writeFlag);
- break;
- case DRM_PERMISSION_EXECUTE:
- flag =
- drm_startConsumeRights(&pCurRo->bIsExecuteable,
- &pCurRo->ExecuteConstraint,
- &writeFlag);
- break;
- case DRM_PERMISSION_PRINT:
- flag =
- drm_startConsumeRights(&pCurRo->bIsPrintable,
- &pCurRo->PrintConstraint, &writeFlag);
- break;
- default:
- free(pNumOfPriority);
- free(pRo);
- return DRM_FAILURE;
- }
-
- /* Here confirm the valid RO amount and set the writeFlag */
- if (0 == pCurRo->bIsPlayable && 0 == pCurRo->bIsDisplayable &&
- 0 == pCurRo->bIsExecuteable && 0 == pCurRo->bIsPrintable) {
- int32_t iCurPri;
-
- /** refresh the right priority */
- iCurPri = pNumOfPriority[i];
- for(j = i; j < validRoAmount - 1; j++)
- pNumOfPriority[j] = pNumOfPriority[j + 1];
-
- if(iCurPri != validRoAmount - 1) {
- memcpy(pCurRo, pRo + validRoAmount - 1,
- sizeof(T_DRM_Rights));
- for(j = 0; j < validRoAmount -1; j++) {
- if(validRoAmount - 1 == pNumOfPriority[j])
- pNumOfPriority[j] = iCurPri;
- }
- }
-
- /* Here means it is not the last one RO, so the invalid RO should be deleted */
- writeFlag = 1;
- validRoAmount--; /* If current right is invalid */
- i--;
- }
-
- /* If the flag is TRUE, this means: we have found a valid RO, so break, no need to check other RO */
- if (DRM_SUCCESS == flag)
- break;
- }
-
- if (1 == writeFlag) {
- /* Delete the *.info first */
- //drm_removeIdInfoFile(id);
-
- if (FALSE == drm_writeOrReadInfo(id, pRo, &validRoAmount, SAVE_ALL_RO))
- flag = DRM_FAILURE;
- }
-
- free(pNumOfPriority);
- free(pRo);
- return flag;
-}
-
-
-/* see svc_drm.h */
-int32_t SVC_drm_installRights(T_DRM_Input_Data data, T_DRM_Rights_Info* pRightsInfo)
-{
- uint8_t *buf;
- int32_t dataLen, bufLen;
- T_DRM_Rights rights;
-
- if (0 == data.inputHandle)
- return DRM_RIGHTS_DATA_INVALID;
-
- /* Get input rights data length */
- dataLen = data.getInputDataLength(data.inputHandle);
- if (dataLen <= 0)
- return DRM_RIGHTS_DATA_INVALID;
-
- /* Check if the length is larger than DRM max malloc length */
- if (dataLen > DRM_MAX_MALLOC_LEN)
- bufLen = DRM_MAX_MALLOC_LEN;
- else
- bufLen = dataLen;
-
- buf = (uint8_t *)malloc(bufLen);
- if (NULL == buf)
- return DRM_FAILURE;
-
- /* Read input data to buffer */
- if (0 >= data.readInputData(data.inputHandle, buf, bufLen)) {
- free(buf);
- return DRM_RIGHTS_DATA_INVALID;
- }
-
- /* if the input mime type is unknown, DRM engine will try to recognize it. */
- if (TYPE_DRM_UNKNOWN == data.mimeType)
- data.mimeType = getMimeType(buf, bufLen);
-
- switch(data.mimeType) {
- case TYPE_DRM_MESSAGE: /* in case of Combined Delivery, extract the rights part to install */
- {
- T_DRM_DM_Info dmInfo;
-
- memset(&dmInfo, 0, sizeof(T_DRM_DM_Info));
- if (FALSE == drm_parseDM(buf, bufLen, &dmInfo)) {
- free(buf);
- return DRM_RIGHTS_DATA_INVALID;
- }
-
- /* if it is not Combined Delivery, it can not use to "SVC_drm_installRights" */
- if (COMBINED_DELIVERY != dmInfo.deliveryType || dmInfo.rightsOffset <= 0 || dmInfo.rightsLen <= 0) {
- free(buf);
- return DRM_RIGHTS_DATA_INVALID;
- }
-
- memset(&rights, 0, sizeof(T_DRM_Rights));
- if (FALSE == drm_relParser(buf + dmInfo.rightsOffset, dmInfo.rightsLen, TYPE_DRM_RIGHTS_XML, &rights)) {
- free(buf);
- return DRM_RIGHTS_DATA_INVALID;
- }
- }
- break;
- case TYPE_DRM_RIGHTS_XML:
- case TYPE_DRM_RIGHTS_WBXML:
- memset(&rights, 0, sizeof(T_DRM_Rights));
- if (FALSE == drm_relParser(buf, bufLen, data.mimeType, &rights)) {
- free(buf);
- return DRM_RIGHTS_DATA_INVALID;
- }
- break;
- case TYPE_DRM_CONTENT: /* DCF should not using "SVC_drm_installRights", it should be used to open a session. */
- case TYPE_DRM_UNKNOWN:
- default:
- free(buf);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- free(buf);
-
- /* append the rights information to DRM engine storage */
- if (FALSE == drm_appendRightsInfo(&rights))
- return DRM_FAILURE;
-
- memset(pRightsInfo, 0, sizeof(T_DRM_Rights_Info));
- drm_getLicenseInfo(&rights, pRightsInfo);
-
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_openSession(T_DRM_Input_Data data)
-{
- int32_t session;
- int32_t dataLen;
- T_DRM_Session_Node* s;
-
- if (0 == data.inputHandle)
- return DRM_MEDIA_DATA_INVALID;
-
- /* Get input data length */
- dataLen = data.getInputDataLength(data.inputHandle);
- if (dataLen <= 0)
- return DRM_MEDIA_DATA_INVALID;
-
- s = newSession(data);
- if (NULL == s)
- return DRM_FAILURE;
-
- /* Check if the length is larger than DRM max malloc length */
- if (dataLen > DRM_MAX_MALLOC_LEN)
- s->rawContentLen = DRM_MAX_MALLOC_LEN;
- else
- s->rawContentLen = dataLen;
-
- s->rawContent = (uint8_t *)malloc(s->rawContentLen);
- if (NULL == s->rawContent)
- return DRM_FAILURE;
-
- /* Read input data to buffer */
- if (0 >= data.readInputData(data.inputHandle, s->rawContent, s->rawContentLen)) {
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- /* if the input mime type is unknown, DRM engine will try to recognize it. */
- if (TYPE_DRM_UNKNOWN == data.mimeType)
- data.mimeType = getMimeType(s->rawContent, s->rawContentLen);
-
- switch(data.mimeType) {
- case TYPE_DRM_MESSAGE:
- {
- T_DRM_DM_Info dmInfo;
-
- memset(&dmInfo, 0, sizeof(T_DRM_DM_Info));
- if (FALSE == drm_parseDM(s->rawContent, s->rawContentLen, &dmInfo)) {
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- s->deliveryMethod = dmInfo.deliveryType;
-
- if (SEPARATE_DELIVERY_FL == s->deliveryMethod)
- s->contentLength = DRM_UNKNOWN_DATA_LEN;
- else
- s->contentLength = dmInfo.contentLen;
-
- s->transferEncoding = dmInfo.transferEncoding;
- s->contentOffset = dmInfo.contentOffset;
- s->bEndData = FALSE;
- strcpy((char *)s->contentType, (char *)dmInfo.contentType);
- strcpy((char *)s->contentID, (char *)dmInfo.contentID);
-
- if (SEPARATE_DELIVERY_FL == s->deliveryMethod) {
- s->infoStruct = (T_DRM_Dcf_Node *)malloc(sizeof(T_DRM_Dcf_Node));
- if (NULL == s->infoStruct)
- return DRM_FAILURE;
- memset(s->infoStruct, 0, sizeof(T_DRM_Dcf_Node));
-
- ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength = dmInfo.contentLen;
- strcpy((char *)((T_DRM_Dcf_Node *)(s->infoStruct))->rightsIssuer, (char *)dmInfo.rightsIssuer);
- break;
- }
-
- if (DRM_MESSAGE_CODING_BASE64 == s->transferEncoding) {
- s->infoStruct = (T_DRM_DM_Base64_Node *)malloc(sizeof(T_DRM_DM_Base64_Node));
- if (NULL == s->infoStruct)
- return DRM_FAILURE;
- memset(s->infoStruct, 0, sizeof(T_DRM_DM_Base64_Node));
-
- strcpy((char *)((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary, (char *)dmInfo.boundary);
- } else {
- s->infoStruct = (T_DRM_DM_Binary_Node *)malloc(sizeof(T_DRM_DM_Binary_Node));
- if (NULL == s->infoStruct)
- return DRM_FAILURE;
- memset(s->infoStruct, 0, sizeof(T_DRM_DM_Binary_Node));
-
- strcpy((char *)((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary, (char *)dmInfo.boundary);
- }
-
-
- if (DRM_MESSAGE_CODING_BASE64 == s->transferEncoding) {
- if (s->contentLength > 0) {
- int32_t encLen, decLen;
-
- encLen = s->contentLength;
- decLen = encLen / DRM_B64_ENC_BLOCK * DRM_B64_DEC_BLOCK;
-
- decLen = drm_decodeBase64(s->rawContent, decLen, s->rawContent + s->contentOffset, &encLen);
- s->contentLength = decLen;
- } else {
- int32_t encLen = DRM_MAX_MALLOC_LEN - s->contentOffset, decLen;
- int32_t skipLen, needBytes, i;
- uint8_t *pStart;
- int32_t res, bFoundBoundary = FALSE;
-
- pStart = s->rawContent + s->contentOffset;
- if (-1 == (skipLen = drm_skipCRLFinB64(pStart, encLen))) {
- freeSession(s);
- return DRM_FAILURE;
- }
-
- needBytes = DRM_B64_ENC_BLOCK - ((encLen - skipLen) % DRM_B64_ENC_BLOCK);
- if (needBytes < DRM_B64_ENC_BLOCK) {
- s->rawContent = (uint8_t *)realloc(s->rawContent, DRM_MAX_MALLOC_LEN + needBytes);
- if (NULL == s->rawContent) {
- freeSession(s);
- return DRM_FAILURE;
- }
-
- i = 0;
- while (i < needBytes) {
- if (-1 != data.readInputData(data.inputHandle, s->rawContent + DRM_MAX_MALLOC_LEN + i, 1)) {
- if ('\r' == *(s->rawContent + DRM_MAX_MALLOC_LEN + i) || '\n' == *(s->rawContent + DRM_MAX_MALLOC_LEN + i))
- continue;
- i++;
- } else
- break;
- }
- encLen += i;
- }
-
- res = drm_scanEndBoundary(pStart, encLen, ((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary);
- if (-1 == res) {
- freeSession(s);
- return DRM_FAILURE;
- }
- if (-2 == res) { /* may be there is a boundary */
- int32_t boundaryLen, leftLen, readBytes;
- char* pTmp = memrchr(pStart, '\r', encLen);
-
- if (NULL == pTmp) {
- freeSession(s);
- return DRM_FAILURE; /* conflict */
- }
- boundaryLen = strlen((char *)((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary) + 2; /* 2 means: '\r''\n' */
- s->readBuf = (uint8_t *)malloc(boundaryLen);
- if (NULL == s->readBuf) {
- freeSession(s);
- return DRM_FAILURE;
- }
- s->readBufOff = encLen - ((uint8_t *)pTmp - pStart);
- s->readBufLen = boundaryLen - s->readBufOff;
- memcpy(s->readBuf, pTmp, s->readBufOff);
- readBytes = data.readInputData(data.inputHandle, s->readBuf + s->readBufOff, s->readBufLen);
- if (-1 == readBytes || readBytes < s->readBufLen) {
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- if (0 == drm_scanEndBoundary(s->readBuf, boundaryLen, ((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary)) {
- encLen = (uint8_t *)pTmp - pStart; /* yes, it is the end boundary */
- bFoundBoundary = TRUE;
- }
- } else {
- if (res >= 0 && res < encLen) {
- encLen = res;
- bFoundBoundary = TRUE;
- }
- }
-
- decLen = encLen / DRM_B64_ENC_BLOCK * DRM_B64_DEC_BLOCK;
- decLen = drm_decodeBase64(s->rawContent, decLen, s->rawContent + s->contentOffset, &encLen);
- ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeDataLen = decLen;
- if (bFoundBoundary)
- s->contentLength = decLen;
- }
- } else {
- /* binary data */
- if (DRM_UNKNOWN_DATA_LEN == s->contentLength) {
- /* try to check whether there is boundary may be split */
- int32_t res, binContentLen;
- uint8_t* pStart;
- int32_t bFoundBoundary = FALSE;
-
- pStart = s->rawContent + s->contentOffset;
- binContentLen = s->rawContentLen - s->contentOffset;
- res = drm_scanEndBoundary(pStart, binContentLen, ((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary);
-
- if (-1 == res) {
- freeSession(s);
- return DRM_FAILURE;
- }
-
- if (-2 == res) { /* may be the boundary is split */
- int32_t boundaryLen, leftLen, readBytes;
- char* pTmp = memrchr(pStart, '\r', binContentLen);
-
- if (NULL == pTmp) {
- freeSession(s);
- return DRM_FAILURE; /* conflict */
- }
-
- boundaryLen = strlen((char *)((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary) + 2; /* 2 means: '\r''\n' */
- s->readBuf = (uint8_t *)malloc(boundaryLen);
- if (NULL == s->readBuf) {
- freeSession(s);
- return DRM_FAILURE;
- }
- s->readBufOff = binContentLen - ((uint8_t *)pTmp - pStart);
- s->readBufLen = boundaryLen - s->readBufOff;
- memcpy(s->readBuf, pTmp, s->readBufOff);
- readBytes = data.readInputData(data.inputHandle, s->readBuf + s->readBufOff, s->readBufLen);
- if (-1 == readBytes || readBytes < s->readBufLen) {
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- if (0 == drm_scanEndBoundary(s->readBuf, boundaryLen, ((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary)) {
- binContentLen = (uint8_t *)pTmp - pStart; /* yes, it is the end boundary */
- bFoundBoundary = TRUE;
- }
- } else {
- if (res >= 0 && res < binContentLen) {
- binContentLen = res;
- bFoundBoundary = TRUE;
- }
- }
-
- if (bFoundBoundary)
- s->contentLength = binContentLen;
- }
- }
- }
- break;
- case TYPE_DRM_CONTENT:
- {
- T_DRM_DCF_Info dcfInfo;
- uint8_t* pEncData = NULL;
-
- memset(&dcfInfo, 0, sizeof(T_DRM_DCF_Info));
- if (FALSE == drm_dcfParser(s->rawContent, s->rawContentLen, &dcfInfo, &pEncData)) {
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- s->infoStruct = (T_DRM_Dcf_Node *)malloc(sizeof(T_DRM_Dcf_Node));
- if (NULL == s->infoStruct)
- return DRM_FAILURE;
- memset(s->infoStruct, 0, sizeof(T_DRM_Dcf_Node));
-
- s->deliveryMethod = SEPARATE_DELIVERY;
- s->contentLength = dcfInfo.DecryptedDataLen;
- ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength = dcfInfo.EncryptedDataLen;
- s->contentOffset = pEncData - s->rawContent;
- strcpy((char *)s->contentType, (char *)dcfInfo.ContentType);
- strcpy((char *)s->contentID, (char *)dcfInfo.ContentURI);
- strcpy((char *)((T_DRM_Dcf_Node *)(s->infoStruct))->rightsIssuer, (char *)dcfInfo.Rights_Issuer);
- }
- break;
- case TYPE_DRM_RIGHTS_XML: /* rights object should using "SVC_drm_installRights", it can not open a session */
- case TYPE_DRM_RIGHTS_WBXML: /* rights object should using "SVC_drm_installRights", it can not open a session */
- case TYPE_DRM_UNKNOWN:
- default:
- freeSession(s);
- return DRM_MEDIA_DATA_INVALID;
- }
-
- if ((SEPARATE_DELIVERY_FL == s->deliveryMethod || SEPARATE_DELIVERY == s->deliveryMethod) &&
- s->contentOffset + ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength <= DRM_MAX_MALLOC_LEN) {
- uint8_t keyValue[DRM_KEY_LEN];
- uint8_t lastDcfBuf[DRM_TWO_AES_BLOCK_LEN];
- int32_t seekPos, moreBytes;
-
- if (TRUE == drm_getKey(s->contentID, keyValue)) {
- seekPos = s->contentOffset + ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength - DRM_TWO_AES_BLOCK_LEN;
- memcpy(lastDcfBuf, s->rawContent + seekPos, DRM_TWO_AES_BLOCK_LEN);
-
- if (TRUE == drm_updateDcfDataLen(lastDcfBuf, keyValue, &moreBytes)) {
- s->contentLength = ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength;
- s->contentLength -= moreBytes;
- }
- }
- }
-
- session = addSession(s);
- if (-1 == session)
- return DRM_FAILURE;
-
- return session;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getDeliveryMethod(int32_t session)
-{
- T_DRM_Session_Node* s;
-
- if (session < 0)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- return s->deliveryMethod;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getContentType(int32_t session, uint8_t* mediaType)
-{
- T_DRM_Session_Node* s;
-
- if (session < 0 || NULL == mediaType)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- strcpy((char *)mediaType, (char *)s->contentType);
-
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_checkRights(int32_t session, int32_t permission)
-{
- T_DRM_Session_Node* s;
- int32_t id;
- T_DRM_Rights *pRo, *pCurRo;
- int32_t roAmount;
- int32_t i;
- int32_t res = DRM_FAILURE;
-
- if (session < 0)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- /* if it is Forward-Lock cases, check it and return directly */
- if (FORWARD_LOCK == s->deliveryMethod) {
- if (DRM_PERMISSION_PLAY == permission ||
- DRM_PERMISSION_DISPLAY == permission ||
- DRM_PERMISSION_EXECUTE == permission ||
- DRM_PERMISSION_PRINT == permission)
- return DRM_SUCCESS;
-
- return DRM_FAILURE;
- }
-
- /* if try to forward, only DCF can be forwarded */
- if (DRM_PERMISSION_FORWARD == permission) {
- if (SEPARATE_DELIVERY == s->deliveryMethod)
- return DRM_SUCCESS;
-
- return DRM_FAILURE;
- }
-
- /* The following will check CD or SD other permissions */
- if (FALSE == drm_readFromUidTxt(s->contentID, &id, GET_ID))
- return DRM_FAILURE;
-
- drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT);
- if (roAmount <= 0)
- return DRM_FAILURE;
-
- pRo = malloc(roAmount * sizeof(T_DRM_Rights));
- if (NULL == pRo)
- return DRM_FAILURE;
-
- drm_writeOrReadInfo(id, pRo, &roAmount, GET_ALL_RO);
-
- pCurRo = pRo;
- for (i = 0; i < roAmount; i++) {
- switch (permission) {
- case DRM_PERMISSION_PLAY:
- res = drm_startCheckRights(&(pCurRo->bIsPlayable), &(pCurRo->PlayConstraint));
- break;
- case DRM_PERMISSION_DISPLAY:
- res = drm_startCheckRights(&(pCurRo->bIsDisplayable), &(pCurRo->DisplayConstraint));
- break;
- case DRM_PERMISSION_EXECUTE:
- res = drm_startCheckRights(&(pCurRo->bIsExecuteable), &(pCurRo->ExecuteConstraint));
- break;
- case DRM_PERMISSION_PRINT:
- res = drm_startCheckRights(&(pCurRo->bIsPrintable), &(pCurRo->PrintConstraint));
- break;
- default:
- free(pRo);
- return DRM_FAILURE;
- }
-
- if (DRM_SUCCESS == res) {
- free(pRo);
- return DRM_SUCCESS;
- }
- pCurRo++;
- }
-
- free(pRo);
- return res;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_consumeRights(int32_t session, int32_t permission)
-{
- T_DRM_Session_Node* s;
- int32_t id;
-
- if (session < 0)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- if (DRM_PERMISSION_FORWARD == permission) {
- if (SEPARATE_DELIVERY == s->deliveryMethod)
- return DRM_SUCCESS;
-
- return DRM_FAILURE;
- }
-
- if (FORWARD_LOCK == s->deliveryMethod) /* Forwardlock type have utter rights */
- return DRM_SUCCESS;
-
- if (FALSE == drm_readFromUidTxt(s->contentID, &id, GET_ID))
- return DRM_FAILURE;
-
- return drm_checkRoAndUpdate(id, permission);
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getContentLength(int32_t session)
-{
- T_DRM_Session_Node* s;
-
- if (session < 0)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- if (DRM_UNKNOWN_DATA_LEN == s->contentLength && s->contentOffset + ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength <= DRM_MAX_MALLOC_LEN &&
- (SEPARATE_DELIVERY == s->deliveryMethod || SEPARATE_DELIVERY_FL == s->deliveryMethod)) {
- uint8_t keyValue[DRM_KEY_LEN];
- uint8_t lastDcfBuf[DRM_TWO_AES_BLOCK_LEN];
- int32_t seekPos, moreBytes;
-
- if (TRUE == drm_getKey(s->contentID, keyValue)) {
- seekPos = s->contentOffset + ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength - DRM_TWO_AES_BLOCK_LEN;
- memcpy(lastDcfBuf, s->rawContent + seekPos, DRM_TWO_AES_BLOCK_LEN);
-
- if (TRUE == drm_updateDcfDataLen(lastDcfBuf, keyValue, &moreBytes)) {
- s->contentLength = ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength;
- s->contentLength -= moreBytes;
- }
- }
- }
-
- return s->contentLength;
-}
-
-static int32_t drm_readAesData(uint8_t* buf, T_DRM_Session_Node* s, int32_t aesStart, int32_t bufLen)
-{
- if (NULL == buf || NULL == s || aesStart < 0 || bufLen < 0)
- return -1;
-
- if (aesStart - s->contentOffset + bufLen > ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength)
- return -2;
-
- if (aesStart < DRM_MAX_MALLOC_LEN) {
- if (aesStart + bufLen <= DRM_MAX_MALLOC_LEN) { /* read from buffer */
- memcpy(buf, s->rawContent + aesStart, bufLen);
- return bufLen;
- } else { /* first read from buffer and then from InputStream */
- int32_t point = DRM_MAX_MALLOC_LEN - aesStart;
- int32_t res;
-
- if (((T_DRM_Dcf_Node *)(s->infoStruct))->bAesBackupBuf) {
- memcpy(buf, ((T_DRM_Dcf_Node *)(s->infoStruct))->aesBackupBuf, DRM_ONE_AES_BLOCK_LEN);
- res = s->readInputDataFunc(s->inputHandle, buf + DRM_ONE_AES_BLOCK_LEN, DRM_ONE_AES_BLOCK_LEN);
- if (0 == res || -1 == res)
- return -1;
-
- res += DRM_ONE_AES_BLOCK_LEN;
- } else {
- memcpy(buf, s->rawContent + aesStart, point);
- res = s->readInputDataFunc(s->inputHandle, buf + point, bufLen - point);
- if (0 == res || -1 == res)
- return -1;
-
- res += point;
- }
-
- memcpy(((T_DRM_Dcf_Node *)(s->infoStruct))->aesBackupBuf, buf + DRM_ONE_AES_BLOCK_LEN, DRM_ONE_AES_BLOCK_LEN);
- ((T_DRM_Dcf_Node *)(s->infoStruct))->bAesBackupBuf = TRUE;
-
- return res;
- }
- } else { /* read from InputStream */
- int32_t res;
-
- memcpy(buf, ((T_DRM_Dcf_Node *)(s->infoStruct))->aesBackupBuf, DRM_ONE_AES_BLOCK_LEN);
- res = s->readInputDataFunc(s->inputHandle, buf + DRM_ONE_AES_BLOCK_LEN, DRM_ONE_AES_BLOCK_LEN);
-
- if (0 == res || -1 == res)
- return -1;
-
- memcpy(((T_DRM_Dcf_Node *)(s->infoStruct))->aesBackupBuf, buf + DRM_ONE_AES_BLOCK_LEN, DRM_ONE_AES_BLOCK_LEN);
-
- return DRM_ONE_AES_BLOCK_LEN + res;
- }
-}
-
-static int32_t drm_readContentFromBuf(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- int32_t readBytes;
-
- if (offset > s->contentLength)
- return DRM_FAILURE;
-
- if (offset == s->contentLength)
- return DRM_MEDIA_EOF;
-
- if (offset + mediaBufLen > s->contentLength)
- readBytes = s->contentLength - offset;
- else
- readBytes = mediaBufLen;
-
- if (DRM_MESSAGE_CODING_BASE64 == s->transferEncoding)
- memcpy(mediaBuf, s->rawContent + offset, readBytes);
- else
- memcpy(mediaBuf, s->rawContent + s->contentOffset + offset, readBytes);
-
- return readBytes;
-}
-
-static int32_t drm_readB64ContentFromInputStream(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- uint8_t encBuf[DRM_B64_ENC_BLOCK], decBuf[DRM_B64_DEC_BLOCK];
- int32_t encLen, decLen;
- int32_t i, j, piece, leftLen, firstBytes;
- int32_t readBytes = 0;
-
- if (offset < ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeDataLen) {
- readBytes = ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeDataLen - offset;
- memcpy(mediaBuf, s->rawContent + offset, readBytes);
- } else {
- if (s->bEndData)
- return DRM_MEDIA_EOF;
-
- firstBytes = offset % DRM_B64_DEC_BLOCK;
- if (firstBytes > 0) {
- if (DRM_B64_DEC_BLOCK - firstBytes >= mediaBufLen) {
- readBytes = mediaBufLen;
- memcpy(mediaBuf, ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeData + firstBytes, readBytes);
- return readBytes;
- }
-
- readBytes = DRM_B64_DEC_BLOCK - firstBytes;
- memcpy(mediaBuf, ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeData + firstBytes, readBytes);
- }
- }
-
- leftLen = mediaBufLen - readBytes;
- encLen = (leftLen - 1) / DRM_B64_DEC_BLOCK * DRM_B64_ENC_BLOCK + DRM_B64_ENC_BLOCK;
- piece = encLen / DRM_B64_ENC_BLOCK;
-
- for (i = 0; i < piece; i++) {
- j = 0;
- while (j < DRM_B64_ENC_BLOCK) {
- if (NULL != s->readBuf && s->readBufLen > 0) { /* read from backup buffer */
- *(encBuf + j) = s->readBuf[s->readBufOff];
- s->readBufOff++;
- s->readBufLen--;
- } else { /* read from InputStream */
- if (0 == s->readInputDataFunc(s->inputHandle, encBuf + j, 1))
- return DRM_MEDIA_DATA_INVALID;
- }
-
- if ('\r' == *(encBuf + j) || '\n' == *(encBuf + j))
- continue; /* skip CRLF */
-
- if ('-' == *(encBuf + j)) {
- int32_t k, len;
-
- /* invalid base64 data, it comes to end boundary */
- if (0 != j)
- return DRM_MEDIA_DATA_INVALID;
-
- /* check whether it is really the boundary */
- len = strlen((char *)((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary);
- if (NULL == s->readBuf) {
- s->readBuf = (uint8_t *)malloc(len);
- if (NULL == s->readBuf)
- return DRM_FAILURE;
- }
-
- s->readBuf[0] = '-';
- for (k = 0; k < len - 1; k++) {
- if (NULL != s->readBuf && s->readBufLen > 0) { /* read from backup buffer */
- *(s->readBuf + k + 1) = s->readBuf[s->readBufOff];
- s->readBufOff++;
- s->readBufLen--;
- } else { /* read from InputStream */
- if (-1 == s->readInputDataFunc(s->inputHandle, s->readBuf + k + 1, 1))
- return DRM_MEDIA_DATA_INVALID;
- }
- }
- if (0 == memcmp(s->readBuf, ((T_DRM_DM_Base64_Node *)(s->infoStruct))->boundary, len))
- s->bEndData = TRUE;
- else
- return DRM_MEDIA_DATA_INVALID;
-
- break;
- }
- j++;
- }
-
- if (TRUE == s->bEndData) { /* it means come to the end of base64 data */
- if (0 == readBytes)
- return DRM_MEDIA_EOF;
-
- break;
- }
-
- encLen = DRM_B64_ENC_BLOCK;
- decLen = DRM_B64_DEC_BLOCK;
- if (-1 == (decLen = drm_decodeBase64(decBuf, decLen, encBuf, &encLen)))
- return DRM_MEDIA_DATA_INVALID;
-
- if (leftLen >= decLen) {
- memcpy(mediaBuf + readBytes, decBuf, decLen);
- readBytes += decLen;
- leftLen -= decLen;
- } else {
- if (leftLen > 0) {
- memcpy(mediaBuf + readBytes, decBuf, leftLen);
- readBytes += leftLen;
- }
- break;
- }
- }
- memcpy(((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeData, decBuf, DRM_B64_DEC_BLOCK);
-
- return readBytes;
-}
-
-static int32_t drm_readBase64Content(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- int32_t readBytes;
-
- /* when the content length has been well-known */
- if (s->contentLength >= 0)
- readBytes = drm_readContentFromBuf(s, offset, mediaBuf, mediaBufLen);
- else /* else when the content length has not been well-known yet */
- if (offset < ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeDataLen)
- if (offset + mediaBufLen <= ((T_DRM_DM_Base64_Node *)(s->infoStruct))->b64DecodeDataLen) {
- readBytes = mediaBufLen;
- memcpy(mediaBuf, s->rawContent + offset, readBytes);
- } else
- readBytes = drm_readB64ContentFromInputStream(s, offset, mediaBuf, mediaBufLen);
- else
- readBytes = drm_readB64ContentFromInputStream(s, offset, mediaBuf, mediaBufLen);
-
- return readBytes;
-}
-
-static int32_t drm_readBinaryContentFromInputStream(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- int32_t res = 0, readBytes = 0;
- int32_t leftLen;
-
- if (s->contentOffset + offset < DRM_MAX_MALLOC_LEN) {
- readBytes = DRM_MAX_MALLOC_LEN - s->contentOffset - offset;
- memcpy(mediaBuf, s->rawContent + s->contentOffset + offset, readBytes);
- } else
- if (s->bEndData)
- return DRM_MEDIA_EOF;
-
- leftLen = mediaBufLen - readBytes;
-
- if (NULL != s->readBuf && s->readBufLen > 0) { /* read from backup buffer */
- if (leftLen <= s->readBufLen) {
- memcpy(mediaBuf + readBytes, s->readBuf + s->readBufOff, leftLen);
- s->readBufOff += leftLen;
- s->readBufLen -= leftLen;
- readBytes += leftLen;
- leftLen = 0;
- } else {
- memcpy(mediaBuf + readBytes, s->readBuf + s->readBufOff, s->readBufLen);
- s->readBufOff += s->readBufLen;
- leftLen -= s->readBufLen;
- readBytes += s->readBufLen;
- s->readBufLen = 0;
- }
- }
-
- if (leftLen > 0) {
- res = s->readInputDataFunc(s->inputHandle, mediaBuf + readBytes, mediaBufLen - readBytes);
- if (-1 == res)
- return DRM_MEDIA_DATA_INVALID;
- }
-
- readBytes += res;
- res = drm_scanEndBoundary(mediaBuf, readBytes, ((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary);
- if (-1 == res)
- return DRM_MEDIA_DATA_INVALID;
- if (-2 == res) { /* may be the boundary is split */
- int32_t boundaryLen, len, off, k;
- char* pTmp = memrchr(mediaBuf, '\r', readBytes);
-
- if (NULL == pTmp)
- return DRM_FAILURE; /* conflict */
-
- boundaryLen = strlen((char *)((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary) + 2; /* 2 means: '\r''\n' */
- if (NULL == s->readBuf) {
- s->readBuf = (uint8_t *)malloc(boundaryLen);
- if (NULL == s->readBuf)
- return DRM_FAILURE;
- }
-
- off = readBytes - ((uint8_t *)pTmp - mediaBuf);
- len = boundaryLen - off;
- memcpy(s->readBuf, pTmp, off);
- for (k = 0; k < boundaryLen - off; k++) {
- if (NULL != s->readBuf && s->readBufLen > 0) { /* read from backup buffer */
- *(s->readBuf + k + off) = s->readBuf[s->readBufOff];
- s->readBufOff++;
- s->readBufLen--;
- } else { /* read from InputStream */
- if (-1 == s->readInputDataFunc(s->inputHandle, s->readBuf + k + off, 1))
- return DRM_MEDIA_DATA_INVALID;
- }
- }
- s->readBufOff = off;
- s->readBufLen = len;
-
- if (0 == drm_scanEndBoundary(s->readBuf, boundaryLen, ((T_DRM_DM_Binary_Node *)(s->infoStruct))->boundary)) {
- readBytes = (uint8_t *)pTmp - mediaBuf; /* yes, it is the end boundary */
- s->bEndData = TRUE;
- }
- } else {
- if (res >= 0 && res < readBytes) {
- readBytes = res;
- s->bEndData = TRUE;
- }
- }
-
- if (s->bEndData) {
- if (0 == readBytes)
- return DRM_MEDIA_EOF;
- }
-
- return readBytes;
-}
-
-static int32_t drm_readBinaryContent(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- int32_t readBytes;
-
- if (s->contentLength >= 0)
- readBytes = drm_readContentFromBuf(s, offset, mediaBuf, mediaBufLen);
- else /* else when the content length has not been well-known yet */
- if (s->contentOffset + offset < DRM_MAX_MALLOC_LEN)
- if (s->contentOffset + offset + mediaBufLen <= DRM_MAX_MALLOC_LEN) {
- readBytes = mediaBufLen;
- memcpy(mediaBuf, s->rawContent + s->contentOffset + offset, readBytes);
- } else
- readBytes = drm_readBinaryContentFromInputStream(s, offset, mediaBuf, mediaBufLen);
- else
- readBytes = drm_readBinaryContentFromInputStream(s, offset, mediaBuf, mediaBufLen);
-
- return readBytes;
-}
-
-static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- uint8_t keyValue[DRM_KEY_LEN];
- uint8_t buf[DRM_TWO_AES_BLOCK_LEN];
- int32_t readBytes = 0;
- int32_t bufLen, piece, i, copyBytes, leftBytes;
- int32_t aesStart, mediaStart, mediaBufOff;
- AES_KEY key;
-
- if (FALSE == drm_getKey(s->contentID, keyValue))
- return DRM_NO_RIGHTS;
-
- /* when the content length has been well-known */
- if (s->contentLength > 0) {
- if (offset > s->contentLength)
- return DRM_FAILURE;
-
- if (offset == s->contentLength)
- return DRM_MEDIA_EOF;
-
- if (offset + mediaBufLen > s->contentLength)
- readBytes = s->contentLength - offset;
- else
- readBytes = mediaBufLen;
-
- aesStart = s->contentOffset + (offset / DRM_ONE_AES_BLOCK_LEN * DRM_ONE_AES_BLOCK_LEN);
- piece = (offset + readBytes - 1) / DRM_ONE_AES_BLOCK_LEN - offset / DRM_ONE_AES_BLOCK_LEN + 2;
- mediaStart = offset % DRM_ONE_AES_BLOCK_LEN;
-
- AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key);
- mediaBufOff = 0;
- leftBytes = readBytes;
-
- for (i = 0; i < piece - 1; i++) {
- memcpy(buf, s->rawContent + aesStart + i * DRM_ONE_AES_BLOCK_LEN, DRM_TWO_AES_BLOCK_LEN);
- bufLen = DRM_TWO_AES_BLOCK_LEN;
-
- if (drm_aesDecBuffer(buf, &bufLen, &key) < 0)
- return DRM_MEDIA_DATA_INVALID;
-
- if (0 != i)
- mediaStart = 0;
-
- if (bufLen - mediaStart <= leftBytes)
- copyBytes = bufLen - mediaStart;
- else
- copyBytes = leftBytes;
-
- memcpy(mediaBuf + mediaBufOff, buf + mediaStart, copyBytes);
- leftBytes -= copyBytes;
- mediaBufOff += copyBytes;
- }
- } else {
- int32_t res;
-
- if (s->bEndData)
- return DRM_MEDIA_EOF;
-
- if (((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataLen > ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff) {
- if (mediaBufLen < ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataLen - ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff)
- copyBytes = mediaBufLen;
- else
- copyBytes = ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataLen - ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff;
-
- memcpy(mediaBuf, ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecData + ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff, copyBytes);
- ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff += copyBytes;
- readBytes += copyBytes;
- }
-
- leftBytes = mediaBufLen - readBytes;
- if (0 == leftBytes)
- return readBytes;
- if (leftBytes < 0)
- return DRM_FAILURE;
-
- offset += readBytes;
- aesStart = s->contentOffset + (offset / DRM_ONE_AES_BLOCK_LEN * DRM_ONE_AES_BLOCK_LEN);
- piece = (offset + leftBytes - 1) / DRM_ONE_AES_BLOCK_LEN - offset / DRM_ONE_AES_BLOCK_LEN + 2;
- mediaBufOff = readBytes;
-
- AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key);
-
- for (i = 0; i < piece - 1; i++) {
- if (-1 == (res = drm_readAesData(buf, s, aesStart, DRM_TWO_AES_BLOCK_LEN)))
- return DRM_MEDIA_DATA_INVALID;
-
- if (-2 == res)
- break;
-
- bufLen = DRM_TWO_AES_BLOCK_LEN;
- aesStart += DRM_ONE_AES_BLOCK_LEN;
-
- if (drm_aesDecBuffer(buf, &bufLen, &key) < 0)
- return DRM_MEDIA_DATA_INVALID;
-
- drm_discardPaddingByte(buf, &bufLen);
-
- if (bufLen <= leftBytes)
- copyBytes = bufLen;
- else
- copyBytes = leftBytes;
-
- memcpy(mediaBuf + mediaBufOff, buf, copyBytes);
- leftBytes -= copyBytes;
- mediaBufOff += copyBytes;
- readBytes += copyBytes;
- }
-
- memcpy(((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecData, buf, DRM_ONE_AES_BLOCK_LEN);
- ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataLen = bufLen;
- ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff = copyBytes;
-
- if (aesStart - s->contentOffset > ((T_DRM_Dcf_Node *)(s->infoStruct))->encContentLength - DRM_TWO_AES_BLOCK_LEN && ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataOff == ((T_DRM_Dcf_Node *)(s->infoStruct))->aesDecDataLen) {
- s->bEndData = TRUE;
- if (0 == readBytes)
- return DRM_MEDIA_EOF;
- }
- }
-
- return readBytes;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getContent(int32_t session, int32_t offset, uint8_t* mediaBuf, int32_t mediaBufLen)
-{
- T_DRM_Session_Node* s;
- int32_t readBytes;
-
- if (session < 0 || offset < 0 || NULL == mediaBuf || mediaBufLen <= 0)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- if (0 >= s->getInputDataLengthFunc(s->inputHandle))
- return DRM_MEDIA_DATA_INVALID;
-
- switch(s->deliveryMethod) {
- case FORWARD_LOCK:
- case COMBINED_DELIVERY:
- if (DRM_MESSAGE_CODING_BASE64 == s->transferEncoding)
- readBytes = drm_readBase64Content(s, offset, mediaBuf, mediaBufLen);
- else /* binary */
- readBytes = drm_readBinaryContent(s, offset, mediaBuf, mediaBufLen);
- break;
- case SEPARATE_DELIVERY:
- case SEPARATE_DELIVERY_FL:
- readBytes = drm_readAesContent(s, offset, mediaBuf, mediaBufLen);
- break;
- default:
- return DRM_FAILURE;
- }
-
- return readBytes;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getRightsIssuer(int32_t session, uint8_t* rightsIssuer)
-{
- T_DRM_Session_Node* s;
-
- if (session < 0 || NULL == rightsIssuer)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- if (SEPARATE_DELIVERY == s->deliveryMethod || SEPARATE_DELIVERY_FL == s->deliveryMethod) {
- strcpy((char *)rightsIssuer, (char *)((T_DRM_Dcf_Node *)(s->infoStruct))->rightsIssuer);
- return DRM_SUCCESS;
- }
-
- return DRM_NOT_SD_METHOD;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_getRightsInfo(int32_t session, T_DRM_Rights_Info* rights)
-{
- T_DRM_Session_Node* s;
- T_DRM_Rights rightsInfo;
- int32_t roAmount, id;
-
- if (session < 0 || NULL == rights)
- return DRM_FAILURE;
-
- s = getSession(session);
- if (NULL == s)
- return DRM_SESSION_NOT_OPENED;
-
- if (FORWARD_LOCK == s->deliveryMethod) {
- strcpy((char *)rights->roId, "ForwardLock");
- rights->displayRights.indicator = DRM_NO_CONSTRAINT;
- rights->playRights.indicator = DRM_NO_CONSTRAINT;
- rights->executeRights.indicator = DRM_NO_CONSTRAINT;
- rights->printRights.indicator = DRM_NO_CONSTRAINT;
- return DRM_SUCCESS;
- }
-
- if (FALSE == drm_readFromUidTxt(s->contentID, &id, GET_ID))
- return DRM_NO_RIGHTS;
-
- if (FALSE == drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT))
- return DRM_FAILURE;
-
- if (roAmount < 0)
- return DRM_NO_RIGHTS;
-
- /* some rights has been installed, but now there is no valid rights */
- if (0 == roAmount) {
- strcpy((char *)rights->roId, s->contentID);
- rights->displayRights.indicator = DRM_NO_PERMISSION;
- rights->playRights.indicator = DRM_NO_PERMISSION;
- rights->executeRights.indicator = DRM_NO_PERMISSION;
- rights->printRights.indicator = DRM_NO_PERMISSION;
- return DRM_SUCCESS;
- }
-
- roAmount = 1;
- memset(&rightsInfo, 0, sizeof(T_DRM_Rights));
- if (FALSE == drm_writeOrReadInfo(id, &rightsInfo, &roAmount, GET_A_RO))
- return DRM_FAILURE;
-
- memset(rights, 0, sizeof(T_DRM_Rights_Info));
- drm_getLicenseInfo(&rightsInfo, rights);
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_closeSession(int32_t session)
-{
- if (session < 0)
- return DRM_FAILURE;
-
- if (NULL == getSession(session))
- return DRM_SESSION_NOT_OPENED;
-
- removeSession(session);
-
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_updateRights(uint8_t* contentID, int32_t permission)
-{
- int32_t id;
-
- if (NULL == contentID)
- return DRM_FAILURE;
-
- if (FALSE == drm_readFromUidTxt(contentID, &id, GET_ID))
- return DRM_FAILURE;
-
- return drm_checkRoAndUpdate(id, permission);
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_viewAllRights(T_DRM_Rights_Info_Node **ppRightsInfo)
-{
- T_DRM_Rights_Info_Node rightsNode;
- int32_t maxId, id, roAmount, j;
- T_DRM_Rights rights;
-
- memset(&rights, 0, sizeof(T_DRM_Rights));
-
- if (NULL == ppRightsInfo)
- return DRM_FAILURE;
-
- *ppRightsInfo = NULL;
-
- maxId = drm_getMaxIdFromUidTxt();
- if (-1 == maxId)
- return DRM_FAILURE;
-
- for (id = 1; id <= maxId; id++) {
- drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT);
- if (roAmount <= 0) /* this means there is not any rights */
- continue;
-
- for (j = 1; j <= roAmount; j++) {
- if (FALSE == drm_writeOrReadInfo(id, &rights, &j, GET_A_RO))
- continue;
-
- memset(&rightsNode, 0, sizeof(T_DRM_Rights_Info_Node));
-
- drm_getLicenseInfo(&rights, &(rightsNode.roInfo));
-
- if (FALSE == drm_addRightsNodeToList(ppRightsInfo, &rightsNode))
- continue;
- }
- }
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_freeRightsInfoList(T_DRM_Rights_Info_Node *pRightsHeader)
-{
- T_DRM_Rights_Info_Node *pNode, *pTmp;
-
- if (NULL == pRightsHeader)
- return DRM_FAILURE;
-
- pNode = pRightsHeader;
-
- while (NULL != pNode) {
- pTmp = pNode;
- pNode = pNode->next;
- free(pTmp);
- }
- return DRM_SUCCESS;
-}
-
-/* see svc_drm.h */
-int32_t SVC_drm_deleteRights(uint8_t* roId)
-{
- int32_t maxId, id, roAmount, j;
- T_DRM_Rights rights;
-
- memset(&rights, 0, sizeof(T_DRM_Rights));
-
- if (NULL == roId)
- return DRM_FAILURE;
-
- maxId = drm_getMaxIdFromUidTxt();
- if (-1 == maxId)
- return DRM_NO_RIGHTS;
-
- for (id = 1; id <= maxId; id++) {
- drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT);
- if (roAmount <= 0) /* this means there is not any rights */
- continue;
-
- for (j = 1; j <= roAmount; j++) {
- if (FALSE == drm_writeOrReadInfo(id, &rights, &j, GET_A_RO))
- continue;
-
- /* here find the RO which will be deleted */
- if (0 == strcmp((char *)rights.uid, (char *)roId)) {
- T_DRM_Rights *pAllRights;
-
- pAllRights = (T_DRM_Rights *)malloc(roAmount * sizeof(T_DRM_Rights));
- if (NULL == pAllRights)
- return DRM_FAILURE;
-
- drm_writeOrReadInfo(id, pAllRights, &roAmount, GET_ALL_RO);
- roAmount--;
- if (0 == roAmount) { /* this means it is the last one rights */
- drm_removeIdInfoFile(id); /* delete the id.info file first */
- drm_updateUidTxtWhenDelete(id); /* update uid.txt file */
- free(pAllRights);
- return DRM_SUCCESS;
- } else /* using the last one rights instead of the deleted one */
- memcpy(pAllRights + (j - 1), pAllRights + roAmount, sizeof(T_DRM_Rights));
-
- /* delete the id.info file first */
-// drm_removeIdInfoFile(id);
-
- if (FALSE == drm_writeOrReadInfo(id, pAllRights, &roAmount, SAVE_ALL_RO)) {
- free(pAllRights);
- return DRM_FAILURE;
- }
-
- free(pAllRights);
- return DRM_SUCCESS;
- }
- }
- }
-
- return DRM_FAILURE;
-}
diff --git a/media/libdrm/mobile1/src/objmng/drm_decoder.c b/media/libdrm/mobile1/src/objmng/drm_decoder.c
deleted file mode 100644
index 82c7efb..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_decoder.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <objmng/drm_decoder.h>
-
-/* global variables */
-static const uint8_t * base64_alphabet = (const uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-#define SKIP_CRLF(p) while('\r' == *(p) || '\n' == *(p)) \
- p++
-
-static int8_t get_alphabet_index(int8_t ch)
-{
- uint8_t * tmp;
-
- if ('=' == ch)
- return 64;
-
- tmp = (uint8_t *)strchr((const char *)base64_alphabet, ch);
- if (NULL == tmp)
- return -1;
-
- return (int8_t)(tmp - base64_alphabet);
-}
-
-/* See drm_decoder.h */
-int32_t drm_decodeBase64(uint8_t * dest, int32_t destLen, uint8_t * src, int32_t * srcLen)
-{
- int32_t maxDestSize, i, maxGroup;
- uint8_t *pDest, *pSrc;
- int8_t tpChar;
-
- if (NULL == src || NULL == srcLen || *srcLen <= 0 || destLen < 0)
- return -1;
-
- maxDestSize = (*srcLen) * 3/4;
- if (NULL == dest || 0 == destLen)
- return maxDestSize;
-
- if (destLen < maxDestSize)
- maxDestSize = destLen;
- maxGroup = maxDestSize/3;
-
- pDest = dest; /* start to decode src to dest */
- pSrc = src;
- for (i = 0; i < maxGroup && *srcLen - (pSrc - src) >= 4; i++) {
- SKIP_CRLF(pSrc);
- if (pSrc - src >= *srcLen)
- break;
- tpChar = get_alphabet_index(*pSrc); /* to first byte */
- if (-1 == tpChar || 64 == tpChar)
- return -1;
- pDest[0] = tpChar << 2;
- pSrc++;
- SKIP_CRLF(pSrc);
- tpChar = get_alphabet_index(*pSrc);
- if (-1 == tpChar || 64 == tpChar)
- return -1;
- pDest[0] |= (tpChar >> 4);
- pDest[1] = tpChar << 4; /* to second byte */
- pSrc++;
- SKIP_CRLF(pSrc);
- tpChar = get_alphabet_index(*pSrc);
- if (-1 == tpChar)
- return -1;
- if (64 == tpChar) /* end */
- return pDest - dest + 1;
- pDest[1] |= (tpChar >> 2);
- pDest[2] = tpChar << 6; /* to third byte */
- pSrc++;
- SKIP_CRLF(pSrc);
- tpChar = get_alphabet_index(*pSrc);
- if (-1 == tpChar)
- return -1;
- if (64 == tpChar) /* end */
- return pDest - dest + 2;
- pDest[2] |= tpChar;
- pDest += 3;
- pSrc++;
- }
- *srcLen = pSrc - src;
- return pDest - dest;
-}
diff --git a/media/libdrm/mobile1/src/objmng/drm_file.c b/media/libdrm/mobile1/src/objmng/drm_file.c
deleted file mode 100644
index e6c303e..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_file.c
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <objmng/drm_file.h>
-
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <errno.h>
-#include <string.h>
-
-/**
- * Fails on zaurus?
- #define DEVICE_FILESYSTEM
-*/
-#define DEFAULT_TOTAL_SPACE (4L * 1024L * 1024L) /* 4 Meg. */
-
-#ifndef DEVICE_FILESYSTEM
-/* Store the total space on FS VM can use. */
-static int32_t totalSpace;
-/* how many remain space can VM use. */
-static int32_t availableSize;
-#endif
-
-extern char* getStorageRoot(void);
-
-static char tmpPathBuf1[MAX_FILENAME_LEN];
-static char tmpPathBuf2[MAX_FILENAME_LEN];
-
-static int32_t
-convertFilename(const uint16_t *strData, int32_t strLength, char *buffer);
-
-static int calcDirSize(char *path, int len, uint8_t includeSubdirs);
-
-#ifndef DEVICE_FILESYSTEM
-static void initFsVariables(void);
-#endif
-
-/**
- * Convert a Java string into a nul terminated ascii string to pass to posix
- * @param strData first character of name
- * @param strLength number of characters in name
- * @param buffer Buffer to store terminated string in (at least MAXPATHLEN)
- * @return Length of filename in characters (excl. nul), or -1 on failure.
- */
-static int32_t
-convertFilename(const uint16_t *strData, int32_t strLength, char *buffer)
-{
- int idx;
-
- if (strLength >= (MAXPATHLEN-1))
- {
- Trace("convertFilename '%.*S' too long", strLength, strData);
- return -1;
- }
-
- for (idx = 0; idx < strLength; ++idx)
- *buffer++ = (char)*strData++;
-
- *buffer = 0;
- return strLength;
-}
-
-
-/**
- * Perform a stat() call on the given filename.
- * Helper for getFileLength and exists
- * @param name unicode name
- * @param nameLen number of unicode characters in name
- * @param sbuf stat buffer
- * @return TRUE on success, FALSE on failure
- */
-static int32_t
-getFileStat(const uint16_t *name, int32_t nameLen, struct stat *sbuf)
-{
- Trace("getFileStat: %.*S", nameLen, name);
-
- if (convertFilename(name, nameLen, tmpPathBuf1) <= 0)
- {
- Trace("getFileStat: bad filename");
- }
- else if (stat(tmpPathBuf1, sbuf) != 0)
- {
- Trace("getFileStat %s: stat() errno=%d", tmpPathBuf1, errno);
- }
- else /* Successful */
- {
- return TRUE;
- }
-
- return FALSE;
-}
-
-#ifndef DEVICE_FILESYSTEM
-/**
- * initial the variables like totalSpace, availableSize...
- */
-static void initFsVariables(void)
-{
- totalSpace = DEFAULT_TOTAL_SPACE;
-
- availableSize = totalSpace;
-}
-#endif /* DEVICE_FILESYSTEM */
-
-/**
- * calculate the size of everything inside path pointed directory
- * this function will use path pointed buffer to store some extra info
- * so param len is needed.
- * @param path the directory path need to calculate
- * @param len length of the path buffer, not the path string length
- * @param includeSubdirs also calculate all the subdirs in path holds?
- * @return the calculated size, DRM_FILE_FAILURE on failure.
- */
-static int calcDirSize(char *path, int len, uint8_t includeSubdirs)
-{
- struct dirent *ent;
- struct stat stat_buf;
-
- DIR *dir = NULL;
- int size = 0;
- int exists = -1;
- int dirPathLen = strlen(path);
-
- /* Ensure space for wildcard */
- if((dirPathLen + 2) >= MAXPATHLEN || (dirPathLen + 2) >= len)
- {
- return DRM_FILE_FAILURE;
- }
-
- if(path[dirPathLen - 1] != '/')
- {
- path[dirPathLen++] = '/';
- path[dirPathLen] = '\0';
- }
-
- dir = opendir(path);
- if (dir == NULL)
- {
- return DRM_FILE_FAILURE;
- }
-
- while ((ent = readdir(dir)) != NULL )
- {
- if (strcmp(ent->d_name, ".") == 0 ||
- strcmp(ent->d_name, "..") == 0)
- {
- continue;
- }
-
- path[dirPathLen] = '\0';
- if ((int)(strlen(ent->d_name) + dirPathLen + 1) < len)
- {
- strcat(path, ent->d_name);
- }
- else
- {
- continue;
- }
-
- exists = stat(path, &stat_buf);
- if (exists != -1)
- {
- /* exclude the storage occupied by directory itself */
- if (stat_buf.st_mode & S_IFDIR)
- {
- if(includeSubdirs)
- {
- /* calculate the size recursively */
- int ret;
- ret = calcDirSize(path, len, includeSubdirs);
- /* ignore failure in subdirs */
- if( DRM_FILE_FAILURE != ret )
- {
- size += ret;
- }
- }
- }
- else
- {
- size += stat_buf.st_size;
- }
- }
- }
-
- closedir(dir);
- return size;
-}
-
-/* see drm_file.h */
-int32_t DRM_file_startup(void)
-{
- Trace("DRM_file_startup");
-
-#ifndef DEVICE_FILESYSTEM
- availableSize = -1;
-
- initFsVariables();
-#endif
-
- return DRM_FILE_SUCCESS; /* Nothing to do */
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_listOpen(const uint16_t *prefix,
- int32_t prefixLen,
- int32_t* session,
- int32_t* iteration)
-{
- Trace("DRM_file_listOpen: %.*S", prefixLen, prefix);
-
- if (convertFilename(prefix, prefixLen, tmpPathBuf1) <= 0)
- {
- Trace("DRM_file_listOpen: bad filename");
- }
- else
- {
- DIR *dir;
-
- /* find the last /, and store the offset to the leaf prefix in
- * *iteration
- */
-
- char *sep = strrchr(tmpPathBuf1, '/');
- /* Root "/" is a leaf */
- if (sep == NULL || ((sep != NULL) && (sep == tmpPathBuf1)))
- {
- *iteration = prefixLen;
-
-#ifdef TRACE_ON
- sep = " <empty>"; /* trace will show sep+1 */
-#endif
- }
- else
- {
- *iteration = sep - tmpPathBuf1 + 1;
- *sep = 0;
- }
-
- dir = opendir(tmpPathBuf1);
-
- if (dir == NULL)
- {
- Trace("DRM_file_listOpen: opendir %s: errno=%d", tmpPathBuf1, errno);
- }
- else
- {
- Trace("DRM_file_listOpen: dir %s, filter %s", tmpPathBuf1, sep+1);
- *session = (int32_t)dir;
- return DRM_FILE_SUCCESS;
- }
- }
-
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_listNextEntry(const uint16_t *prefix, int32_t prefixLen,
- uint16_t* entry, int32_t entrySize,
- int32_t *session, int32_t* iteration)
-{
- struct dirent *ent;
-
- /* We stored the offset of the leaf part of the prefix (if any)
- * in *iteration
- */
- const uint16_t* strData = prefix + *iteration;
- int32_t strLength = prefixLen - *iteration;
-
- /* entrySize is bytes for some reason. Convert to ucs chars */
- entrySize /= 2;
-
- /* Now we want to filter for files which start with the (possibly empty)
- * sequence at strData. We have to return fully-qualified filenames,
- * which means *iteration characters from prefix, plus the
- * leaf name.
- */
-
- while ( (ent = readdir((DIR *)*session)) != NULL)
- {
- int len = strlen(ent->d_name);
-
- if ( (len + *iteration) > entrySize)
- {
- Trace("DRM_file_listNextEntry: %s too long", ent->d_name);
- }
- else if (strcmp(ent->d_name, ".") != 0 &&
- strcmp(ent->d_name, "..") != 0)
- {
- int idx;
- struct stat sinfo;
-
- /* check against the filter */
-
- for (idx = 0; idx < strLength; ++idx)
- {
- if (ent->d_name[idx] != strData[idx])
- goto next_name;
- }
-
- Trace("DRM_file_listNextEntry: matched %s", ent->d_name);
-
- /* Now generate the fully-qualified name */
-
- for (idx = 0; idx < *iteration; ++idx)
- entry[idx] = prefix[idx];
-
- for (idx = 0; idx < len; ++idx)
- entry[*iteration + idx] = (unsigned char)ent->d_name[idx];
-
- /*add "/" at the end of a DIR file entry*/
- if (getFileStat(entry, idx + *iteration, &sinfo)){
- if (S_ISDIR(sinfo.st_mode) &&
- (idx + 1 + *iteration) < entrySize) {
- entry[*iteration + idx] = '/';
- ++idx;
- }
- }
- else
- {
- Trace("DRM_file_listNextEntry: stat FAILURE on %.*S",
- idx + *iteration, entry);
- }
- Trace("DRM_file_listNextEntry: got %.*S", idx + *iteration, entry);
-
- return idx + *iteration;
- }
-
- next_name:
- Trace("DRM_file_listNextEntry: rejected %s", ent->d_name);
- }
-
- Trace("DRM_file_listNextEntry: end of list");
- return 0;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_listClose(int32_t session, int32_t iteration)
-{
- closedir( (DIR *)session);
- return DRM_FILE_SUCCESS;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_getFileLength(const uint16_t *name, int32_t nameLen)
-{
- struct stat sbuf;
-
- if (getFileStat(name, nameLen, &sbuf))
- {
- if (sbuf.st_size >= INT32_MAX)
- {
- Trace("DRM_file_getFileLength: file too big");
- }
- else /* Successful */
- {
- Trace("DRM_file_getFileLength: %.*S -> %d",
- nameLen, name, (int32_t)sbuf.st_size);
- return (int32_t)sbuf.st_size;
- }
- }
-
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_delete(const uint16_t *name, int32_t nameLen)
-{
- Trace("DRM_file_delete: %.*S", nameLen, name);
-
- if (convertFilename(name, nameLen, tmpPathBuf1) <= 0)
- {
- Trace("DRM_file_delete: bad filename");
- return DRM_FILE_FAILURE;
- }
- else
- {
- struct stat sinfo;
- if (stat(tmpPathBuf1, &sinfo) != 0){
- Trace("DRM_file_delete: stat failed, errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
-#ifndef DEVICE_FILESYSTEM
- if (S_ISDIR(sinfo.st_mode)){
- /* it's a dir */
- if (rmdir(tmpPathBuf1) != 0){
- Trace("DRM_file_delete: dir remove failed, errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
- else
- {
- return DRM_FILE_SUCCESS;
- }
- }
-#endif
- /* it's a file */
- if (unlink(tmpPathBuf1) != 0)
- {
- Trace("DRM_file_delete: file remove failed, errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
- else
- {
-#ifndef DEVICE_FILESYSTEM
- availableSize += sinfo.st_size;
-#endif
- return DRM_FILE_SUCCESS;
- }
- }
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_rename(const uint16_t *oldName, int32_t oldNameLen,
- const uint16_t *newName, int32_t newNameLen)
-{
- Trace("DRM_file_rename %.*S -> %.*S",
- oldNameLen, oldName, newNameLen, newName);
- if (DRM_file_exists(newName, newNameLen) != DRM_FILE_FAILURE)
- {
- Trace("DRM_file_rename: filename:%s exist",newName);
- return DRM_FILE_FAILURE;
- }
-
- if (convertFilename(oldName, oldNameLen, tmpPathBuf1) <= 0 ||
- convertFilename(newName, newNameLen, tmpPathBuf2) <= 0)
- {
- Trace("DRM_file_rename: bad filename");
- }
- else if (rename(tmpPathBuf1, tmpPathBuf2) != 0)
- {
- Trace("DRM_file_rename: failed errno=%d", errno);
- }
- else /* Success */
- {
- return DRM_FILE_SUCCESS;
- }
-
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_exists(const uint16_t *name, int32_t nameLen)
-{
- struct stat sbuf;
-
- Trace("DRM_file_exists: %.*S", nameLen, name);
-
- /*remove trailing "/" separators, except the first "/" standing for root*/
- while ((nameLen > 1) && (name[nameLen -1] == '/'))
- --nameLen;
-
- if (getFileStat(name, nameLen, &sbuf))
- {
- Trace("DRM_file_exists: stat returns mode 0x%x", sbuf.st_mode);
-
- if (S_ISDIR(sbuf.st_mode))
- return DRM_FILE_ISDIR;
- if (S_ISREG(sbuf.st_mode))
- return DRM_FILE_ISREG;
- }
-
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_open(const uint16_t *name, int32_t nameLen, int32_t mode,
- int32_t* handle)
-{
- int res;
-
-#if DRM_FILE_MODE_READ != 1 || DRM_FILE_MODE_WRITE != 2
-#error constants changed
-#endif
-
- /* Convert DRM file modes to posix modes */
- static const int modes[4] =
- { 0,
- O_RDONLY,
- O_WRONLY | O_CREAT,
- O_RDWR | O_CREAT
- };
-
- Trace("DRM_file_open %.*S mode 0x%x", nameLen, name, mode);
-
- assert((mode & ~(DRM_FILE_MODE_READ|DRM_FILE_MODE_WRITE)) == 0);
-
- if (convertFilename(name, nameLen, tmpPathBuf1) <= 0)
- {
- Trace("DRM_file_open: bad filename");
- return DRM_FILE_FAILURE;
- }
-
- if ((res = open(tmpPathBuf1, modes[mode], 0777)) == -1)
- {
- Trace("DRM_file_open: open failed errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
-
- Trace("DRM_file_open: open '%s; returned %d", tmpPathBuf1, res);
- *handle = res;
-
- return DRM_FILE_SUCCESS;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_read(int32_t handle, uint8_t* dst, int32_t length)
-{
- int n;
-
- assert(length > 0);
-
- /* TODO: Make dst a void *? */
-
- n = read((int)handle, dst, (size_t)length);
- if (n > 0)
- {
- Trace("DRM_file_read handle=%d read %d bytes", handle, n);
- return n;
- }
- else if (n == 0)
- {
- Trace("DRM_file_read read EOF: handle=%d", handle);
- return DRM_FILE_EOF;
- }
- else
- {
- Trace("DRM_file_read failed handle=%d, errno=%d", handle, errno);
- return DRM_FILE_FAILURE;
- }
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_write(int32_t handle, const uint8_t* src, int32_t length)
-{
- /* TODO: Make dst a void *? */
- int n;
-#ifndef DEVICE_FILESYSTEM
- int delta;
- off_t prevPos;
- struct stat sbuf;
- int prevFileSize;
-#endif
-
- assert(length >= 0);
-
-#ifndef DEVICE_FILESYSTEM
- if ( -1 == fstat((int)handle, &sbuf) )
- {
- Trace("DRM_file_write: fstat error %d", errno);
- return DRM_FILE_FAILURE;
- }
- prevFileSize = (int)(sbuf.st_size);
- prevPos = lseek( (int)handle, 0, SEEK_CUR);
- if ( (off_t)-1 == prevPos )
- {
- Trace("DRM_file_write: get current pos error %d", errno);
- return DRM_FILE_FAILURE;
- }
- delta = (int)prevPos + length - prevFileSize;
- if (delta > availableSize)
- {
- Trace("DRM_file_write: not enough size!");
- return DRM_FILE_FAILURE;
- }
-#endif
- n = write((int)handle, src, (size_t)length);
- if (n < 0)
- {
- Trace("DRM_file_write failed errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
-#ifndef DEVICE_FILESYSTEM
- delta = prevPos + n - prevFileSize;
-
- if ( delta > 0 )
- {
- availableSize -= delta;
- }
-#endif
- Trace("DRM_file_write handle=%d wrote %d/%d bytes", handle, n, length);
-
- return n;
-}
-
-/* see drm_file.h */
-int32_t DRM_file_close(int32_t handle)
-{
- if (close((int)handle) == 0)
- {
- Trace("DRM_file_close handle=%d success", handle);
- return DRM_FILE_SUCCESS;
- }
-
- Trace("DRM_file_close handle=%d failed", handle);
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_setPosition(int32_t handle, int32_t value)
-{
-#ifndef DEVICE_FILESYSTEM
- struct stat sbuf;
-#endif
- off_t newPos;
-
- if (value < 0)
- {
- Trace("DRM_file_setPosition: handle=%d negative value (%d)",
- handle, value);
- return DRM_FILE_FAILURE;
- }
-
-#ifndef DEVICE_FILESYSTEM
- if ( fstat((int)handle, &sbuf) == -1 )
- {
- Trace("DRM_file_setPosition: fstat fail errno=%d", errno);
- return DRM_FILE_FAILURE;
- }
-
- if ( ((off_t)value > sbuf.st_size) &&
- (availableSize < (value - (int)(sbuf.st_size))) )
- {
- Trace("DRM_file_setPosition: not enough space");
- return DRM_FILE_FAILURE;
- }
-#endif
-
- newPos = lseek( (int)handle, (off_t)value, SEEK_SET);
- if ( newPos == (off_t)-1 )
- {
- Trace("DRM_file_setPosition: seek failed: errno=%d", errno);
- }
- else
- {
-#ifndef DEVICE_FILESYSTEM
- if ( newPos > sbuf.st_size )
- {
- availableSize -= (int)(newPos - sbuf.st_size);
- }
-#endif
- return DRM_FILE_SUCCESS;
- }
-
- return DRM_FILE_FAILURE;
-}
-
-/* see drm_file.h */
-int32_t
-DRM_file_mkdir(const uint16_t* name, int32_t nameChars)
-{
- Trace("DRM_file_mkdir started!..");
-
- if (convertFilename(name, nameChars, tmpPathBuf1) <= 0)
- {
- Trace("DRM_file_mkdir: bad filename");
- return DRM_FILE_FAILURE;
- }
-
- if (mkdir(tmpPathBuf1,0777) != 0)
- {
- Trace("DRM_file_mkdir failed!errno=%d",errno);
- return DRM_FILE_FAILURE;
- }
-
- return DRM_FILE_SUCCESS;
-}
diff --git a/media/libdrm/mobile1/src/objmng/drm_i18n.c b/media/libdrm/mobile1/src/objmng/drm_i18n.c
deleted file mode 100644
index b1118a9..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_i18n.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <objmng/drm_i18n.h>
-
-#define IS_GB2312_HIGH_BYTE(c) ((c) >= 0xA1 && (c) <= 0xF7)
-#define IS_GB2312_LOW_BYTE(c) ((c) >= 0xA1 && (c) <= 0xFE)
-#define IS_GBK_HIGH_BYTE(c) ((c) >= 0x81 && (c) <= 0xFE)
-#define IS_GBK_LOW_BYTE(c) ((c) >= 0x40 && (c) <= 0xFE && (c) != 0x7F)
-#define IS_BIG5_HIGH_BYTE(c) ((c) >= 0xA1 && (c) <= 0xF9)
-#define IS_BIG5_LOW_BYTE(c) (((c) >= 0x40 && (c) <= 0x7E) \
- || ((c) >= 0xA1 && (c) <= 0xFE))
-#define IS_ASCII(c) ((c) <= 127)
-
-#define INVALID_UNICODE 0xFFFD
-
-#define I18N_LATIN1_SUPPORT
-#define I18N_UTF8_UTF16_SUPPORT
-
-
-/**
- * Simply convert ISO 8859-1 (latin1) to unicode
- */
-static int32_t latin1ToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed);
-
-/**
- * Convert one unicode char to ISO 8859-1 (latin1) byte
- */
-static int32_t wcToLatin1(uint16_t wc, uint8_t * mbs, int32_t bufSize);
-
-/**
- * Convert UTF-8 to unicode
- */
-static int32_t utf8ToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed);
-
-/**
- * Convert one unicode char to UTF-8 bytes
- */
-static int32_t wcToUtf8(uint16_t wc, uint8_t * mbs, int32_t bufSize);
-
-/**
- * Convert UTF-16 BE to unicode
- */
-static int32_t utf16beToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed);
-
-/**
- * Convert one unicode char to UTF-16 BE bytes
- */
-static int32_t wcToUtf16be(uint16_t wc, uint8_t * mbs, int32_t bufSize);
-
-/**
- * Convert UTF-16 LE to unicode
- */
-static int32_t utf16leToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed);
-
-/**
- * Convert one unicode char to UTF-16 LE bytes
- */
-static int32_t wcToUtf16le(uint16_t wc, uint8_t * mbs, int32_t bufSize);
-
-/*
- * see drm_i18n.h
- */
-int32_t DRM_i18n_mbsToWcs(DRM_Charset_t charset,
- const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed)
-{
- switch (charset)
- {
-#ifdef I18N_GB2312_SUPPORT
- case DRM_CHARSET_GB2312:
- return gb2312ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
-#ifdef I18N_GBK_SUPPORT
- case DRM_CHARSET_GBK:
- return gbkToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
-#ifdef I18N_BIG5_SUPPORT
- case DRM_CHARSET_BIG5:
- return big5ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
-#ifdef I18N_LATIN1_SUPPORT
- case DRM_CHARSET_LATIN1:
- return latin1ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
-#ifdef I18N_ISO8859X_SUPPORT
- case DRM_CHARSET_LATIN2:
- case DRM_CHARSET_LATIN3:
- case DRM_CHARSET_LATIN4:
- case DRM_CHARSET_CYRILLIC:
- case DRM_CHARSET_ARABIC:
- case DRM_CHARSET_GREEK:
- case DRM_CHARSET_HEBREW:
- case DRM_CHARSET_LATIN5:
- case DRM_CHARSET_LATIN6:
- case DRM_CHARSET_THAI:
- case DRM_CHARSET_LATIN7:
- case DRM_CHARSET_LATIN8:
- case DRM_CHARSET_LATIN9:
- case DRM_CHARSET_LATIN10:
- return iso8859xToWcs(charset, mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
-#ifdef I18N_UTF8_UTF16_SUPPORT
- case DRM_CHARSET_UTF8:
- return utf8ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
- case DRM_CHARSET_UTF16BE:
- return utf16beToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
- case DRM_CHARSET_UTF16LE:
- return utf16leToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed);
-#endif
- default:
- return -1;
- }
-}
-
-/*
- * see drm_i18n.h
- */
-int32_t DRM_i18n_wcsToMbs(DRM_Charset_t charset,
- const uint16_t *wcs, int32_t wcsLen,
- uint8_t *mbsBuf, int32_t bufSizeInByte)
-{
- int32_t (* wcToMbFunc)(uint16_t, uint8_t *, int32_t);
- int32_t charIndex = 0;
- int32_t numMultiBytes = 0;
-
- switch (charset)
- {
-#ifdef I18N_LATIN1_SUPPORT
- case DRM_CHARSET_LATIN1:
- wcToMbFunc = wcToLatin1;
- break;
-#endif
-#ifdef I18N_UTF8_UTF16_SUPPORT
- case DRM_CHARSET_UTF8:
- wcToMbFunc = wcToUtf8;
- break;
- case DRM_CHARSET_UTF16BE:
- wcToMbFunc = wcToUtf16be;
- break;
- case DRM_CHARSET_UTF16LE:
- wcToMbFunc = wcToUtf16le;
- break;
-#endif
-#ifdef I18N_ISO8859X_SUPPORT
- case DRM_CHARSET_LATIN2:
- case DRM_CHARSET_LATIN3:
- case DRM_CHARSET_LATIN4:
- case DRM_CHARSET_CYRILLIC:
- case DRM_CHARSET_ARABIC:
- case DRM_CHARSET_GREEK:
- case DRM_CHARSET_HEBREW:
- case DRM_CHARSET_LATIN5:
- case DRM_CHARSET_LATIN6:
- case DRM_CHARSET_THAI:
- case DRM_CHARSET_LATIN7:
- case DRM_CHARSET_LATIN8:
- case DRM_CHARSET_LATIN9:
- case DRM_CHARSET_LATIN10:
- return wcsToIso8859x(charset, wcs, wcsLen, mbsBuf, bufSizeInByte);
-#endif
- default:
- return -1;
- }
-
- if (mbsBuf) {
- while (numMultiBytes < bufSizeInByte && charIndex < wcsLen) {
- /* TODO: handle surrogate pair values here */
- int32_t mbLen = wcToMbFunc(wcs[charIndex],
- &mbsBuf[numMultiBytes], bufSizeInByte - numMultiBytes);
-
- if (numMultiBytes + mbLen > bufSizeInByte) {
- /* Insufficient buffer. Don't update numMultiBytes */
- break;
- }
- charIndex++;
- numMultiBytes += mbLen;
- }
- } else {
- while (charIndex < wcsLen) {
- /* TODO: handle surrogate pair values here */
- numMultiBytes += wcToMbFunc(wcs[charIndex], NULL, 0);
- charIndex++;
- }
- }
-
- return numMultiBytes;
-}
-
-
-#ifdef I18N_LATIN1_SUPPORT
-
-int32_t latin1ToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed)
-{
- int32_t charsToConvert;
- int32_t len;
-
- if (wcsBuf == NULL) {
- return mbsLen;
- }
-
- len = charsToConvert = mbsLen > bufSizeInWideChar ? bufSizeInWideChar : mbsLen;
- if (len < 0)
- return 0;
- while (len--) {
- *wcsBuf++ = *mbs++;
- }
-
- if (bytesConsumed)
- *bytesConsumed = charsToConvert;
-
- return charsToConvert;
-}
-
-int32_t wcToLatin1(uint16_t wc, uint8_t * mbs, int32_t bufSize)
-{
- uint8_t ch;
-
- if (wc < 0x100) {
- ch = (uint8_t)(wc & 0xff);
- } else {
- ch = '?';
- }
- if (mbs && bufSize > 0)
- *mbs = ch;
- return 1;
-}
-
-#endif /* I18N_LATIN1_SUPPORT */
-
-#ifdef I18N_UTF8_UTF16_SUPPORT
-
-int32_t utf8ToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed)
-{
- int32_t charsConverted = 0;
- int32_t i = 0;
- int32_t wideChar;
-
- if (wcsBuf == NULL) {
- /* No conversion but we're still going to calculate bytesConsumed */
- bufSizeInWideChar = mbsLen * 2;
- }
-
- while((i < mbsLen) && (charsConverted < bufSizeInWideChar)) {
- uint8_t ch = mbs[i];
- uint8_t ch2, ch3, ch4;
-
- wideChar = -1;
-
- if(IS_ASCII(ch)) {
- wideChar = ch;
- i++;
- } else if ((ch & 0xc0) == 0xc0) {
- int utfStart = i;
- if ((ch & 0xe0) == 0xc0) {
- /* 2 byte sequence */
- if (i + 1 < mbsLen && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80) {
- wideChar = (uint16_t)(((ch & 0x1F) << 6) | (ch2 & 0x3F));
- i += 2;
- } else {
- /* skip incomplete sequence */
- i++;
- }
- } else if ((ch & 0xf0) == 0xe0) {
- /* 3 byte sequence */
- if (i + 2 < mbsLen
- && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80
- && ((ch3 = mbs[i + 2]) & 0xc0) == 0x80) {
- wideChar = (uint16_t)(((ch & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F));
- i += 3;
- } else {
- /* skip incomplete sequence (up to 2 bytes) */
- i++;
- if (i < mbsLen && (mbs[i] & 0xc0) == 0x80)
- i++;
- }
- } else if ((ch & 0xf8) == 0xf0) {
- /* 4 byte sequence */
- if (i + 3 < mbsLen
- && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80
- && ((ch3 = mbs[i + 2]) & 0xc0) == 0x80
- && ((ch4 = mbs[i + 3]) & 0xc0) == 0x80) {
- /* FIXME: we do NOT support U+10000 - U+10FFFF for now.
- * leave it as 0xFFFD. */
- wideChar = INVALID_UNICODE;
- i += 4;
- } else {
- /* skip incomplete sequence (up to 3 bytes) */
- i++;
- if (i < mbsLen && (mbs[i] & 0xc0) == 0x80) {
- i++;
- if (i < mbsLen && (mbs[i] & 0xc0) == 0x80) {
- i++;
- }
- }
- }
- } else {
- /* invalid */
- i++;
- }
- if (i >= mbsLen && wideChar == -1) {
- /* Possible incomplete UTF-8 sequence at the end of mbs.
- * Leave it to the caller.
- */
- i = utfStart;
- break;
- }
- } else {
- /* invalid */
- i++;
- }
- if(wcsBuf) {
- if (wideChar == -1)
- wideChar = INVALID_UNICODE;
- wcsBuf[charsConverted] = (uint16_t)wideChar;
- }
- charsConverted++;
- }
-
- if (bytesConsumed)
- *bytesConsumed = i;
-
- return charsConverted;
-}
-
-int32_t wcToUtf8(uint16_t wc, uint8_t * mbs, int32_t bufSize)
-{
- if (wc <= 0x7f) {
- if (mbs && (bufSize >= 1)) {
- *mbs = (uint8_t)wc;
- }
- return 1;
- } else if (wc <= 0x7ff) {
- if (mbs && (bufSize >= 2)) {
- *mbs++ = (uint8_t)((wc >> 6) | 0xc0);
- *mbs = (uint8_t)((wc & 0x3f) | 0x80);
- }
- return 2;
- } else {
- if (mbs && (bufSize >= 3)) {
- *mbs++ = (uint8_t)((wc >> 12) | 0xe0);
- *mbs++ = (uint8_t)(((wc >> 6) & 0x3f)| 0x80);
- *mbs = (uint8_t)((wc & 0x3f) | 0x80);
- }
- return 3;
- }
-}
-
-int32_t utf16beToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed)
-{
- int32_t charsToConvert;
- int32_t len;
-
- if (wcsBuf == NULL) {
- return mbsLen / 2;
- }
-
- len = charsToConvert = (mbsLen / 2) > bufSizeInWideChar ? bufSizeInWideChar : (mbsLen / 2);
- while (len--) {
- /* TODO: handle surrogate pair values */
- *wcsBuf++ = (uint16_t)((*mbs << 8) | *(mbs + 1));
- mbs += 2;
- }
-
- if (bytesConsumed)
- *bytesConsumed = charsToConvert * 2;
-
- return charsToConvert;
-}
-
-int32_t wcToUtf16be(uint16_t wc, uint8_t * mbs, int32_t bufSize)
-{
- if (mbs && bufSize >= 2) {
- /* TODO: handle surrogate pair values */
- *mbs = (uint8_t)(wc >> 8);
- *(mbs + 1) = (uint8_t)(wc & 0xff);
- }
- return 2;
-}
-
-int32_t utf16leToWcs(const uint8_t *mbs, int32_t mbsLen,
- uint16_t *wcsBuf, int32_t bufSizeInWideChar,
- int32_t *bytesConsumed)
-{
- int32_t charsToConvert;
- int32_t len;
-
- if (wcsBuf == NULL) {
- return mbsLen / 2;
- }
-
- len = charsToConvert = (mbsLen / 2) > bufSizeInWideChar ? bufSizeInWideChar : (mbsLen / 2);
- while (len--) {
- /* TODO: handle surrogate pair values */
- *wcsBuf++ = (uint16_t)(*mbs | (*(mbs + 1) << 8));
- mbs += 2;
- }
-
- if (bytesConsumed)
- *bytesConsumed = charsToConvert * 2;
-
- return charsToConvert;
-}
-
-int32_t wcToUtf16le(uint16_t wc, uint8_t * mbs, int32_t bufSize)
-{
- if (mbs && bufSize >= 2) {
- /* TODO: handle surrogate pair values */
- *mbs = (uint8_t)(wc & 0xff);
- *(mbs + 1) = (uint8_t)(wc >> 8);
- }
- return 2;
-}
-
-#endif /* I18N_UTF8_UTF16_SUPPORT */
-
diff --git a/media/libdrm/mobile1/src/objmng/drm_rights_manager.c b/media/libdrm/mobile1/src/objmng/drm_rights_manager.c
deleted file mode 100644
index df22327..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_rights_manager.c
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <drm_rights_manager.h>
-#include <drm_inner.h>
-#include <drm_file.h>
-#include <drm_i18n.h>
-
-static int32_t drm_getString(uint8_t* string, int32_t len, int32_t handle)
-{
- int32_t i;
-
- for (i = 0; i < len; i++) {
- if (DRM_FILE_FAILURE == DRM_file_read(handle, &string[i], 1))
- return FALSE;
- if (string[i] == '\n') {
- string[i + 1] = '\0';
- break;
- }
- }
- return TRUE;
-}
-
-static int32_t drm_putString(uint8_t* string, int32_t handle)
-{
- int32_t i = 0;
-
- for (i = 0;; i++) {
- if (string[i] == '\0')
- break;
- if (DRM_FILE_FAILURE == DRM_file_write(handle, &string[i], 1))
- return FALSE;
- }
- return TRUE;
-}
-
-static int32_t drm_writeToUidTxt(uint8_t* Uid, int32_t* id)
-{
- int32_t length;
- int32_t i;
- uint8_t idStr[8];
- int32_t idMax;
- uint8_t(*uidStr)[256];
- uint16_t nameUcs2[MAX_FILENAME_LEN];
- int32_t nameLen;
- int32_t bytesConsumed;
- int32_t handle;
- int32_t fileRes;
-
- if (*id < 1)
- return FALSE;
-
- /* convert in ucs2 */
- nameLen = strlen(DRM_UID_FILE_PATH);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- (uint8_t *)DRM_UID_FILE_PATH,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- if (DRM_FILE_SUCCESS != fileRes) {
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_WRITE,
- &handle);
- DRM_file_write(handle, (uint8_t *)"0\n", 2);
- DRM_file_close(handle);
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- }
-
- if (!drm_getString(idStr, 8, handle)) {
- DRM_file_close(handle);
- return FALSE;
- }
- idMax = atoi((char *)idStr);
-
- if (idMax < *id)
- uidStr = malloc((idMax + 1) * 256);
- else
- uidStr = malloc(idMax * 256);
-
- for (i = 0; i < idMax; i++) {
- if (!drm_getString(uidStr[i], 256, handle)) {
- DRM_file_close(handle);
- free(uidStr);
- return FALSE;
- }
- }
- length = strlen((char *)Uid);
- strcpy((char *)uidStr[*id - 1], (char *)Uid);
- uidStr[*id - 1][length] = '\n';
- uidStr[*id - 1][length + 1] = '\0';
- if (idMax < (*id))
- idMax++;
- DRM_file_close(handle);
-
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_WRITE,
- &handle);
- sprintf((char *)idStr, "%d", idMax);
-
- if (!drm_putString(idStr, handle)) {
- DRM_file_close(handle);
- free(uidStr);
- return FALSE;
- }
- if (DRM_FILE_FAILURE == DRM_file_write(handle, (uint8_t *)"\n", 1)) {
- DRM_file_close(handle);
- free(uidStr);
- return FALSE;
- }
- for (i = 0; i < idMax; i++) {
- if (!drm_putString(uidStr[i], handle)) {
- DRM_file_close(handle);
- free(uidStr);
- return FALSE;
- }
- }
- if (DRM_FILE_FAILURE == DRM_file_write(handle, (uint8_t *)"\n", 1)) {
- DRM_file_close(handle);
- free(uidStr);
- return FALSE;
- }
- DRM_file_close(handle);
- free(uidStr);
- return TRUE;
-}
-
-/* See objmng_files.h */
-int32_t drm_readFromUidTxt(uint8_t* Uid, int32_t* id, int32_t option)
-{
- int32_t i;
- uint8_t p[256] = { 0 };
- uint8_t idStr[8];
- int32_t idMax = 0;
- uint16_t nameUcs2[MAX_FILENAME_LEN];
- int32_t nameLen = 0;
- int32_t bytesConsumed;
- int32_t handle;
- int32_t fileRes;
-
- if (NULL == id || NULL == Uid)
- return FALSE;
-
- DRM_file_startup();
-
- /* convert in ucs2 */
- nameLen = strlen(DRM_UID_FILE_PATH);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- (uint8_t *)DRM_UID_FILE_PATH,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- if (DRM_FILE_SUCCESS != fileRes) {
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_WRITE,
- &handle);
- DRM_file_write(handle, (uint8_t *)"0\n", 2);
- DRM_file_close(handle);
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- }
-
- if (!drm_getString(idStr, 8, handle)) {
- DRM_file_close(handle);
- return FALSE;
- }
- idMax = atoi((char *)idStr);
-
- if (option == GET_UID) {
- if (*id < 1 || *id > idMax) {
- DRM_file_close(handle);
- return FALSE;
- }
- for (i = 1; i <= *id; i++) {
- if (!drm_getString(Uid, 256, handle)) {
- DRM_file_close(handle);
- return FALSE;
- }
- }
- DRM_file_close(handle);
- return TRUE;
- }
- if (option == GET_ID) {
- *id = -1;
- for (i = 1; i <= idMax; i++) {
- if (!drm_getString(p, 256, handle)) {
- DRM_file_close(handle);
- return FALSE;
- }
- if (strstr((char *)p, (char *)Uid) != NULL
- && strlen((char *)p) == strlen((char *)Uid) + 1) {
- *id = i;
- DRM_file_close(handle);
- return TRUE;
- }
- if ((*id == -1) && (strlen((char *)p) < 3))
- *id = i;
- }
- if (*id != -1) {
- DRM_file_close(handle);
- return FALSE;
- }
- *id = idMax + 1;
- DRM_file_close(handle);
- return FALSE;
- }
- DRM_file_close(handle);
- return FALSE;
-}
-
-static int32_t drm_acquireId(uint8_t* uid, int32_t* id)
-{
- if (TRUE == drm_readFromUidTxt(uid, id, GET_ID))
- return TRUE;
-
- drm_writeToUidTxt(uid, id);
-
- return FALSE; /* The Uid is not exit, then return FALSE indicate it */
-}
-
-int32_t drm_writeOrReadInfo(int32_t id, T_DRM_Rights* Ro, int32_t* RoAmount, int32_t option)
-{
- uint8_t fullname[MAX_FILENAME_LEN] = {0};
- int32_t tmpRoAmount;
- uint16_t nameUcs2[MAX_FILENAME_LEN];
- int32_t nameLen = 0;
- int32_t bytesConsumed;
- int32_t handle;
- int32_t fileRes;
-
- sprintf((char *)fullname, ANDROID_DRM_CORE_PATH"%d"EXTENSION_NAME_INFO, id);
-
- /* convert in ucs2 */
- nameLen = strlen((char *)fullname);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- fullname,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- if (DRM_FILE_SUCCESS != fileRes) {
- if (GET_ALL_RO == option || GET_A_RO == option)
- return FALSE;
-
- if (GET_ROAMOUNT == option) {
- *RoAmount = -1;
- return TRUE;
- }
- }
-
- DRM_file_close(handle);
- DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ | DRM_FILE_MODE_WRITE,
- &handle);
-
- switch(option) {
- case GET_ROAMOUNT:
- if (DRM_FILE_FAILURE == DRM_file_read(handle, (uint8_t*)RoAmount, sizeof(int32_t))) {
- DRM_file_close(handle);
- return FALSE;
- }
- break;
- case GET_ALL_RO:
- DRM_file_setPosition(handle, sizeof(int32_t));
-
- if (DRM_FILE_FAILURE == DRM_file_read(handle, (uint8_t*)Ro, (*RoAmount) * sizeof(T_DRM_Rights))) {
- DRM_file_close(handle);
- return FALSE;
- }
- break;
- case SAVE_ALL_RO:
- if (DRM_FILE_FAILURE == DRM_file_write(handle, (uint8_t*)RoAmount, sizeof(int32_t))) {
- DRM_file_close(handle);
- return FALSE;
- }
-
- if (NULL != Ro && *RoAmount >= 1) {
- if (DRM_FILE_FAILURE == DRM_file_write(handle, (uint8_t*) Ro, (*RoAmount) * sizeof(T_DRM_Rights))) {
- DRM_file_close(handle);
- return FALSE;
- }
- }
- break;
- case GET_A_RO:
- DRM_file_setPosition(handle, sizeof(int32_t) + (*RoAmount - 1) * sizeof(T_DRM_Rights));
-
- if (DRM_FILE_FAILURE == DRM_file_read(handle, (uint8_t*)Ro, sizeof(T_DRM_Rights))) {
- DRM_file_close(handle);
- return FALSE;
- }
- break;
- case SAVE_A_RO:
- DRM_file_setPosition(handle, sizeof(int32_t) + (*RoAmount - 1) * sizeof(T_DRM_Rights));
-
- if (DRM_FILE_FAILURE == DRM_file_write(handle, (uint8_t*)Ro, sizeof(T_DRM_Rights))) {
- DRM_file_close(handle);
- return FALSE;
- }
-
- DRM_file_setPosition(handle, 0);
- if (DRM_FILE_FAILURE == DRM_file_read(handle, (uint8_t*)&tmpRoAmount, sizeof(int32_t))) {
- DRM_file_close(handle);
- return FALSE;
- }
- if (tmpRoAmount < *RoAmount) {
- DRM_file_setPosition(handle, 0);
- DRM_file_write(handle, (uint8_t*)RoAmount, sizeof(int32_t));
- }
- break;
- default:
- DRM_file_close(handle);
- return FALSE;
- }
-
- DRM_file_close(handle);
- return TRUE;
-}
-
-int32_t drm_appendRightsInfo(T_DRM_Rights* rights)
-{
- int32_t id;
- int32_t roAmount;
-
- if (NULL == rights)
- return FALSE;
-
- drm_acquireId(rights->uid, &id);
-
- if (FALSE == drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT))
- return FALSE;
-
- if (-1 == roAmount)
- roAmount = 0;
-
- /* The RO amount increase */
- roAmount++;
-
- /* Save the rights information */
- if (FALSE == drm_writeOrReadInfo(id, rights, &roAmount, SAVE_A_RO))
- return FALSE;
-
- return TRUE;
-}
-
-int32_t drm_getMaxIdFromUidTxt()
-{
- uint8_t idStr[8];
- int32_t idMax = 0;
- uint16_t nameUcs2[MAX_FILENAME_LEN] = {0};
- int32_t nameLen = 0;
- int32_t bytesConsumed;
- int32_t handle;
- int32_t fileRes;
-
- /* convert in ucs2 */
- nameLen = strlen(DRM_UID_FILE_PATH);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- (uint8_t *)DRM_UID_FILE_PATH,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
-
- /* this means the uid.txt file is not exist, so there is not any DRM object */
- if (DRM_FILE_SUCCESS != fileRes)
- return 0;
-
- if (!drm_getString(idStr, 8, handle)) {
- DRM_file_close(handle);
- return -1;
- }
- DRM_file_close(handle);
-
- idMax = atoi((char *)idStr);
- return idMax;
-}
-
-int32_t drm_removeIdInfoFile(int32_t id)
-{
- uint8_t filename[MAX_FILENAME_LEN] = {0};
- uint16_t nameUcs2[MAX_FILENAME_LEN];
- int32_t nameLen = 0;
- int32_t bytesConsumed;
-
- if (id <= 0)
- return FALSE;
-
- sprintf((char *)filename, ANDROID_DRM_CORE_PATH"%d"EXTENSION_NAME_INFO, id);
-
- /* convert in ucs2 */
- nameLen = strlen((char *)filename);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- filename,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- if (DRM_FILE_SUCCESS != DRM_file_delete(nameUcs2, nameLen))
- return FALSE;
-
- return TRUE;
-}
-
-int32_t drm_updateUidTxtWhenDelete(int32_t id)
-{
- uint16_t nameUcs2[MAX_FILENAME_LEN];
- int32_t nameLen = 0;
- int32_t bytesConsumed;
- int32_t handle;
- int32_t fileRes;
- int32_t bufferLen;
- uint8_t *buffer;
- uint8_t idStr[8];
- int32_t idMax;
-
- if (id <= 0)
- return FALSE;
-
- nameLen = strlen(DRM_UID_FILE_PATH);
- nameLen = DRM_i18n_mbsToWcs(DRM_CHARSET_UTF8,
- (uint8_t *)DRM_UID_FILE_PATH,
- nameLen,
- nameUcs2,
- MAX_FILENAME_LEN,
- &bytesConsumed);
- bufferLen = DRM_file_getFileLength(nameUcs2, nameLen);
- if (bufferLen <= 0)
- return FALSE;
-
- buffer = (uint8_t *)malloc(bufferLen);
- if (NULL == buffer)
- return FALSE;
-
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_READ,
- &handle);
- if (DRM_FILE_SUCCESS != fileRes) {
- free(buffer);
- return FALSE;
- }
-
- drm_getString(idStr, 8, handle);
- idMax = atoi((char *)idStr);
-
- bufferLen -= strlen((char *)idStr);
- fileRes = DRM_file_read(handle, buffer, bufferLen);
- buffer[bufferLen] = '\0';
- DRM_file_close(handle);
-
- /* handle this buffer */
- {
- uint8_t *pStart, *pEnd;
- int32_t i, movLen;
-
- pStart = buffer;
- pEnd = pStart;
- for (i = 0; i < id; i++) {
- if (pEnd != pStart)
- pStart = ++pEnd;
- while ('\n' != *pEnd)
- pEnd++;
- if (pStart == pEnd)
- pStart--;
- }
- movLen = bufferLen - (pEnd - buffer);
- memmove(pStart, pEnd, movLen);
- bufferLen -= (pEnd - pStart);
- }
-
- if (DRM_FILE_SUCCESS != DRM_file_delete(nameUcs2, nameLen)) {
- free(buffer);
- return FALSE;
- }
-
- fileRes = DRM_file_open(nameUcs2,
- nameLen,
- DRM_FILE_MODE_WRITE,
- &handle);
- if (DRM_FILE_SUCCESS != fileRes) {
- free(buffer);
- return FALSE;
- }
- sprintf((char *)idStr, "%d", idMax);
- drm_putString(idStr, handle);
- DRM_file_write(handle, (uint8_t*)"\n", 1);
- DRM_file_write(handle, buffer, bufferLen);
- free(buffer);
- DRM_file_close(handle);
- return TRUE;
-}
-
-int32_t drm_getKey(uint8_t* uid, uint8_t* KeyValue)
-{
- T_DRM_Rights ro;
- int32_t id, roAmount;
-
- if (NULL == uid || NULL == KeyValue)
- return FALSE;
-
- if (FALSE == drm_readFromUidTxt(uid, &id, GET_ID))
- return FALSE;
-
- if (FALSE == drm_writeOrReadInfo(id, NULL, &roAmount, GET_ROAMOUNT))
- return FALSE;
-
- if (roAmount <= 0)
- return FALSE;
-
- memset(&ro, 0, sizeof(T_DRM_Rights));
- roAmount = 1;
- if (FALSE == drm_writeOrReadInfo(id, &ro, &roAmount, GET_A_RO))
- return FALSE;
-
- memcpy(KeyValue, ro.KeyValue, DRM_KEY_LEN);
- return TRUE;
-}
-
-void drm_discardPaddingByte(uint8_t *decryptedBuf, int32_t *decryptedBufLen)
-{
- int32_t tmpLen = *decryptedBufLen;
- int32_t i;
-
- if (NULL == decryptedBuf || *decryptedBufLen < 0)
- return;
-
- /* Check whether the last several bytes are padding or not */
- for (i = 1; i < decryptedBuf[tmpLen - 1]; i++) {
- if (decryptedBuf[tmpLen - 1 - i] != decryptedBuf[tmpLen - 1])
- break; /* Not the padding bytes */
- }
- if (i == decryptedBuf[tmpLen - 1]) /* They are padding bytes */
- *decryptedBufLen = tmpLen - i;
- return;
-}
-
-int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, AES_KEY *key)
-{
- uint8_t dbuf[3 * DRM_ONE_AES_BLOCK_LEN], buf[DRM_ONE_AES_BLOCK_LEN];
- uint64_t i, len, wlen = DRM_ONE_AES_BLOCK_LEN, curLen, restLen;
- uint8_t *pTarget, *pTargetHead;
-
- pTargetHead = Buffer;
- pTarget = Buffer;
- curLen = 0;
- restLen = *BufferLen;
-
- if (restLen > 2 * DRM_ONE_AES_BLOCK_LEN) {
- len = 2 * DRM_ONE_AES_BLOCK_LEN;
- } else {
- len = restLen;
- }
- memcpy(dbuf, Buffer, (size_t)len);
- restLen -= len;
- Buffer += len;
-
- if (len < 2 * DRM_ONE_AES_BLOCK_LEN) { /* The original file is less than one block in length */
- len -= DRM_ONE_AES_BLOCK_LEN;
- /* Decrypt from position len to position len + DRM_ONE_AES_BLOCK_LEN */
- AES_decrypt((dbuf + len), (dbuf + len), key);
-
- /* Undo the CBC chaining */
- for (i = 0; i < len; ++i)
- dbuf[i] ^= dbuf[i + DRM_ONE_AES_BLOCK_LEN];
-
- /* Output the decrypted bytes */
- memcpy(pTarget, dbuf, (size_t)len);
- pTarget += len;
- } else {
- uint8_t *b1 = dbuf, *b2 = b1 + DRM_ONE_AES_BLOCK_LEN, *b3 = b2 + DRM_ONE_AES_BLOCK_LEN, *bt;
-
- for (;;) { /* While some ciphertext remains, prepare to decrypt block b2 */
- /* Read in the next block to see if ciphertext stealing is needed */
- b3 = Buffer;
- if (restLen > DRM_ONE_AES_BLOCK_LEN) {
- len = DRM_ONE_AES_BLOCK_LEN;
- } else {
- len = restLen;
- }
- restLen -= len;
- Buffer += len;
-
- /* Decrypt the b2 block */
- AES_decrypt((uint8_t *)b2, buf, key);
-
- if (len == 0 || len == DRM_ONE_AES_BLOCK_LEN) { /* No ciphertext stealing */
- /* Unchain CBC using the previous ciphertext block in b1 */
- for (i = 0; i < DRM_ONE_AES_BLOCK_LEN; ++i)
- buf[i] ^= b1[i];
- } else { /* Partial last block - use ciphertext stealing */
- wlen = len;
- /* Produce last 'len' bytes of plaintext by xoring with */
- /* The lowest 'len' bytes of next block b3 - C[N-1] */
- for (i = 0; i < len; ++i)
- buf[i] ^= b3[i];
-
- /* Reconstruct the C[N-1] block in b3 by adding in the */
- /* Last (DRM_ONE_AES_BLOCK_LEN - len) bytes of C[N-2] in b2 */
- for (i = len; i < DRM_ONE_AES_BLOCK_LEN; ++i)
- b3[i] = buf[i];
-
- /* Decrypt the C[N-1] block in b3 */
- AES_decrypt((uint8_t *)b3, (uint8_t *)b3, key);
-
- /* Produce the last but one plaintext block by xoring with */
- /* The last but two ciphertext block */
- for (i = 0; i < DRM_ONE_AES_BLOCK_LEN; ++i)
- b3[i] ^= b1[i];
-
- /* Write decrypted plaintext blocks */
- memcpy(pTarget, b3, DRM_ONE_AES_BLOCK_LEN);
- pTarget += DRM_ONE_AES_BLOCK_LEN;
- }
-
- /* Write the decrypted plaintext block */
- memcpy(pTarget, buf, (size_t)wlen);
- pTarget += wlen;
-
- if (len != DRM_ONE_AES_BLOCK_LEN) {
- *BufferLen = pTarget - pTargetHead;
- return 0;
- }
-
- /* Advance the buffer pointers */
- bt = b1, b1 = b2, b2 = b3, b3 = bt;
- }
- }
- return 0;
-}
-
-int32_t drm_updateDcfDataLen(uint8_t* pDcfLastData, uint8_t* keyValue, int32_t* moreBytes)
-{
- AES_KEY key;
- int32_t len = DRM_TWO_AES_BLOCK_LEN;
-
- if (NULL == pDcfLastData || NULL == keyValue)
- return FALSE;
-
- AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key);
-
- if (drm_aesDecBuffer(pDcfLastData, &len, &key) < 0)
- return FALSE;
-
- drm_discardPaddingByte(pDcfLastData, &len);
-
- *moreBytes = DRM_TWO_AES_BLOCK_LEN - len;
-
- return TRUE;
-}
diff --git a/media/libdrm/mobile1/src/objmng/drm_time.c b/media/libdrm/mobile1/src/objmng/drm_time.c
deleted file mode 100644
index fceb4952..0000000
--- a/media/libdrm/mobile1/src/objmng/drm_time.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-/**
- * @file
- * DRM 1.0 Reference Port: linux implementation of drm_time.c.
- */
-
-#include <objmng/drm_time.h>
-#include <unistd.h>
-
-/* See drm_time.h */
-uint32_t DRM_time_getElapsedSecondsFrom1970(void)
-{
- return time(NULL);
-}
-
-/* See drm_time.h */
-void DRM_time_sleep(uint32_t ms)
-{
- usleep(ms * 1000);
-}
-
-/* See drm_time.h */
-void DRM_time_getSysTime(T_DB_TIME_SysTime *time_ptr)
-{
- time_t t;
- struct tm *tm_t;
-
- time(&t);
- tm_t = gmtime(&t);
-
- time_ptr->year = tm_t->tm_year + 1900;
- time_ptr->month = tm_t->tm_mon + 1;
- time_ptr->day = tm_t->tm_mday;
- time_ptr->hour = tm_t->tm_hour;
- time_ptr->min = tm_t->tm_min;
- time_ptr->sec = tm_t->tm_sec;
-}
diff --git a/media/libdrm/mobile1/src/parser/parser_dcf.c b/media/libdrm/mobile1/src/parser/parser_dcf.c
deleted file mode 100644
index 06aa830..0000000
--- a/media/libdrm/mobile1/src/parser/parser_dcf.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <parser_dcf.h>
-#include <svc_drm.h>
-
-static int32_t drm_parseUintVar(uint8_t * buffer, uint8_t * len)
-{
- int32_t i;
- int32_t byteLen;
- int32_t sum;
-
- if (NULL == buffer)
- return DRM_UINT_VAR_ERR;
-
- byteLen = 0;
- while ((buffer[byteLen] & UINT_VAR_FLAG) > 0 && byteLen < MAX_UINT_VAR_BYTE) /* UINT_VAR_FLAG == 0x80 */
- byteLen++;
-
- if (byteLen >= MAX_UINT_VAR_BYTE) /* MAX_UINT_VAR_BYTE == 5 */
- return DRM_UINT_VAR_ERR; /* The var int is too large, and that is impossible */
-
- *len = (uint8_t)(byteLen + 1);
- sum = buffer[byteLen];
- for (i = byteLen - 1; i >= 0; i--)
- sum += ((buffer[i] & UINT_VAR_DATA) << 7 * (byteLen - i)); /* UINT_VAR_DATA == 0x7F */
-
- return sum;
-}
-
-/* See parser_dcf.h */
-int32_t drm_dcfParser(uint8_t *buffer, int32_t bufferLen, T_DRM_DCF_Info *pDcfInfo,
- uint8_t **ppEncryptedData)
-{
- uint8_t *tmpBuf;
- uint8_t *pStart, *pEnd;
- uint8_t *pHeader, *pData;
- uint8_t varLen;
-
- if (NULL == buffer || bufferLen <= 0 || NULL == pDcfInfo)
- return FALSE;
-
- tmpBuf = buffer;
- /* 1. Parse the version, content-type and content-url */
- pDcfInfo->Version = *(tmpBuf++);
- if (0x01 != pDcfInfo->Version) /* Because it is OMA DRM v1.0, the vension must be 1 */
- return FALSE;
- pDcfInfo->ContentTypeLen = *(tmpBuf++);
- pDcfInfo->ContentURILen = *(tmpBuf++);
- strncpy((char *)pDcfInfo->ContentType, (char *)tmpBuf, pDcfInfo->ContentTypeLen);
- tmpBuf += pDcfInfo->ContentTypeLen;
- strncpy((char *)pDcfInfo->ContentURI, (char *)tmpBuf, pDcfInfo->ContentURILen);
- tmpBuf += pDcfInfo->ContentURILen;
-
- /* 2. Get the headers length and data length */
- pDcfInfo->HeadersLen = drm_parseUintVar(tmpBuf, &varLen);
- if (DRM_UINT_VAR_ERR == pDcfInfo->HeadersLen)
- return FALSE;
- tmpBuf += varLen;
- pDcfInfo->DecryptedDataLen = DRM_UNKNOWN_DATA_LEN;
- pDcfInfo->EncryptedDataLen = drm_parseUintVar(tmpBuf, &varLen);
- if (DRM_UINT_VAR_ERR == pDcfInfo->EncryptedDataLen)
- return FALSE;
- tmpBuf += varLen;
- pHeader = tmpBuf;
- tmpBuf += pDcfInfo->HeadersLen;
- pData = tmpBuf;
-
- /* 3. Parse the headers */
- pStart = pHeader;
- while (pStart < pData) {
- pEnd = pStart;
- while ('\r' != *pEnd && pEnd < pData)
- pEnd++;
-
- if (0 == strncmp((char *)pStart, HEADER_ENCRYPTION_METHOD, HEADER_ENCRYPTION_METHOD_LEN))
- strncpy((char *)pDcfInfo->Encryption_Method,
- (char *)(pStart + HEADER_ENCRYPTION_METHOD_LEN),
- pEnd - pStart - HEADER_ENCRYPTION_METHOD_LEN);
- else if (0 == strncmp((char *)pStart, HEADER_RIGHTS_ISSUER, HEADER_RIGHTS_ISSUER_LEN))
- strncpy((char *)pDcfInfo->Rights_Issuer,
- (char *)(pStart + HEADER_RIGHTS_ISSUER_LEN),
- pEnd - pStart - HEADER_RIGHTS_ISSUER_LEN);
- else if (0 == strncmp((char *)pStart, HEADER_CONTENT_NAME, HEADER_CONTENT_NAME_LEN))
- strncpy((char *)pDcfInfo->Content_Name,
- (char *)(pStart + HEADER_CONTENT_NAME_LEN),
- pEnd - pStart - HEADER_CONTENT_NAME_LEN);
- else if (0 == strncmp((char *)pStart, HEADER_CONTENT_DESCRIPTION, HEADER_CONTENT_DESCRIPTION_LEN))
- strncpy((char *)pDcfInfo->ContentDescription,
- (char *)(pStart + HEADER_CONTENT_DESCRIPTION_LEN),
- pEnd - pStart - HEADER_CONTENT_DESCRIPTION_LEN);
- else if (0 == strncmp((char *)pStart, HEADER_CONTENT_VENDOR, HEADER_CONTENT_VENDOR_LEN))
- strncpy((char *)pDcfInfo->ContentVendor,
- (char *)(pStart + HEADER_CONTENT_VENDOR_LEN),
- pEnd - pStart - HEADER_CONTENT_VENDOR_LEN);
- else if (0 == strncmp((char *)pStart, HEADER_ICON_URI, HEADER_ICON_URI_LEN))
- strncpy((char *)pDcfInfo->Icon_URI,
- (char *)(pStart + HEADER_ICON_URI_LEN),
- pEnd - pStart - HEADER_ICON_URI_LEN);
-
- if ('\n' == *(pEnd + 1))
- pStart = pEnd + 2; /* Two bytes: a '\r' and a '\n' */
- else
- pStart = pEnd + 1;
- }
-
- /* 4. Give out the location of encrypted data */
- if (NULL != ppEncryptedData)
- *ppEncryptedData = pData;
-
- return TRUE;
-}
diff --git a/media/libdrm/mobile1/src/parser/parser_dm.c b/media/libdrm/mobile1/src/parser/parser_dm.c
deleted file mode 100644
index f5b7aaf..0000000
--- a/media/libdrm/mobile1/src/parser/parser_dm.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <parser_dm.h>
-#include <parser_dcf.h>
-#include <svc_drm.h>
-#include "log.h"
-
-#define DRM_SKIP_SPACE_TAB(p) while( (*(p) == ' ') || (*(p) == '\t') ) \
- p++
-
-typedef enum _DM_PARSE_STATUS {
- DM_PARSE_START,
- DM_PARSING_RIGHTS,
- DM_PARSING_CONTENT,
- DM_PARSE_END
-} DM_PARSE_STATUS;
-
-static int drm_strnicmp(const uint8_t* s1, const uint8_t* s2, int32_t n)
-{
- if (n < 0 || NULL == s1 || NULL == s2)
- return -1;
-
- if (n == 0)
- return 0;
-
- while (n-- != 0 && tolower(*s1) == tolower(*s2))
- {
- if (n == 0 || *s1 == '\0' || *s2 == '\0')
- break;
- s1++;
- s2++;
- }
-
- return tolower(*s1) - tolower(*s2);
-}
-
-const uint8_t * drm_strnstr(const uint8_t * str, const uint8_t * strSearch, int32_t len)
-{
- int32_t i, stringLen;
-
- if (NULL == str || NULL == strSearch || len <= 0)
- return NULL;
-
- stringLen = strlen((char *)strSearch);
- for (i = 0; i < len - stringLen + 1; i++) {
- if (str[i] == *strSearch && 0 == memcmp(str + i, strSearch, stringLen))
- return str + i;
- }
- return NULL;
-}
-
-/* See parser_dm.h */
-int32_t drm_parseDM(const uint8_t *buffer, int32_t bufferLen, T_DRM_DM_Info *pDmInfo)
-{
- const uint8_t *pStart = NULL, *pEnd = NULL;
- const uint8_t *pBufferEnd;
- int32_t contentLen, leftLen;
- DM_PARSE_STATUS status = DM_PARSE_START;
- int32_t boundaryLen;
-
- if (NULL == buffer || bufferLen <= 0 || NULL == pDmInfo)
- return FALSE;
-
- /* Find the end of the input buffer */
- pBufferEnd = buffer + bufferLen;
- leftLen = bufferLen;
-
- /* Find out the boundary */
- pStart = drm_strnstr(buffer, (uint8_t *)"--", bufferLen);
- if (NULL == pStart)
- return FALSE; /* No boundary error */
- pEnd = pStart;
-
- /* Record the boundary */
- pEnd = drm_strnstr(pStart, (uint8_t *)DRM_NEW_LINE_CRLF, leftLen);
- /* if can not find the CRLF, return FALSE */
- if (NULL == pEnd)
- return FALSE;
- strncpy((char *)pDmInfo->boundary, (char *)pStart, pEnd - pStart);
- boundaryLen = strlen((char *)pDmInfo->boundary) + 2; /* 2 means: '\r' and '\n' */
-
- pEnd += 2; /* skip the '\r' and '\n' */
- pStart = pEnd;
- leftLen = pBufferEnd - pStart;
- do {
- pDmInfo->transferEncoding = DRM_MESSAGE_CODING_7BIT; /* According RFC2045 chapter 6.1, the default value should be 7bit.*/
- strcpy((char *)pDmInfo->contentType, "text/plain"); /* According RFC2045 chapter 5.2, the default value should be "text/plain". */
-
- /* Deal the header information */
- while ((('\r' != *pStart) || ('\n' != *(pStart + 1))) && pStart < pBufferEnd) {
- pEnd = drm_strnstr(pStart, (uint8_t *)DRM_NEW_LINE_CRLF, leftLen);
- if (NULL == pEnd)
- return FALSE;
-
- if (0 != pDmInfo->deliveryType) { /* This means the delivery type has been confirmed */
- if (0 == strncmp((char *)pStart, HEADERS_TRANSFER_CODING, HEADERS_TRANSFER_CODING_LEN)) {
- pStart += HEADERS_TRANSFER_CODING_LEN;
- DRM_SKIP_SPACE_TAB(pStart);
-
- if (0 == strncmp((char *)pStart, TRANSFER_CODING_TYPE_7BIT, pEnd - pStart))
- pDmInfo->transferEncoding = DRM_MESSAGE_CODING_7BIT;
- else if (0 == strncmp((char *)pStart, TRANSFER_CODING_TYPE_8BIT, pEnd - pStart))
- pDmInfo->transferEncoding = DRM_MESSAGE_CODING_8BIT;
- else if (0 == strncmp((char *)pStart, TRANSFER_CODING_TYPE_BINARY, pEnd - pStart))
- pDmInfo->transferEncoding = DRM_MESSAGE_CODING_BINARY;
- else if (0 == strncmp((char *)pStart, TRANSFER_CODING_TYPE_BASE64, pEnd - pStart))
- pDmInfo->transferEncoding = DRM_MESSAGE_CODING_BASE64;
- else
- return FALSE; /* Unknown transferCoding error */
- } else if (0 == drm_strnicmp(pStart, (uint8_t *)HEADERS_CONTENT_TYPE, HEADERS_CONTENT_TYPE_LEN)) {
- pStart += HEADERS_CONTENT_TYPE_LEN;
- DRM_SKIP_SPACE_TAB(pStart);
-
- if (pEnd - pStart > 0) {
- strncpy((char *)pDmInfo->contentType, (char *)pStart, pEnd - pStart);
- pDmInfo->contentType[pEnd - pStart] = '\0';
- }
- } else if (0 == drm_strnicmp(pStart, (uint8_t *)HEADERS_CONTENT_ID, HEADERS_CONTENT_ID_LEN)) {
- uint8_t tmpBuf[MAX_CONTENT_ID] = {0};
- uint8_t *pTmp;
-
- pStart += HEADERS_CONTENT_ID_LEN;
- DRM_SKIP_SPACE_TAB(pStart);
-
- /* error: more than one content id */
- if(drm_strnstr(pStart, (uint8_t*)HEADERS_CONTENT_ID, pBufferEnd - pStart)){
- ALOGD("drm_dmParser: error: more than one content id\r\n");
- return FALSE;
- }
-
- status = DM_PARSING_CONTENT; /* can go here means that the rights object has been parsed. */
-
- /* Change the format from <...> to cid:... */
- if (NULL != (pTmp = (uint8_t *)memchr((char *)pStart, '<', pEnd - pStart))) {
- strncpy((char *)tmpBuf, (char *)(pTmp + 1), pEnd - pTmp - 1);
-
- if (NULL != (pTmp = (uint8_t *)memchr((char *)tmpBuf, '>', pEnd - pTmp - 1))) {
- *pTmp = '\0';
-
- memset(pDmInfo->contentID, 0, MAX_CONTENT_ID);
- sprintf((char *)pDmInfo->contentID, "%s%s", "cid:", (int8_t *)tmpBuf);
- }
- }
- }
- } else { /* First confirm delivery type, Forward_Lock, Combined Delivery or Separate Delivery */
- if (0 == drm_strnicmp(pStart, (uint8_t *)HEADERS_CONTENT_TYPE, HEADERS_CONTENT_TYPE_LEN)) {
- pStart += HEADERS_CONTENT_TYPE_LEN;
- DRM_SKIP_SPACE_TAB(pStart);
-
- if (pEnd - pStart > 0) {
- strncpy((char *)pDmInfo->contentType, (char *)pStart, pEnd - pStart);
- pDmInfo->contentType[pEnd - pStart] = '\0';
- }
-
- if (0 == strcmp((char *)pDmInfo->contentType, DRM_MIME_TYPE_RIGHTS_XML)) {
- pDmInfo->deliveryType = COMBINED_DELIVERY;
- status = DM_PARSING_RIGHTS;
- }
- else if (0 == strcmp((char *)pDmInfo->contentType, DRM_MIME_TYPE_CONTENT)) {
- pDmInfo->deliveryType = SEPARATE_DELIVERY_FL;
- status = DM_PARSING_CONTENT;
- }
- else if (0 == pDmInfo->deliveryType) {
- pDmInfo->deliveryType = FORWARD_LOCK;
- status = DM_PARSING_CONTENT;
- }
- }
- }
- pEnd += 2; /* skip the '\r' and '\n' */
- pStart = pEnd;
- leftLen = pBufferEnd - pStart;
- }
- pStart += 2; /* skip the second CRLF: "\r\n" */
- pEnd = pStart;
-
- /* Deal the content part, including rel or real content */
- while (leftLen > 0) {
- if (NULL == (pEnd = memchr(pEnd, '\r', leftLen))) {
- pEnd = pBufferEnd;
- break; /* no boundary found */
- }
-
- leftLen = pBufferEnd - pEnd;
- if (leftLen < boundaryLen) {
- pEnd = pBufferEnd;
- break; /* here means may be the boundary has been split */
- }
-
- if (('\n' == *(pEnd + 1)) && (0 == memcmp(pEnd + 2, pDmInfo->boundary, strlen((char *)pDmInfo->boundary))))
- break; /* find the boundary here */
-
- pEnd++;
- leftLen--;
- }
-
- if (pEnd >= pBufferEnd)
- contentLen = DRM_UNKNOWN_DATA_LEN;
- else
- contentLen = pEnd - pStart;
-
- switch(pDmInfo->deliveryType) {
- case FORWARD_LOCK:
- pDmInfo->contentLen = contentLen;
- pDmInfo->contentOffset = pStart - buffer;
- status = DM_PARSE_END;
- break;
- case COMBINED_DELIVERY:
- if (DM_PARSING_RIGHTS == status) {
- pDmInfo->rightsLen = contentLen;
- pDmInfo->rightsOffset = pStart - buffer;
- } else {
- pDmInfo->contentLen = contentLen;
- pDmInfo->contentOffset = pStart - buffer;
- status = DM_PARSE_END;
- }
- break;
- case SEPARATE_DELIVERY_FL:
- {
- T_DRM_DCF_Info dcfInfo;
- uint8_t* pEncData = NULL;
-
- memset(&dcfInfo, 0, sizeof(T_DRM_DCF_Info));
- if (DRM_UNKNOWN_DATA_LEN == contentLen)
- contentLen = pEnd - pStart;
- if (FALSE == drm_dcfParser(pStart, contentLen, &dcfInfo, &pEncData))
- return FALSE;
-
- pDmInfo->contentLen = dcfInfo.EncryptedDataLen;
- pDmInfo->contentOffset = pEncData - buffer;
- strcpy((char *)pDmInfo->contentType, (char *)dcfInfo.ContentType);
- strcpy((char *)pDmInfo->contentID, (char *)dcfInfo.ContentURI);
- strcpy((char *)pDmInfo->rightsIssuer, (char *)dcfInfo.Rights_Issuer);
- status = DM_PARSE_END;
- }
- break;
- default:
- return FALSE;
- }
-
- if (DM_PARSING_RIGHTS == status) {
- /* Here means the rights object data has been completed, boundary must exist */
- leftLen = pBufferEnd - pEnd;
- pStart = drm_strnstr(pEnd, pDmInfo->boundary, leftLen);
- if (NULL == pStart)
- return FALSE;
- leftLen = pBufferEnd - pStart;
- pEnd = drm_strnstr(pStart, (uint8_t *)DRM_NEW_LINE_CRLF, leftLen);
- if (NULL == pEnd)
- return FALSE; /* only rights object, no media object, error */
-
- pEnd += 2; /* skip the "\r\n" */
- pStart = pEnd;
- }
- } while (DM_PARSE_END != status);
-
- return TRUE;
-}
diff --git a/media/libdrm/mobile1/src/parser/parser_rel.c b/media/libdrm/mobile1/src/parser/parser_rel.c
deleted file mode 100644
index 537fa9ce..0000000
--- a/media/libdrm/mobile1/src/parser/parser_rel.c
+++ /dev/null
@@ -1,663 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <parser_rel.h>
-#include <parser_dm.h>
-#include <xml_tinyParser.h>
-#include <wbxml_tinyparser.h>
-#include <drm_decoder.h>
-#include <svc_drm.h>
-
-/* See parser_rel.h */
-int32_t drm_monthDays(int32_t year, int32_t month)
-{
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- return 31;
- case 4:
- case 6:
- case 9:
- case 11:
- return 30;
- case 2:
- if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
- return 29;
- else
- return 28;
- default:
- return -1;
- }
-}
-
-int32_t drm_checkDate(int32_t year, int32_t month, int32_t day,
- int32_t hour, int32_t min, int32_t sec)
-{
- if (month >= 1 && month <= 12 &&
- day >= 1 && day <= drm_monthDays(year, month) &&
- hour >= 0 && hour <= 23 &&
- min >= 0 && min <= 59 && sec >= 0 && sec <= 59)
- return 0;
- else
- return -1;
-}
-
-static int32_t drm_getStartEndTime(uint8_t * pValue, int32_t valueLen,
- T_DRM_DATETIME * dateTime)
-{
- int32_t year, mon, day, hour, min, sec;
- uint8_t pTmp[64] = {0};
-
- strncpy((char *)pTmp, (char *)pValue, valueLen);
- {
- uint8_t * pHead = pTmp;
- uint8_t * pEnd = NULL;
- uint8_t tmpByte;
-
- /** get year */
- pEnd = (uint8_t *)strstr((char *)pHead, "-");
- if(NULL == pEnd)
- return FALSE;
- tmpByte = *pEnd;
- *pEnd = '\0';
- year = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpByte;
-
- /** get month */
- pEnd = (uint8_t *)strstr((char *)pHead, "-");
- if(NULL == pEnd)
- return FALSE;
- tmpByte = *pEnd;
- *pEnd = '\0';
- mon = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpByte;
-
- /** get day */
- pEnd = (uint8_t *)strstr((char *)pHead, "T");
- if(NULL == pEnd)
- return FALSE;
- tmpByte = *pEnd;
- *pEnd = '\0';
- day = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpByte;
-
- /** get hour */
- pEnd = (uint8_t *)strstr((char *)pHead, ":");
- if(NULL == pEnd)
- return FALSE;
- tmpByte = *pEnd;
- *pEnd = '\0';
- hour = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpByte;
-
- /** get minute */
- pEnd = (uint8_t *)strstr((char *)pHead, ":");
- if(NULL == pEnd)
- return FALSE;
- tmpByte = *pEnd;
- *pEnd = '\0';
- min = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpByte;
-
- /** get second */
- sec = atoi((char *)pHead);
- }
- if (0 != drm_checkDate(year, mon, day, hour, min, sec))
- return FALSE;
-
- YMD_HMS_2_INT(year, mon, day, dateTime->date, hour, min, sec,
- dateTime->time);
- return TRUE;
-}
-
-static int32_t drm_checkWhetherHasUnknowConstraint(uint8_t* drm_constrain)
-{
- char* begin_constrain = "<o-ex:constraint>";
- char* end_constrain = "</o-ex:constraint>";
- char* constrain_begin = strstr((char*)drm_constrain,begin_constrain);
- char* constrain_end = strstr((char*)drm_constrain,end_constrain);
- uint32_t constrain_len = 0;
-
- if(NULL == constrain_begin)
- return FALSE;
-
- if(NULL == constrain_end)
- return TRUE;
-
- /* compute valid characters length */
- {
- uint32_t constrain_begin_len = strlen(begin_constrain);
- char* cur_pos = constrain_begin + constrain_begin_len;
-
- constrain_len = (constrain_end - constrain_begin) - constrain_begin_len;
-
- while(cur_pos < constrain_end){
- if(isspace(*cur_pos))
- constrain_len--;
-
- cur_pos++;
- }
- }
-
- /* check all constraints */
- {
- #define DRM_ALL_CONSTRAINT_COUNT 5
-
- int32_t i = 0;
- int32_t has_datetime = FALSE;
- int32_t has_start_or_end = FALSE;
-
- char* all_vaild_constraints[DRM_ALL_CONSTRAINT_COUNT][2] = {
- {"<o-dd:count>","</o-dd:count>"},
- {"<o-dd:interval>","</o-dd:interval>"},
- {"<o-dd:datetime>","</o-dd:datetime>"},
- {"<o-dd:start>","</o-dd:start>"},
- {"<o-dd:end>","</o-dd:end>"}
- };
-
- for(i = 0; i < DRM_ALL_CONSTRAINT_COUNT; i++){
- char*start = strstr((char*)drm_constrain,all_vaild_constraints[i][0]);
-
- if(start && (start < constrain_end)){
- char* end = strstr((char*)drm_constrain,all_vaild_constraints[i][1]);
-
- if(end && (end < constrain_end)){
- if(0 == strncmp(all_vaild_constraints[i][0],"<o-dd:datetime>",strlen("<o-dd:datetime>"))){
- constrain_len -= strlen(all_vaild_constraints[i][0]);
- constrain_len -= strlen(all_vaild_constraints[i][1]);
-
- if(0 == constrain_len)
- return TRUE;
-
- has_datetime = TRUE;
- continue;
- }
-
- if((0 == strncmp(all_vaild_constraints[i][0],"<o-dd:start>",strlen("<o-dd:start>")))
- || (0 == strncmp(all_vaild_constraints[i][0],"<o-dd:end>",strlen("<o-dd:end>")))){
- if(FALSE == has_datetime)
- return TRUE;
- else
- has_start_or_end = TRUE;
- }
-
- constrain_len -= (end - start);
- constrain_len -= strlen(all_vaild_constraints[i][1]);
-
- if(0 == constrain_len)
- if(has_datetime != has_start_or_end)
- return TRUE;
- else
- return FALSE;
- }
- else
- return TRUE;
- }
- }
-
- if(has_datetime != has_start_or_end)
- return TRUE;
-
- if(constrain_len)
- return TRUE;
- else
- return FALSE;
- }
-}
-
-static int32_t drm_getRightValue(uint8_t * buffer, int32_t bufferLen,
- T_DRM_Rights * ro, uint8_t * operation,
- uint8_t oper_char)
-{
- uint8_t *pBuf, *pValue;
- uint8_t sProperty[256];
- int32_t valueLen;
- int32_t year, mon, day, hour, min, sec;
- T_DRM_Rights_Constraint *pConstraint;
- int32_t *bIsAble;
- uint8_t *ret = NULL;
- int32_t flag = 0;
-
- if (operation == NULL) {
- switch (oper_char) {
- case REL_TAG_PLAY:
- pConstraint = &(ro->PlayConstraint);
- bIsAble = &(ro->bIsPlayable);
- break;
- case REL_TAG_DISPLAY:
- pConstraint = &(ro->DisplayConstraint);
- bIsAble = &(ro->bIsDisplayable);
- break;
- case REL_TAG_EXECUTE:
- pConstraint = &(ro->ExecuteConstraint);
- bIsAble = &(ro->bIsExecuteable);
- break;
- case REL_TAG_PRINT:
- pConstraint = &(ro->PrintConstraint);
- bIsAble = &(ro->bIsPrintable);
- break;
- default:
- return FALSE; /* The input parm is err */
- }
- } else {
- if (strcmp((char *)operation, "play") == 0) {
- pConstraint = &(ro->PlayConstraint);
- bIsAble = &(ro->bIsPlayable);
- } else if (strcmp((char *)operation, "display") == 0) {
- pConstraint = &(ro->DisplayConstraint);
- bIsAble = &(ro->bIsDisplayable);
- } else if (strcmp((char *)operation, "execute") == 0) {
- pConstraint = &(ro->ExecuteConstraint);
- bIsAble = &(ro->bIsExecuteable);
- } else if (strcmp((char *)operation, "print") == 0) {
- pConstraint = &(ro->PrintConstraint);
- bIsAble = &(ro->bIsPrintable);
- } else
- return FALSE; /* The input parm is err */
- }
-
- if (operation == NULL) {
- sprintf((char *)sProperty, "%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char);
- ret = WBXML_DOM_getNode(buffer, bufferLen, sProperty);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s",
- operation);
- ret = XML_DOM_getNode(buffer, sProperty);
- }
- CHECK_VALIDITY(ret);
- if (NULL == ret)
- return TRUE;
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_NO_CONSTRAINT); /* If exit first assume have utter rights */
- flag = 1;
-
- if (operation == NULL) { /* If father element node is not exit then return */
- sprintf((char *)sProperty, "%c%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char,
- REL_TAG_CONSTRAINT);
- ret = WBXML_DOM_getNode(buffer, bufferLen, sProperty);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint",
- operation);
- ret = XML_DOM_getNode(buffer, sProperty);
- }
-
- CHECK_VALIDITY(ret);
- if (ret == NULL)
- return TRUE;
-
- if(TRUE == drm_checkWhetherHasUnknowConstraint(ret))
- return FALSE;
-
- *bIsAble = 0;
- pConstraint->Indicator = DRM_NO_PERMISSION; /* If exit constraint assume have no rights */
- flag = 2;
-
- if (operation == NULL) {
- sprintf((char *)sProperty, "%c%c%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char,
- REL_TAG_CONSTRAINT, REL_TAG_INTERVAL);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:interval",
- operation);
- pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen);
- }
- CHECK_VALIDITY(pBuf);
- if (pBuf) { /* If interval element exit then get the value */
- uint8_t pTmp[64] = {0};
-
- strncpy((char *)pTmp, (char *)pValue, valueLen);
- {
- uint8_t * pHead = pTmp + 1;
- uint8_t * pEnd = NULL;
- uint8_t tmpChar;
-
- /** get year */
- pEnd = (uint8_t *)strstr((char *)pHead, "Y");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- year = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpChar;
-
- /** get month */
- pEnd = (uint8_t *)strstr((char *)pHead, "M");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- mon = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpChar;
-
- /** get day */
- pEnd = (uint8_t *)strstr((char *)pHead, "D");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- day = atoi((char *)pHead);
- pHead = pEnd + 2;
- *pEnd = tmpChar;
-
- /** get hour */
- pEnd = (uint8_t *)strstr((char *)pHead, "H");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- hour = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpChar;
-
- /** get minute */
- pEnd = (uint8_t *)strstr((char *)pHead, "M");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- min = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpChar;
-
- /** get second */
- pEnd = (uint8_t *)strstr((char *)pHead, "S");
- if(NULL == pEnd)
- return FALSE;
- tmpChar = *pEnd;
- *pEnd = '\0';
- sec = atoi((char *)pHead);
- pHead = pEnd + 1;
- *pEnd = tmpChar;
- }
-
- if (year < 0 || mon < 0 || day < 0 || hour < 0
- || min < 0 || sec < 0)
- return FALSE;
- YMD_HMS_2_INT(year, mon, day, pConstraint->Interval.date, hour,
- min, sec, pConstraint->Interval.time);
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator,
- DRM_INTERVAL_CONSTRAINT);
- flag = 3;
- }
-
- if (operation == NULL) {
- sprintf((char *)sProperty, "%c%c%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char,
- REL_TAG_CONSTRAINT, REL_TAG_COUNT);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:count",
- operation);
- pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen);
- }
- CHECK_VALIDITY(pBuf);
- if (pBuf) { /* If count element exit the get the value */
- uint8_t pTmp[16] = {0};
- int32_t i;
-
- for (i = 0; i < valueLen; i++) { /* Check the count format */
- if (0 == isdigit(*(pValue + i)))
- return FALSE;
- }
-
- strncpy((char *)pTmp, (char *)pValue, valueLen);
- pConstraint->Count = atoi((char *)pTmp);
-
- if(0 == pConstraint->Count)
- {
- WRITE_RO_FLAG(*bIsAble, 0, pConstraint->Indicator, DRM_NO_PERMISSION);
- }
- else if( pConstraint->Count > 0)
- {
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_COUNT_CONSTRAINT);
- }
- else /* < 0 */
- {
- return FALSE;
- }
-
- flag = 3;
- }
-
- if (operation == NULL) {
- sprintf((char *)sProperty, "%c%c%c%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char,
- REL_TAG_CONSTRAINT, REL_TAG_DATETIME, REL_TAG_START);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:datetime\\o-dd:start",
- operation);
- pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen);
- }
- CHECK_VALIDITY(pBuf);
- if (pBuf) { /* If start element exit then get the value */
- if (FALSE ==
- drm_getStartEndTime(pValue, valueLen, &pConstraint->StartTime))
- return FALSE;
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_START_TIME_CONSTRAINT);
- flag = 3;
- }
-
- if (operation == NULL) {
- sprintf((char *)sProperty, "%c%c%c%c%c%c%c", REL_TAG_RIGHTS,
- REL_TAG_AGREEMENT, REL_TAG_PERMISSION, oper_char,
- REL_TAG_CONSTRAINT, REL_TAG_DATETIME, REL_TAG_END);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- } else {
- sprintf((char *)sProperty,
- "o-ex:rights\\o-ex:agreement\\o-ex:permission\\o-dd:%s\\o-ex:constraint\\o-dd:datetime\\o-dd:end",
- operation);
- pBuf = XML_DOM_getNodeValue(buffer, sProperty, &pValue, &valueLen);
- }
- CHECK_VALIDITY(pBuf);
- if (pBuf) {
- if (FALSE ==
- drm_getStartEndTime(pValue, valueLen, &pConstraint->EndTime))
- return FALSE;
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_END_TIME_CONSTRAINT);
- flag = 3;
- }
-
- if (2 == flag)
- WRITE_RO_FLAG(*bIsAble, 1, pConstraint->Indicator, DRM_NO_CONSTRAINT); /* If exit first assume have utter rights */
- return TRUE;
-}
-
-/* See parser_rel.h */
-int32_t drm_relParser(uint8_t* buffer, int32_t bufferLen, int32_t Format, T_DRM_Rights* pRights)
-{
- uint8_t *pBuf, *pValue;
- uint8_t sProperty[256];
- int32_t valueLen;
-
- if (TYPE_DRM_RIGHTS_WBXML != Format && TYPE_DRM_RIGHTS_XML != Format) /* It is not the support parse format */
- return FALSE;
-
- if (TYPE_DRM_RIGHTS_XML == Format) {
- /* Check whether it is a CD, and parse it using TYPE_DRM_RIGHTS_XML */
- if (NULL != drm_strnstr(buffer, (uint8_t *)HEADERS_CONTENT_ID, bufferLen))
- return FALSE;
-
- pBuf =
- XML_DOM_getNodeValue(buffer,
- (uint8_t *)"o-ex:rights\\o-ex:context\\o-dd:version",
- &pValue, &valueLen);
- CHECK_VALIDITY(pBuf);
-
- if (pBuf) {
- if (valueLen > 8) /* Check version lenth */
- return FALSE;
-
- /* error version */
- if(strncmp(pValue,"1.0",valueLen))
- return FALSE;
-
- strncpy((char *)pRights->Version, (char *)pValue, valueLen);
- } else
- return FALSE;
-
- /* this means there is more than one version label in rights */
- if(strstr((char*)pBuf, "<o-dd:version>"))
- return FALSE;
-
- pBuf =
- XML_DOM_getNodeValue(buffer,
- (uint8_t *)"o-ex:rights\\o-ex:agreement\\o-ex:asset\\ds:KeyInfo\\ds:KeyValue",
- &pValue, &valueLen);
- CHECK_VALIDITY(pBuf);
- if (pBuf) { /* Get keyvalue */
- int32_t keyLen;
-
- if (24 != valueLen)
- return FALSE;
-
- keyLen = drm_decodeBase64(NULL, 0, pValue, &valueLen);
- if (keyLen < 0)
- return FALSE;
-
- if (DRM_KEY_LEN != drm_decodeBase64(pRights->KeyValue, keyLen, pValue, &valueLen))
- return FALSE;
- }
-
- pBuf =
- XML_DOM_getNodeValue(buffer,
- (uint8_t *)"o-ex:rights\\o-ex:agreement\\o-ex:asset\\o-ex:context\\o-dd:uid",
- &pValue, &valueLen);
- CHECK_VALIDITY(pBuf);
- if (pBuf) {
- if (valueLen > DRM_UID_LEN)
- return FALSE;
- strncpy((char *)pRights->uid, (char *)pValue, valueLen);
- pRights->uid[valueLen] = '\0';
- } else
- return FALSE;
-
- /* this means there is more than one uid label in rights */
- if(strstr((char*)pBuf, "<o-dd:uid>"))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"play", 0))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"display", 0))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"execute", 0))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, (uint8_t *)"print", 0))
- return FALSE;
- } else if (TYPE_DRM_RIGHTS_WBXML == Format) {
- if (!REL_CHECK_WBXML_HEADER(buffer))
- return FALSE;
-
- sprintf((char *)sProperty, "%c%c%c", REL_TAG_RIGHTS, REL_TAG_CONTEXT,
- REL_TAG_VERSION);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- CHECK_VALIDITY(pBuf);
-
- if (pBuf) {
- if (valueLen > 8) /* Check version lenth */
- return FALSE;
- strncpy((char *)pRights->Version, (char *)pValue, valueLen);
- } else
- return FALSE;
-
- sprintf((char *)sProperty, "%c%c%c%c%c",
- REL_TAG_RIGHTS, REL_TAG_AGREEMENT, REL_TAG_ASSET,
- REL_TAG_KEYINFO, REL_TAG_KEYVALUE);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- CHECK_VALIDITY(pBuf);
- if (pBuf) {
- if (DRM_KEY_LEN != valueLen)
- return FALSE;
- memcpy(pRights->KeyValue, pValue, DRM_KEY_LEN);
- memset(pValue, 0, DRM_KEY_LEN); /* Clean the KeyValue */
- }
-
- sprintf((char *)sProperty, "%c%c%c%c%c",
- REL_TAG_RIGHTS, REL_TAG_AGREEMENT, REL_TAG_ASSET,
- REL_TAG_CONTEXT, REL_TAG_UID);
- pBuf =
- WBXML_DOM_getNodeValue(buffer, bufferLen, sProperty, (uint8_t **)&pValue,
- &valueLen);
- CHECK_VALIDITY(pBuf);
- if (pBuf) {
- if (valueLen > DRM_UID_LEN)
- return FALSE;
- strncpy((char *)pRights->uid, (char *)pValue, valueLen);
- pRights->uid[valueLen] = '\0';
- } else
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, NULL,
- REL_TAG_PLAY))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, NULL,
- REL_TAG_DISPLAY))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, NULL,
- REL_TAG_EXECUTE))
- return FALSE;
-
- if (FALSE ==
- drm_getRightValue(buffer, bufferLen, pRights, NULL,
- REL_TAG_PRINT))
- return FALSE;
- }
-
- return TRUE;
-}
diff --git a/media/libdrm/mobile1/src/xml/xml_tinyparser.c b/media/libdrm/mobile1/src/xml/xml_tinyparser.c
deleted file mode 100644
index 7580312..0000000
--- a/media/libdrm/mobile1/src/xml/xml_tinyparser.c
+++ /dev/null
@@ -1,834 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#include <xml/xml_tinyParser.h>
-
-int32_t xml_errno;
-
-#ifdef XML_DOM_PARSER
-
-#define XML_IS_WHITESPACE(x) ((x) == '\t' || (x) == '\n' || (x) == ' ' || (x) == '\r')
-#define XML_IS_NAMECHAR(ch) (isalpha(ch) || isdigit(ch) || ch ==':' || \
- ch == '_' || ch == '-' || ch =='.')
-
-static uint8_t *xml_ignore_blank(uint8_t *buffer)
-{
- if (NULL == buffer)
- return NULL;
-
- while (XML_IS_WHITESPACE(*buffer))
- buffer++;
-
- return buffer;
-}
-
-static uint8_t *xml_goto_tagend(uint8_t *buffer)
-{
- int32_t nameLen, valueLen;
- uint8_t *name, *value;
-
- if (NULL == buffer)
- return NULL;
-
- /* Ignore the start-tag */
- if (*buffer == '<') {
- buffer++;
- while (buffer != NULL && XML_IS_NAMECHAR(*buffer))
- buffer++;
- if (NULL == buffer)
- return NULL;
- }
-
- do {
- if (NULL == (buffer = xml_ignore_blank(buffer)))
- return NULL;
-
- if (*buffer == '>' || (*buffer == '/' && *(buffer + 1) == '>'))
- return buffer;
-
- if (NULL ==
- XML_DOM_getAttr(buffer, &name, &nameLen, &value, &valueLen))
- return NULL;
-
- buffer = value + valueLen + 1;
- } while (*buffer != '\0');
-
- return NULL;
-}
-
-static uint8_t *xml_match_tag(uint8_t *buffer)
-{
- int32_t tagLen, tagType, bal;
-
- if (NULL == buffer)
- return NULL;
-
- bal = 0;
- do {
- if (NULL == (buffer = XML_DOM_getTag(buffer, &tagLen, &tagType)))
- return NULL;
-
- switch (tagType) {
- case XML_TAG_SELF:
- case XML_TAG_START:
- if (NULL == (buffer = xml_goto_tagend(buffer + tagLen + 1)))
- return NULL;
- if (strncmp((char *)buffer, "/>", 2) == 0) {
- buffer += 2;
- } else {
- bal++;
- }
- break;
-
- case XML_TAG_END:
- if (bal <= 0)
- return NULL;
- buffer = buffer + tagLen + 2;
- bal--;
- break;
- }
- } while (bal != 0);
-
- return buffer;
-}
-
-uint8_t *XML_DOM_getAttr(uint8_t *buffer, uint8_t **pName, int32_t *nameLen,
- uint8_t **pValue, int32_t *valueLen)
-{
- uint8_t charQuoted;
-
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- /* Ignore the tag */
- if (*buffer == '<') {
- buffer++;
- /* Ignore the STag */
- while (buffer != NULL && XML_IS_NAMECHAR(*buffer))
- buffer++;
- if (NULL == buffer)
- return NULL;
- }
-
- if (NULL == (buffer = xml_ignore_blank(buffer))) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- /* Name */
- *pName = buffer;
- while (buffer != NULL && XML_IS_NAMECHAR(*buffer))
- buffer++;
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_ATTR_NAME);
- return NULL;
- }
- *nameLen = buffer - *pName;
- if (*nameLen <= 0) {
- XML_ERROR(XML_ERROR_ATTR_NAME);
- return NULL;
- }
-
- /* '=' */
- buffer = xml_ignore_blank(buffer);
- if (NULL == buffer || *buffer != '=') {
- XML_ERROR(XML_ERROR_ATTR_MISSED_EQUAL);
- return NULL;
- }
-
- /* Value */
- buffer++;
- buffer = xml_ignore_blank(buffer);
- if (NULL == buffer || (*buffer != '"' && *buffer != '\'')) {
- XML_ERROR(XML_ERROR_ATTR_VALUE);
- return NULL;
- }
- charQuoted = *buffer++;
- *pValue = buffer;
- while (*buffer != '\0' && *buffer != charQuoted)
- buffer++;
- if (*buffer != charQuoted) {
- XML_ERROR(XML_ERROR_ATTR_VALUE);
- return NULL;
- }
- *valueLen = buffer - *pValue;
-
- XML_ERROR(XML_ERROR_OK);
-
- return buffer + 1;
-}
-
-uint8_t *XML_DOM_getValue(uint8_t *buffer, uint8_t **pValue, int32_t *valueLen)
-{
- uint8_t *pEnd;
-
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- /* Ignore the STag */
- if (*buffer == '<') {
- buffer++;
- /* If it's an end_tag, no value should be returned */
- if (*buffer == '/') {
- *valueLen = 0;
- XML_ERROR(XML_ERROR_NOVALUE);
- return NULL;
- }
-
- while (buffer != NULL && XML_IS_NAMECHAR(*buffer))
- buffer++;
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- if (NULL == (buffer = xml_goto_tagend(buffer))) {
- XML_ERROR(XML_ERROR_PROPERTY_END);
- return NULL;
- }
- }
-
- /* <test/> node found */
- if (*buffer == '/') {
- if (*(buffer + 1) != '>') {
- XML_ERROR(XML_ERROR_PROPERTY_END);
- return NULL;
- }
- XML_ERROR(XML_ERROR_OK);
- *valueLen = 0;
- return buffer;
- }
-
- if (*buffer == '>')
- buffer++;
-
- if (NULL == (buffer = xml_ignore_blank(buffer))) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- /* the following is a tag instead of the value */
- if (*buffer == '<') { /* nono value, such as <test></test> */
- buffer++;
- if (*buffer != '/') {
- XML_ERROR(XML_ERROR_ENDTAG);
- return NULL;
- }
- *valueLen = 0;
- XML_ERROR(XML_ERROR_OK);
- return NULL;
- }
-
- *pValue = buffer;
- pEnd = NULL;
- while (*buffer != '\0' && *buffer != '<') {
- if (!XML_IS_WHITESPACE(*buffer))
- pEnd = buffer;
- buffer++;
- }
- if (*buffer != '<' || pEnd == NULL) {
- XML_ERROR(XML_ERROR_VALUE);
- return NULL;
- }
-
- *valueLen = pEnd - *pValue + 1;
-
- buffer++;
- if (*buffer != '/') {
- XML_ERROR(XML_ERROR_ENDTAG);
- return NULL;
- }
-
- XML_ERROR(XML_ERROR_OK);
-
- return buffer - 1;
-}
-
-uint8_t *XML_DOM_getTag(uint8_t *buffer, int32_t *tagLen, int32_t *tagType)
-{
- uint8_t *pStart;
-
- /* WARNING: <!-- --> comment is not supported in this verison */
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- do {
- while (*buffer != '<') {
- if (*buffer == '\0') {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- if (*buffer == '\"' || *buffer == '\'') {
- uint8_t charQuoted = *buffer;
- buffer++;
- while (*buffer != '\0' && *buffer != charQuoted)
- buffer++;
- if (*buffer == '\0') {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
- }
- buffer++;
- }
- buffer++;
- } while (*buffer == '!' || *buffer == '?');
-
- pStart = buffer - 1;
-
- if (*buffer == '/') {
- buffer++;
- *tagType = XML_TAG_END;
- } else {
- /* check here if it is self-end-tag */
- uint8_t *pCheck = xml_goto_tagend(pStart);
- if (pCheck == NULL) {
- XML_ERROR(XML_ERROR_PROPERTY_END);
- return NULL;
- }
-
- if (*pCheck == '>')
- *tagType = XML_TAG_START;
- else if (strncmp((char *)pCheck, "/>", 2) == 0)
- *tagType = XML_TAG_SELF;
- else {
- XML_ERROR(XML_ERROR_PROPERTY_END);
- return NULL;
- }
- }
-
- while (buffer != NULL && XML_IS_NAMECHAR(*buffer))
- buffer++;
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- if (*tagType == XML_TAG_END)
- *tagLen = buffer - pStart - 2;
- else
- *tagLen = buffer - pStart - 1;
-
- XML_ERROR(XML_ERROR_OK);
-
- return pStart;
-}
-
-uint8_t *XML_DOM_getNode(uint8_t *buffer, const uint8_t *const node)
-{
- uint8_t *pStart;
- uint8_t buf[XML_MAX_PROPERTY_LEN + 2];
- uint8_t *nodeStr = buf;
- uint8_t *retPtr = NULL;
- int32_t tagLen, tagType;
- uint8_t *lastNode = (uint8_t *)"";
-
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- strncpy((char *)nodeStr, (char *)node, XML_MAX_PROPERTY_LEN);
- strcat((char *)nodeStr, "\\");
- pStart = (uint8_t *)strchr((char *)nodeStr, '\\');
-
- while (pStart != NULL) {
- *pStart = '\0';
-
- /* get the first start_tag from buffer */
- if (NULL == (buffer = XML_DOM_getTag(buffer, &tagLen, &tagType))) {
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
-
- if (tagType == XML_TAG_END) {
- if (0 ==
- strncmp((char *)lastNode, (char *)(buffer + 2), strlen((char *)lastNode)))
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- else
- XML_ERROR(XML_ERROR_NO_START_TAG);
- return NULL;
- }
-
- /* wrong node, contiue to fetch the next node */
- if ((int32_t) strlen((char *)nodeStr) != tagLen
- || strncmp((char *)nodeStr, (char *)(buffer + 1), tagLen) != 0) {
- /* we should ignore all the middle code */
- buffer = xml_match_tag(buffer);
- continue;
- }
-
- retPtr = buffer; /* retPtr starts with '<xxx>' */
- buffer += (tagLen + 1);
-
- if (tagType == XML_TAG_SELF) {
- nodeStr = pStart + 1;
- break;
- }
-
- lastNode = nodeStr;
- nodeStr = pStart + 1;
- pStart = (uint8_t *)strchr((char *)nodeStr, '\\');
- }
-
- /* Check 5: nodeStr should be empty here */
- if (*nodeStr != '\0') {
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
-
- XML_ERROR(XML_ERROR_OK);
-
- return retPtr;
-}
-
-uint8_t *XML_DOM_getNodeValue(uint8_t *buffer, uint8_t *node,
- uint8_t **value, int32_t *valueLen)
-{
- uint8_t *pStart;
- uint8_t *lastTag;
-
- if (NULL == node || NULL == buffer) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- lastTag = node + strlen((char *)node) - 1;
- while (lastTag >= node && *lastTag != '\\')
- lastTag--;
- lastTag++;
-
- if (NULL == (pStart = XML_DOM_getNode(buffer, node)))
- return NULL;
-
- pStart += (strlen((char *)lastTag) + 1);
-
- if (NULL == (pStart = xml_goto_tagend(pStart))) {
- XML_ERROR(XML_ERROR_PROPERTY_END);
- return NULL;
- }
-
- if (NULL == (pStart = XML_DOM_getValue(pStart, value, valueLen)))
- return NULL;
-
- /* Check the end tag */
-#ifdef XML_DOM_CHECK_ENDTAG
- if (strncmp((char *)pStart, "/>", 2) == 0) {
-
- } else if (strncmp((char *)lastTag, (char *)(pStart + 2), strlen((char *)lastTag)) !=
- 0) {
- XML_ERROR(XML_ERROR_ENDTAG);
- return NULL;
- }
-#endif
-
- XML_ERROR(XML_ERROR_OK);
-
- return *value;
-}
-
-uint8_t *XML_DOM_getNextNode(uint8_t *buffer, uint8_t **pNodeName, int32_t *nodenameLen)
-{
- int32_t tagType;
-
- if (NULL == buffer)
- return NULL;
-
- do {
- if (NULL ==
- (buffer = XML_DOM_getTag(buffer + 1, nodenameLen, &tagType))) {
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
- } while (tagType == XML_TAG_END);
-
- *pNodeName = buffer + 1;
-
- XML_ERROR(XML_ERROR_OK);
-
- return buffer;
-}
-
-#endif /* XML_DOM_PARSER */
-
-#ifdef WBXML_DOM_PARSER
-
-#ifdef WBXML_OLD_VERSION
-uint8_t *WBXML_DOM_getNode(uint8_t *buffer, int32_t bufferLen,
- uint8_t *node)
-{
- int32_t i = 0, j = 0;
-
- if (NULL == buffer || node == NULL) {
- XML_ERROR(XML_ERROR_BUFFER_NULL);
- return NULL;
- }
-
- while (i < bufferLen) {
- if (WBXML_GET_TAG(buffer[i]) == WBXML_GET_TAG(node[j])) {
- j++;
- if (node[j] == '\0')
- break;
-
- /* Check if there is the content(it should have content) */
- if (!WBXML_HAS_CONTENT(buffer[i])) {
- /*XML_ERROR(WBXML_ERROR_MISSED_CONTENT); */
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
-
- /* Ignore the attrib filed */
- if (WBXML_HAS_ATTR(buffer[i])) {
- while (i < bufferLen && buffer[i] != WBXML_ATTR_END)
- i++;
- if (i >= bufferLen)
- break;
- }
- }
- i++;
-
- /* Ignore the content filed */
- if (buffer[i] == WBXML_STR_I) {
- while (i < bufferLen && buffer[i] != WBXML_END)
- i++;
- if (i >= bufferLen)
- break;
- i++;
- }
- }
-
- if (i >= bufferLen) {
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
-
- XML_ERROR(XML_ERROR_OK);
-
- return buffer + i + 1;
-}
-
-uint8_t *WBXML_DOM_getNodeValue(uint8_t *buffer, int32_t bufferLen,
- uint8_t *node,
- uint8_t **value, int32_t *valueLen)
-{
- int32_t i;
- uint8_t *pEnd;
-
- *value = NULL;
- *valueLen = 0;
-
- pEnd = buffer + bufferLen;
- buffer = WBXML_DOM_getNode(buffer, bufferLen, node);
- if (NULL == buffer) {
- XML_ERROR(XML_ERROR_NO_SUCH_NODE);
- return NULL;
- }
-
- if (*buffer == WBXML_OPAUE) {
- buffer++;
- *valueLen = WBXML_GetUintVar(buffer, &i);
- if (*valueLen < 0) {
- XML_ERROR(WBXML_ERROR_MBUINT32);
- return NULL;
- }
- buffer += i;
- *value = buffer;
- return *value;
- }
-
- if (*buffer != WBXML_STR_I) {
- XML_ERROR(WBXML_ERROR_MISSED_STARTTAG);
- return NULL;
- }
-
- buffer++;
-
- i = 0;
- while ((buffer + i) < pEnd && buffer[i] != WBXML_END)
- i++;
-
- if (buffer[i] != WBXML_END) {
- XML_ERROR(WBXML_ERROR_MISSED_ENDTAG);
- return NULL;
- }
-
- *value = buffer;
- *valueLen = i;
- XML_ERROR(XML_ERROR_OK);
-
- return *value;
-}
-#endif /* WBXML_OLD_VERSION */
-
-#define MAX_UINT_VAR_BYTE 4
-#define UINTVAR_INVALID -1
-int32_t WBXML_GetUintVar(const uint8_t *const buffer, int32_t *len)
-{
- int32_t i, byteLen;
- int32_t sum;
-
- byteLen = 0;
- while ((buffer[byteLen] & 0x80) > 0 && byteLen < MAX_UINT_VAR_BYTE)
- byteLen++;
-
- if (byteLen > MAX_UINT_VAR_BYTE)
- return UINTVAR_INVALID;
-
- *len = byteLen + 1;
- sum = buffer[byteLen];
- for (i = byteLen - 1; i >= 0; i--)
- sum += ((buffer[i] & 0x7F) << 7 * (byteLen - i));
-
- return sum;
-}
-
-XML_BOOL WBXML_DOM_Init(WBXML * pWbxml, uint8_t *buffer,
- int32_t bufferLen)
-{
- int32_t num, len;
-
- pWbxml->End = buffer + bufferLen;
- pWbxml->version = *buffer++;
- if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len)))
- return XML_FALSE;
- buffer += len;
- pWbxml->publicid = num;
- if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len)))
- return XML_FALSE;
- buffer += len;
- pWbxml->charset = num;
- if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len)))
- return XML_FALSE;
- buffer += len;
- pWbxml->strTable = buffer;
- pWbxml->strTableLen = num;
- buffer += num;
- pWbxml->curPtr = pWbxml->Content = buffer;
- pWbxml->depth = 0;
-
- return XML_TRUE;
-}
-
-void WBXML_DOM_Rewind(WBXML * pWbxml)
-{
- pWbxml->curPtr = pWbxml->Content;
-}
-
-XML_BOOL WBXML_DOM_Eof(WBXML * pWbxml)
-{
- if (pWbxml->curPtr > pWbxml->End)
- return XML_TRUE;
-
- return XML_FALSE;
-}
-
-uint8_t WBXML_DOM_GetTag(WBXML * pWbxml)
-{
- uint8_t tagChar;
-
- if (pWbxml->curPtr > pWbxml->End)
- return XML_EOF;
-
- tagChar = *pWbxml->curPtr;
- pWbxml->curPtr++;
-
- if (WBXML_GET_TAG(tagChar) == WBXML_CONTENT_END)
- pWbxml->depth--;
- else
- pWbxml->depth++;
-
- return tagChar;
-}
-
-uint8_t WBXML_DOM_GetChar(WBXML * pWbxml)
-{
- return *pWbxml->curPtr++;
-}
-
-void WBXML_DOM_Seek(WBXML * pWbxml, int32_t offset)
-{
- pWbxml->curPtr += offset;
-}
-
-uint8_t WBXML_DOM_GetUIntVar(WBXML * pWbxml)
-{
- int32_t num, len;
-
- num = WBXML_GetUintVar(pWbxml->curPtr, &len);
- pWbxml->curPtr += len;
-
- return (uint8_t)num;
-}
-
-#ifdef XML_TREE_STRUCTURE
-
-#ifdef DEBUG_MODE
-static int32_t malloc_times = 0;
-static int32_t free_times = 0;
-void XML_PrintMallocInfo()
-{
- printf("====XML_PrintMallocInfo====\n");
- printf(" Total malloc times:%d\n", malloc_times);
- printf(" Total free times:%d\n", free_times);
- printf("===========================\n");
-}
-#endif
-
-void *xml_malloc(int32_t size)
-{
-#ifdef DEBUG_MODE
- malloc_times++;
-#endif
- return malloc(size);
-}
-
-void xml_free(void *buffer)
-{
-#ifdef DEBUG_MODE
- free_times++;
-#endif
- free(buffer);
-}
-
-XML_TREE *xml_tree_fillnode(uint8_t **buf, int32_t tagLen)
-{
- XML_TREE *Tree;
- uint8_t *pAttr, *pName, *pValue;
- int32_t nameLen, valueLen;
- uint8_t *buffer = *buf;
-
- if (NULL == (Tree = (XML_TREE *) xml_malloc(sizeof(XML_TREE))))
- return NULL;
- memset(Tree, 0, sizeof(XML_TREE));
-
- strncpy((char *)Tree->tag, (char *)++buffer, tagLen);
- buffer += tagLen;
- pAttr = buffer;
-
- /* attribute */
- while (NULL !=
- (pAttr =
- XML_DOM_getAttr(pAttr, &pName, &nameLen, &pValue,
- &valueLen))) {
- XML_TREE_ATTR *attr;
- if (NULL ==
- (attr = (XML_TREE_ATTR *) xml_malloc(sizeof(XML_TREE_ATTR))))
- return NULL;
- memset(attr, 0, sizeof(XML_TREE_ATTR));
- strncpy((char *)attr->name, (char *)pName, nameLen);
- strncpy((char *)attr->value, (char *)pValue, valueLen);
- buffer = pValue + valueLen + 1;
-
- if (NULL != Tree->attr) // no attribute now
- Tree->last_attr->next = attr;
- else
- Tree->attr = attr;
- Tree->last_attr = attr;
- }
-
- /* value */
- pAttr = XML_DOM_getValue(buffer, &pValue, &valueLen);
- if (pAttr != NULL && valueLen > 0) {
- strncpy((char *)Tree->value, (char *)pValue, valueLen);
- buffer = pValue + valueLen;
- }
-
- *buf = buffer;
- return Tree;
-}
-
-XML_TREE *XML_makeTree(uint8_t **buf)
-{
- uint8_t *pBuf;
- int32_t valueLen, tagType;
- uint8_t *buffer = *buf;
- XML_TREE *TreeHead = NULL;
-
- if (NULL == (buffer = XML_DOM_getTag(buffer, &valueLen, &tagType)))
- return NULL;
- if (XML_TAG_END == tagType)
- return NULL;
- if (NULL == (TreeHead = xml_tree_fillnode(&buffer, valueLen)))
- return NULL;
- if (XML_TAG_SELF == tagType) {
- *buf = buffer;
- return TreeHead;
- }
-
- do {
- if (NULL == (pBuf = XML_DOM_getTag(buffer, &valueLen, &tagType)))
- return NULL;
-
- switch (tagType) {
- case XML_TAG_SELF:
- case XML_TAG_START:
- if (NULL == TreeHead->child)
- TreeHead->child = XML_makeTree(&buffer);
- else if (NULL == TreeHead->child->last_brother) {
- TreeHead->child->brother = XML_makeTree(&buffer);
- TreeHead->child->last_brother = TreeHead->child->brother;
- } else {
- TreeHead->child->last_brother->brother =
- XML_makeTree(&buffer);
- TreeHead->child->last_brother =
- TreeHead->child->last_brother->brother;
- }
- break;
- case XML_TAG_END:
- *buf = pBuf;
- return TreeHead;
- }
- buffer++;
- } while (1);
-}
-
-void XML_freeTree(XML_TREE * pTree)
-{
- XML_TREE *p, *pNext;
- XML_TREE_ATTR *pa, *lastpa;
-
- if (NULL == pTree)
- return;
-
- p = pTree->brother;
- while (NULL != p) {
- pNext = p->brother;
- p->brother = NULL;
- XML_freeTree(p);
- p = pNext;
- }
-
- if (NULL != pTree->child)
- XML_freeTree(pTree->child);
-
- pa = pTree->attr;
- while (NULL != pa) {
- lastpa = pa;
- pa = pa->next;
- xml_free(lastpa);
- }
- xml_free(pTree);
-}
-
-#endif /* XML_TREE_STRUCTURE */
-
-#endif /* WBXML_DOM_PARSER */
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index de77cac..58fc8e8 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -146,6 +146,8 @@
Slog.e(TAG, "Could not copy URI " + packageURI.toString() + " Security: "
+ e.getMessage());
return PackageManager.INSTALL_FAILED_INVALID_APK;
+ } finally {
+ IoUtils.closeQuietly(autoOut);
}
}
diff --git a/packages/Keyguard/Android.mk b/packages/Keyguard/Android.mk
index 2f8edad..bc86a44 100644
--- a/packages/Keyguard/Android.mk
+++ b/packages/Keyguard/Android.mk
@@ -16,7 +16,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-Iaidl-files)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-subdir-Iaidl-files)
LOCAL_JAVA_LIBRARIES := services
@@ -28,4 +28,4 @@
include $(BUILD_PACKAGE)
-include $(call all-makefiles-under,$(LOCAL_PATH))
+#include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml
index 38e764a..7a40a9e7 100644
--- a/packages/Keyguard/AndroidManifest.xml
+++ b/packages/Keyguard/AndroidManifest.xml
@@ -38,7 +38,7 @@
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
- <application android:label="@string/app_name" android:icon="@drawable/app_icon"
+ <application android:label="@string/app_name"
android:process="com.android.systemui.keyguard"
android:persistent="true" >
diff --git a/packages/Keyguard/res/drawable-nodpi/app_icon.png b/packages/Keyguard/res/drawable-nodpi/app_icon.png
deleted file mode 100644
index ea31bd8..0000000
--- a/packages/Keyguard/res/drawable-nodpi/app_icon.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardService.java b/packages/Keyguard/src/com/android/keyguard/KeyguardService.java
index 9fa4790..f89ad65 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardService.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardService.java
@@ -21,7 +21,11 @@
import android.app.Service;
import android.content.Intent;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+
+import android.os.Binder;
import android.os.Bundle;
+import android.os.Debug;
import android.os.IBinder;
import android.util.Log;
@@ -32,6 +36,7 @@
public class KeyguardService extends Service {
static final String TAG = "KeyguardService";
+ static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
private KeyguardViewMediator mKeyguardViewMediator;
@Override
@@ -53,6 +58,14 @@
// TODO
}
+ void checkPermission() {
+ if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
+ Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
+ throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
+ + ", must have permission " + PERMISSION);
+ }
+ }
+
private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
public boolean isShowing() {
return mKeyguardViewMediator.isShowing();
@@ -70,48 +83,61 @@
mKeyguardViewMediator.verifyUnlock(callback);
}
public void keyguardDone(boolean authenticated, boolean wakeup) {
+ checkPermission();
mKeyguardViewMediator.keyguardDone(authenticated, wakeup);
}
public void setHidden(boolean isHidden) {
+ checkPermission();
mKeyguardViewMediator.setHidden(isHidden);
}
public void dismiss() {
mKeyguardViewMediator.dismiss();
}
public void onWakeKeyWhenKeyguardShowing(int keyCode) {
+ checkPermission();
mKeyguardViewMediator.onWakeKeyWhenKeyguardShowing(keyCode);
}
public void onWakeMotionWhenKeyguardShowing() {
+ checkPermission();
mKeyguardViewMediator.onWakeMotionWhenKeyguardShowing();
}
public void onDreamingStarted() {
+ checkPermission();
mKeyguardViewMediator.onDreamingStarted();
}
public void onDreamingStopped() {
+ checkPermission();
mKeyguardViewMediator.onDreamingStopped();
}
public void onScreenTurnedOff(int reason) {
+ checkPermission();
mKeyguardViewMediator.onScreenTurnedOff(reason);
}
public void onScreenTurnedOn(IKeyguardShowCallback callback) {
+ checkPermission();
mKeyguardViewMediator.onScreenTurnedOn(callback);
}
public void setKeyguardEnabled(boolean enabled) {
+ checkPermission();
mKeyguardViewMediator.setKeyguardEnabled(enabled);
}
public boolean isDismissable() {
return mKeyguardViewMediator.isDismissable();
}
public void onSystemReady() {
+ checkPermission();
mKeyguardViewMediator.onSystemReady();
}
public void doKeyguardTimeout(Bundle options) {
+ checkPermission();
mKeyguardViewMediator.doKeyguardTimeout(options);
}
public void setCurrentUser(int userId) {
+ checkPermission();
mKeyguardViewMediator.setCurrentUser(userId);
}
public void showAssistant() {
+ checkPermission();
mKeyguardViewMediator.showAssistant();
}
};
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java
index 010e2a3..c566457 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java
@@ -169,6 +169,7 @@
KeyguardWidgetFrame newWidgetPage = getWidgetPageAt(newPageIndex);
if (newWidgetPage != null) {
newWidgetPage.onActive(true);
+ newWidgetPage.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
newWidgetPage.requestAccessibilityFocus();
}
if (mParent != null && AccessibilityManager.getInstance(mContext).isEnabled()) {
diff --git a/packages/Keyguard/test/Android.mk b/packages/Keyguard/test/Android.mk
new file mode 100644
index 0000000..d011df4
--- /dev/null
+++ b/packages/Keyguard/test/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2013 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.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := KeyguardTest
+
+# Remove this to verify permission checks are working correctly
+LOCAL_CERTIFICATE := platform
+
+# LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
+include $(BUILD_PACKAGE)
diff --git a/packages/Keyguard/test/AndroidManifest.xml b/packages/Keyguard/test/AndroidManifest.xml
new file mode 100644
index 0000000..b801e4b
--- /dev/null
+++ b/packages/Keyguard/test/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.keyguard.test">
+ <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/>
+ <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
+ <application android:label="@string/app_name" android:icon="@drawable/app_icon">
+ <activity android:name=".KeyguardTestActivity"
+ android:label="@string/app_name"
+ android:theme="@android:style/Theme.Holo">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/packages/Keyguard/test/res/drawable-hdpi/app_icon.png b/packages/Keyguard/test/res/drawable-hdpi/app_icon.png
new file mode 100644
index 0000000..732133c
--- /dev/null
+++ b/packages/Keyguard/test/res/drawable-hdpi/app_icon.png
Binary files differ
diff --git a/packages/Keyguard/test/res/drawable-mdpi/app_icon.png b/packages/Keyguard/test/res/drawable-mdpi/app_icon.png
new file mode 100644
index 0000000..30eb974
--- /dev/null
+++ b/packages/Keyguard/test/res/drawable-mdpi/app_icon.png
Binary files differ
diff --git a/packages/Keyguard/test/res/drawable-xhdpi/app_icon.png b/packages/Keyguard/test/res/drawable-xhdpi/app_icon.png
new file mode 100644
index 0000000..c44a330
--- /dev/null
+++ b/packages/Keyguard/test/res/drawable-xhdpi/app_icon.png
Binary files differ
diff --git a/packages/Keyguard/res/layout/keyguard_test_activity.xml b/packages/Keyguard/test/res/layout/keyguard_test_activity.xml
similarity index 96%
rename from packages/Keyguard/res/layout/keyguard_test_activity.xml
rename to packages/Keyguard/test/res/layout/keyguard_test_activity.xml
index a3b75b0..dab1088 100644
--- a/packages/Keyguard/res/layout/keyguard_test_activity.xml
+++ b/packages/Keyguard/test/res/layout/keyguard_test_activity.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2012, The Android Open Source Project
+** Copyright 2013, 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.
diff --git a/packages/Keyguard/res/menu/optionmenu.xml b/packages/Keyguard/test/res/menu/optionmenu.xml
similarity index 100%
rename from packages/Keyguard/res/menu/optionmenu.xml
rename to packages/Keyguard/test/res/menu/optionmenu.xml
diff --git a/packages/Keyguard/res/values/activitystrings.xml b/packages/Keyguard/test/res/values/strings.xml
similarity index 96%
rename from packages/Keyguard/res/values/activitystrings.xml
rename to packages/Keyguard/test/res/values/strings.xml
index 5af9dea..129204b 100644
--- a/packages/Keyguard/res/values/activitystrings.xml
+++ b/packages/Keyguard/test/res/values/strings.xml
@@ -2,7 +2,7 @@
<!--
/* //device/apps/common/assets/res/any/strings.xml
**
-** Copyright 2006, The Android Open Source Project
+** Copyright 2013, 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.
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTestActivity.java b/packages/Keyguard/test/src/com/android/keyguard/test/KeyguardTestActivity.java
similarity index 88%
rename from packages/Keyguard/src/com/android/keyguard/KeyguardTestActivity.java
rename to packages/Keyguard/test/src/com/android/keyguard/test/KeyguardTestActivity.java
index 0ff00e3..e89c10e 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardTestActivity.java
+++ b/packages/Keyguard/test/src/com/android/keyguard/test/KeyguardTestActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.keyguard;
+package com.android.keyguard.test;
import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.policy.IKeyguardExitCallback;
@@ -28,6 +28,7 @@
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -56,6 +57,7 @@
private static final int MODE_SIM_PIN = 4;
private static final int MODE_SIM_PUK = 5;
private static final String SECURITY_MODE = "security_mode";
+ Handler mHandler = new Handler();
IKeyguardService mService = null;
@@ -76,13 +78,17 @@
class KeyguardExitCallback extends IKeyguardExitCallback.Stub {
@Override
- public void onKeyguardExitResult(boolean success) throws RemoteException {
- new AlertDialog.Builder(KeyguardTestActivity.this)
- .setMessage("Result: " + success)
- .setPositiveButton("OK", null)
- .show();
+ public void onKeyguardExitResult(final boolean success) throws RemoteException {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ new AlertDialog.Builder(KeyguardTestActivity.this)
+ .setMessage("Result: " + success)
+ .setPositiveButton("OK", null)
+ .show();
+ }
+ });
}
-
};
private class RemoteServiceConnection implements ServiceConnection {
@@ -158,12 +164,13 @@
setMode(savedInstanceState.getInt(SECURITY_MODE));
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.optionmenu, menu);
- return true;
- }
+// TODO: Find a secure way to inject mock into keyguard...
+// @Override
+// public boolean onCreateOptionsMenu(Menu menu) {
+// MenuInflater inflater = getMenuInflater();
+// inflater.inflate(R.menu.optionmenu, menu);
+// return true;
+// }
private void setMode(int mode) {
mTestSimPin = false;
@@ -255,12 +262,22 @@
mService.doKeyguardTimeout(null);
break;
case R.id.verify_unlock:
- mService.verifyUnlock(mKeyguardExitCallback);
+ mService.doKeyguardTimeout(null);
+ // Wait for keyguard to lock and then try this...
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mService.verifyUnlock(mKeyguardExitCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed verifyUnlock()", e);
+ }
+ }
+ }, 5000);
break;
}
} catch (RemoteException e) {
- Log.e(TAG, "Remote service died");
- e.printStackTrace();
+ Log.e(TAG, "onClick(): Failed due to remote exeption", e);
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 659651b..f894068 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -48,7 +48,6 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
-import android.provider.DrmStore;
import android.provider.MediaStore;
import android.provider.Settings;
import android.text.TextUtils;
@@ -978,7 +977,7 @@
/*
* When a client attempts to openFile the default ringtone or
* notification setting Uri, we will proxy the call to the current
- * default ringtone's Uri (if it is in the DRM or media provider).
+ * default ringtone's Uri (if it is in the media provider).
*/
int ringtoneType = RingtoneManager.getDefaultType(uri);
// Above call returns -1 if the Uri doesn't match a default type
@@ -989,22 +988,9 @@
Uri soundUri = RingtoneManager.getActualDefaultRingtoneUri(context, ringtoneType);
if (soundUri != null) {
- // Only proxy the openFile call to drm or media providers
+ // Proxy the openFile call to media provider
String authority = soundUri.getAuthority();
- boolean isDrmAuthority = authority.equals(DrmStore.AUTHORITY);
- if (isDrmAuthority || authority.equals(MediaStore.AUTHORITY)) {
-
- if (isDrmAuthority) {
- try {
- // Check DRM access permission here, since once we
- // do the below call the DRM will be checking our
- // permission, not our caller's permission
- DrmStore.enforceAccessDrmPermission(context);
- } catch (SecurityException e) {
- throw new FileNotFoundException(e.getMessage());
- }
- }
-
+ if (authority.equals(MediaStore.AUTHORITY)) {
return context.getContentResolver().openFileDescriptor(soundUri, mode);
}
}
@@ -1019,7 +1005,7 @@
/*
* When a client attempts to openFile the default ringtone or
* notification setting Uri, we will proxy the call to the current
- * default ringtone's Uri (if it is in the DRM or media provider).
+ * default ringtone's Uri (if it is in the media provider).
*/
int ringtoneType = RingtoneManager.getDefaultType(uri);
// Above call returns -1 if the Uri doesn't match a default type
@@ -1030,22 +1016,9 @@
Uri soundUri = RingtoneManager.getActualDefaultRingtoneUri(context, ringtoneType);
if (soundUri != null) {
- // Only proxy the openFile call to drm or media providers
+ // Proxy the openFile call to media provider
String authority = soundUri.getAuthority();
- boolean isDrmAuthority = authority.equals(DrmStore.AUTHORITY);
- if (isDrmAuthority || authority.equals(MediaStore.AUTHORITY)) {
-
- if (isDrmAuthority) {
- try {
- // Check DRM access permission here, since once we
- // do the below call the DRM will be checking our
- // permission, not our caller's permission
- DrmStore.enforceAccessDrmPermission(context);
- } catch (SecurityException e) {
- throw new FileNotFoundException(e.getMessage());
- }
- }
-
+ if (authority.equals(MediaStore.AUTHORITY)) {
ParcelFileDescriptor pfd = null;
try {
pfd = context.getContentResolver().openFileDescriptor(soundUri, mode);
diff --git a/packages/SystemUI/ic_sysbar_internal.psd b/packages/SystemUI/ic_sysbar_internal.psd
new file mode 100644
index 0000000..929c872
--- /dev/null
+++ b/packages/SystemUI/ic_sysbar_internal.psd
Binary files differ
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 150375d..56122de 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -174,7 +174,7 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"המסך נעול כעת לרוחב."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"המסך נעול כעת לאורך."</string>
<string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
- <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"חלום בהקיץ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"מצב טיסה"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"טוען (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 57e70c8..bc3c7dc 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -65,7 +65,7 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string>
<string name="compat_mode_help_header" msgid="7969493989397529910">"Saderības tālummaiņa"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Ja lietotne ir paredzēta mazākam ekrānam, blakus pulkstenim tiks parādīta tālummaiņas vadīkla."</string>
- <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Notiek ekrānuzņ. saglabāšana"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Notiek ekrānuzņēmuma saglabāšana"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Notiek ekrānuzņēmuma saglabāšana..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Notiek ekrānuzņēmuma saglabāšana."</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"Ekrānuzņēmums ir uzņemts."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 33d1f6d6d..168f038 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -68,9 +68,9 @@
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在保存屏幕截图..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在保存屏幕截图..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"正在保存屏幕截图。"</string>
- <string name="screenshot_saved_title" msgid="6461865960961414961">"已捕获屏幕截图。"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"已抓取屏幕截图。"</string>
<string name="screenshot_saved_text" msgid="1152839647677558815">"触摸可查看您的屏幕截图。"</string>
- <string name="screenshot_failed_title" msgid="705781116746922771">"无法捕获屏幕截图。"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"无法抓取屏幕截图。"</string>
<string name="screenshot_failed_text" msgid="8134011269572415402">"无法保存屏幕截图。存储设备可能正在使用中。"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 文件传输选项"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"作为媒体播放器 (MTP) 装载"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 5b911c1..683824b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -315,9 +315,9 @@
protected View updateNotificationVetoButton(View row, StatusBarNotification n) {
View vetoButton = row.findViewById(R.id.veto);
if (n.isClearable()) {
- final String _pkg = n.pkg;
- final String _tag = n.tag;
- final int _id = n.id;
+ final String _pkg = n.getPackageName();
+ final String _tag = n.getTag();
+ final int _id = n.getId();
vetoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Accessibility feedback
@@ -341,14 +341,14 @@
protected void applyLegacyRowBackground(StatusBarNotification sbn, View content) {
- if (sbn.notification.contentView.getLayoutId() !=
+ if (sbn.getNotification().contentView.getLayoutId() !=
com.android.internal.R.layout.notification_template_base) {
int version = 0;
try {
- ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.pkg, 0);
+ ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.getPackageName(), 0);
version = info.targetSdkVersion;
} catch (NameNotFoundException ex) {
- Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.pkg, ex);
+ Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.getPackageName(), ex);
}
if (version > 0 && version < Build.VERSION_CODES.GINGERBREAD) {
content.setBackgroundResource(R.drawable.notification_row_legacy_bg);
@@ -729,8 +729,8 @@
int maxHeight =
mContext.getResources().getDimensionPixelSize(R.dimen.notification_max_height);
StatusBarNotification sbn = entry.notification;
- RemoteViews oneU = sbn.notification.contentView;
- RemoteViews large = sbn.notification.bigContentView;
+ RemoteViews oneU = sbn.getNotification().contentView;
+ RemoteViews large = sbn.getNotification().bigContentView;
if (oneU == null) {
return false;
}
@@ -741,7 +741,7 @@
View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
// for blaming (see SwipeHelper.setLongPressListener)
- row.setTag(sbn.pkg);
+ row.setTag(sbn.getPackageName());
workAroundBadLayerDrawableOpacity(row);
View vetoButton = updateNotificationVetoButton(row, sbn);
@@ -756,10 +756,10 @@
content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
- PendingIntent contentIntent = sbn.notification.contentIntent;
+ PendingIntent contentIntent = sbn.getNotification().contentIntent;
if (contentIntent != null) {
final View.OnClickListener listener = new NotificationClicker(contentIntent,
- sbn.pkg, sbn.tag, sbn.id);
+ sbn.getPackageName(), sbn.getTag(), sbn.getId());
content.setOnClickListener(listener);
} else {
content.setOnClickListener(null);
@@ -775,7 +775,7 @@
}
}
catch (RuntimeException e) {
- final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id);
+ final String ident = sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId());
Slog.e(TAG, "couldn't inflate view for notification " + ident, e);
return false;
}
@@ -904,7 +904,7 @@
void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
removeNotification(key);
try {
- mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
+ mBarService.onNotificationError(n.getPackageName(), n.getTag(), n.getId(), n.getUid(), n.getInitialPid(), message);
} catch (RemoteException ex) {
// The end is nigh.
}
@@ -932,16 +932,16 @@
}
// Construct the icon.
final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.pkg + "/0x" + Integer.toHexString(notification.id),
- notification.notification);
+ notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
+ notification.getNotification());
iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.user,
- notification.notification.icon,
- notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
+ notification.getUser(),
+ notification.getNotification().icon,
+ notification.getNotification().iconLevel,
+ notification.getNotification().number,
+ notification.getNotification().tickerText);
if (!iconView.set(ic)) {
handleNotificationError(key, notification, "Couldn't create icon: " + ic);
return null;
@@ -1026,19 +1026,19 @@
final StatusBarNotification oldNotification = oldEntry.notification;
// XXX: modify when we do something more intelligent with the two content views
- final RemoteViews oldContentView = oldNotification.notification.contentView;
- final RemoteViews contentView = notification.notification.contentView;
- final RemoteViews oldBigContentView = oldNotification.notification.bigContentView;
- final RemoteViews bigContentView = notification.notification.bigContentView;
+ final RemoteViews oldContentView = oldNotification.getNotification().contentView;
+ final RemoteViews contentView = notification.getNotification().contentView;
+ final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView;
+ final RemoteViews bigContentView = notification.getNotification().bigContentView;
if (DEBUG) {
- Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
+ Slog.d(TAG, "old notification: when=" + oldNotification.getNotification().when
+ " ongoing=" + oldNotification.isOngoing()
+ " expanded=" + oldEntry.expanded
+ " contentView=" + oldContentView
+ " bigContentView=" + oldBigContentView
+ " rowParent=" + oldEntry.row.getParent());
- Slog.d(TAG, "new notification: when=" + notification.notification.when
+ Slog.d(TAG, "new notification: when=" + notification.getNotification().when
+ " ongoing=" + oldNotification.isOngoing()
+ " contentView=" + contentView
+ " bigContentView=" + bigContentView);
@@ -1062,13 +1062,13 @@
&& oldBigContentView.getPackage().equals(bigContentView.getPackage())
&& oldBigContentView.getLayoutId() == bigContentView.getLayoutId());
ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
- boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
- && notification.score == oldNotification.score;
+ boolean orderUnchanged = notification.getNotification().when== oldNotification.getNotification().when
+ && notification.getScore() == oldNotification.getScore();
// score now encompasses/supersedes isOngoing()
- boolean updateTicker = notification.notification.tickerText != null
- && !TextUtils.equals(notification.notification.tickerText,
- oldEntry.notification.notification.tickerText);
+ boolean updateTicker = notification.getNotification().tickerText != null
+ && !TextUtils.equals(notification.getNotification().tickerText,
+ oldEntry.notification.getNotification().tickerText);
boolean isTopAnyway = isTopNotification(rowParent, oldEntry);
if (contentsUnchanged && bigContentsUnchanged && (orderUnchanged || isTopAnyway)) {
if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
@@ -1080,20 +1080,20 @@
bigContentView.reapply(mContext, oldEntry.getLargeView(), mOnClickHandler);
}
// update the contentIntent
- final PendingIntent contentIntent = notification.notification.contentIntent;
+ final PendingIntent contentIntent = notification.getNotification().contentIntent;
if (contentIntent != null) {
final View.OnClickListener listener = makeClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
+ notification.getPackageName(), notification.getTag(), notification.getId());
oldEntry.content.setOnClickListener(listener);
} else {
oldEntry.content.setOnClickListener(null);
}
// Update the icon.
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.user,
- notification.notification.icon, notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
+ notification.getUser(),
+ notification.getNotification().icon, notification.getNotification().iconLevel,
+ notification.getNotification().number,
+ notification.getNotification().tickerText);
if (!oldEntry.icon.set(ic)) {
handleNotificationError(key, notification, "Couldn't update icon: " + ic);
return;
@@ -1144,7 +1144,7 @@
if (DEBUG) Slog.d(TAG, "updating the current intruder:" + notification);
// XXX: this is a hack for Alarms. The real implementation will need to *update*
// the intruder.
- if (notification.notification.fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
+ if (notification.getNotification().fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
if (DEBUG) Slog.d(TAG, "no longer intrudes!");
mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
}
@@ -1155,9 +1155,9 @@
// A: Almost none! Only things coming from the system (package is "android") that also
// have special "kind" tags marking them as relevant for setup (see below).
protected boolean showNotificationEvenIfUnprovisioned(StatusBarNotification sbn) {
- if ("android".equals(sbn.pkg)) {
- if (sbn.notification.kind != null) {
- for (String aKind : sbn.notification.kind) {
+ if ("android".equals(sbn.getPackageName())) {
+ if (sbn.getNotification().kind != null) {
+ for (String aKind : sbn.getNotification().kind) {
// IME switcher, created by InputMethodManagerService
if ("android.system.imeswitcher".equals(aKind)) return true;
// OTA availability & errors, created by SystemUpdateService
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 886ed77..2c7a2a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -89,10 +89,10 @@
public int compare(Entry a, Entry b) {
final StatusBarNotification na = a.notification;
final StatusBarNotification nb = b.notification;
- int d = na.score - nb.score;
+ int d = na.getScore() - nb.getScore();
return (d != 0)
? d
- : (int)(na.notification.when - nb.notification.when);
+ : (int)(na.getNotification().when - nb.getNotification().when);
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 498d869..82a5012 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -875,7 +875,7 @@
}
public void addNotification(IBinder key, StatusBarNotification notification) {
- if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.score);
+ if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.getScore());
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
@@ -924,7 +924,7 @@
} else
*/
- if (notification.notification.fullScreenIntent != null) {
+ if (notification.getNotification().fullScreenIntent != null) {
// Stop screensaver if the notification has a full-screen intent.
// (like an incoming phone call)
awakenDreams();
@@ -932,7 +932,7 @@
// not immersive & a full-screen alert should be shown
if (DEBUG) Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
- notification.notification.fullScreenIntent.send();
+ notification.getNotification().fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
} else {
@@ -1065,7 +1065,7 @@
// If the device hasn't been through Setup, we only show system notifications
for (int i=0; i<N; i++) {
Entry ent = mNotificationData.get(N-i-1);
- if (!((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE)
+ if (!((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE)
|| showNotificationEvenIfUnprovisioned(ent.notification))) continue;
if (!notificationIsForCurrentUser(ent.notification)) continue;
toShow.add(ent.icon);
@@ -2012,7 +2012,7 @@
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
// run a ticker without being attached will crash!
- if (n.notification.tickerText != null && mStatusBarWindow.getWindowToken() != null) {
+ if (n.getNotification().tickerText != null && mStatusBarWindow.getWindowToken() != null) {
if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
| StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
mTicker.addEntry(n);
@@ -2117,9 +2117,9 @@
NotificationData.Entry e = mNotificationData.get(i);
pw.println(" [" + i + "] key=" + e.key + " icon=" + e.icon);
StatusBarNotification n = e.notification;
- pw.println(" pkg=" + n.pkg + " id=" + n.id + " score=" + n.score);
- pw.println(" notification=" + n.notification);
- pw.println(" tickerText=\"" + n.notification.tickerText + "\"");
+ pw.println(" pkg=" + n.getPackageName() + " id=" + n.getId() + " score=" + n.getScore());
+ pw.println(" notification=" + n.getNotification());
+ pw.println(" tickerText=\"" + n.getNotification().tickerText + "\"");
}
}
@@ -2420,9 +2420,9 @@
try {
mBarService.onNotificationClear(
- mCurrentlyIntrudingNotification.pkg,
- mCurrentlyIntrudingNotification.tag,
- mCurrentlyIntrudingNotification.id);
+ mCurrentlyIntrudingNotification.getPackageName(),
+ mCurrentlyIntrudingNotification.getTag(),
+ mCurrentlyIntrudingNotification.getId());
} catch (android.os.RemoteException ex) {
// oh well
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
index 976dd01..f3f6a80 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
@@ -189,25 +189,25 @@
// a notification storm).
if (initialCount > 0) {
final Segment seg = mSegments.get(0);
- if (n.pkg.equals(seg.notification.pkg)
- && n.notification.icon == seg.notification.notification.icon
- && n.notification.iconLevel == seg.notification.notification.iconLevel
- && CharSequences.equals(seg.notification.notification.tickerText,
- n.notification.tickerText)) {
+ if (n.getPackageName().equals(seg.notification.getPackageName())
+ && n.getNotification().icon == seg.notification.getNotification().icon
+ && n.getNotification().iconLevel == seg.notification.getNotification().iconLevel
+ && CharSequences.equals(seg.notification.getNotification().tickerText,
+ n.getNotification().tickerText)) {
return;
}
}
final Drawable icon = StatusBarIconView.getIcon(mContext,
- new StatusBarIcon(n.pkg, n.user, n.notification.icon, n.notification.iconLevel, 0,
- n.notification.tickerText));
- final CharSequence text = n.notification.tickerText;
+ new StatusBarIcon(n.getPackageName(), n.getUser(), n.getNotification().icon, n.getNotification().iconLevel, 0,
+ n.getNotification().tickerText));
+ final CharSequence text = n.getNotification().tickerText;
final Segment newSegment = new Segment(n, icon, text);
// If there's already a notification schedule for this package and id, remove it.
for (int i=0; i<mSegments.size(); i++) {
Segment seg = mSegments.get(i);
- if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) {
+ if (n.getId() == seg.notification.getId() && n.getPackageName().equals(seg.notification.getPackageName())) {
// just update that one to use this new data instead
mSegments.remove(i--); // restart iteration here
}
@@ -235,7 +235,7 @@
public void removeEntry(StatusBarNotification n) {
for (int i=mSegments.size()-1; i>=0; i--) {
Segment seg = mSegments.get(i);
- if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) {
+ if (n.getId() == seg.notification.getId() && n.getPackageName().equals(seg.notification.getPackageName())) {
mSegments.remove(i);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 05bba89..bfa1b63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -859,12 +859,12 @@
final boolean immersive = isImmersive();
if (false && immersive) {
// TODO: immersive mode popups for tablet
- } else if (notification.notification.fullScreenIntent != null) {
+ } else if (notification.getNotification().fullScreenIntent != null) {
// not immersive & a full-screen alert should be shown
Slog.w(TAG, "Notification has fullScreenIntent and activity is not immersive;"
+ " sending fullScreenIntent");
try {
- notification.notification.fullScreenIntent.send();
+ notification.getNotification().fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
} else {
@@ -971,14 +971,14 @@
}
// If they asked for FLAG_ONLY_ALERT_ONCE, then only show this notification
// if it's a new notification.
- if (!firstTime && (n.notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
+ if (!firstTime && (n.getNotification().flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
return;
}
// Show the ticker if one is requested. Also don't do this
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
// run a ticker without being attached will crash!
- if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) {
+ if (hasTicker(n.getNotification()) && mStatusBarView.getWindowToken() != null) {
if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
| StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
mTicker.add(key, n);
@@ -1410,7 +1410,7 @@
for (int i=0; toShow.size()< maxNotificationIconsCount; i++) {
if (i >= N) break;
Entry ent = mNotificationData.get(N-i-1);
- if ((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE)
+ if ((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE)
|| showNotificationEvenIfUnprovisioned(ent.notification)) {
toShow.add(ent.icon);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
index 725d9e6..095c441 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
@@ -249,7 +249,7 @@
}
private View makeTickerView(StatusBarNotification notification) {
- final Notification n = notification.notification;
+ final Notification n = notification.getNotification();
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -274,8 +274,8 @@
exception = e;
}
if (expanded == null) {
- final String ident = notification.pkg
- + "/0x" + Integer.toHexString(notification.id);
+ final String ident = notification.getPackageName()
+ + "/0x" + Integer.toHexString(notification.getId());
Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
return null;
}
@@ -286,7 +286,7 @@
} else if (n.tickerText != null) {
group = (ViewGroup)inflater.inflate(R.layout.system_bar_ticker_compat, mWindow, false);
final Drawable icon = StatusBarIconView.getIcon(mContext,
- new StatusBarIcon(notification.pkg, notification.user, n.icon, n.iconLevel, 0,
+ new StatusBarIcon(notification.getPackageName(), notification.getUser(), n.icon, n.iconLevel, 0,
n.tickerText));
ImageView iv = (ImageView)group.findViewById(iconId);
iv.setImageDrawable(icon);
@@ -313,12 +313,12 @@
}
if (CLICKABLE_TICKER) {
- PendingIntent contentIntent = notification.notification.contentIntent;
+ PendingIntent contentIntent = notification.getNotification().contentIntent;
if (contentIntent != null) {
// create the usual notification clicker, but chain it together with a halt() call
// to abort the ticker too
final View.OnClickListener clicker = mBar.makeClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
+ notification.getPackageName(), notification.getTag(), notification.getId());
group.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
halt();
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 63584ac..a093630 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -546,7 +546,7 @@
@Override
public void onProposedRotationChanged(int rotation) {
- if (localLOGV) Log.v(TAG, "onProposedRotationChanged, rotation=" + rotation);
+ if (localLOGV) Slog.v(TAG, "onProposedRotationChanged, rotation=" + rotation);
updateRotation(false);
}
}
@@ -623,7 +623,7 @@
}
//Could have been invoked due to screen turning on or off or
//change of the currently visible window's orientation
- if (localLOGV) Log.v(TAG, "Screen status="+mScreenOnEarly+
+ if (localLOGV) Slog.v(TAG, "Screen status="+mScreenOnEarly+
", current orientation="+mCurrentAppOrientation+
", SensorEnabled="+mOrientationSensorEnabled);
boolean disable = true;
@@ -633,7 +633,7 @@
//enable listener if not already enabled
if (!mOrientationSensorEnabled) {
mOrientationListener.enable();
- if(localLOGV) Log.v(TAG, "Enabling listeners");
+ if(localLOGV) Slog.v(TAG, "Enabling listeners");
mOrientationSensorEnabled = true;
}
}
@@ -641,7 +641,7 @@
//check if sensors need to be disabled
if (disable && mOrientationSensorEnabled) {
mOrientationListener.disable();
- if(localLOGV) Log.v(TAG, "Disabling listeners");
+ if(localLOGV) Slog.v(TAG, "Disabling listeners");
mOrientationSensorEnabled = false;
}
}
@@ -1700,7 +1700,7 @@
}
}
mNavigationBar = win;
- if (DEBUG_LAYOUT) Log.i(TAG, "NAVIGATION BAR: " + mNavigationBar);
+ if (DEBUG_LAYOUT) Slog.i(TAG, "NAVIGATION BAR: " + mNavigationBar);
break;
case TYPE_NAVIGATION_BAR_PANEL:
mContext.enforceCallingOrSelfPermission(
@@ -1722,7 +1722,6 @@
return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON;
}
mKeyguard = win;
- hideKeyguardScrim();
break;
case TYPE_KEYGUARD_SCRIM:
if (mKeyguardScrim != null) {
@@ -1742,7 +1741,7 @@
} else if (mKeyguard == win) {
Log.v(TAG, "Removing keyguard window (Did it crash?)");
mKeyguard = null;
- showKeyguardScrimLw();
+ mKeyguardDelegate.showScrim();
} else if (mKeyguardScrim == win) {
Log.v(TAG, "Removing keyguard scrim");
mKeyguardScrim = null;
@@ -1751,14 +1750,6 @@
}
}
- private void showKeyguardScrimLw() {
- Log.v(TAG, "*** SHOWING KEYGUARD SCRIM ***");
- }
-
- private void hideKeyguardScrim() {
- Log.v(TAG, "*** HIDING KEYGUARD SCRIM ***");
- }
-
static final boolean PRINT_ANIM = false;
/** {@inheritDoc} */
@@ -2722,9 +2713,9 @@
// And compute the final frame.
mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame,
mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame);
- if (DEBUG_LAYOUT) Log.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame);
+ if (DEBUG_LAYOUT) Slog.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame);
}
- if (DEBUG_LAYOUT) Log.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)",
+ if (DEBUG_LAYOUT) Slog.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)",
mDockLeft, mDockTop, mDockRight, mDockBottom));
// decide where the status bar goes ahead of time
@@ -2763,7 +2754,7 @@
mContentLeft = mCurLeft = mDockLeft;
mContentRight = mCurRight = mDockRight;
- if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: " +
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Status bar: " +
String.format(
"dock=[%d,%d][%d,%d] content=[%d,%d][%d,%d] cur=[%d,%d][%d,%d]",
mDockLeft, mDockTop, mDockRight, mDockBottom,
@@ -2881,9 +2872,7 @@
final boolean needsToOffsetInputMethodTarget = isDefaultDisplay &&
(win == mLastInputMethodTargetWindow && mLastInputMethodWindow != null);
if (needsToOffsetInputMethodTarget) {
- if (DEBUG_LAYOUT) {
- Slog.i(TAG, "Offset ime target window by the last ime window state");
- }
+ if (DEBUG_LAYOUT) Slog.i(TAG, "Offset ime target window by the last ime window state");
offsetInputMethodWindowLw(mLastInputMethodWindow);
}
@@ -2927,8 +2916,7 @@
} else {
if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
- if (DEBUG_LAYOUT)
- Log.v(TAG, "layoutWindowLw(" + attrs.getTitle()
+ if (DEBUG_LAYOUT) Slog.v(TAG, "layoutWindowLw(" + attrs.getTitle()
+ "): IN_SCREEN, 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
@@ -2958,11 +2946,9 @@
? mRestrictedScreenTop+mRestrictedScreenHeight
: mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
- if (DEBUG_LAYOUT) {
- Log.v(TAG, String.format(
+ if (DEBUG_LAYOUT) Slog.v(TAG, String.format(
"Laying out status bar window: (%d,%d - %d,%d)",
pf.left, pf.top, pf.right, pf.bottom));
- }
} else if ((attrs.flags&FLAG_LAYOUT_IN_OVERSCAN) != 0
&& attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
&& attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
@@ -3044,8 +3030,8 @@
} else if ((fl & FLAG_LAYOUT_IN_SCREEN) != 0 || (sysUiFl
& (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)) != 0) {
- if (DEBUG_LAYOUT)
- Log.v(TAG, "layoutWindowLw(" + attrs.getTitle() + "): IN_SCREEN");
+ if (DEBUG_LAYOUT) Slog.v(TAG, "layoutWindowLw(" + attrs.getTitle() +
+ "): IN_SCREEN");
// A window that has requested to fill the entire screen just
// gets everything, period.
if (attrs.type == TYPE_STATUS_BAR_PANEL
@@ -3059,11 +3045,9 @@
pf.bottom = df.bottom = of.bottom = cf.bottom = hasNavBar
? mRestrictedScreenTop+mRestrictedScreenHeight
: mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
- if (DEBUG_LAYOUT) {
- Log.v(TAG, String.format(
+ if (DEBUG_LAYOUT) Slog.v(TAG, String.format(
"Laying out IN_SCREEN status bar window: (%d,%d - %d,%d)",
pf.left, pf.top, pf.right, pf.bottom));
- }
} else if (attrs.type == TYPE_NAVIGATION_BAR
|| attrs.type == TYPE_NAVIGATION_BAR_PANEL) {
// The navigation bar has Real Ultimate Power.
@@ -3073,11 +3057,9 @@
+ mUnrestrictedScreenWidth;
pf.bottom = df.bottom = of.bottom = mUnrestrictedScreenTop
+ mUnrestrictedScreenHeight;
- if (DEBUG_LAYOUT) {
- Log.v(TAG, String.format(
+ if (DEBUG_LAYOUT) Slog.v(TAG, String.format(
"Laying out navigation bar window: (%d,%d - %d,%d)",
pf.left, pf.top, pf.right, pf.bottom));
- }
} else if ((attrs.type == TYPE_SECURE_SYSTEM_OVERLAY
|| attrs.type == TYPE_BOOT_PROGRESS)
&& ((fl & FLAG_FULLSCREEN) != 0)) {
@@ -3153,14 +3135,14 @@
vf.set(cf);
}
} else if (attached != null) {
- if (DEBUG_LAYOUT)
- Log.v(TAG, "layoutWindowLw(" + attrs.getTitle() + "): attached to " + attached);
+ if (DEBUG_LAYOUT) Slog.v(TAG, "layoutWindowLw(" + attrs.getTitle() +
+ "): attached to " + attached);
// A child window should be placed inside of the same visible
// frame that its parent had.
setAttachedWindowFrames(win, fl, adjust, attached, false, pf, df, of, cf, vf);
} else {
- if (DEBUG_LAYOUT)
- Log.v(TAG, "layoutWindowLw(" + attrs.getTitle() + "): normal window");
+ if (DEBUG_LAYOUT) Slog.v(TAG, "layoutWindowLw(" + attrs.getTitle() +
+ "): normal window");
// Otherwise, a normal window must be placed inside the content
// of all screen decorations.
if (attrs.type == TYPE_STATUS_BAR_PANEL) {
@@ -3208,7 +3190,7 @@
= vf.right = vf.bottom = 10000;
}
- if (DEBUG_LAYOUT) Log.v(TAG, "Compute frame " + attrs.getTitle()
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Compute frame " + attrs.getTitle()
+ ": sim=#" + Integer.toHexString(sim)
+ " attach=" + attached + " type=" + attrs.type
+ String.format(" flags=0x%08x", fl)
@@ -3238,7 +3220,7 @@
if (mCurBottom > top) {
mCurBottom = top;
}
- if (DEBUG_LAYOUT) Log.v(TAG, "Input method: mDockBottom="
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Input method: mDockBottom="
+ mDockBottom + " mContentBottom="
+ mContentBottom + " mCurBottom=" + mCurBottom);
}
@@ -3305,21 +3287,20 @@
&& attrs.x == 0 && attrs.y == 0
&& attrs.width == WindowManager.LayoutParams.MATCH_PARENT
&& attrs.height == WindowManager.LayoutParams.MATCH_PARENT) {
- if (DEBUG_LAYOUT) Log.v(TAG, "Fullscreen window: " + win);
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Fullscreen window: " + win);
mTopFullscreenOpaqueWindowState = win;
if ((attrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) {
- if (DEBUG_LAYOUT) Log.v(TAG, "Setting mHideLockScreen to true by win " + win);
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Setting mHideLockScreen to true by win " + win);
mHideLockScreen = true;
mForceStatusBarFromKeyguard = false;
}
if ((attrs.flags & FLAG_DISMISS_KEYGUARD) != 0
&& mDismissKeyguard == DISMISS_KEYGUARD_NONE) {
- if (DEBUG_LAYOUT) Log.v(TAG, "Setting mDismissKeyguard to true by win " + win);
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Setting mDismissKeyguard true by win " + win);
mDismissKeyguard = mWinDismissingKeyguard == win ?
DISMISS_KEYGUARD_CONTINUE : DISMISS_KEYGUARD_START;
mWinDismissingKeyguard = win;
- mForceStatusBarFromKeyguard =
- mShowingLockscreen && isKeyguardSecure();
+ mForceStatusBarFromKeyguard = mShowingLockscreen && isKeyguardSecure();
}
if ((attrs.flags & FLAG_ALLOW_LOCK_WHILE_SCREEN_ON) != 0) {
mAllowLockscreenWhenOn = true;
@@ -3347,17 +3328,17 @@
}
if (mStatusBar != null) {
- if (DEBUG_LAYOUT) Log.i(TAG, "force=" + mForceStatusBar
+ if (DEBUG_LAYOUT) Slog.i(TAG, "force=" + mForceStatusBar
+ " forcefkg=" + mForceStatusBarFromKeyguard
+ " top=" + mTopFullscreenOpaqueWindowState);
if (mForceStatusBar || mForceStatusBarFromKeyguard) {
- if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: forced");
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced");
if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
} else if (mTopFullscreenOpaqueWindowState != null) {
if (localLOGV) {
- Log.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw()
+ Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw()
+ " shown frame: " + mTopFullscreenOpaqueWindowState.getShownFrameLw());
- Log.d(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs()
+ Slog.d(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs()
+ " lp.flags=0x" + Integer.toHexString(lp.flags));
}
topIsFullscreen = (lp.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0
@@ -3371,7 +3352,7 @@
changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
} else if (topIsFullscreen) {
- if (DEBUG_LAYOUT) Log.v(TAG, "** HIDING status bar");
+ if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar");
if (mStatusBar.hideLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
@@ -3388,11 +3369,11 @@
mStatusBarService = null;
}
}});
- } else if (DEBUG_LAYOUT) {
- Log.v(TAG, "Preventing status bar from hiding by policy");
+ } else {
+ if (DEBUG_LAYOUT) Slog.v(TAG, "Policy preventing status bar from hiding");
}
} else {
- if (DEBUG_LAYOUT) Log.v(TAG, "** SHOWING status bar: top is not fullscreen");
+ if (DEBUG_LAYOUT) Slog.v(TAG, "** SHOWING status bar: top is not fullscreen");
if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
}
@@ -3403,7 +3384,7 @@
// Hide the key guard if a visible window explicitly specifies that it wants to be
// displayed when the screen is locked.
if (mKeyguard != null) {
- if (localLOGV) Log.v(TAG, "finishPostLayoutPolicyLw: mHideKeyguard="
+ if (localLOGV) Slog.v(TAG, "finishPostLayoutPolicyLw: mHideKeyguard="
+ mHideLockScreen);
if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !mKeyguardDelegate.isSecure()) {
if (mKeyguard.hideLw(true)) {
@@ -4521,7 +4502,7 @@
? HapticFeedbackConstants.SAFE_MODE_ENABLED
: HapticFeedbackConstants.SAFE_MODE_DISABLED, true);
}
-
+
static long[] getLongIntArray(Resources r, int resid) {
int[] ar = r.getIntArray(resid);
if (ar == null) {
@@ -4533,8 +4514,9 @@
}
return out;
}
-
+
/** {@inheritDoc} */
+ @Override
public void systemReady() {
if (!mHeadless) {
mKeyguardDelegate = new KeyguardServiceDelegate(mContext, null);
@@ -4544,6 +4526,7 @@
updateOrientationListenerLp();
mSystemReady = true;
mHandler.post(new Runnable() {
+ @Override
public void run() {
updateSettings();
}
@@ -4694,6 +4677,7 @@
}
/** {@inheritDoc} */
+ @Override
public void enableScreenAfterBoot() {
readLidState();
applyLidSwitchState();
@@ -4735,7 +4719,7 @@
* <li>The device is in car mode but there's no CAR_DOCK app with METADATA_DOCK_HOME
* <li>The device is in desk mode but there's no DESK_DOCK app with METADATA_DOCK_HOME
* </ul>
- * @return
+ * @return A dock intent.
*/
Intent createHomeDockIntent() {
Intent intent = null;
@@ -4790,7 +4774,7 @@
mContext.startActivityAsUser(mHomeIntent, UserHandle.CURRENT);
}
-
+
/**
* goes to the home screen
* @return whether it did anything
@@ -4842,7 +4826,8 @@
}
return true;
}
-
+
+ @Override
public void setCurrentOrientationLw(int newOrientation) {
synchronized (mLock) {
if (newOrientation != mCurrentAppOrientation) {
@@ -4866,11 +4851,13 @@
ringTone.setStreamType(AudioManager.STREAM_MUSIC);
ringTone.play();
}
+
private boolean isGlobalAccessibilityGestureEnabled() {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED, 0) == 1;
}
+ @Override
public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) {
if (!mVibrator.hasVibrator()) {
return false;
@@ -4960,7 +4947,16 @@
if (mHideybars == HIDEYBARS_SHOWING) {
if (!hideybarsAllowed) {
mHideybars = HIDEYBARS_NONE;
+ if ((tmpVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0) {
+ // hideybars for View.SYSTEM_UI_FLAG_FULLSCREEN: clear the clearable flags
+ int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS;
+ if (newVal != mResettingSystemUiFlags) {
+ mResettingSystemUiFlags = newVal;
+ mWindowManagerFuncs.reevaluateStatusBarVisibility();
+ }
+ }
} else {
+ // hideybars for WM.LP.FLAG_FULLSCREEN: show transparent status bar
tmpVisibility |= View.STATUS_BAR_OVERLAY;
if ((mLastSystemUiFlags & View.STATUS_BAR_OVERLAY) == 0) {
mStatusBar.showLw(true);
@@ -4978,6 +4974,7 @@
mLastFocusNeedsMenu = needsMenu;
mFocusedApp = mFocusedWindow.getAppToken();
mHandler.post(new Runnable() {
+ @Override
public void run() {
try {
IStatusBarService statusbar = getStatusBarService();
@@ -4996,6 +4993,7 @@
// Use this instead of checking config_showNavigationBar so that it can be consistently
// overridden by qemu.hw.mainkeys in the emulator.
+ @Override
public boolean hasNavigationBar() {
return mHasNavigationBar;
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
index bf18b99..2bb94be 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
@@ -4,12 +4,17 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.ActivityInfo;
+import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
import android.view.WindowManagerPolicy.OnKeyguardExitResult;
import com.android.internal.policy.IKeyguardExitCallback;
@@ -29,6 +34,7 @@
private static final String TAG = "KeyguardServiceDelegate";
private static final boolean DEBUG = true;
protected KeyguardServiceWrapper mKeyguardService;
+ private View mScrim; // shown if keyguard crashes
private KeyguardState mKeyguardState = new KeyguardState();
/* package */ static final class KeyguardState {
@@ -64,6 +70,7 @@
if (mShowListener != null) {
mShowListener.onShown(windowToken);
}
+ hideScrim();
}
};
@@ -87,6 +94,7 @@
public KeyguardServiceDelegate(Context context, LockPatternUtils lockPatternUtils) {
Intent intent = new Intent();
intent.setClassName(KEYGUARD_PACKAGE, KEYGUARD_CLASS);
+ mScrim = createScrim(context);
if (!context.bindServiceAsUser(intent, mKeyguardConnection,
Context.BIND_AUTO_CREATE, UserHandle.OWNER)) {
if (DEBUG) Log.v(TAG, "*** Keyguard: can't bind to " + KEYGUARD_CLASS);
@@ -102,7 +110,10 @@
mKeyguardService = new KeyguardServiceWrapper(
IKeyguardService.Stub.asInterface(service));
if (mKeyguardState.systemIsReady) {
+ // If the system is ready, it means keyguard crashed and restarted.
mKeyguardService.onSystemReady();
+ // This is used to hide the scrim once keyguard displays.
+ mKeyguardService.onScreenTurnedOn(new KeyguardShowDelegate(null));
}
}
@@ -257,4 +268,51 @@
mKeyguardState.currentUser = newUserId;
}
+ private static final View createScrim(Context context) {
+ View view = new View(context);
+
+ int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER
+ ;
+
+ final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;
+ final int type = WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM;
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ stretch, stretch, type, flags, PixelFormat.TRANSLUCENT);
+ lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+ lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
+ lp.setTitle("KeyguardScrim");
+ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ wm.addView(view, lp);
+ view.setVisibility(View.GONE);
+ // Disable pretty much everything in statusbar until keyguard comes back and we know
+ // the state of the world.
+ view.setSystemUiVisibility(View.STATUS_BAR_DISABLE_HOME
+ | View.STATUS_BAR_DISABLE_BACK
+ | View.STATUS_BAR_DISABLE_RECENT
+ | View.STATUS_BAR_DISABLE_EXPAND
+ | View.STATUS_BAR_DISABLE_SEARCH);
+ return view;
+ }
+
+ public void showScrim() {
+ mScrim.post(new Runnable() {
+ @Override
+ public void run() {
+ mScrim.setVisibility(View.VISIBLE);
+ }
+ });
+ }
+
+ public void hideScrim() {
+ mScrim.post(new Runnable() {
+ @Override
+ public void run() {
+ mScrim.setVisibility(View.GONE);
+ }
+ });
+ }
+
}
diff --git a/preloaded-classes b/preloaded-classes
index 126dd15..2aa610a 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -6,6 +6,7 @@
android.accounts.Account
android.accounts.Account$1
android.accounts.AccountManager
+android.accounts.AccountManager$12
android.accounts.AccountManager$13
android.accounts.AccountManager$6
android.accounts.AccountManager$AmsTask
@@ -20,11 +21,11 @@
android.accounts.OnAccountsUpdateListener
android.animation.Animator
android.animation.Animator$AnimatorListener
-android.animation.AnimatorInflater
android.animation.AnimatorListenerAdapter
android.animation.AnimatorSet
android.animation.AnimatorSet$AnimatorSetListener
android.animation.AnimatorSet$Builder
+android.animation.AnimatorSet$DependencyListener
android.animation.AnimatorSet$Node
android.animation.FloatEvaluator
android.animation.FloatKeyframeSet
@@ -34,7 +35,6 @@
android.animation.Keyframe$FloatKeyframe
android.animation.Keyframe$IntKeyframe
android.animation.KeyframeSet
-android.animation.LayoutTransition
android.animation.LayoutTransition$TransitionListener
android.animation.ObjectAnimator
android.animation.PropertyValuesHolder
@@ -49,6 +49,10 @@
android.app.Activity
android.app.Activity$1
android.app.ActivityManager
+android.app.ActivityManager$MemoryInfo
+android.app.ActivityManager$MemoryInfo$1
+android.app.ActivityManager$RunningAppProcessInfo
+android.app.ActivityManager$RunningAppProcessInfo$1
android.app.ActivityManagerNative
android.app.ActivityManagerNative$1
android.app.ActivityManagerProxy
@@ -61,12 +65,15 @@
android.app.ActivityThread$BindServiceData
android.app.ActivityThread$ContextCleanupInfo
android.app.ActivityThread$CreateServiceData
+android.app.ActivityThread$DropBoxReporter
+android.app.ActivityThread$DumpComponentInfo
android.app.ActivityThread$EventLoggingReporter
android.app.ActivityThread$GcIdler
android.app.ActivityThread$H
android.app.ActivityThread$Idler
android.app.ActivityThread$Profiler
android.app.ActivityThread$ProviderClientRecord
+android.app.ActivityThread$ProviderKey
android.app.ActivityThread$ProviderRefCount
android.app.ActivityThread$ReceiverData
android.app.ActivityThread$ResourcesKey
@@ -74,8 +81,10 @@
android.app.ActivityThread$ServiceArgsData
android.app.ActivityThread$StopInfo
android.app.AlertDialog
+android.app.AlertDialog$Builder
android.app.AppGlobals
android.app.Application
+android.app.Application$ActivityLifecycleCallbacks
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
@@ -130,11 +139,13 @@
android.app.Dialog
android.app.Dialog$1
android.app.Dialog$ListenersHandler
-android.app.DialogFragment
android.app.Fragment
+android.app.FragmentBreadCrumbs
+android.app.FragmentBreadCrumbs$1
android.app.FragmentContainer
android.app.FragmentManager
android.app.FragmentManager$BackStackEntry
+android.app.FragmentManager$OnBackStackChangedListener
android.app.FragmentManagerImpl
android.app.FragmentManagerImpl$1
android.app.FragmentTransaction
@@ -152,8 +163,13 @@
android.app.INotificationManager$Stub$Proxy
android.app.ISearchManager
android.app.ISearchManager$Stub
+android.app.ISearchManager$Stub$Proxy
android.app.IServiceConnection
android.app.IServiceConnection$Stub
+android.app.ITransientNotification
+android.app.ITransientNotification$Stub
+android.app.IUiAutomationConnection
+android.app.IUiAutomationConnection$Stub
android.app.Instrumentation
android.app.IntentReceiverLeaked
android.app.IntentService
@@ -161,7 +177,6 @@
android.app.ListActivity
android.app.ListActivity$1
android.app.ListActivity$2
-android.app.ListFragment
android.app.LoadedApk
android.app.LoadedApk$ReceiverDispatcher
android.app.LoadedApk$ReceiverDispatcher$Args
@@ -175,7 +190,11 @@
android.app.LoaderManager
android.app.LoaderManagerImpl
android.app.NativeActivity
+android.app.Notification
+android.app.Notification$1
+android.app.Notification$Builder
android.app.NotificationManager
+android.app.OnActivityPausedListener
android.app.PendingIntent
android.app.PendingIntent$1
android.app.QueuedWork
@@ -199,11 +218,8 @@
android.app.backup.FileBackupHelperBase
android.app.backup.FullBackup
android.appwidget.AppWidgetManager
-android.bluetooth.BluetoothSocket
-android.bluetooth.IBluetooth
-android.bluetooth.IBluetooth$Stub
-android.bluetooth.IBluetoothA2dp
-android.bluetooth.IBluetoothA2dp$Stub
+android.appwidget.AppWidgetProvider
+android.bluetooth.BluetoothUuid
android.content.AbstractThreadedSyncAdapter
android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
android.content.AbstractThreadedSyncAdapter$SyncThread
@@ -290,6 +306,8 @@
android.content.pm.ServiceInfo$1
android.content.pm.Signature
android.content.pm.Signature$1
+android.content.pm.UserInfo
+android.content.pm.UserInfo$1
android.content.res.AssetFileDescriptor
android.content.res.AssetFileDescriptor$1
android.content.res.AssetManager
@@ -353,14 +371,16 @@
android.database.sqlite.SQLiteConnection$PreparedStatementCache
android.database.sqlite.SQLiteConnectionPool
android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus
+android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter
android.database.sqlite.SQLiteCursor
android.database.sqlite.SQLiteCursorDriver
android.database.sqlite.SQLiteCustomFunction
android.database.sqlite.SQLiteDatabase
android.database.sqlite.SQLiteDatabase$1
+android.database.sqlite.SQLiteDatabase$2
android.database.sqlite.SQLiteDatabaseConfiguration
-android.database.sqlite.SQLiteDatabase$CustomFunction
android.database.sqlite.SQLiteDebug
+android.database.sqlite.SQLiteDebug$DbStats
android.database.sqlite.SQLiteDebug$PagerStats
android.database.sqlite.SQLiteDirectCursorDriver
android.database.sqlite.SQLiteGlobal
@@ -379,6 +399,7 @@
android.ddm.DdmHandleNativeHeap
android.ddm.DdmHandleProfiling
android.ddm.DdmHandleThread
+android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
android.debug.JNITest
android.drm.DrmManagerClient
@@ -429,6 +450,7 @@
android.graphics.Paint$Style
android.graphics.PaintFlagsDrawFilter
android.graphics.Path
+android.graphics.Path$Direction
android.graphics.Path$FillType
android.graphics.PathDashPathEffect
android.graphics.PathEffect
@@ -465,8 +487,6 @@
android.graphics.Xfermode
android.graphics.YuvImage
android.graphics.drawable.Animatable
-android.graphics.drawable.AnimatedRotateDrawable
-android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState
android.graphics.drawable.AnimationDrawable
android.graphics.drawable.AnimationDrawable$AnimationState
android.graphics.drawable.BitmapDrawable
@@ -505,10 +525,13 @@
android.hardware.Camera
android.hardware.Camera$CameraInfo
android.hardware.Camera$Face
-android.hardware.Camera$Parameters
+android.hardware.Sensor
+android.hardware.SensorEvent
+android.hardware.SensorEventListener
android.hardware.SensorManager
android.hardware.SerialPort
android.hardware.SystemSensorManager
+android.hardware.SystemSensorManager$BaseEventQueue
android.hardware.display.DisplayManager
android.hardware.display.DisplayManagerGlobal
android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
@@ -536,25 +559,37 @@
android.location.ILocationManager$Stub$Proxy
android.location.Location
android.location.Location$1
-android.location.LocationListener
android.location.LocationManager
+android.location.LocationRequest
+android.location.LocationRequest$1
+android.media.AmrInputStream
android.media.AudioFormat
android.media.AudioManager
android.media.AudioManager$1
android.media.AudioManager$FocusEventHandlerDelegate
android.media.AudioManager$FocusEventHandlerDelegate$1
+android.media.AudioManager$OnAudioFocusChangeListener
android.media.AudioRecord
android.media.AudioSystem
android.media.AudioTrack
+android.media.CamcorderProfile
android.media.CameraProfile
android.media.DecoderCapabilities
+android.media.EncoderCapabilities
+android.media.ExifInterface
android.media.IAudioFocusDispatcher
android.media.IAudioFocusDispatcher$Stub
android.media.IAudioService
android.media.IAudioService$Stub
android.media.IAudioService$Stub$Proxy
android.media.JetPlayer
-android.media.MediaFile
+android.media.MediaCodec
+android.media.MediaCodecList
+android.media.MediaCrypto
+android.media.MediaDrm
+android.media.MediaExtractor
+android.media.MediaMetadataRetriever
+android.media.MediaMuxer
android.media.MediaPlayer
android.media.MediaPlayer$OnBufferingUpdateListener
android.media.MediaPlayer$OnCompletionListener
@@ -565,10 +600,24 @@
android.media.MediaRecorder
android.media.MediaScanner
android.media.RemoteDisplay
+android.media.ResampleInputStream
+android.media.SoundPool
android.media.ToneGenerator
+android.media.videoeditor.MediaArtistNativeHelper
+android.media.videoeditor.VideoEditorProfile
+android.mtp.MtpDatabase
+android.mtp.MtpDevice
+android.mtp.MtpDeviceInfo
+android.mtp.MtpObjectInfo
+android.mtp.MtpPropertyGroup
+android.mtp.MtpPropertyList
+android.mtp.MtpServer
+android.mtp.MtpStorage
+android.mtp.MtpStorageInfo
android.net.ConnectivityManager
android.net.Credentials
-android.net.DhcpInfoInternal
+android.net.DhcpResults
+android.net.DhcpResults$1
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
@@ -581,6 +630,8 @@
android.net.NetworkInfo$1
android.net.NetworkInfo$DetailedState
android.net.NetworkInfo$State
+android.net.NetworkStats
+android.net.NetworkStats$1
android.net.NetworkUtils
android.net.Proxy
android.net.SSLCertificateSocketFactory
@@ -603,14 +654,29 @@
android.net.WebAddress
android.net.http.AndroidHttpClient
android.net.http.AndroidHttpClient$1
-android.net.wifi.IWifiManager
-android.net.wifi.IWifiManager$Stub
android.net.http.AndroidHttpClient$2
android.net.http.AndroidHttpClient$CurlLogger
+android.net.http.CertificateChainValidator
+android.net.wifi.IWifiManager
+android.net.wifi.IWifiManager$Stub
+android.net.wifi.IWifiManager$Stub$Proxy
+android.net.wifi.WifiManager
+android.net.wifi.WifiManager$ServiceHandler
android.net.wifi.WifiNative
+android.nfc.INdefPushCallback
+android.nfc.INdefPushCallback$Stub
+android.nfc.INfcAdapter
+android.nfc.INfcAdapter$Stub
+android.nfc.INfcAdapter$Stub$Proxy
+android.nfc.INfcTag
+android.nfc.INfcTag$Stub
+android.nfc.INfcTag$Stub$Proxy
+android.nfc.NfcActivityManager
+android.nfc.NfcAdapter
+android.nfc.NfcAdapter$1
+android.nfc.NfcEvent
+android.nfc.NfcManager
android.opengl.EGL14
-android.nfc.NdefMessage
-android.nfc.NdefRecord
android.opengl.ETC1
android.opengl.GLES10
android.opengl.GLES10Ext
@@ -641,17 +707,23 @@
android.os.Debug
android.os.Debug$MemoryInfo
android.os.Debug$MemoryInfo$1
+android.os.DropBoxManager
android.os.Environment
android.os.Environment$UserEnvironment
android.os.FileObserver$ObserverThread
android.os.FileUtils
android.os.Handler
+android.os.Handler$Callback
+android.os.Handler$MessengerImpl
android.os.HandlerThread
android.os.IBinder
android.os.IBinder$DeathRecipient
android.os.ICancellationSignal
android.os.ICancellationSignal$Stub
android.os.IInterface
+android.os.IMessenger
+android.os.IMessenger$Stub
+android.os.IMessenger$Stub$Proxy
android.os.IPowerManager
android.os.IPowerManager$Stub
android.os.IPowerManager$Stub$Proxy
@@ -662,10 +734,13 @@
android.os.Message$1
android.os.MessageQueue
android.os.MessageQueue$IdleHandler
+android.os.Messenger
+android.os.Messenger$1
android.os.Parcel
android.os.Parcel$1
android.os.ParcelFileDescriptor
android.os.ParcelFileDescriptor$1
+android.os.ParcelFileDescriptor$AutoCloseInputStream
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
@@ -712,34 +787,49 @@
android.os.UEventObserver
android.os.UserHandle
android.os.UserHandle$1
-android.os.Vibrator
android.os.storage.IMountService
android.os.storage.IMountService$Stub
android.os.storage.IMountService$Stub$Proxy
android.os.storage.StorageManager
android.os.storage.StorageVolume
android.os.storage.StorageVolume$1
+android.preference.CheckBoxPreference
+android.preference.GenericInflater
android.preference.GenericInflater$Parent
android.preference.OnDependencyChangeListener
android.preference.Preference
+android.preference.Preference$OnPreferenceChangeInternalListener
+android.preference.Preference$OnPreferenceChangeListener
android.preference.PreferenceActivity
+android.preference.PreferenceActivity$1
android.preference.PreferenceFragment
android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
+android.preference.PreferenceFrameLayout
android.preference.PreferenceGroup
+android.preference.PreferenceGroupAdapter
+android.preference.PreferenceGroupAdapter$1
+android.preference.PreferenceGroupAdapter$PreferenceLayout
+android.preference.PreferenceInflater
android.preference.PreferenceManager
android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.preference.PreferenceScreen
+android.preference.TwoStatePreference
android.provider.BaseColumns
+android.provider.ContactsContract
+android.provider.Settings$Global
android.provider.Settings$NameValueCache
android.provider.Settings$NameValueTable
android.provider.Settings$Secure
+android.provider.Settings$SettingNotFoundException
android.provider.Settings$System
android.renderscript.RenderScript
-android.telephony.PhoneNumberUtils
+android.security.AndroidKeyPairGenerator
+android.security.AndroidKeyStore
+android.security.AndroidKeyStoreProvider
+android.telephony.Rlog
android.telephony.TelephonyManager
android.text.AndroidBidi
android.text.AndroidCharacter
-android.text.AutoText
android.text.BoringLayout
android.text.BoringLayout$Metrics
android.text.DynamicLayout
@@ -748,12 +838,16 @@
android.text.Editable$Factory
android.text.GetChars
android.text.GraphicsOperations
+android.text.Html
android.text.Html$HtmlParser
+android.text.HtmlToSpannedConverter
android.text.InputFilter
android.text.InputType
android.text.Layout
+android.text.Layout$1
android.text.Layout$Alignment
android.text.Layout$Directions
+android.text.Layout$Ellipsizer
android.text.MeasuredText
android.text.NoCopySpan
android.text.NoCopySpan$Concrete
@@ -762,7 +856,6 @@
android.text.ParcelableSpan
android.text.Selection
android.text.Selection$END
-android.text.Selection$PositionIterator
android.text.Selection$START
android.text.SpanSet
android.text.SpanWatcher
@@ -776,14 +869,12 @@
android.text.StaticLayout
android.text.TextDirectionHeuristic
android.text.TextDirectionHeuristics
-android.text.TextDirectionHeuristics$1
android.text.TextDirectionHeuristics$AnyStrong
android.text.TextDirectionHeuristics$FirstStrong
android.text.TextDirectionHeuristics$TextDirectionAlgorithm
android.text.TextDirectionHeuristics$TextDirectionHeuristicImpl
android.text.TextDirectionHeuristics$TextDirectionHeuristicInternal
android.text.TextDirectionHeuristics$TextDirectionHeuristicLocale
-android.text.TextDirectionHeuristics$TriState
android.text.TextLine
android.text.TextPaint
android.text.TextUtils
@@ -792,27 +883,29 @@
android.text.TextUtils$TruncateAt
android.text.TextWatcher
android.text.format.DateFormat
+android.text.format.DateUtils
android.text.format.Time
android.text.method.AllCapsTransformationMethod
android.text.method.ArrowKeyMovementMethod
android.text.method.BaseKeyListener
android.text.method.BaseMovementMethod
android.text.method.KeyListener
+android.text.method.LinkMovementMethod
android.text.method.MetaKeyKeyListener
android.text.method.MovementMethod
android.text.method.PasswordTransformationMethod
-android.text.method.QwertyKeyListener
android.text.method.ReplacementTransformationMethod
android.text.method.ReplacementTransformationMethod$ReplacementCharSequence
android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
+android.text.method.ScrollingMovementMethod
android.text.method.SingleLineTransformationMethod
android.text.method.TextKeyListener
android.text.method.TextKeyListener$Capitalize
android.text.method.TransformationMethod
android.text.method.TransformationMethod2
-android.text.method.WordIterator
android.text.style.AlignmentSpan
android.text.style.CharacterStyle
+android.text.style.ClickableSpan
android.text.style.DynamicDrawableSpan
android.text.style.EasyEditSpan
android.text.style.ImageSpan
@@ -825,6 +918,8 @@
android.text.style.SpellCheckSpan
android.text.style.StyleSpan
android.text.style.SuggestionSpan
+android.text.style.URLSpan
+android.text.style.UnderlineSpan
android.text.style.UpdateAppearance
android.text.style.UpdateLayout
android.text.style.WrapTogetherSpan
@@ -833,10 +928,11 @@
android.util.AttributeSet
android.util.Base64
android.util.Base64$Coder
+android.util.Base64$Decoder
+android.util.Base64$Encoder
android.util.DisplayMetrics
android.util.EventLog
android.util.EventLog$Event
-android.util.FinitePool
android.util.FloatMath
android.util.FloatProperty
android.util.Log
@@ -846,10 +942,12 @@
android.util.LruCache
android.util.Pair
android.util.Patterns
-android.util.Pool
-android.util.Poolable
-android.util.PoolableManager
-android.util.Pools
+android.util.Pools$Pool
+android.util.Pools$SimplePool
+android.util.Pools$SynchronizedPool
+android.util.PrefixPrinter
+android.util.PrintWriterPrinter
+android.util.Printer
android.util.Property
android.util.Singleton
android.util.Slog
@@ -857,7 +955,6 @@
android.util.SparseBooleanArray
android.util.SparseIntArray
android.util.StateSet
-android.util.SynchronizedPool
android.util.TypedValue
android.util.Xml
android.view.AbsSavedState
@@ -894,16 +991,19 @@
android.view.GLES20Layer
android.view.GLES20Layer$Finalizer
android.view.GLES20RecordingCanvas
-android.view.GLES20RecordingCanvas$1
android.view.GLES20RenderLayer
+android.view.GestureDetector
+android.view.GestureDetector$GestureHandler
android.view.GestureDetector$OnDoubleTapListener
android.view.GestureDetector$OnGestureListener
+android.view.GestureDetector$SimpleOnGestureListener
android.view.Gravity
android.view.HardwareCanvas
android.view.HardwareLayer
android.view.HardwareRenderer
android.view.HardwareRenderer$Gl20Renderer
android.view.HardwareRenderer$Gl20Renderer$1
+android.view.HardwareRenderer$Gl20Renderer$2
android.view.HardwareRenderer$Gl20Renderer$Gl20RendererEglContext
android.view.HardwareRenderer$GlRenderer
android.view.HardwareRenderer$GlRenderer$FunctorsRunnable
@@ -925,10 +1025,11 @@
android.view.InputEvent
android.view.InputEvent$1
android.view.InputEventConsistencyVerifier
-android.view.InputEventConsistencyVerifier$KeyState
android.view.InputEventReceiver
+android.view.InputEventSender
android.view.InputQueue
android.view.InputQueue$Callback
+android.view.InputQueue$FinishedInputEventCallback
android.view.KeyCharacterMap
android.view.KeyCharacterMap$1
android.view.KeyCharacterMap$FallbackAction
@@ -944,6 +1045,7 @@
android.view.MenuInflater
android.view.MenuInflater$MenuState
android.view.MenuItem
+android.view.MenuItem$OnMenuItemClickListener
android.view.MotionEvent
android.view.MotionEvent$1
android.view.MotionEvent$PointerCoords
@@ -954,7 +1056,8 @@
android.view.Surface
android.view.Surface$1
android.view.Surface$CompatibleCanvas
-android.view.Surface$PhysicalDisplayInfo
+android.view.SurfaceControl
+android.view.SurfaceControl$PhysicalDisplayInfo
android.view.SurfaceHolder
android.view.SurfaceHolder$Callback
android.view.SurfaceHolder$Callback2
@@ -966,11 +1069,10 @@
android.view.SurfaceView$4
android.view.SurfaceView$MyWindow
android.view.TextureView
-android.view.TouchDelegate
android.view.VelocityTracker
-android.view.VelocityTracker$1
android.view.VelocityTracker$Estimator
android.view.View
+android.view.View$1
android.view.View$10
android.view.View$11
android.view.View$12
@@ -981,6 +1083,7 @@
android.view.View$7
android.view.View$8
android.view.View$9
+android.view.View$AccessibilityDelegate
android.view.View$AttachInfo
android.view.View$AttachInfo$Callbacks
android.view.View$BaseSavedState
@@ -989,6 +1092,7 @@
android.view.View$CheckForTap
android.view.View$ListenerInfo
android.view.View$MeasureSpec
+android.view.View$OnAttachStateChangeListener
android.view.View$OnClickListener
android.view.View$OnCreateContextMenuListener
android.view.View$OnFocusChangeListener
@@ -1001,6 +1105,8 @@
android.view.View$TransformationInfo
android.view.View$UnsetPressedState
android.view.ViewConfiguration
+android.view.ViewDebug
+android.view.ViewDebug$HierarchyHandler
android.view.ViewGroup
android.view.ViewGroup$3
android.view.ViewGroup$LayoutParams
@@ -1010,16 +1116,29 @@
android.view.ViewManager
android.view.ViewParent
android.view.ViewRootImpl
-android.view.ViewRootImpl$2
+android.view.ViewRootImpl$3
+android.view.ViewRootImpl$4
android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$AsyncInputStage
android.view.ViewRootImpl$ConsumeBatchedInputRunnable
-android.view.ViewRootImpl$InputMethodCallback
+android.view.ViewRootImpl$EarlyPostImeInputStage
+android.view.ViewRootImpl$ImeInputStage
+android.view.ViewRootImpl$InputStage
android.view.ViewRootImpl$InvalidateOnAnimationRunnable
+android.view.ViewRootImpl$NativePostImeInputStage
+android.view.ViewRootImpl$NativePreImeInputStage
android.view.ViewRootImpl$QueuedInputEvent
android.view.ViewRootImpl$RunQueue
android.view.ViewRootImpl$RunQueue$HandlerAction
+android.view.ViewRootImpl$SyntheticInputStage
+android.view.ViewRootImpl$SyntheticJoystickHandler
+android.view.ViewRootImpl$SyntheticTouchNavigationHandler
+android.view.ViewRootImpl$SyntheticTouchNavigationHandler$1
+android.view.ViewRootImpl$SyntheticTrackballHandler
android.view.ViewRootImpl$TrackballAxis
android.view.ViewRootImpl$TraversalRunnable
+android.view.ViewRootImpl$ViewPostImeInputStage
+android.view.ViewRootImpl$ViewPreImeInputStage
android.view.ViewRootImpl$ViewRootHandler
android.view.ViewRootImpl$W
android.view.ViewRootImpl$WindowInputEventReceiver
@@ -1049,6 +1168,7 @@
android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
android.view.accessibility.AccessibilityManager$MyHandler
android.view.accessibility.AccessibilityNodeInfo
+android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
android.view.accessibility.IAccessibilityManager
android.view.accessibility.IAccessibilityManager$Stub
@@ -1062,6 +1182,8 @@
android.view.animation.Animation$1
android.view.animation.Animation$2
android.view.animation.Animation$3
+android.view.animation.Animation$AnimationListener
+android.view.animation.AnimationSet
android.view.animation.AnimationUtils
android.view.animation.DecelerateInterpolator
android.view.animation.Interpolator
@@ -1074,73 +1196,133 @@
android.view.inputmethod.ExtractedText
android.view.inputmethod.ExtractedText$1
android.view.inputmethod.InputConnection
-android.view.inputmethod.InputConnectionWrapper
android.view.inputmethod.InputMethodManager
android.view.inputmethod.InputMethodManager$1
-android.view.inputmethod.InputMethodManager$2
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
-android.view.inputmethod.InputMethodManager$FinishedEventCallback
+android.view.inputmethod.InputMethodManager$FinishedInputEventCallback
android.view.inputmethod.InputMethodManager$H
+android.view.inputmethod.InputMethodManager$ImeInputEventSender
android.view.inputmethod.InputMethodManager$PendingEvent
+android.view.textservice.SpellCheckerSubtype
+android.view.textservice.SpellCheckerSubtype$1
android.webkit.BrowserFrame
-android.webkit.CacheManager
+android.webkit.BrowserFrame$ConfigCallback
+android.webkit.CallbackProxy
android.webkit.CookieManager
android.webkit.CookieManagerClassic
+android.webkit.CookieSyncManager
android.webkit.DeviceMotionAndOrientationManager
android.webkit.GeolocationPermissions
android.webkit.GeolocationPermissionsClassic
+android.webkit.GeolocationPermissionsClassic$1
+android.webkit.GeolocationPermissionsClassic$2
android.webkit.HTML5Audio
android.webkit.HTML5VideoViewProxy
android.webkit.JWebCoreJavaBridge
android.webkit.JavascriptInterface
android.webkit.JniUtil
+android.webkit.L10nUtils
android.webkit.MockGeolocation
+android.webkit.OverScrollGlow
+android.webkit.PluginManager
+android.webkit.QuadF
+android.webkit.URLUtil
+android.webkit.ViewManager
+android.webkit.ViewManager$2
+android.webkit.ViewManager$3
android.webkit.ViewStateSerializer
android.webkit.WebBackForwardList
android.webkit.WebBackForwardListClassic
+android.webkit.WebCoreThreadWatchdog
android.webkit.WebHistoryItem
android.webkit.WebHistoryItemClassic
android.webkit.WebIconDatabase
android.webkit.WebIconDatabaseClassic
+android.webkit.WebIconDatabaseClassic$EventHandler
+android.webkit.WebIconDatabaseClassic$EventHandler$1
android.webkit.WebSettings
+android.webkit.WebSettings$LayoutAlgorithm
+android.webkit.WebSettings$PluginState
+android.webkit.WebSettings$RenderPriority
+android.webkit.WebSettings$ZoomDensity
android.webkit.WebSettingsClassic
android.webkit.WebSettingsClassic$AutoFillProfile
+android.webkit.WebSettingsClassic$EventHandler
+android.webkit.WebSettingsClassic$EventHandler$1
android.webkit.WebStorage
android.webkit.WebStorageClassic
+android.webkit.WebStorageClassic$1
+android.webkit.WebStorageClassic$2
+android.webkit.WebSyncManager
+android.webkit.WebSyncManager$SyncHandler
android.webkit.WebView
+android.webkit.WebView$PrivateAccess
android.webkit.WebViewClassic
android.webkit.WebViewClassic$Factory
+android.webkit.WebViewClassic$OnTrimMemoryListener
+android.webkit.WebViewClassic$PackageListener
+android.webkit.WebViewClassic$PageSwapDelegate
+android.webkit.WebViewClassic$PrivateHandler
+android.webkit.WebViewClassic$ProxyReceiver
+android.webkit.WebViewClassic$SelectionHandleAlpha
+android.webkit.WebViewClassic$TitleBarDelegate
+android.webkit.WebViewClassic$TrustStorageListener
+android.webkit.WebViewClassic$ViewSizeData
+android.webkit.WebViewClient
android.webkit.WebViewCore
+android.webkit.WebViewCore$AutoFillData
+android.webkit.WebViewCore$DrawData
+android.webkit.WebViewCore$EventHub
+android.webkit.WebViewCore$EventHub$1
+android.webkit.WebViewCore$GetUrlData
+android.webkit.WebViewCore$TextFieldInitData
+android.webkit.WebViewCore$ViewState
+android.webkit.WebViewCore$WebCoreThread
+android.webkit.WebViewCore$WebCoreThread$1
+android.webkit.WebViewDatabase
+android.webkit.WebViewDatabaseClassic
+android.webkit.WebViewDatabaseClassic$1
android.webkit.WebViewFactory
android.webkit.WebViewFactoryProvider
android.webkit.WebViewFactoryProvider$Statics
+android.webkit.WebViewInputDispatcher
+android.webkit.WebViewInputDispatcher$DispatchEventQueue
+android.webkit.WebViewInputDispatcher$TouchStream
+android.webkit.WebViewInputDispatcher$UiCallbacks
+android.webkit.WebViewInputDispatcher$UiHandler
+android.webkit.WebViewInputDispatcher$WebKitCallbacks
+android.webkit.WebViewInputDispatcher$WebKitHandler
android.webkit.WebViewProvider
android.webkit.WebViewProvider$ScrollDelegate
android.webkit.WebViewProvider$ViewDelegate
+android.webkit.ZoomControlBase
+android.webkit.ZoomControlExternal
+android.webkit.ZoomManager
+android.webkit.ZoomManager$FocusMovementQueue
+android.webkit.ZoomManager$PostScale
android.widget.AbsListView
android.widget.AbsListView$1
-android.widget.AbsListView$2
-android.widget.AbsListView$3
android.widget.AbsListView$AdapterDataSetObserver
android.widget.AbsListView$CheckForTap
-android.widget.AbsListView$FlingRunnable
-android.widget.AbsListView$FlingRunnable$1
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$PerformClick
android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$RecyclerListener
android.widget.AbsListView$SavedState
android.widget.AbsListView$SavedState$1
android.widget.AbsListView$SelectionBoundsAdjuster
android.widget.AbsListView$WindowRunnnable
+android.widget.AbsSeekBar
android.widget.AbsSpinner
android.widget.AbsSpinner$RecycleBin
+android.widget.AbsoluteLayout
android.widget.Adapter
android.widget.AdapterView
android.widget.AdapterView$AdapterDataSetObserver
android.widget.AdapterView$OnItemClickListener
+android.widget.AdapterView$OnItemLongClickListener
android.widget.AdapterView$OnItemSelectedListener
+android.widget.AdapterView$SelectionNotifier
android.widget.AdapterViewAnimator
android.widget.ArrayAdapter
android.widget.AutoCompleteTextView
@@ -1151,7 +1333,6 @@
android.widget.Button
android.widget.CheckBox
android.widget.Checkable
-android.widget.CheckedTextView
android.widget.CompoundButton
android.widget.CompoundButton$OnCheckedChangeListener
android.widget.CursorAdapter
@@ -1165,22 +1346,15 @@
android.widget.Editor$EasyEditSpanController
android.widget.Editor$InputContentType
android.widget.Editor$InputMethodState
+android.widget.Editor$UserDictionaryListener
android.widget.ExpandableListView
-android.widget.ExpandableListView$SavedState
-android.widget.FastScroller
-android.widget.FastScroller$1
-android.widget.FastScroller$ScrollFade
android.widget.Filter
android.widget.Filter$FilterListener
-android.widget.Filter$FilterResults
-android.widget.Filter$ResultsHandler
android.widget.Filterable
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
-android.widget.Gallery
android.widget.GridLayout
android.widget.GridView
-android.widget.HorizontalScrollView
android.widget.ImageButton
android.widget.ImageView
android.widget.ImageView$ScaleType
@@ -1188,6 +1362,9 @@
android.widget.LinearLayout$LayoutParams
android.widget.ListAdapter
android.widget.ListPopupWindow
+android.widget.ListPopupWindow$1
+android.widget.ListPopupWindow$2
+android.widget.ListPopupWindow$DropDownListView
android.widget.ListPopupWindow$ListSelectorHider
android.widget.ListPopupWindow$PopupDataSetObserver
android.widget.ListPopupWindow$PopupScrollListener
@@ -1195,24 +1372,25 @@
android.widget.ListPopupWindow$ResizePopupRunnable
android.widget.ListView
android.widget.ListView$ArrowScrollFocusResult
-android.widget.NumberPicker
android.widget.OverScroller
android.widget.OverScroller$SplineOverScroller
android.widget.PopupWindow
android.widget.PopupWindow$1
android.widget.PopupWindow$OnDismissListener
+android.widget.PopupWindow$PopupViewContainer
android.widget.ProgressBar
android.widget.ProgressBar$SavedState
android.widget.ProgressBar$SavedState$1
android.widget.RelativeLayout
android.widget.RelativeLayout$DependencyGraph
android.widget.RelativeLayout$DependencyGraph$Node
-android.widget.RelativeLayout$DependencyGraph$Node$1
android.widget.RelativeLayout$LayoutParams
android.widget.RemoteViews
android.widget.RemoteViews$1
android.widget.RemoteViews$Action
+android.widget.RemoteViews$BitmapCache
android.widget.RemoteViews$MemoryUsageCounter
+android.widget.RemoteViews$OnClickHandler
android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
android.widget.ScrollBarDrawable
@@ -1232,26 +1410,20 @@
android.widget.SearchView$9
android.widget.SearchView$SearchAutoComplete
android.widget.Spinner
+android.widget.Spinner$DropDownAdapter
+android.widget.Spinner$DropdownPopup
+android.widget.Spinner$DropdownPopup$1
+android.widget.Spinner$SpinnerPopup
android.widget.SpinnerAdapter
-android.widget.StackView
-android.widget.Switch
-android.widget.TabHost
-android.widget.TabHost$ContentStrategy
-android.widget.TabHost$FactoryContentStrategy
-android.widget.TabHost$IndicatorStrategy
-android.widget.TabHost$LabelAndIconIndicatorStrategy
-android.widget.TabHost$OnTabChangeListener
-android.widget.TabHost$TabContentFactory
-android.widget.TabHost$TabSpec
-android.widget.TabHost$ViewIndicatorStrategy
-android.widget.TabWidget
-android.widget.TabWidget$OnTabSelectionChanged
-android.widget.TabWidget$TabClickListener
android.widget.TableLayout
+android.widget.TableLayout$LayoutParams
+android.widget.TableLayout$PassThroughHierarchyChangeListener
android.widget.TableRow
+android.widget.TableRow$ChildrenTracker
+android.widget.TableRow$LayoutParams
android.widget.TextView
android.widget.TextView$2
-android.widget.TextView$3
+android.widget.TextView$4
android.widget.TextView$BufferType
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
@@ -1259,9 +1431,11 @@
android.widget.TextView$OnEditorActionListener
android.widget.TextView$SavedState
android.widget.TextView$SavedState$1
-android.widget.VideoView
-android.widget.ViewAnimator
-com.android.i18n.phonenumbers.AsYouTypeFormatter
+android.widget.Toast
+android.widget.Toast$TN
+android.widget.Toast$TN$1
+android.widget.Toast$TN$2
+com.android.i18n.phonenumbers.PhoneNumberMatcher
com.android.i18n.phonenumbers.PhoneNumberUtil
com.android.internal.R$styleable
com.android.internal.app.ActionBarImpl
@@ -1269,6 +1443,7 @@
com.android.internal.app.ActionBarImpl$2
com.android.internal.app.AlertController
com.android.internal.app.AlertController$1
+com.android.internal.app.AlertController$AlertParams
com.android.internal.app.AlertController$ButtonHandler
com.android.internal.appwidget.IAppWidgetService
com.android.internal.appwidget.IAppWidgetService$Stub
@@ -1277,10 +1452,13 @@
com.android.internal.logging.AndroidConfig
com.android.internal.logging.AndroidHandler
com.android.internal.logging.AndroidHandler$1
+com.android.internal.net.NetworkStatsFactory
com.android.internal.os.AndroidPrintStream
-com.android.internal.os.BatteryStatsImpl
com.android.internal.os.BinderInternal
com.android.internal.os.BinderInternal$GcWatcher
+com.android.internal.os.IDropBoxManagerService
+com.android.internal.os.IDropBoxManagerService$Stub
+com.android.internal.os.IDropBoxManagerService$Stub$Proxy
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
com.android.internal.os.RuntimeInit
@@ -1311,25 +1489,31 @@
com.android.internal.policy.impl.Policy
com.android.internal.telephony.ITelephony
com.android.internal.telephony.ITelephony$Stub
+com.android.internal.telephony.ITelephony$Stub$Proxy
com.android.internal.telephony.ITelephonyRegistry
com.android.internal.telephony.ITelephonyRegistry$Stub
com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
com.android.internal.telephony.PhoneConstants$State
+com.android.internal.textservice.ITextServicesManager
+com.android.internal.textservice.ITextServicesManager$Stub
com.android.internal.util.ArrayUtils
+com.android.internal.util.AsyncChannel
+com.android.internal.util.AsyncChannel$DeathMonitor
com.android.internal.util.FastXmlSerializer
com.android.internal.util.MemInfoReader
+com.android.internal.util.Objects
com.android.internal.util.Preconditions
com.android.internal.util.XmlUtils
com.android.internal.view.ActionBarPolicy
com.android.internal.view.BaseIWindow
com.android.internal.view.IInputConnectionWrapper
com.android.internal.view.IInputConnectionWrapper$MyHandler
+com.android.internal.view.IInputConnectionWrapper$SomeArgs
com.android.internal.view.IInputContext
com.android.internal.view.IInputContext$Stub
com.android.internal.view.IInputContextCallback
com.android.internal.view.IInputContextCallback$Stub
-com.android.internal.view.IInputMethodCallback
-com.android.internal.view.IInputMethodCallback$Stub
+com.android.internal.view.IInputContextCallback$Stub$Proxy
com.android.internal.view.IInputMethodClient
com.android.internal.view.IInputMethodClient$Stub
com.android.internal.view.IInputMethodManager
@@ -1352,19 +1536,24 @@
com.android.internal.view.menu.ActionMenuView$ActionMenuChildView
com.android.internal.view.menu.ActionMenuView$LayoutParams
com.android.internal.view.menu.BaseMenuPresenter
+com.android.internal.view.menu.ListMenuItemView
com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
com.android.internal.view.menu.MenuBuilder$ItemInvoker
com.android.internal.view.menu.MenuItemImpl
+com.android.internal.view.menu.MenuPopupHelper
+com.android.internal.view.menu.MenuPopupHelper$MenuAdapter
com.android.internal.view.menu.MenuPresenter
com.android.internal.view.menu.MenuPresenter$Callback
com.android.internal.view.menu.MenuView
com.android.internal.view.menu.MenuView$ItemView
+com.android.internal.view.menu.SubMenuBuilder
com.android.internal.widget.AbsActionBarView
com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
com.android.internal.widget.ActionBarContainer
com.android.internal.widget.ActionBarContextView
com.android.internal.widget.ActionBarOverlayLayout
+com.android.internal.widget.ActionBarOverlayLayout$LayoutParams
com.android.internal.widget.ActionBarView
com.android.internal.widget.ActionBarView$1
com.android.internal.widget.ActionBarView$2
@@ -1375,10 +1564,6 @@
com.android.internal.widget.ActionBarView$SavedState$1
com.android.internal.widget.DialogTitle
com.android.internal.widget.EditableInputConnection
-com.android.internal.widget.ILockSettings
-com.android.internal.widget.ILockSettings$Stub
-com.android.internal.widget.ILockSettings$Stub$Proxy
-com.android.internal.widget.ScrollingTabContainerView
com.android.org.bouncycastle.asn1.ASN1Boolean
com.android.org.bouncycastle.asn1.ASN1Choice
com.android.org.bouncycastle.asn1.ASN1Encodable
@@ -1418,7 +1603,6 @@
com.android.org.bouncycastle.asn1.InMemoryRepresentable
com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream
com.android.org.bouncycastle.asn1.LimitedInputStream
-com.android.org.bouncycastle.asn1.OIDTokenizer
com.android.org.bouncycastle.asn1.StreamUtil
com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers
com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers
@@ -1427,6 +1611,7 @@
com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
com.android.org.bouncycastle.asn1.x509.BasicConstraints
+com.android.org.bouncycastle.asn1.x509.Extension
com.android.org.bouncycastle.asn1.x509.GeneralName
com.android.org.bouncycastle.asn1.x509.GeneralNames
com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
@@ -1434,20 +1619,15 @@
com.android.org.bouncycastle.asn1.x509.X509Extensions
com.android.org.bouncycastle.asn1.x509.X509Name
com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
+com.android.org.bouncycastle.asn1.x9.X962NamedCurves
com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
-com.android.org.bouncycastle.crypto.BlockCipher
-com.android.org.bouncycastle.crypto.BufferedBlockCipher
-com.android.org.bouncycastle.crypto.CipherParameters
com.android.org.bouncycastle.crypto.Digest
com.android.org.bouncycastle.crypto.ExtendedDigest
+com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
+com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
+com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
-com.android.org.bouncycastle.crypto.engines.AESFastEngine
-com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
-com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
-com.android.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
-com.android.org.bouncycastle.crypto.params.KeyParameter
-com.android.org.bouncycastle.crypto.params.ParametersWithRandom
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
@@ -1474,7 +1654,6 @@
com.android.org.bouncycastle.jcajce.provider.digest.SHA512
com.android.org.bouncycastle.jcajce.provider.digest.SHA512$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.AES
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -1484,12 +1663,6 @@
com.android.org.bouncycastle.jcajce.provider.symmetric.DES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.DESede
com.android.org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.PBE
com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
@@ -1512,6 +1685,120 @@
com.android.org.bouncycastle.util.encoders.HexEncoder
com.android.org.bouncycastle.util.io.Streams
com.android.org.bouncycastle.x509.ExtendedPKIXParameters
+com.android.org.conscrypt.AbstractSessionContext
+com.android.org.conscrypt.AbstractSessionContext$1
+com.android.org.conscrypt.ByteArray
+com.android.org.conscrypt.CertPinManager
+com.android.org.conscrypt.ChainStrengthAnalyzer
+com.android.org.conscrypt.ClientSessionContext
+com.android.org.conscrypt.ClientSessionContext$HostAndPort
+com.android.org.conscrypt.DefaultSSLContextImpl
+com.android.org.conscrypt.FileClientSessionCache
+com.android.org.conscrypt.FileClientSessionCache$Impl
+com.android.org.conscrypt.JSSEProvider
+com.android.org.conscrypt.KeyManagerFactoryImpl
+com.android.org.conscrypt.KeyManagerImpl
+com.android.org.conscrypt.NativeCrypto
+com.android.org.conscrypt.NativeCrypto$SSLHandshakeCallbacks
+com.android.org.conscrypt.OpenSSLBIOInputStream
+com.android.org.conscrypt.OpenSSLCipher
+com.android.org.conscrypt.OpenSSLCipher$AES
+com.android.org.conscrypt.OpenSSLCipher$AES$CBC
+com.android.org.conscrypt.OpenSSLCipher$AES$CBC$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$AES$CBC$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$AES$CFB
+com.android.org.conscrypt.OpenSSLCipher$AES$CFB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$AES$CFB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$AES$CTR
+com.android.org.conscrypt.OpenSSLCipher$AES$CTR$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$AES$CTR$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$AES$ECB
+com.android.org.conscrypt.OpenSSLCipher$AES$ECB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$AES$ECB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$AES$OFB
+com.android.org.conscrypt.OpenSSLCipher$AES$OFB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$AES$OFB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$ARC4
+com.android.org.conscrypt.OpenSSLCipher$DESEDE
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CBC
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CBC$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CBC$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CFB
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CFB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$CFB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$ECB
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$ECB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$ECB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$OFB
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$OFB$NoPadding
+com.android.org.conscrypt.OpenSSLCipher$DESEDE$OFB$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipherRSA
+com.android.org.conscrypt.OpenSSLCipherRSA$PKCS1
+com.android.org.conscrypt.OpenSSLCipherRSA$Raw
+com.android.org.conscrypt.OpenSSLContextImpl
+com.android.org.conscrypt.OpenSSLDSAKeyFactory
+com.android.org.conscrypt.OpenSSLDSAKeyPairGenerator
+com.android.org.conscrypt.OpenSSLECDHKeyAgreement
+com.android.org.conscrypt.OpenSSLECKeyFactory
+com.android.org.conscrypt.OpenSSLECKeyPairGenerator
+com.android.org.conscrypt.OpenSSLKey
+com.android.org.conscrypt.OpenSSLKeyHolder
+com.android.org.conscrypt.OpenSSLMac
+com.android.org.conscrypt.OpenSSLMac$HmacMD5
+com.android.org.conscrypt.OpenSSLMac$HmacSHA1
+com.android.org.conscrypt.OpenSSLMac$HmacSHA256
+com.android.org.conscrypt.OpenSSLMac$HmacSHA384
+com.android.org.conscrypt.OpenSSLMac$HmacSHA512
+com.android.org.conscrypt.OpenSSLMessageDigestJDK
+com.android.org.conscrypt.OpenSSLMessageDigestJDK$MD5
+com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA1
+com.android.org.conscrypt.OpenSSLProvider
+com.android.org.conscrypt.OpenSSLRSAKeyFactory
+com.android.org.conscrypt.OpenSSLRSAKeyPairGenerator
+com.android.org.conscrypt.OpenSSLRSAPublicKey
+com.android.org.conscrypt.OpenSSLRandom
+com.android.org.conscrypt.OpenSSLSessionImpl
+com.android.org.conscrypt.OpenSSLSignature
+com.android.org.conscrypt.OpenSSLSignature$1
+com.android.org.conscrypt.OpenSSLSignature$EngineType
+com.android.org.conscrypt.OpenSSLSignature$MD5RSA
+com.android.org.conscrypt.OpenSSLSignature$SHA1DSA
+com.android.org.conscrypt.OpenSSLSignature$SHA1ECDSA
+com.android.org.conscrypt.OpenSSLSignature$SHA1RSA
+com.android.org.conscrypt.OpenSSLSignature$SHA256ECDSA
+com.android.org.conscrypt.OpenSSLSignature$SHA256RSA
+com.android.org.conscrypt.OpenSSLSignature$SHA384ECDSA
+com.android.org.conscrypt.OpenSSLSignature$SHA384RSA
+com.android.org.conscrypt.OpenSSLSignature$SHA512ECDSA
+com.android.org.conscrypt.OpenSSLSignature$SHA512RSA
+com.android.org.conscrypt.OpenSSLSignatureRawRSA
+com.android.org.conscrypt.OpenSSLSocketFactoryImpl
+com.android.org.conscrypt.OpenSSLSocketImpl
+com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream
+com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream
+com.android.org.conscrypt.OpenSSLSocketImplWrapper
+com.android.org.conscrypt.OpenSSLX509CertPath
+com.android.org.conscrypt.OpenSSLX509CertPath$Encoding
+com.android.org.conscrypt.OpenSSLX509Certificate
+com.android.org.conscrypt.OpenSSLX509CertificateFactory
+com.android.org.conscrypt.OpenSSLX509CertificateFactory$1
+com.android.org.conscrypt.OpenSSLX509CertificateFactory$2
+com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
+com.android.org.conscrypt.ProtocolVersion
+com.android.org.conscrypt.SSLClientSessionCache
+com.android.org.conscrypt.SSLContextImpl
+com.android.org.conscrypt.SSLParametersImpl
+com.android.org.conscrypt.ServerSessionContext
+com.android.org.conscrypt.TrustManagerFactoryImpl
+com.android.org.conscrypt.TrustManagerImpl
+com.android.org.conscrypt.TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker
+com.android.org.conscrypt.TrustedCertificateIndex
+com.android.org.conscrypt.TrustedCertificateKeyStoreSpi
+com.android.org.conscrypt.TrustedCertificateStore
+com.android.org.conscrypt.TrustedCertificateStore$1
+com.android.org.conscrypt.TrustedCertificateStore$2
+com.android.org.conscrypt.TrustedCertificateStore$3
+com.android.org.conscrypt.TrustedCertificateStore$CertSelector
com.android.server.NetworkManagementSocketTagger
com.android.server.NetworkManagementSocketTagger$1
com.android.server.NetworkManagementSocketTagger$SocketTags
@@ -1552,6 +1839,7 @@
java.io.BufferedInputStream
java.io.BufferedOutputStream
java.io.BufferedReader
+java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
java.io.Closeable
@@ -1560,27 +1848,36 @@
java.io.DataInputStream
java.io.DataOutput
java.io.DataOutputStream
+java.io.Externalizable
java.io.File
java.io.FileDescriptor
java.io.FileFilter
java.io.FileInputStream
java.io.FileNotFoundException
java.io.FileOutputStream
+java.io.FileReader
java.io.FilterInputStream
java.io.FilterOutputStream
+java.io.FilterReader
java.io.Flushable
java.io.IOException
java.io.InputStream
java.io.InputStreamReader
+java.io.ObjectInput
+java.io.ObjectInputStream
java.io.ObjectStreamClass
+java.io.ObjectStreamConstants
java.io.ObjectStreamField
java.io.OutputStream
java.io.OutputStreamWriter
java.io.PrintStream
java.io.PrintWriter
+java.io.PushbackInputStream
+java.io.PushbackReader
java.io.RandomAccessFile
java.io.Reader
java.io.Serializable
+java.io.StringReader
java.io.StringWriter
java.io.Writer
java.lang.AbstractMethodError
@@ -1655,6 +1952,7 @@
java.lang.Runtime
java.lang.RuntimeException
java.lang.RuntimePermission
+java.lang.SecurityException
java.lang.Short
java.lang.StackOverflowError
java.lang.StackTraceElement
@@ -1707,23 +2005,29 @@
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
-java.math.Multiplication
java.math.NativeBN
java.math.RoundingMode
java.net.AddressCache
java.net.AddressCache$AddressCacheEntry
+java.net.CacheResponse
java.net.ContentHandler
+java.net.CookieHandler
java.net.HttpURLConnection
java.net.Inet4Address
java.net.Inet6Address
java.net.InetAddress
java.net.InetSocketAddress
+java.net.InetUnixAddress
java.net.JarURLConnection
java.net.PlainSocketImpl
+java.net.PlainSocketImpl$PlainSocketInputStream
+java.net.PlainSocketImpl$PlainSocketOutputStream
java.net.Proxy
java.net.Proxy$Type
java.net.ProxySelector
java.net.ProxySelectorImpl
+java.net.ResponseCache
+java.net.ResponseSource
java.net.Socket
java.net.SocketAddress
java.net.SocketImpl
@@ -1738,8 +2042,8 @@
java.net.URLEncoder$1
java.net.URLStreamHandler
java.net.UnknownHostException
-java.nio.BaseByteBuffer
java.nio.Buffer
+java.nio.ByteArrayBuffer
java.nio.ByteBuffer
java.nio.ByteOrder
java.nio.CharArrayBuffer
@@ -1748,13 +2052,11 @@
java.nio.DirectByteBuffer
java.nio.FileChannelImpl
java.nio.FileChannelImpl$1
-java.nio.HeapByteBuffer
+java.nio.MappedByteBuffer
java.nio.MemoryBlock
+java.nio.MemoryBlock$NonMovableHeapBlock
java.nio.NIOAccess
java.nio.NioUtils
-java.nio.ReadWriteCharArrayBuffer
-java.nio.ReadWriteDirectByteBuffer
-java.nio.ReadWriteHeapByteBuffer
java.nio.channels.ByteChannel
java.nio.channels.Channel
java.nio.channels.FileChannel
@@ -1777,17 +2079,16 @@
java.nio.charset.ModifiedUtf8
java.security.AccessController
java.security.BasicPermission
-java.security.GeneralSecurityException
java.security.Guard
java.security.Key
java.security.KeyFactory
java.security.KeyFactorySpi
+java.security.KeyPairGenerator
java.security.KeyPairGeneratorSpi
java.security.KeyStore
java.security.KeyStoreSpi
java.security.MessageDigest
java.security.MessageDigestSpi
-java.security.NoSuchAlgorithmException
java.security.Permission
java.security.Principal
java.security.PrivilegedAction
@@ -1799,7 +2100,6 @@
java.security.Security
java.security.Security$SecurityDoor
java.security.Signature
-java.security.Signature$SignatureImpl
java.security.SignatureSpi
java.security.cert.CertPath
java.security.cert.CertPathParameters
@@ -1810,6 +2110,7 @@
java.security.cert.Certificate
java.security.cert.CertificateFactory
java.security.cert.CertificateFactorySpi
+java.security.cert.PKIXCertPathChecker
java.security.cert.PKIXCertPathValidatorResult
java.security.cert.PKIXParameters
java.security.cert.PolicyNode
@@ -1826,12 +2127,13 @@
java.security.spec.KeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
+java.sql.Date
java.text.AttributedCharacterIterator$Attribute
java.text.Bidi
java.text.Bidi$Run
-java.text.BreakIterator
-java.text.CharacterIterator
+java.text.Collator
java.text.DateFormat
+java.text.DateFormat$Field
java.text.DateFormatSymbols
java.text.DecimalFormat
java.text.DecimalFormatSymbols
@@ -1841,13 +2143,15 @@
java.text.NumberFormat
java.text.NumberFormat$Field
java.text.ParsePosition
-java.text.RuleBasedBreakIterator
+java.text.RuleBasedCollator
java.text.SimpleDateFormat
-java.text.StringCharacterIterator
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractList$FullListIterator
java.util.AbstractList$SimpleListIterator
+java.util.AbstractList$SubAbstractList
+java.util.AbstractList$SubAbstractList$SubAbstractListIterator
+java.util.AbstractList$SubAbstractListRandomAccess
java.util.AbstractMap
java.util.AbstractQueue
java.util.AbstractSequentialList
@@ -1857,6 +2161,7 @@
java.util.ArrayList$ArrayListIterator
java.util.Arrays
java.util.Arrays$ArrayList
+java.util.BitSet
java.util.Calendar
java.util.Collection
java.util.Collections
@@ -1868,6 +2173,7 @@
java.util.Collections$SingletonList
java.util.Collections$SynchronizedCollection
java.util.Collections$SynchronizedMap
+java.util.Collections$SynchronizedSet
java.util.Collections$UnmodifiableCollection
java.util.Collections$UnmodifiableCollection$1
java.util.Collections$UnmodifiableList
@@ -1884,11 +2190,13 @@
java.util.Deque
java.util.Dictionary
java.util.EnumMap
+java.util.EnumSet
java.util.Enumeration
java.util.EventObject
java.util.Formattable
java.util.Formatter
java.util.Formatter$1
+java.util.Formatter$CachedDecimalFormat
java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatToken
java.util.GregorianCalendar
@@ -1926,6 +2234,7 @@
java.util.Locale
java.util.Map
java.util.Map$Entry
+java.util.MiniEnumSet
java.util.NavigableMap
java.util.NavigableSet
java.util.Properties
@@ -1940,6 +2249,11 @@
java.util.StringTokenizer
java.util.TimSort
java.util.TimeZone
+java.util.Timer
+java.util.Timer$FinalizerHelper
+java.util.Timer$TimerImpl
+java.util.Timer$TimerImpl$TimerHeap
+java.util.TimerTask
java.util.TreeMap
java.util.TreeMap$1
java.util.TreeMap$2
@@ -1955,6 +2269,7 @@
java.util.TreeMap$Node
java.util.TreeMap$Relation
java.util.TreeSet
+java.util.UUID
java.util.Vector
java.util.Vector$1
java.util.WeakHashMap
@@ -1966,8 +2281,10 @@
java.util.concurrent.AbstractExecutorService
java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
+java.util.concurrent.CancellationException
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentHashMap$HashEntry
+java.util.concurrent.ConcurrentHashMap$HashIterator
java.util.concurrent.ConcurrentHashMap$Segment
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentLinkedQueue$Node
@@ -1976,12 +2293,14 @@
java.util.concurrent.CopyOnWriteArrayList$CowIterator
java.util.concurrent.CountDownLatch
java.util.concurrent.CountDownLatch$Sync
+java.util.concurrent.ExecutionException
java.util.concurrent.Executor
java.util.concurrent.ExecutorService
java.util.concurrent.Executors
java.util.concurrent.Executors$DefaultThreadFactory
java.util.concurrent.Executors$DelegatedExecutorService
java.util.concurrent.Executors$FinalizableDelegatedExecutorService
+java.util.concurrent.Executors$RunnableAdapter
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.FutureTask$WaitNode
@@ -2013,7 +2332,6 @@
java.util.concurrent.locks.LockSupport
java.util.concurrent.locks.ReadWriteLock
java.util.concurrent.locks.ReentrantLock
-java.util.concurrent.locks.ReentrantLock$FairSync
java.util.concurrent.locks.ReentrantLock$NonfairSync
java.util.concurrent.locks.ReentrantLock$Sync
java.util.concurrent.locks.ReentrantReadWriteLock
@@ -2051,7 +2369,9 @@
java.util.zip.CRC32
java.util.zip.Checksum
java.util.zip.Deflater
+java.util.zip.DeflaterOutputStream
java.util.zip.GZIPInputStream
+java.util.zip.GZIPOutputStream
java.util.zip.Inflater
java.util.zip.InflaterInputStream
java.util.zip.ZipConstants
@@ -2062,10 +2382,10 @@
java.util.zip.ZipFile$ZipInflaterInputStream
javax.crypto.Cipher
javax.crypto.CipherSpi
+javax.crypto.KeyAgreementSpi
+javax.crypto.MacSpi
javax.crypto.SecretKey
-javax.crypto.interfaces.PBEKey
javax.crypto.spec.IvParameterSpec
-javax.crypto.spec.PBEParameterSpec
javax.crypto.spec.SecretKeySpec
javax.microedition.khronos.egl.EGL
javax.microedition.khronos.egl.EGL10
@@ -2098,6 +2418,8 @@
javax.net.ssl.X509KeyManager
javax.net.ssl.X509TrustManager
javax.security.auth.x500.X500Principal
+libcore.icu.AlphabeticIndex
+libcore.icu.AlphabeticIndex$ImmutableIndex
libcore.icu.ICU
libcore.icu.LocaleData
libcore.icu.NativeBreakIterator
@@ -2108,12 +2430,16 @@
libcore.icu.NativeIDN
libcore.icu.NativeNormalizer
libcore.icu.NativePluralRules
+libcore.icu.RuleBasedCollatorICU
libcore.icu.TimeZoneNames
+libcore.icu.Transliterator
libcore.internal.StringPool
libcore.io.AsynchronousCloseMonitor
-libcore.io.Base64
libcore.io.BlockGuardOs
libcore.io.BufferIterator
+libcore.io.DropBox
+libcore.io.DropBox$DefaultReporter
+libcore.io.DropBox$Reporter
libcore.io.ErrnoException
libcore.io.EventLogger
libcore.io.EventLogger$DefaultReporter
@@ -2140,11 +2466,32 @@
libcore.io.StructStat
libcore.io.StructStatFs
libcore.io.StructTimeval
+libcore.io.StructUcred
libcore.io.StructUtsname
libcore.math.MathUtils
libcore.net.MimeUtils
libcore.net.RawSocket
libcore.net.UriCodec
+libcore.net.http.AbstractHttpInputStream
+libcore.net.http.FixedLengthInputStream
+libcore.net.http.HeaderParser$CacheControlHandler
+libcore.net.http.HttpConnection
+libcore.net.http.HttpConnection$Address
+libcore.net.http.HttpConnectionPool
+libcore.net.http.HttpDate
+libcore.net.http.HttpDate$1
+libcore.net.http.HttpEngine
+libcore.net.http.HttpEngine$1
+libcore.net.http.HttpHandler
+libcore.net.http.HttpURLConnectionImpl
+libcore.net.http.HttpURLConnectionImpl$Retry
+libcore.net.http.HttpsHandler
+libcore.net.http.RawHeaders
+libcore.net.http.RawHeaders$1
+libcore.net.http.RequestHeaders
+libcore.net.http.RequestHeaders$1
+libcore.net.http.ResponseHeaders
+libcore.net.http.ResponseHeaders$1
libcore.net.url.FileHandler
libcore.net.url.FileURLConnection
libcore.net.url.JarHandler
@@ -2172,6 +2519,7 @@
org.apache.harmony.dalvik.ddmc.DdmServer
org.apache.harmony.lang.annotation.AnnotationFactory
org.apache.harmony.lang.annotation.AnnotationMember
+org.apache.harmony.lang.annotation.AnnotationMember$DefaultValues
org.apache.harmony.luni.internal.util.TimezoneGetter
org.apache.harmony.security.asn1.ASN1Any
org.apache.harmony.security.asn1.ASN1BitString
@@ -2199,6 +2547,7 @@
org.apache.harmony.security.asn1.ASN1StringType$5
org.apache.harmony.security.asn1.ASN1StringType$6
org.apache.harmony.security.asn1.ASN1StringType$7
+org.apache.harmony.security.asn1.ASN1StringType$ASN1StringUTF8Type
org.apache.harmony.security.asn1.ASN1Time
org.apache.harmony.security.asn1.ASN1Type
org.apache.harmony.security.asn1.ASN1TypeCollection
@@ -2215,16 +2564,8 @@
org.apache.harmony.security.fortress.Engine$SpiAndProvider
org.apache.harmony.security.fortress.SecurityAccess
org.apache.harmony.security.fortress.Services
-org.apache.harmony.security.pkcs7.ContentInfo
-org.apache.harmony.security.pkcs7.ContentInfo$1
-org.apache.harmony.security.provider.cert.Cache
org.apache.harmony.security.provider.cert.DRLCertFactory
-org.apache.harmony.security.provider.cert.X509CertFactoryImpl
org.apache.harmony.security.provider.cert.X509CertImpl
-org.apache.harmony.security.provider.cert.X509CertPathImpl
-org.apache.harmony.security.provider.cert.X509CertPathImpl$1
-org.apache.harmony.security.provider.cert.X509CertPathImpl$2
-org.apache.harmony.security.provider.cert.X509CertPathImpl$3
org.apache.harmony.security.provider.crypto.CryptoProvider
org.apache.harmony.security.provider.crypto.RandomBitsSupplier
org.apache.harmony.security.provider.crypto.SHA1_Data
@@ -2247,6 +2588,8 @@
org.apache.harmony.security.x509.Certificate$1
org.apache.harmony.security.x509.EDIPartyName
org.apache.harmony.security.x509.EDIPartyName$1
+org.apache.harmony.security.x509.ExtendedKeyUsage
+org.apache.harmony.security.x509.ExtendedKeyUsage$1
org.apache.harmony.security.x509.Extension
org.apache.harmony.security.x509.Extension$1
org.apache.harmony.security.x509.Extension$2
@@ -2255,6 +2598,7 @@
org.apache.harmony.security.x509.Extensions$1
org.apache.harmony.security.x509.GeneralName
org.apache.harmony.security.x509.GeneralName$1
+org.apache.harmony.security.x509.GeneralName$2
org.apache.harmony.security.x509.GeneralNames
org.apache.harmony.security.x509.GeneralNames$1
org.apache.harmony.security.x509.KeyUsage
@@ -2273,66 +2617,6 @@
org.apache.harmony.security.x509.Validity$1
org.apache.harmony.xml.ExpatAttributes
org.apache.harmony.xml.ExpatParser
-org.apache.harmony.xnet.provider.jsse.AbstractSessionContext
-org.apache.harmony.xnet.provider.jsse.AbstractSessionContext$1
-org.apache.harmony.xnet.provider.jsse.ByteArray
-org.apache.harmony.xnet.provider.jsse.CertPinManager
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext$HostAndPort
-org.apache.harmony.xnet.provider.jsse.DefaultSSLContextImpl
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl
-org.apache.harmony.xnet.provider.jsse.JSSEProvider
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.KeyManagerImpl
-org.apache.harmony.xnet.provider.jsse.NativeCrypto
-org.apache.harmony.xnet.provider.jsse.NativeCrypto$SSLHandshakeCallbacks
-org.apache.harmony.xnet.provider.jsse.OpenSSLCipherRSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLCipherRSA$PKCS1
-org.apache.harmony.xnet.provider.jsse.OpenSSLCipherRSA$Raw
-org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLDSAKeyPairGenerator
-org.apache.harmony.xnet.provider.jsse.OpenSSLDSAPublicKey
-org.apache.harmony.xnet.provider.jsse.OpenSSLKey
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK$MD5
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK$SHA1
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK$SHA512
-org.apache.harmony.xnet.provider.jsse.OpenSSLProvider
-org.apache.harmony.xnet.provider.jsse.OpenSSLRSAKeyFactory
-org.apache.harmony.xnet.provider.jsse.OpenSSLRSAKeyPairGenerator
-org.apache.harmony.xnet.provider.jsse.OpenSSLRSAPublicKey
-org.apache.harmony.xnet.provider.jsse.OpenSSLRandom
-org.apache.harmony.xnet.provider.jsse.OpenSSLSessionImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$EngineType
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$MD5RSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$SHA1DSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$SHA1RSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$SHA256RSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$SHA384RSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignature$SHA512RSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSignatureRawRSA
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImplWrapper
-org.apache.harmony.xnet.provider.jsse.PinListEntry
-org.apache.harmony.xnet.provider.jsse.ProtocolVersion
-org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache
-org.apache.harmony.xnet.provider.jsse.SSLContextImpl
-org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
-org.apache.harmony.xnet.provider.jsse.ServerSessionContext
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.TrustManagerImpl
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateIndex
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateKeyStoreSpi
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore$1
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore$2
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore$3
-org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore$CertSelector
org.apache.http.ConnectionReuseStrategy
org.apache.http.FormattedHeader
org.apache.http.Header
@@ -2362,6 +2646,7 @@
org.apache.http.auth.AuthSchemeRegistry
org.apache.http.auth.AuthState
org.apache.http.client.AuthenticationHandler
+org.apache.http.client.CookieStore
org.apache.http.client.CredentialsProvider
org.apache.http.client.HttpClient
org.apache.http.client.HttpRequestRetryHandler
@@ -2419,6 +2704,11 @@
org.apache.http.conn.ssl.StrictHostnameVerifier
org.apache.http.conn.ssl.X509HostnameVerifier
org.apache.http.conn.util.InetAddressUtils
+org.apache.http.cookie.CookieAttributeHandler
+org.apache.http.cookie.CookieIdentityComparator
+org.apache.http.cookie.CookieOrigin
+org.apache.http.cookie.CookiePathComparator
+org.apache.http.cookie.CookieSpec
org.apache.http.cookie.CookieSpecFactory
org.apache.http.cookie.CookieSpecRegistry
org.apache.http.entity.AbstractHttpEntity
@@ -2436,6 +2726,7 @@
org.apache.http.impl.auth.DigestSchemeFactory
org.apache.http.impl.client.AbstractAuthenticationHandler
org.apache.http.impl.client.AbstractHttpClient
+org.apache.http.impl.client.BasicCookieStore
org.apache.http.impl.client.BasicCredentialsProvider
org.apache.http.impl.client.ClientParamsStack
org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy
@@ -2472,11 +2763,29 @@
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
org.apache.http.impl.conn.tsccm.WaitingThreadAborter
+org.apache.http.impl.cookie.AbstractCookieAttributeHandler
+org.apache.http.impl.cookie.AbstractCookieSpec
+org.apache.http.impl.cookie.BasicCommentHandler
+org.apache.http.impl.cookie.BasicExpiresHandler
+org.apache.http.impl.cookie.BasicMaxAgeHandler
+org.apache.http.impl.cookie.BasicPathHandler
+org.apache.http.impl.cookie.BasicSecureHandler
+org.apache.http.impl.cookie.BestMatchSpec
org.apache.http.impl.cookie.BestMatchSpecFactory
org.apache.http.impl.cookie.BrowserCompatSpecFactory
+org.apache.http.impl.cookie.CookieSpecBase
org.apache.http.impl.cookie.NetscapeDraftSpecFactory
+org.apache.http.impl.cookie.RFC2109DomainHandler
+org.apache.http.impl.cookie.RFC2109Spec
org.apache.http.impl.cookie.RFC2109SpecFactory
+org.apache.http.impl.cookie.RFC2109VersionHandler
+org.apache.http.impl.cookie.RFC2965CommentUrlAttributeHandler
+org.apache.http.impl.cookie.RFC2965DiscardAttributeHandler
+org.apache.http.impl.cookie.RFC2965DomainAttributeHandler
+org.apache.http.impl.cookie.RFC2965PortAttributeHandler
+org.apache.http.impl.cookie.RFC2965Spec
org.apache.http.impl.cookie.RFC2965SpecFactory
+org.apache.http.impl.cookie.RFC2965VersionAttributeHandler
org.apache.http.impl.entity.EntityDeserializer
org.apache.http.impl.entity.EntitySerializer
org.apache.http.impl.entity.LaxContentLengthStrategy
@@ -2538,9 +2847,37 @@
org.apache.http.util.ByteArrayBuffer
org.apache.http.util.CharArrayBuffer
org.apache.http.util.LangUtils
+org.ccil.cowan.tagsoup.AttributesImpl
+org.ccil.cowan.tagsoup.AutoDetector
+org.ccil.cowan.tagsoup.Element
+org.ccil.cowan.tagsoup.ElementType
+org.ccil.cowan.tagsoup.HTMLModels
+org.ccil.cowan.tagsoup.HTMLScanner
+org.ccil.cowan.tagsoup.HTMLSchema
+org.ccil.cowan.tagsoup.Parser
+org.ccil.cowan.tagsoup.Parser$1
+org.ccil.cowan.tagsoup.ScanHandler
+org.ccil.cowan.tagsoup.Scanner
+org.ccil.cowan.tagsoup.Schema
+org.json.JSON
+org.json.JSONArray
+org.json.JSONObject
+org.json.JSONObject$1
+org.json.JSONStringer
+org.json.JSONStringer$Scope
+org.json.JSONTokener
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.xml.sax.Attributes
+org.xml.sax.ContentHandler
+org.xml.sax.DTDHandler
+org.xml.sax.EntityResolver
+org.xml.sax.ErrorHandler
+org.xml.sax.InputSource
+org.xml.sax.Locator
+org.xml.sax.XMLReader
+org.xml.sax.ext.LexicalHandler
+org.xml.sax.helpers.DefaultHandler
org.xmlpull.v1.XmlPullParser
org.xmlpull.v1.XmlSerializer
sun.misc.Unsafe
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index ab38ed2..3d6b6e7 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -6110,15 +6110,42 @@
for (size_t i = 0; i < mAxes.size(); i++) {
const Axis& axis = mAxes.valueAt(i);
- info->addMotionRange(axis.axisInfo.axis, AINPUT_SOURCE_JOYSTICK,
- axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ addMotionRange(axis.axisInfo.axis, axis, info);
+
if (axis.axisInfo.mode == AxisInfo::MODE_SPLIT) {
- info->addMotionRange(axis.axisInfo.highAxis, AINPUT_SOURCE_JOYSTICK,
- axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ addMotionRange(axis.axisInfo.highAxis, axis, info);
+
}
}
}
+void JoystickInputMapper::addMotionRange(int32_t axisId, const Axis& axis,
+ InputDeviceInfo* info) {
+ info->addMotionRange(axisId, AINPUT_SOURCE_JOYSTICK,
+ axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ /* In order to ease the transition for developers from using the old axes
+ * to the newer, more semantically correct axes, we'll continue to register
+ * the old axes as duplicates of their corresponding new ones. */
+ int32_t compatAxis = getCompatAxis(axisId);
+ if (compatAxis >= 0) {
+ info->addMotionRange(compatAxis, AINPUT_SOURCE_JOYSTICK,
+ axis.min, axis.max, axis.flat, axis.fuzz, axis.resolution);
+ }
+}
+
+/* A mapping from axes the joystick actually has to the axes that should be
+ * artificially created for compatibility purposes.
+ * Returns -1 if no compatibility axis is needed. */
+int32_t JoystickInputMapper::getCompatAxis(int32_t axis) {
+ switch(axis) {
+ case AMOTION_EVENT_AXIS_LTRIGGER:
+ return AMOTION_EVENT_AXIS_BRAKE;
+ case AMOTION_EVENT_AXIS_RTRIGGER:
+ return AMOTION_EVENT_AXIS_GAS;
+ }
+ return -1;
+}
+
void JoystickInputMapper::dump(String8& dump) {
dump.append(INDENT2 "Joystick Input Mapper:\n");
@@ -6373,9 +6400,10 @@
size_t numAxes = mAxes.size();
for (size_t i = 0; i < numAxes; i++) {
const Axis& axis = mAxes.valueAt(i);
- pointerCoords.setAxisValue(axis.axisInfo.axis, axis.currentValue);
+ setPointerCoordsAxisValue(&pointerCoords, axis.axisInfo.axis, axis.currentValue);
if (axis.axisInfo.mode == AxisInfo::MODE_SPLIT) {
- pointerCoords.setAxisValue(axis.axisInfo.highAxis, axis.highCurrentValue);
+ setPointerCoordsAxisValue(&pointerCoords, axis.axisInfo.highAxis,
+ axis.highCurrentValue);
}
}
@@ -6391,6 +6419,19 @@
getListener()->notifyMotion(&args);
}
+void JoystickInputMapper::setPointerCoordsAxisValue(PointerCoords* pointerCoords,
+ int32_t axis, float value) {
+ pointerCoords->setAxisValue(axis, value);
+ /* In order to ease the transition for developers from using the old axes
+ * to the newer, more semantically correct axes, we'll continue to produce
+ * values for the old axes as mirrors of the value of their corresponding
+ * new axes. */
+ int32_t compatAxis = getCompatAxis(axis);
+ if (compatAxis >= 0) {
+ pointerCoords->setAxisValue(compatAxis, value);
+ }
+}
+
bool JoystickInputMapper::filterAxes(bool force) {
bool atLeastOneSignificantChange = force;
size_t numAxes = mAxes.size();
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index 312f19b..ed2a5c1 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -1805,6 +1805,11 @@
float newValue, float currentValue, float thresholdValue);
static bool isCenteredAxis(int32_t axis);
+ static int32_t getCompatAxis(int32_t axis);
+
+ static void addMotionRange(int32_t axisId, const Axis& axis, InputDeviceInfo* info);
+ static void setPointerCoordsAxisValue(PointerCoords* pointerCoords, int32_t axis,
+ float value);
};
} // namespace android
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index f0257ffe..cc74b92 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -49,7 +49,6 @@
import android.media.IRingtonePlayer;
import android.net.Uri;
import android.os.Binder;
-import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -285,7 +284,7 @@
public void record(StatusBarNotification nr) {
// Nuke heavy parts of notification before storing in archive
- nr.notification.lightenPayload();
+ nr.getNotification().lightenPayload();
if (mBuffer.size() == BUFFER_SIZE) {
mBuffer.removeFirst();
@@ -312,7 +311,7 @@
private StatusBarNotification findNext() {
while (iter.hasNext()) {
StatusBarNotification nr = iter.next();
- if ((pkg == null || nr.pkg == pkg)
+ if ((pkg == null || nr.getPackageName() == pkg)
&& (userId == UserHandle.USER_ALL || nr.getUserId() == userId)) {
return nr;
}
@@ -786,7 +785,7 @@
*
* @param token The binder for the listener, to check that the caller is allowed
*/
- public void clearAllNotificationsFromListener(INotificationListener token) {
+ public void cancelAllNotificationsFromListener(INotificationListener token) {
NotificationListenerInfo info = checkListenerToken(token);
long identity = Binder.clearCallingIdentity();
try {
@@ -803,7 +802,7 @@
*
* @param token The binder for the listener, to check that the caller is allowed
*/
- public void clearNotificationFromListener(INotificationListener token, String pkg, String tag, int id) {
+ public void cancelNotificationFromListener(INotificationListener token, String pkg, String tag, int id) {
NotificationListenerInfo info = checkListenerToken(token);
long identity = Binder.clearCallingIdentity();
try {
@@ -816,6 +815,30 @@
}
}
+ /**
+ * Allow an INotificationListener to request the list of outstanding notifications seen by
+ * the current user. Useful when starting up, after which point the listener callbacks should
+ * be used.
+ *
+ * @param token The binder for the listener, to check that the caller is allowed
+ */
+ public StatusBarNotification[] getActiveNotificationsFromListener(INotificationListener token) {
+ NotificationListenerInfo info = checkListenerToken(token);
+
+ StatusBarNotification[] result = new StatusBarNotification[0];
+ ArrayList<StatusBarNotification> list = new ArrayList<StatusBarNotification>();
+ synchronized (mNotificationList) {
+ final int N = mNotificationList.size();
+ for (int i=0; i<N; i++) {
+ StatusBarNotification sbn = mNotificationList.get(i).sbn;
+ if (info.enabledAndUserMatches(sbn)) {
+ list.add(sbn);
+ }
+ }
+ }
+ return list.toArray(result);
+ }
+
// -- end of listener APIs --
public static final class NotificationRecord
@@ -828,17 +851,17 @@
this.sbn = sbn;
}
- public Notification getNotification() { return sbn.notification; }
- public int getFlags() { return sbn.notification.flags; }
+ public Notification getNotification() { return sbn.getNotification(); }
+ public int getFlags() { return sbn.getNotification().flags; }
public int getUserId() { return sbn.getUserId(); }
void dump(PrintWriter pw, String prefix, Context baseContext) {
- final Notification notification = sbn.notification;
+ final Notification notification = sbn.getNotification();
pw.println(prefix + this);
- pw.println(prefix + " uid=" + sbn.uid + " userId=" + sbn.getUserId());
+ pw.println(prefix + " uid=" + sbn.getUid() + " userId=" + sbn.getUserId());
pw.println(prefix + " icon=0x" + Integer.toHexString(notification.icon)
- + " / " + idDebugString(baseContext, sbn.pkg, notification.icon));
- pw.println(prefix + " pri=" + notification.priority + " score=" + sbn.score);
+ + " / " + idDebugString(baseContext, sbn.getPackageName(), notification.icon));
+ pw.println(prefix + " pri=" + notification.priority + " score=" + sbn.getScore());
pw.println(prefix + " contentIntent=" + notification.contentIntent);
pw.println(prefix + " deleteIntent=" + notification.deleteIntent);
pw.println(prefix + " tickerText=" + notification.tickerText);
@@ -897,8 +920,8 @@
return String.format(
"NotificationRecord(0x%08x: pkg=%s user=%s id=%d tag=%s score=%d: %s)",
System.identityHashCode(this),
- this.sbn.pkg, this.sbn.user, this.sbn.id, this.sbn.tag,
- this.sbn.score, this.sbn.notification);
+ this.sbn.getPackageName(), this.sbn.getUser(), this.sbn.getId(), this.sbn.getTag(),
+ this.sbn.getScore(), this.sbn.getNotification());
}
}
@@ -1517,7 +1540,7 @@
final int N = mNotificationList.size();
for (int i=0; i<N; i++) {
final NotificationRecord r = mNotificationList.get(i);
- if (r.sbn.pkg.equals(pkg) && r.sbn.getUserId() == userId) {
+ if (r.sbn.getPackageName().equals(pkg) && r.sbn.getUserId() == userId) {
count++;
if (count >= MAX_PACKAGE_NOTIFICATIONS) {
Slog.e(TAG, "Package has already posted " + count
@@ -1634,7 +1657,7 @@
long identity = Binder.clearCallingIdentity();
try {
r.statusBarKey = mStatusBar.addNotification(n);
- if ((n.notification.flags & Notification.FLAG_SHOW_LIGHTS) != 0
+ if ((n.getNotification().flags & Notification.FLAG_SHOW_LIGHTS) != 0
&& canInterrupt) {
mAttentionLight.pulse();
}
@@ -1750,7 +1773,7 @@
// does not have the VIBRATE permission.
long identity = Binder.clearCallingIdentity();
try {
- mVibrator.vibrate(r.sbn.uid, r.sbn.basePkg,
+ mVibrator.vibrate(r.sbn.getUid(), r.sbn.getBasePkg(),
useDefaultVibrate ? mDefaultVibrationPattern
: mFallbackVibrationPattern,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
@@ -1759,7 +1782,7 @@
}
} else if (notification.vibrate.length > 1) {
// If you want your own vibration pattern, you need the VIBRATE permission
- mVibrator.vibrate(r.sbn.uid, r.sbn.basePkg, notification.vibrate,
+ mVibrator.vibrate(r.sbn.getUid(), r.sbn.getBasePkg(), notification.vibrate,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
}
}
@@ -1816,7 +1839,7 @@
} catch (PendingIntent.CanceledException ex) {
// do nothing - there's no relevant way to recover, and
// no reason to let this propagate
- Slog.w(TAG, "canceled PendingIntent for " + r.sbn.pkg, ex);
+ Slog.w(TAG, "canceled PendingIntent for " + r.sbn.getPackageName(), ex);
}
}
}
@@ -1941,7 +1964,7 @@
if ((r.getFlags() & mustNotHaveFlags) != 0) {
continue;
}
- if (pkg != null && !r.sbn.pkg.equals(pkg)) {
+ if (pkg != null && !r.sbn.getPackageName().equals(pkg)) {
continue;
}
canceledSomething = true;
@@ -2041,7 +2064,7 @@
if (mLedNotification == null || mInCall || mScreenOn) {
mNotificationLight.turnOff();
} else {
- final Notification ledno = mLedNotification.sbn.notification;
+ final Notification ledno = mLedNotification.sbn.getNotification();
int ledARGB = ledno.ledARGB;
int ledOnMS = ledno.ledOnMS;
int ledOffMS = ledno.ledOffMS;
@@ -2065,19 +2088,19 @@
final int len = list.size();
for (int i=0; i<len; i++) {
NotificationRecord r = list.get(i);
- if (!notificationMatchesUserId(r, userId) || r.sbn.id != id) {
+ if (!notificationMatchesUserId(r, userId) || r.sbn.getId() != id) {
continue;
}
if (tag == null) {
- if (r.sbn.tag != null) {
+ if (r.sbn.getTag() != null) {
continue;
}
} else {
- if (!tag.equals(r.sbn.tag)) {
+ if (!tag.equals(r.sbn.getTag())) {
continue;
}
}
- if (r.sbn.pkg.equals(pkg)) {
+ if (r.sbn.getPackageName().equals(pkg)) {
return i;
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index b263680..92f72ba 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.media.AudioService;
import android.net.wifi.p2p.WifiP2pService;
@@ -346,6 +347,9 @@
Slog.i(TAG, "No Bluetooh Service (emulator)");
} else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
Slog.i(TAG, "No Bluetooth Service (factory test)");
+ } else if (!context.getPackageManager().hasSystemFeature
+ (PackageManager.FEATURE_BLUETOOTH)) {
+ Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
} else if (disableBluetooth) {
Slog.i(TAG, "Bluetooth Service disabled by config");
} else {
diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java
index de941f2..d4d3850 100644
--- a/services/java/com/android/server/Watchdog.java
+++ b/services/java/com/android/server/Watchdog.java
@@ -424,7 +424,7 @@
}
name = (mCurrentMonitor != null) ?
- mCurrentMonitor.getClass().getName() : "null";
+ mCurrentMonitor.getClass().getName() : "main thread blocked";
}
// If we got here, that means that the system is most likely hung.
diff --git a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 0d8a571..9e893da 100644
--- a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -56,6 +56,13 @@
*/
static final int FLAG_FEATURE_TOUCH_EXPLORATION = 0x00000002;
+ /**
+ * Flag for enabling the filtering key events feature.
+ *
+ * @see #setEnabledFeatures(int)
+ */
+ static final int FLAG_FEATURE_FILTER_KEY_EVENTS = 0x00000004;
+
private final Runnable mProcessBatchedEventsRunnable = new Runnable() {
@Override
public void run() {
@@ -101,6 +108,8 @@
private boolean mKeyEventSequenceStarted;
+ private boolean mFilterKeyEvents;
+
AccessibilityInputFilter(Context context, AccessibilityManagerService service) {
super(context.getMainLooper());
mContext = context;
@@ -198,6 +207,10 @@
}
private void onKeyEvent(KeyEvent event, int policyFlags) {
+ if (!mFilterKeyEvents) {
+ super.onInputEvent(event, policyFlags);
+ return;
+ }
if ((policyFlags & WindowManagerPolicy.FLAG_PASS_TO_USER) == 0) {
mKeyEventSequenceStarted = false;
super.onInputEvent(event, policyFlags);
@@ -314,13 +327,6 @@
}
}
- void reset() {
- setEnabledFeatures(0);
- mKeyEventSequenceStarted = false;
- mMotionEventSequenceStarted = false;
- mHoverEventSequenceStarted = false;
- }
-
private void enableFeatures() {
mMotionEventSequenceStarted = false;
mHoverEventSequenceStarted = false;
@@ -338,9 +344,12 @@
mEventHandler = mTouchExplorer;
}
}
+ if ((mEnabledFeatures & FLAG_FEATURE_FILTER_KEY_EVENTS) != 0) {
+ mFilterKeyEvents = true;
+ }
}
- private void disableFeatures() {
+ void disableFeatures() {
if (mTouchExplorer != null) {
mTouchExplorer.clear();
mTouchExplorer.onDestroy();
@@ -352,6 +361,10 @@
mScreenMagnifier = null;
}
mEventHandler = null;
+ mKeyEventSequenceStarted = false;
+ mMotionEventSequenceStarted = false;
+ mHoverEventSequenceStarted = false;
+ mFilterKeyEvents = false;
}
@Override
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 64dfd67..138c51b 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -797,6 +797,7 @@
private Service getQueryBridge() {
if (mQueryBridge == null) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
+ info.setCapabilities(AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT);
mQueryBridge = new Service(UserHandle.USER_NULL,
sFakeAccessibilityServiceComponentName, info);
}
@@ -1170,9 +1171,18 @@
boolean setInputFilter = false;
AccessibilityInputFilter inputFilter = null;
synchronized (mLock) {
- // Accessibility enabled means at least one service is enabled.
- if (userState.mIsAccessibilityEnabled
- || userState.mIsDisplayMagnificationEnabled) {
+ int flags = 0;
+ if (userState.mIsDisplayMagnificationEnabled) {
+ flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER;
+ }
+ // Touch exploration without accessibility makes no sense.
+ if (userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled) {
+ flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION;
+ }
+ if (userState.mIsFilterKeyEventsEnabled) {
+ flags |= AccessibilityInputFilter.FLAG_FEATURE_FILTER_KEY_EVENTS;
+ }
+ if (flags != 0) {
if (!mHasInputFilter) {
mHasInputFilter = true;
if (mInputFilter == null) {
@@ -1182,19 +1192,11 @@
inputFilter = mInputFilter;
setInputFilter = true;
}
- int flags = 0;
- if (userState.mIsDisplayMagnificationEnabled) {
- flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER;
- }
- // Touch exploration without accessibility makes no sense.
- if (userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled) {
- flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION;
- }
mInputFilter.setEnabledFeatures(flags);
} else {
if (mHasInputFilter) {
mHasInputFilter = false;
- mInputFilter.reset();
+ mInputFilter.disableFeatures();
inputFilter = null;
setInputFilter = true;
}
@@ -1261,13 +1263,52 @@
}
private void onUserStateChangedLocked(UserState userState) {
+ updateLegacyCapabilities(userState);
updateServicesLocked(userState);
+ updateFilterKeyEventsLocked(userState);
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
scheduleUpdateInputFilter(userState);
scheduleUpdateClientsIfNeededLocked(userState);
}
+ private void updateLegacyCapabilities(UserState userState) {
+ // Up to JB-MR1 we had a white list with services that can enable touch
+ // exploration. When a service is first started we show a dialog to the
+ // use to get a permission to white list the service.
+ final int installedServiceCount = userState.mInstalledServices.size();
+ for (int i = 0; i < installedServiceCount; i++) {
+ AccessibilityServiceInfo serviceInfo = userState.mInstalledServices.get(i);
+ ResolveInfo resolveInfo = serviceInfo.getResolveInfo();
+ if ((serviceInfo.getCapabilities()
+ & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) == 0
+ && resolveInfo.serviceInfo.applicationInfo.targetSdkVersion
+ <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ ComponentName componentName = new ComponentName(
+ resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
+ if (userState.mTouchExplorationGrantedServices.contains(componentName)) {
+ serviceInfo.setCapabilities(serviceInfo.getCapabilities()
+ | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION);
+ }
+ }
+ }
+ }
+
+ private void updateFilterKeyEventsLocked(UserState userState) {
+ final int serviceCount = userState.mBoundServices.size();
+ for (int i = 0; i < serviceCount; i++) {
+ Service service = userState.mBoundServices.get(i);
+ if (service.mRequestFilterKeyEvents
+ && (service.mAccessibilityServiceInfo.getCapabilities()
+ & AccessibilityServiceInfo
+ .CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS) != 0) {
+ userState.mIsFilterKeyEventsEnabled = true;
+ return;
+ }
+ }
+ userState.mIsFilterKeyEventsEnabled = false;
+ }
+
private void updateServicesLocked(UserState userState) {
if (userState.mIsAccessibilityEnabled) {
manageServicesLocked(userState);
@@ -1658,8 +1699,6 @@
Intent mIntent;
- boolean mCanRetrieveScreenContent;
-
boolean mIsAutomation;
final Rect mTempBounds = new Rect();
@@ -1695,15 +1734,11 @@
mAccessibilityServiceInfo = accessibilityServiceInfo;
mIsAutomation = (sFakeAccessibilityServiceComponentName.equals(componentName));
if (!mIsAutomation) {
- mCanRetrieveScreenContent = (accessibilityServiceInfo.getCapabilities()
- & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) != 0;
mIntent = new Intent().setComponent(mComponentName);
mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.accessibility_binding_label);
mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
mContext, 0, new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0));
- } else {
- mCanRetrieveScreenContent = true;
}
setDynamicallyConfigurableProperties(accessibilityServiceInfo);
}
@@ -2152,7 +2187,7 @@
.loadLabel(mContext.getPackageManager()));
pw.append(", feedbackType"
+ AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType));
- pw.append(", canRetrieveScreenContent=" + mCanRetrieveScreenContent);
+ pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities());
pw.append(", eventTypes="
+ AccessibilityEvent.eventTypeToString(mEventTypes));
pw.append(", notificationTimeout=" + mNotificationTimeout);
@@ -2742,7 +2777,8 @@
}
public boolean canRetrieveWindowContent(Service service) {
- return service.mCanRetrieveScreenContent;
+ return (service.mAccessibilityServiceInfo.getCapabilities()
+ & AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0;
}
public void enforceCanRetrieveWindowContent(Service service) throws RemoteException {
@@ -2881,6 +2917,7 @@
public boolean mIsTouchExplorationEnabled;
public boolean mIsEnhancedWebAccessibilityEnabled;
public boolean mIsDisplayMagnificationEnabled;
+ public boolean mIsFilterKeyEventsEnabled;
private Service mUiAutomationService;
private IAccessibilityServiceClient mUiAutomationServiceClient;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index c750cad..beebc83 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -2340,11 +2340,19 @@
}
}
- void updateUsageStats(ActivityRecord resumedComponent, boolean resumed) {
+ void updateUsageStats(ActivityRecord component, boolean resumed) {
+ if (DEBUG_SWITCH) Slog.d(TAG, "updateUsageStats: comp=" + component + "res=" + resumed);
+ final BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
if (resumed) {
- mUsageStatsService.noteResumeComponent(resumedComponent.realActivity);
+ mUsageStatsService.noteResumeComponent(component.realActivity);
+ synchronized (stats) {
+ stats.noteActivityResumedLocked(component.app.uid);
+ }
} else {
- mUsageStatsService.notePauseComponent(resumedComponent.realActivity);
+ mUsageStatsService.notePauseComponent(component.realActivity);
+ synchronized (stats) {
+ stats.noteActivityPausedLocked(component.app.uid);
+ }
}
}
@@ -2528,11 +2536,6 @@
}
}
- void reportResumedActivityLocked(ActivityRecord r) {
- //Slog.i(TAG, "**** REPORT RESUME: " + r);
- updateUsageStats(r, true);
- }
-
private void dispatchProcessesChanged() {
int N;
synchronized (this) {
@@ -2545,6 +2548,7 @@
mPendingProcessChanges.clear();
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "*** Delivering " + N + " process changes");
}
+
int i = mProcessObservers.beginBroadcast();
while (i > 0) {
i--;
@@ -6782,7 +6786,7 @@
if (DEBUG_PROVIDER) {
RuntimeException e = new RuntimeException("here");
- Slog.w(TAG, "LAUNCHING REMOTE PROVIDER (myuid " + r.uid
+ Slog.w(TAG, "LAUNCHING REMOTE PROVIDER (myuid " + (r != null ? r.uid : null)
+ " pruid " + cpr.appInfo.uid + "): " + cpr.info.name, e);
}
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 3758bb1..9fedba6 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -668,7 +668,6 @@
checkReadyForSleepLocked();
}
- // Checked.
void checkReadyForSleepLocked() {
if (!mService.isSleepingOrShuttingDown()) {
// Do not care.
@@ -788,9 +787,9 @@
EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
prev.userId, System.identityHashCode(prev),
prev.shortComponentName);
+ mService.updateUsageStats(prev, false);
prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
userLeaving, prev.configChangeFlags);
- mService.updateUsageStats(prev, false);
} catch (Exception e) {
// Ignore exception, if process died other code will cleanup.
Slog.w(TAG, "Exception thrown during pause", e);
@@ -1003,7 +1002,6 @@
prev.cpuTimeAtResume = 0; // reset it
}
- // Checked.
/**
* Once we know that we have asked an application to put an activity in
* the resumed state (either by launching it or explicitly telling it),
@@ -1034,13 +1032,28 @@
}
}
- // Checked.
+ /**
+ * Version of ensureActivitiesVisible that can easily be called anywhere.
+ */
+ final boolean ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
+ return ensureActivitiesVisibleLocked(starting, configChanges, false);
+ }
+
+ final boolean ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges,
+ boolean forceHomeShown) {
+ ActivityRecord r = topRunningActivityLocked(null);
+ if (r != null) {
+ return ensureActivitiesVisibleLocked(r, starting, null, configChanges, forceHomeShown);
+ }
+ return false;
+ }
+
/**
* Make sure that all activities that need to be visible (that is, they
* currently can be seen by the user) actually are.
*/
- final void ensureActivitiesVisibleLocked(ActivityRecord top,
- ActivityRecord starting, String onlyThisProcess, int configChanges) {
+ final boolean ensureActivitiesVisibleLocked(ActivityRecord top, ActivityRecord starting,
+ String onlyThisProcess, int configChanges, boolean forceHomeShown) {
if (DEBUG_VISBILITY) Slog.v(
TAG, "ensureActivitiesVisible behind " + top
+ " configChanges=0x" + Integer.toHexString(configChanges));
@@ -1048,7 +1061,9 @@
// If the top activity is not fullscreen, then we need to
// make sure any activities under it are now visible.
boolean aboveTop = true;
- boolean behindFullscreen = !mStackSupervisor.isFrontStack(this);
+ boolean showHomeBehindStack = false;
+ boolean behindFullscreen = !mStackSupervisor.isFrontStack(this) &&
+ !(forceHomeShown && isHomeStack());
int taskNdx;
for (taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
@@ -1129,8 +1144,11 @@
if (r.fullscreen) {
// At this point, nothing else needs to be shown
- if (DEBUG_VISBILITY) Slog.v(
- TAG, "Stopping: fullscreen at " + r);
+ if (DEBUG_VISBILITY) Slog.v(TAG, "Fullscreen: at " + r);
+ behindFullscreen = true;
+ } else if (r.mLaunchHomeTaskNext) {
+ if (DEBUG_VISBILITY) Slog.v(TAG, "Showing home: at " + r);
+ showHomeBehindStack = true;
behindFullscreen = true;
}
} else {
@@ -1163,18 +1181,7 @@
}
}
}
- }
-
- // Checked.
- /**
- * Version of ensureActivitiesVisible that can easily be called anywhere.
- */
- final void ensureActivitiesVisibleLocked(ActivityRecord starting,
- int configChanges) {
- ActivityRecord r = topRunningActivityLocked(null);
- if (r != null) {
- ensureActivitiesVisibleLocked(r, starting, null, configChanges);
- }
+ return showHomeBehindStack;
}
/**
@@ -1190,7 +1197,6 @@
return resumeTopActivityLocked(prev, null);
}
- // Checked.
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
// Find the first activity that is not finishing.
ActivityRecord next = topRunningActivityLocked(null);
@@ -1302,7 +1308,12 @@
// We need to start pausing the current activity so the top one
// can be resumed...
- if (mStackSupervisor.pauseBackStacks(userLeaving)) {
+ boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving);
+ if (mResumedActivity != null) {
+ pausing = true;
+ startPausingLocked(userLeaving, false);
+ }
+ if (pausing) {
if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
// At this point we want to put the upcoming activity's process
// at the top of the LRU list, since we know we will be needing it
@@ -2168,7 +2179,6 @@
}
}
- // Checked.
final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
Configuration config) {
if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
@@ -2878,6 +2888,9 @@
r.userId, System.identityHashCode(r),
r.task.taskId, r.shortComponentName,
"proc died without state saved");
+ if (r.state == ActivityState.RESUMED) {
+ mService.updateUsageStats(r, false);
+ }
}
removeActivityFromHistoryLocked(r);
@@ -3344,9 +3357,6 @@
if (andResume) {
r.results = null;
r.newIntents = null;
- if (mStackSupervisor.isFrontStack(this)) {
- mService.reportResumedActivityLocked(r);
- }
r.state = ActivityState.RESUMED;
} else {
mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 528bf6f..22d7780 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -346,7 +346,7 @@
throw e;
}
} else {
- stack.ensureActivitiesVisibleLocked(hr, null, processName, 0);
+ stack.ensureActivitiesVisibleLocked(hr, null, processName, 0, false);
}
}
}
@@ -438,7 +438,7 @@
void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
long thisTime, long totalTime) {
for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
- WaitResult w = mWaitingActivityLaunched.get(i);
+ WaitResult w = mWaitingActivityLaunched.remove(i);
w.timeout = timeout;
if (r != null) {
w.who = new ComponentName(r.info.packageName, r.info.name);
@@ -1921,7 +1921,7 @@
boolean reportResumedActivityLocked(ActivityRecord r) {
final ActivityStack stack = r.task.stack;
if (isFrontStack(stack)) {
- mService.reportResumedActivityLocked(r);
+ mService.updateUsageStats(r, true);
mService.setFocusedActivityLocked(r);
}
if (allResumedActivitiesComplete()) {
@@ -1941,8 +1941,21 @@
}
void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
+ // First the front stacks. In case any are not fullscreen and are in front of home.
+ boolean showHomeBehindStack = false;
for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
- mStacks.get(stackNdx).ensureActivitiesVisibleLocked(starting, configChanges);
+ final ActivityStack stack = mStacks.get(stackNdx);
+ if (isFrontStack(stack)) {
+ showHomeBehindStack =
+ stack.ensureActivitiesVisibleLocked(starting, configChanges);
+ }
+ }
+ // Now do back stacks.
+ for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
+ final ActivityStack stack = mStacks.get(stackNdx);
+ if (!isFrontStack(stack)) {
+ stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
+ }
}
}
@@ -2182,7 +2195,8 @@
}
void scheduleIdleTimeoutLocked(ActivityRecord next) {
- mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next).sendToTarget();
+ Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
+ mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
}
final void scheduleIdleLocked() {
diff --git a/services/java/com/android/server/firewall/IntentFirewall.java b/services/java/com/android/server/firewall/IntentFirewall.java
index edba243..4496aae 100644
--- a/services/java/com/android/server/firewall/IntentFirewall.java
+++ b/services/java/com/android/server/firewall/IntentFirewall.java
@@ -107,6 +107,7 @@
public IntentFirewall(AMSInterface ams) {
mAms = ams;
File rulesFile = getRulesFile();
+ rulesFile.getParentFile().mkdirs();
readRules(rulesFile);
diff --git a/services/java/com/android/server/power/ElectronBeam.java b/services/java/com/android/server/power/ElectronBeam.java
index 4a74149..379e704 100644
--- a/services/java/com/android/server/power/ElectronBeam.java
+++ b/services/java/com/android/server/power/ElectronBeam.java
@@ -389,10 +389,14 @@
mTexNamesGenerated = true;
}
- SurfaceTexture st = new SurfaceTexture(mTexNames[0]);
- SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
- SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN),
- new Surface(st));
+ final SurfaceTexture st = new SurfaceTexture(mTexNames[0]);
+ final Surface s = new Surface(st);
+ try {
+ SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
+ SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), s);
+ } finally {
+ s.release();
+ }
st.updateTexImage();
st.getTransformMatrix(mTexMatrix);
diff --git a/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java b/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
index e8337f6..0ab86e4 100644
--- a/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
+++ b/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
@@ -122,9 +122,16 @@
}
private void setEnforcingMode(Context context) {
- boolean mode = Settings.Global.getInt(context.getContentResolver(),
- Settings.Global.SELINUX_STATUS, 0) == 1;
- SELinux.setSELinuxEnforce(mode);
+ String mode = Settings.Global.getString(context.getContentResolver(),
+ Settings.Global.SELINUX_STATUS);
+ if (mode.equals("1")) {
+ Slog.i(TAG, "Setting enforcing mode");
+ SystemProperties.set("persist.selinux.enforcing", mode);
+ } else if (mode.equals("0")) {
+ Slog.i(TAG, "Tried to set permissive mode, ignoring");
+ } else {
+ Slog.e(TAG, "Got invalid enforcing mode: " + mode);
+ }
}
@Override
diff --git a/services/java/com/android/server/wifi/WifiService.java b/services/java/com/android/server/wifi/WifiService.java
index 5cf1966..8ddc776 100644
--- a/services/java/com/android/server/wifi/WifiService.java
+++ b/services/java/com/android/server/wifi/WifiService.java
@@ -102,9 +102,6 @@
private int mMulticastEnabled;
private int mMulticastDisabled;
- private AtomicBoolean mDeviceProvisioned = new AtomicBoolean();
- private AtomicBoolean mNotifyScanMode = new AtomicBoolean();
-
private final IBatteryStats mBatteryStats;
private final AppOpsManager mAppOps;
@@ -247,8 +244,6 @@
mWifiController.start();
registerForScanModeChange();
- registerForDeviceProvisionedChange();
- registerForNotifyUserOnScanModeChange();
mContext.registerReceiver(
new BroadcastReceiver() {
@Override
@@ -405,16 +400,6 @@
long ident = Binder.clearCallingIdentity();
try {
-
- /* Turning off Wi-Fi when scans are still available */
- if (!enable && isScanAlwaysAvailable()) {
- /* Notify if device is provisioned and user has not opted out of the notification */
- if (mNotifyScanMode.get() && mDeviceProvisioned.get()) {
- Intent intent = new Intent(WifiManager.ACTION_NOTIFY_SCAN_ALWAYS_AVAILABLE);
- mContext.startActivityAsUser(intent, null, UserHandle.CURRENT);
- }
- }
-
if (! mSettingsStore.handleWifiToggled(enable)) {
// Nothing to do if wifi cannot be toggled
return true;
@@ -871,51 +856,6 @@
false, contentObserver);
}
- private void getPersistedDeviceProvisioned() {
- mDeviceProvisioned.set(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.DEVICE_PROVISIONED, 0) != 0);
- }
-
- private void getPersistedNotifyScanMode() {
- mNotifyScanMode.set(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.WIFI_NOTIFY_SCAN_ALWAYS_AVAILABLE, 1) == 1);
- }
-
- /**
- * Observes settings changes to notify the user when scan mode is active and
- * Wi-Fi is turned off
- */
- private void registerForNotifyUserOnScanModeChange() {
- ContentObserver contentObserver = new ContentObserver(null) {
- @Override
- public void onChange(boolean selfChange) {
- getPersistedNotifyScanMode();
- }
- };
-
- getPersistedNotifyScanMode();
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.WIFI_NOTIFY_SCAN_ALWAYS_AVAILABLE),
- false, contentObserver);
- }
-
- /*
- * Observes settings changes device provisioned status
- */
- private void registerForDeviceProvisionedChange() {
- ContentObserver contentObserver = new ContentObserver(null) {
- @Override
- public void onChange(boolean selfChange) {
- getPersistedDeviceProvisioned();
- }
- };
-
- getPersistedDeviceProvisioned();
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),
- false, contentObserver);
- }
-
private void registerForBroadcasts() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
@@ -940,8 +880,6 @@
pw.println("Stay-awake conditions: " +
Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0));
- pw.println("mDeviceProvisioned " + mDeviceProvisioned.get());
- pw.println("mNotifyScanMode " + mNotifyScanMode.get());
pw.println("mMulticastEnabled " + mMulticastEnabled);
pw.println("mMulticastDisabled " + mMulticastDisabled);
mWifiController.dump(fd, pw, args);
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index 45f018d..dd675db 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -22,6 +22,7 @@
import static com.android.server.wm.WindowManagerService.TAG;
import android.graphics.Rect;
+import android.graphics.Region;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
@@ -70,6 +71,8 @@
private final DisplayInfo mDisplayInfo = new DisplayInfo();
private final Display mDisplay;
+ Rect mBaseDisplayRect = new Rect();
+
// Accessed directly by all users.
boolean layoutNeeded;
int pendingLayoutChanges;
@@ -94,9 +97,6 @@
/** True when the home StackBox is at the top of mStackBoxes, false otherwise. */
private TaskStack mHomeStack = null;
- /** Save allocating when retrieving tasks */
- ArrayList<Task> mTmpTasks = new ArrayList<Task>();
-
/** Sorted most recent at top, oldest at [0]. */
ArrayList<TaskStack> mStackHistory = new ArrayList<TaskStack>();
@@ -106,8 +106,17 @@
/** Detect user tapping outside of current focused stack bounds .*/
StackTapDetector mTapDetector;
+ /** Detect user tapping outside of current focused stack bounds .*/
+ Region mTouchExcludeRegion = new Region();
+
SparseArray<UserStacks> mUserStacks = new SparseArray<UserStacks>();
+ /** Save allocating when retrieving tasks */
+ ArrayList<Task> mTmpTasks = new ArrayList<Task>();
+
+ /** Save allocating when calculating rects */
+ Rect mTmpRect = new Rect();
+
/**
* @param display May not be null.
*/
@@ -328,6 +337,20 @@
return topBox.stackIdFromPoint(x, y);
}
+ void setTouchExcludeRegion(TaskStack focusedStack) {
+ mTouchExcludeRegion.set(mBaseDisplayRect);
+ WindowList windows = getWindowList();
+ for (int i = windows.size() - 1; i >= 0; --i) {
+ final WindowState win = windows.get(i);
+ final TaskStack stack = win.getStack();
+ if (win.isVisibleLw() && stack != null && stack != focusedStack) {
+ mTmpRect.set(win.mVisibleFrame);
+ mTmpRect.intersect(win.mVisibleInsets);
+ mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE);
+ }
+ }
+ }
+
void switchUserStacks(int oldUserId, int newUserId) {
final WindowList windows = getWindowList();
for (int i = 0; i < windows.size(); i++) {
diff --git a/services/java/com/android/server/wm/FocusedStackFrame.java b/services/java/com/android/server/wm/FocusedStackFrame.java
index 29949ad..9c18331 100644
--- a/services/java/com/android/server/wm/FocusedStackFrame.java
+++ b/services/java/com/android/server/wm/FocusedStackFrame.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static com.android.server.wm.WindowManagerService.DEBUG_STACK;
+import static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -29,6 +30,8 @@
import android.view.SurfaceControl;
import android.view.SurfaceSession;
+import com.android.server.wm.WindowStateAnimator.SurfaceTrace;
+
class FocusedStackFrame {
private static final String TAG = "FocusedStackFrame";
private static final int THICKNESS = 10;
@@ -43,10 +46,14 @@
public FocusedStackFrame(Display display, SurfaceSession session) {
SurfaceControl ctrl = null;
try {
- ctrl = new SurfaceControl(session, "FocusedStackFrame",
- 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
+ if (DEBUG_SURFACE_TRACE) {
+ ctrl = new SurfaceTrace(session, "FocusedStackFrame",
+ 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
+ } else {
+ ctrl = new SurfaceControl(session, "FocusedStackFrame",
+ 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
+ }
ctrl.setLayerStack(display.getLayerStack());
- ctrl.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER * 102);
ctrl.setAlpha(ALPHA);
mSurface.copyFrom(ctrl);
} catch (SurfaceControl.OutOfResourcesException e) {
@@ -127,4 +134,8 @@
if (DEBUG_STACK) Slog.i(TAG, "setBounds: bounds=" + bounds);
mBounds.set(bounds);
}
+
+ public void setLayer(int layer) {
+ mSurfaceControl.setLayer(layer);
+ }
}
diff --git a/services/java/com/android/server/wm/StackTapDetector.java b/services/java/com/android/server/wm/StackTapDetector.java
index 7d63a9b..a71b075 100644
--- a/services/java/com/android/server/wm/StackTapDetector.java
+++ b/services/java/com/android/server/wm/StackTapDetector.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import android.graphics.Rect;
+import android.graphics.Region;
import android.os.Looper;
import android.view.DisplayInfo;
import android.view.InputChannel;
@@ -25,6 +26,8 @@
import android.view.InputEventReceiver;
import android.view.MotionEvent;
+import com.android.server.wm.WindowManagerService.H;
+
public class StackTapDetector extends InputEventReceiver {
private static final int TAP_TIMEOUT_MSEC = 300;
private static final float TAP_MOTION_SLOP_INCHES = 0.125f;
@@ -33,7 +36,7 @@
private float mDownX;
private float mDownY;
private int mPointerId;
- private Rect mStackBounds = new Rect();
+ final private Region mTouchExcludeRegion;
private final WindowManagerService mService;
private final DisplayContent mDisplayContent;
@@ -42,6 +45,7 @@
super(inputChannel, looper);
mService = service;
mDisplayContent = displayContent;
+ mTouchExcludeRegion = displayContent.mTouchExcludeRegion;
DisplayInfo info = displayContent.getDisplayInfo();
mMotionSlop = (int)(info.logicalDensityDpi * TAP_MOTION_SLOP_INCHES);
}
@@ -82,8 +86,9 @@
if ((motionEvent.getEventTime() - motionEvent.getDownTime())
< TAP_TIMEOUT_MSEC
&& (x - mDownX) < mMotionSlop && (y - mDownY) < mMotionSlop
- && !mStackBounds.contains(x, y)) {
- mService.tapOutsideStackBounds(mDisplayContent, x, y);
+ && !mTouchExcludeRegion.contains(x, y)) {
+ mService.mH.obtainMessage(H.TAP_OUTSIDE_STACK, x, y, mDisplayContent)
+ .sendToTarget();
}
}
mPointerId = -1;
@@ -92,10 +97,4 @@
}
}
}
-
- void setStackBounds(Rect bounds) {
- synchronized (this) {
- mStackBounds.set(bounds);
- }
- }
}
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index 3147497..d101602 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -625,6 +625,8 @@
}
}
+ mService.setFocusedStackLayer();
+
if (mService.mWatermark != null) {
mService.mWatermark.drawIfNeeded();
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index cb4333f..6a2d3e2 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -219,6 +219,11 @@
static final int LAYER_OFFSET_BLUR = 2;
/**
+ * FocusedStackFrame layer is immediately above focused window.
+ */
+ static final int LAYER_OFFSET_FOCUSED_STACK = 1;
+
+ /**
* Animation thumbnail is as far as possible below the window above
* the thumbnail (or in other words as far as possible above the window
* below it).
@@ -405,6 +410,8 @@
StrictModeFlash mStrictModeFlash;
FocusedStackFrame mFocusedStackFrame;
+ int mFocusedStackLayer;
+
final float[] mTmpFloats = new float[9];
boolean mDisplayReady;
@@ -3686,7 +3693,32 @@
}
}
- void setFocusedStackFrame(TaskStack stack) {
+ /** Call while in a Surface transaction. */
+ void setFocusedStackLayer() {
+ mFocusedStackLayer = 0;
+ final WindowList windows = mFocusedApp.allAppWindows;
+ for (int i = windows.size() - 1; i >= 0; --i) {
+ final WindowState win = windows.get(i);
+ final int animLayer = win.mWinAnimator.mAnimLayer;
+ if (win.mAttachedWindow == null && win.isVisibleLw() &&
+ animLayer > mFocusedStackLayer) {
+ mFocusedStackLayer = animLayer + LAYER_OFFSET_FOCUSED_STACK;
+ }
+ }
+ if (DEBUG_LAYERS) Slog.v(TAG, "Setting FocusedStackFrame to layer=" +
+ mFocusedStackLayer);
+ mFocusedStackFrame.setLayer(mFocusedStackLayer);
+ }
+
+ void setFocusedStackFrame() {
+ final TaskStack stack;
+ if (mFocusedApp != null) {
+ Task task = mTaskIdToTask.get(mFocusedApp.groupId);
+ stack = task.mStack;
+ task.getDisplayContent().setTouchExcludeRegion(stack);
+ } else {
+ stack = null;
+ }
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setFocusedStackFrame");
SurfaceControl.openTransaction();
try {
@@ -3705,18 +3737,6 @@
}
}
- void tapOutsideStackBounds(DisplayContent displayContent, int x, int y) {
- synchronized (mWindowMap) {
- int stackId = displayContent.stackIdFromPoint(x, y);
- if (stackId >= 0) {
- try {
- mActivityManager.setFocusedStack(stackId);
- } catch (RemoteException e) {
- }
- }
- }
- }
-
@Override
public void setFocusedApp(IBinder token, boolean moveFocusNow) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
@@ -6875,6 +6895,8 @@
displayContent.mBaseDisplayWidth = displayContent.mInitialDisplayWidth;
displayContent.mBaseDisplayHeight = displayContent.mInitialDisplayHeight;
displayContent.mBaseDisplayDensity = displayContent.mInitialDisplayDensity;
+ displayContent.mBaseDisplayRect.set(0, 0,
+ displayContent.mBaseDisplayWidth, displayContent.mBaseDisplayHeight);
}
}
}
@@ -6932,6 +6954,7 @@
public static final int DO_DISPLAY_CHANGED = 29;
public static final int CLIENT_FREEZE_TIMEOUT = 30;
+ public static final int TAP_OUTSIDE_STACK = 31;
@Override
public void handleMessage(Message msg) {
@@ -7351,6 +7374,19 @@
handleDisplayChangedLocked(msg.arg1);
}
break;
+
+ case TAP_OUTSIDE_STACK: {
+ int stackId;
+ synchronized (mWindowMap) {
+ stackId = ((DisplayContent)msg.obj).stackIdFromPoint(msg.arg1, msg.arg2);
+ }
+ if (stackId >= 0) {
+ try {
+ mActivityManager.setFocusedStack(stackId);
+ } catch (RemoteException e) {
+ }
+ }
+ }
}
if (DEBUG_WINDOW_TRACE) {
Slog.v(TAG, "handleMessage: exit");
@@ -7856,13 +7892,14 @@
layerChanged = true;
anyLayerChanged = true;
}
+ final AppWindowToken wtoken = w.mAppToken;
oldLayer = winAnimator.mAnimLayer;
if (w.mTargetAppToken != null) {
winAnimator.mAnimLayer =
w.mLayer + w.mTargetAppToken.mAppAnimator.animLayerAdjustment;
- } else if (w.mAppToken != null) {
+ } else if (wtoken != null) {
winAnimator.mAnimLayer =
- w.mLayer + w.mAppToken.mAppAnimator.animLayerAdjustment;
+ w.mLayer + wtoken.mAppAnimator.animLayerAdjustment;
} else {
winAnimator.mAnimLayer = w.mLayer;
}
@@ -7882,8 +7919,8 @@
if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
+ "mBase=" + w.mBaseLayer
+ " mLayer=" + w.mLayer
- + (w.mAppToken == null ?
- "" : " mAppLayer=" + w.mAppToken.mAppAnimator.animLayerAdjustment)
+ + (wtoken == null ?
+ "" : " mAppLayer=" + wtoken.mAppAnimator.animLayerAdjustment)
+ " =mAnimLayer=" + winAnimator.mAnimLayer);
//System.out.println(
// "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
@@ -9267,16 +9304,8 @@
}
}
- final TaskStack stack;
- if (mFocusedApp != null) {
- Task task = mTaskIdToTask.get(mFocusedApp.groupId);
- stack = task.mStack;
- task.getDisplayContent().mTapDetector.setStackBounds(stack.mStackBox.mBounds);
- } else {
- stack = null;
- }
- setFocusedStackFrame(stack);
-
+ setFocusedStackFrame();
+
// Check to see if we are now in a state where the screen should
// be enabled, because the window obscured flags have changed.
enableScreenIfNeededLocked();
@@ -10755,7 +10784,11 @@
final DisplayContent displayContent = getDisplayContentLocked(displayId);
if (displayContent != null) {
mDisplayContents.delete(displayId);
- displayContent.mTapInputChannel.dispose();
+
+ if (displayContent.mTapInputChannel != null) {
+ displayContent.mTapInputChannel.dispose();
+ }
+
WindowList windows = displayContent.getWindowList();
while (!windows.isEmpty()) {
final WindowState win = windows.get(windows.size() - 1);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 807962b..ac6d65f 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -447,8 +447,7 @@
mContainingFrame.set(pf);
}
- final Rect display = mDisplayFrame;
- display.set(df);
+ mDisplayFrame.set(df);
final int pw = mContainingFrame.width();
final int ph = mContainingFrame.height();
@@ -498,18 +497,12 @@
mContentChanged = true;
}
- final Rect overscan = mOverscanFrame;
- overscan.set(of);
+ mOverscanFrame.set(of);
+ mContentFrame.set(cf);
+ mVisibleFrame.set(vf);
- final Rect content = mContentFrame;
- content.set(cf);
-
- final Rect visible = mVisibleFrame;
- visible.set(vf);
-
- final Rect frame = mFrame;
- final int fw = frame.width();
- final int fh = frame.height();
+ final int fw = mFrame.width();
+ final int fh = mFrame.height();
//System.out.println("In: w=" + w + " h=" + h + " container=" +
// container + " x=" + mAttrs.x + " y=" + mAttrs.y);
@@ -525,61 +518,60 @@
Gravity.apply(mAttrs.gravity, w, h, mContainingFrame,
(int) (x + mAttrs.horizontalMargin * pw),
- (int) (y + mAttrs.verticalMargin * ph), frame);
+ (int) (y + mAttrs.verticalMargin * ph), mFrame);
//System.out.println("Out: " + mFrame);
// Now make sure the window fits in the overall display.
- Gravity.applyDisplay(mAttrs.gravity, df, frame);
+ Gravity.applyDisplay(mAttrs.gravity, df, mFrame);
// Make sure the overscan, content and visible frames are inside of the
// final window frame.
- if (overscan.left < frame.left) overscan.left = frame.left;
- if (overscan.top < frame.top) overscan.top = frame.top;
- if (overscan.right > frame.right) overscan.right = frame.right;
- if (overscan.bottom > frame.bottom) overscan.bottom = frame.bottom;
- if (content.left < frame.left) content.left = frame.left;
- if (content.top < frame.top) content.top = frame.top;
- if (content.right > frame.right) content.right = frame.right;
- if (content.bottom > frame.bottom) content.bottom = frame.bottom;
- if (visible.left < frame.left) visible.left = frame.left;
- if (visible.top < frame.top) visible.top = frame.top;
- if (visible.right > frame.right) visible.right = frame.right;
- if (visible.bottom > frame.bottom) visible.bottom = frame.bottom;
+ mOverscanFrame.set(Math.max(mOverscanFrame.left, mFrame.left),
+ Math.max(mOverscanFrame.top, mFrame.top),
+ Math.min(mOverscanFrame.right, mFrame.right),
+ Math.min(mOverscanFrame.bottom, mFrame.bottom));
- final Rect overscanInsets = mOverscanInsets;
- overscanInsets.left = overscan.left-frame.left;
- overscanInsets.top = overscan.top-frame.top;
- overscanInsets.right = frame.right-overscan.right;
- overscanInsets.bottom = frame.bottom-overscan.bottom;
+ mContentFrame.set(Math.max(mContentFrame.left, mFrame.left),
+ Math.max(mContentFrame.top, mFrame.top),
+ Math.min(mContentFrame.right, mFrame.right),
+ Math.min(mContentFrame.bottom, mFrame.bottom));
- final Rect contentInsets = mContentInsets;
- contentInsets.left = content.left-frame.left;
- contentInsets.top = content.top-frame.top;
- contentInsets.right = frame.right-content.right;
- contentInsets.bottom = frame.bottom-content.bottom;
+ mVisibleFrame.set(Math.max(mVisibleFrame.left, mFrame.left),
+ Math.max(mVisibleFrame.top, mFrame.top),
+ Math.min(mVisibleFrame.right, mFrame.right),
+ Math.min(mVisibleFrame.bottom, mFrame.bottom));
- final Rect visibleInsets = mVisibleInsets;
- visibleInsets.left = visible.left-frame.left;
- visibleInsets.top = visible.top-frame.top;
- visibleInsets.right = frame.right-visible.right;
- visibleInsets.bottom = frame.bottom-visible.bottom;
+ mOverscanInsets.set(mOverscanFrame.left - mFrame.left,
+ mOverscanFrame.top - mFrame.top,
+ mFrame.right - mOverscanFrame.right,
+ mFrame.bottom - mOverscanFrame.bottom);
- mCompatFrame.set(frame);
+ mContentInsets.set(mContentFrame.left - mFrame.left,
+ mContentFrame.top - mFrame.top,
+ mFrame.right - mContentFrame.right,
+ mFrame.bottom - mContentFrame.bottom);
+
+ mVisibleInsets.set(mVisibleFrame.left - mFrame.left,
+ mVisibleFrame.top - mFrame.top,
+ mFrame.right - mVisibleFrame.right,
+ mFrame.bottom - mVisibleFrame.bottom);
+
+ mCompatFrame.set(mFrame);
if (mEnforceSizeCompat) {
// If there is a size compatibility scale being applied to the
// window, we need to apply this to its insets so that they are
// reported to the app in its coordinate space.
- overscanInsets.scale(mInvGlobalScale);
- contentInsets.scale(mInvGlobalScale);
- visibleInsets.scale(mInvGlobalScale);
+ mOverscanInsets.scale(mInvGlobalScale);
+ mContentInsets.scale(mInvGlobalScale);
+ mVisibleInsets.scale(mInvGlobalScale);
// Also the scaled frame that we report to the app needs to be
// adjusted to be in its coordinate space.
mCompatFrame.scale(mInvGlobalScale);
}
- if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) {
+ if (mIsWallpaper && (fw != mFrame.width() || fh != mFrame.height())) {
final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
mService.updateWallpaperOffsetLocked(this, displayInfo.appWidth, displayInfo.appHeight,
false);
@@ -592,8 +584,8 @@
+ mRequestedWidth + ", mRequestedheight="
+ mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
+ "): frame=" + mFrame.toShortString()
- + " ci=" + contentInsets.toShortString()
- + " vi=" + visibleInsets.toShortString());
+ + " ci=" + mContentInsets.toShortString()
+ + " vi=" + mVisibleInsets.toShortString());
//}
}
}
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index c07174b..9e18227 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -19,7 +19,6 @@
import android.view.Display;
import android.view.DisplayInfo;
import android.view.MagnificationSpec;
-import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowManager;
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 6400e68..c14d61b 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -234,7 +234,14 @@
/**
* Returns the current location of the device.
- * Return null if current location is not available.
+ *<p>
+ * If there is only one radio in the device and that radio has an LTE connection,
+ * this method will return null. The implementation must not to try add LTE
+ * identifiers into the existing cdma/gsm classes.
+ *<p>
+ * In the future this call will be deprecated.
+ *<p>
+ * @return Current location of the device or null if not available.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
@@ -290,8 +297,11 @@
}
/**
- * Returns the neighboring cell information of the device.
- *
+ * Returns the neighboring cell information of the device. The getAllCellInfo is preferred
+ * and use this only if getAllCellInfo return nulls or an empty list.
+ *<p>
+ * In the future this call will be deprecated.
+ *<p>
* @return List of NeighboringCellInfo or null if info unavailable.
*
* <p>Requires Permission:
@@ -582,7 +592,7 @@
public static final int NETWORK_TYPE_HSPAP = 15;
/**
- * Returns the NETWORK_TYPE_xxxx for data transmission
+ * @return the NETWORK_TYPE_xxxx for current data connection.
*/
public int getNetworkType() {
return getDataNetworkType();
@@ -865,8 +875,8 @@
* is a tri-state return value as for a period of time
* the mode may be unknown.
*
- * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE}
- * or {@link Phone#LTE_ON_CDMA_TRUE}
+ * @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE}
+ * or {@link PhoneConstants#LTE_ON_CDMA_TRUE}
*
* @hide
*/
@@ -1341,13 +1351,25 @@
}
/**
- * Returns all observed cell information of the device. This does
+ * Returns all observed cell information from all radios on the
+ * device including the primary and neighboring cells. This does
* not cause or change the rate of PhoneStateListner#onCellInfoChanged.
- *
+ *<p>
+ * The list can include one or more of {@link android.telephony.CellInfoGsm CellInfoGsm},
+ * {@link android.telephony.CellInfoCdma CellInfoCdma},
+ * {@link android.telephony.CellInfoLte CellInfoLte} and
+ * {@link android.telephony.CellInfoWcdma CellInfoCdma} in any combination.
+ * Specifically on devices with multiple radios it is typical to see instances of
+ * one or more of any these in the list. In addition 0, 1 or more CellInfo
+ * objects may return isRegistered() true.
+ *<p>
+ * This is preferred over using getCellLocation although for older
+ * devices this may return null in which case getCellLocation should
+ * be called.
+ *<p>
* @return List of CellInfo or null if info unavailable.
*
- * <p>Requires Permission:
- * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES}
+ * <p>Requires Permission: {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
*/
public List<CellInfo> getAllCellInfo() {
try {
@@ -1362,11 +1384,11 @@
/**
* Sets the minimum time in milli-seconds between {@link PhoneStateListener#onCellInfoChanged
* PhoneStateListener.onCellInfoChanged} will be invoked.
- *
+ *<p>
* The default, 0, means invoke onCellInfoChanged when any of the reported
* information changes. Setting the value to INT_MAX(0x7fffffff) means never issue
* A onCellInfoChanged.
- *
+ *<p>
* @param rateInMillis the rate
*
* @hide
diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk
index 5abfc88..bc0e4e4 100644
--- a/tests/CoreTests/android/Android.mk
+++ b/tests/CoreTests/android/Android.mk
@@ -6,7 +6,7 @@
LOCAL_SRC_FILES := \
$(call all-subdir-java-files)
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle conscrypt
LOCAL_PACKAGE_NAME := CoreTests
diff --git a/tests/CoreTests/android/core/SSLSocketTest.java b/tests/CoreTests/android/core/SSLSocketTest.java
index 03905e1..b06790b 100644
--- a/tests/CoreTests/android/core/SSLSocketTest.java
+++ b/tests/CoreTests/android/core/SSLSocketTest.java
@@ -18,10 +18,10 @@
import junit.framework.TestCase;
+import com.android.org.conscrypt.FileClientSessionCache;
+import com.android.org.conscrypt.OpenSSLContextImpl;
+import com.android.org.conscrypt.SSLClientSessionCache;
import org.apache.commons.codec.binary.Base64;
-import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index 9b1658a..7934757 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -7,10 +7,8 @@
# This tool is prebuilt if we're doing an app-only build.
ifeq ($(TARGET_BUILD_APPS),)
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
+aapt_src_files := \
AaptAssets.cpp \
Command.cpp \
CrunchCache.cpp \
@@ -24,23 +22,27 @@
ResourceTable.cpp \
Images.cpp \
Resource.cpp \
+ pseudolocalize.cpp \
SourcePos.cpp \
ZipEntry.cpp \
ZipFile.cpp
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(aapt_src_files)
LOCAL_CFLAGS += -Wno-format-y2k
ifeq (darwin,$(HOST_OS))
LOCAL_CFLAGS += -D_DARWIN_UNLIMITED_STREAMS
endif
+LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
LOCAL_C_INCLUDES += external/libpng
LOCAL_C_INCLUDES += external/zlib
-LOCAL_C_INCLUDES += build/libs/host/include
LOCAL_STATIC_LIBRARIES := \
- libhost \
libandroidfw \
libutils \
libcutils \
@@ -64,4 +66,35 @@
include $(BUILD_HOST_EXECUTABLE)
+# aapt for running on the device
+# =========================================================
+ifneq ($(SDK_ONLY),true)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(aapt_src_files)
+
+LOCAL_MODULE := aapt
+
+LOCAL_C_INCLUDES += bionic
+LOCAL_C_INCLUDES += bionic/libstdc++/include
+LOCAL_C_INCLUDES += external/stlport/stlport
+LOCAL_C_INCLUDES += external/libpng
+LOCAL_C_INCLUDES += external/zlib
+
+LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
+LOCAL_CFLAGS += -Wno-non-virtual-dtor
+
+LOCAL_STATIC_LIBRARIES := \
+ libstlport_static \
+ libandroidfw \
+ libutils \
+ libcutils \
+ libexpat_static \
+ libpng \
+ liblog \
+ libz
+
+include $(BUILD_EXECUTABLE)
+endif
+
endif # TARGET_BUILD_APPS
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 32fecb2..977226b 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -48,6 +48,7 @@
" List contents of Zip-compatible archive.\n\n", gProgName);
fprintf(stderr,
" %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n"
+ " strings Print the contents of the resource table string pool in the APK.\n"
" badging Print the label and icon for the app declared in APK.\n"
" permissions Print the permissions from the APK.\n"
" resources Print the resource table from the APK.\n"
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index fe5c810..cd6870d 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -1619,11 +1619,37 @@
return whitespace + sizeof(whitespace) - 1 - indent*4;
}
-static status_t fixupSymbol(String16* inoutSymbol)
-{
- inoutSymbol->replaceAll('.', '_');
- inoutSymbol->replaceAll(':', '_');
- return NO_ERROR;
+static String8 flattenSymbol(const String8& symbol) {
+ String8 result(symbol);
+ ssize_t first;
+ if ((first = symbol.find(":", 0)) >= 0
+ || (first = symbol.find(".", 0)) >= 0) {
+ size_t size = symbol.size();
+ char* buf = result.lockBuffer(size);
+ for (size_t i = first; i < size; i++) {
+ if (buf[i] == ':' || buf[i] == '.') {
+ buf[i] = '_';
+ }
+ }
+ result.unlockBuffer(size);
+ }
+ return result;
+}
+
+static String8 getSymbolPackage(const String8& symbol, const sp<AaptAssets>& assets, bool pub) {
+ ssize_t colon = symbol.find(":", 0);
+ if (colon >= 0) {
+ return String8(symbol.string(), colon);
+ }
+ return pub ? assets->getPackage() : assets->getSymbolsPrivatePackage();
+}
+
+static String8 getSymbolName(const String8& symbol) {
+ ssize_t colon = symbol.find(":", 0);
+ if (colon >= 0) {
+ return String8(symbol.string() + colon + 1);
+ }
+ return symbol;
}
static String16 getAttributeComment(const sp<AaptAssets>& assets,
@@ -1667,12 +1693,8 @@
size_t N = symbols->getNestedSymbols().size();
for (i=0; i<N; i++) {
sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String16 nclassName16(symbols->getNestedSymbols().keyAt(i));
- String8 realClassName(nclassName16);
- if (fixupSymbol(&nclassName16) != NO_ERROR) {
- hasErrors = true;
- }
- String8 nclassName(nclassName16);
+ String8 realClassName(symbols->getNestedSymbols().keyAt(i));
+ String8 nclassName(flattenSymbol(realClassName));
SortedVector<uint32_t> idents;
Vector<uint32_t> origOrder;
@@ -1762,13 +1784,11 @@
}
comment = String16(comment.string(), p-comment.string());
}
- String16 name(name8);
- fixupSymbol(&name);
fprintf(fp, "%s <tr><td><code>{@link #%s_%s %s:%s}</code></td><td>%s</td></tr>\n",
indentStr, nclassName.string(),
- String8(name).string(),
- assets->getPackage().string(),
- String8(name).string(),
+ flattenSymbol(name8).string(),
+ getSymbolPackage(name8, assets, true).string(),
+ getSymbolName(name8).string(),
String8(comment).string());
}
}
@@ -1782,11 +1802,9 @@
if (!publicFlags.itemAt(a) && !includePrivate) {
continue;
}
- String16 name(sym.name);
- fixupSymbol(&name);
fprintf(fp, "%s @see #%s_%s\n",
indentStr, nclassName.string(),
- String8(name).string());
+ flattenSymbol(sym.name).string());
}
}
fprintf(fp, "%s */\n", getIndentSpace(indent));
@@ -1829,11 +1847,7 @@
} else {
getAttributeComment(assets, name8, &typeComment);
}
- String16 name(name8);
- if (fixupSymbol(&name) != NO_ERROR) {
- hasErrors = true;
- }
-
+
uint32_t typeSpecFlags = 0;
String16 name16(sym.name);
assets->getIncludedResources().identifierForName(
@@ -1859,9 +1873,8 @@
"%s <p>This symbol is the offset where the {@link %s.R.attr#%s}\n"
"%s attribute's value can be found in the {@link #%s} array.\n",
indentStr,
- pub ? assets->getPackage().string()
- : assets->getSymbolsPrivatePackage().string(),
- String8(name).string(),
+ getSymbolPackage(name8, assets, pub).string(),
+ getSymbolName(name8).string(),
indentStr, nclassName.string());
}
if (typeComment.size() > 0) {
@@ -1874,18 +1887,19 @@
if (comment.size() > 0) {
if (pub) {
fprintf(fp,
- "%s <p>This corresponds to the global attribute"
+ "%s <p>This corresponds to the global attribute\n"
"%s resource symbol {@link %s.R.attr#%s}.\n",
indentStr, indentStr,
- assets->getPackage().string(),
- String8(name).string());
+ getSymbolPackage(name8, assets, true).string(),
+ getSymbolName(name8).string());
} else {
fprintf(fp,
"%s <p>This is a private symbol.\n", indentStr);
}
}
fprintf(fp, "%s @attr name %s:%s\n", indentStr,
- "android", String8(name).string());
+ getSymbolPackage(name8, assets, pub).string(),
+ getSymbolName(name8).string());
fprintf(fp, "%s*/\n", indentStr);
if (deprecated) {
fprintf(fp, "%s@Deprecated\n", indentStr);
@@ -1893,7 +1907,7 @@
fprintf(fp,
"%spublic static final int %s_%s = %d;\n",
indentStr, nclassName.string(),
- String8(name).string(), (int)pos);
+ flattenSymbol(name8).string(), (int)pos);
}
}
}
@@ -1916,12 +1930,8 @@
size_t N = symbols->getNestedSymbols().size();
for (i=0; i<N; i++) {
sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String16 nclassName16(symbols->getNestedSymbols().keyAt(i));
- String8 realClassName(nclassName16);
- if (fixupSymbol(&nclassName16) != NO_ERROR) {
- hasErrors = true;
- }
- String8 nclassName(nclassName16);
+ String8 realClassName(symbols->getNestedSymbols().keyAt(i));
+ String8 nclassName(flattenSymbol(realClassName));
SortedVector<uint32_t> idents;
Vector<uint32_t> origOrder;
@@ -1981,10 +1991,6 @@
} else {
getAttributeComment(assets, name8, &typeComment);
}
- String16 name(name8);
- if (fixupSymbol(&name) != NO_ERROR) {
- hasErrors = true;
- }
uint32_t typeSpecFlags = 0;
String16 name16(sym.name);
@@ -1999,7 +2005,7 @@
fprintf(fp,
"int styleable %s_%s %d\n",
nclassName.string(),
- String8(name).string(), (int)pos);
+ flattenSymbol(name8).string(), (int)pos);
}
}
}
@@ -2033,10 +2039,7 @@
if (!assets->isJavaSymbol(sym, includePrivate)) {
continue;
}
- String16 name(sym.name);
- if (fixupSymbol(&name) != NO_ERROR) {
- return UNKNOWN_ERROR;
- }
+ String8 name8(sym.name);
String16 comment(sym.comment);
bool haveComment = false;
bool deprecated = false;
@@ -2077,7 +2080,7 @@
}
fprintf(fp, id_format,
getIndentSpace(indent),
- String8(name).string(), (int)sym.int32Val);
+ flattenSymbol(name8).string(), (int)sym.int32Val);
}
for (i=0; i<N; i++) {
@@ -2088,10 +2091,7 @@
if (!assets->isJavaSymbol(sym, includePrivate)) {
continue;
}
- String16 name(sym.name);
- if (fixupSymbol(&name) != NO_ERROR) {
- return UNKNOWN_ERROR;
- }
+ String8 name8(sym.name);
String16 comment(sym.comment);
bool deprecated = false;
if (comment.size() > 0) {
@@ -2114,7 +2114,7 @@
}
fprintf(fp, "%spublic static final String %s=\"%s\";\n",
getIndentSpace(indent),
- String8(name).string(), sym.stringVal.string());
+ flattenSymbol(name8).string(), sym.stringVal.string());
}
sp<AaptSymbols> styleableSymbols;
@@ -2163,14 +2163,10 @@
continue;
}
- String16 name(sym.name);
- if (fixupSymbol(&name) != NO_ERROR) {
- return UNKNOWN_ERROR;
- }
-
+ String8 name8(sym.name);
fprintf(fp, "int %s %s 0x%08x\n",
className.string(),
- String8(name).string(), (int)sym.int32Val);
+ flattenSymbol(name8).string(), (int)sym.int32Val);
}
N = symbols->getNestedSymbols().size();
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index dcbe7db..a663ad5 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -6,8 +6,8 @@
#include "XMLNode.h"
#include "ResourceTable.h"
+#include "pseudolocalize.h"
-#include <host/pseudolocalize.h>
#include <utils/ByteOrder.h>
#include <errno.h>
#include <string.h>
diff --git a/tools/aapt/pseudolocalize.cpp b/tools/aapt/pseudolocalize.cpp
new file mode 100644
index 0000000..9e50c5a
--- /dev/null
+++ b/tools/aapt/pseudolocalize.cpp
@@ -0,0 +1,119 @@
+#include "pseudolocalize.h"
+
+using namespace std;
+
+static const char*
+pseudolocalize_char(char c)
+{
+ switch (c) {
+ case 'a': return "\xc4\x83";
+ case 'b': return "\xcf\x84";
+ case 'c': return "\xc4\x8b";
+ case 'd': return "\xc4\x8f";
+ case 'e': return "\xc4\x99";
+ case 'f': return "\xc6\x92";
+ case 'g': return "\xc4\x9d";
+ case 'h': return "\xd1\x9b";
+ case 'i': return "\xcf\x8a";
+ case 'j': return "\xc4\xb5";
+ case 'k': return "\xc4\xb8";
+ case 'l': return "\xc4\xba";
+ case 'm': return "\xe1\xb8\xbf";
+ case 'n': return "\xd0\xb8";
+ case 'o': return "\xcf\x8c";
+ case 'p': return "\xcf\x81";
+ case 'q': return "\x51";
+ case 'r': return "\xd2\x91";
+ case 's': return "\xc5\xa1";
+ case 't': return "\xd1\x82";
+ case 'u': return "\xce\xb0";
+ case 'v': return "\x56";
+ case 'w': return "\xe1\xba\x85";
+ case 'x': return "\xd1\x85";
+ case 'y': return "\xe1\xbb\xb3";
+ case 'z': return "\xc5\xba";
+ case 'A': return "\xc3\x85";
+ case 'B': return "\xce\xb2";
+ case 'C': return "\xc4\x88";
+ case 'D': return "\xc4\x90";
+ case 'E': return "\xd0\x84";
+ case 'F': return "\xce\x93";
+ case 'G': return "\xc4\x9e";
+ case 'H': return "\xc4\xa6";
+ case 'I': return "\xd0\x87";
+ case 'J': return "\xc4\xb5";
+ case 'K': return "\xc4\xb6";
+ case 'L': return "\xc5\x81";
+ case 'M': return "\xe1\xb8\xbe";
+ case 'N': return "\xc5\x83";
+ case 'O': return "\xce\x98";
+ case 'P': return "\xcf\x81";
+ case 'Q': return "\x71";
+ case 'R': return "\xd0\xaf";
+ case 'S': return "\xc8\x98";
+ case 'T': return "\xc5\xa6";
+ case 'U': return "\xc5\xa8";
+ case 'V': return "\xce\xbd";
+ case 'W': return "\xe1\xba\x84";
+ case 'X': return "\xc3\x97";
+ case 'Y': return "\xc2\xa5";
+ case 'Z': return "\xc5\xbd";
+ default: return NULL;
+ }
+}
+
+/**
+ * Converts characters so they look like they've been localized.
+ *
+ * Note: This leaves escape sequences untouched so they can later be
+ * processed by ResTable::collectString in the normal way.
+ */
+string
+pseudolocalize_string(const string& source)
+{
+ const char* s = source.c_str();
+ string result;
+ const size_t I = source.length();
+ for (size_t i=0; i<I; i++) {
+ char c = s[i];
+ if (c == '\\') {
+ if (i<I-1) {
+ result += '\\';
+ i++;
+ c = s[i];
+ switch (c) {
+ case 'u':
+ // this one takes up 5 chars
+ result += string(s+i, 5);
+ i += 4;
+ break;
+ case 't':
+ case 'n':
+ case '#':
+ case '@':
+ case '?':
+ case '"':
+ case '\'':
+ case '\\':
+ default:
+ result += c;
+ break;
+ }
+ } else {
+ result += c;
+ }
+ } else {
+ const char* p = pseudolocalize_char(c);
+ if (p != NULL) {
+ result += p;
+ } else {
+ result += c;
+ }
+ }
+ }
+
+ //printf("result=\'%s\'\n", result.c_str());
+ return result;
+}
+
+
diff --git a/tools/aapt/pseudolocalize.h b/tools/aapt/pseudolocalize.h
new file mode 100644
index 0000000..94cb034
--- /dev/null
+++ b/tools/aapt/pseudolocalize.h
@@ -0,0 +1,9 @@
+#ifndef HOST_PSEUDOLOCALIZE_H
+#define HOST_PSEUDOLOCALIZE_H
+
+#include <string>
+
+std::string pseudolocalize_string(const std::string& source);
+
+#endif // HOST_PSEUDOLOCALIZE_H
+
diff --git a/tools/preload/Policy.java b/tools/preload/Policy.java
index f557365..ca0291b 100644
--- a/tools/preload/Policy.java
+++ b/tools/preload/Policy.java
@@ -69,6 +69,7 @@
// Threads
"android.os.AsyncTask",
"android.pim.ContactsAsyncHelper",
+ "android.webkit.WebViewClassic$1",
"java.lang.ProcessManager"
));
diff --git a/tools/preload/Record.java b/tools/preload/Record.java
index 14e9201..d0a2af4 100644
--- a/tools/preload/Record.java
+++ b/tools/preload/Record.java
@@ -42,14 +42,24 @@
"com.android.fakeoemfeatures\\u003Abackground",
"com.android.fakeoemfeatures:core",
"com.android.fakeoemfeatures\\u003Acore",
+ "com.android.launcher:wallpaper_chooser",
+ "com.android.launcher\\u003Awallpaper_chooser",
+ "com.android.nfc:handover",
+ "com.android.nfc\\u003Ahandover",
"com.google.android.music:main",
"com.google.android.music\\u003Amain",
"com.google.android.music:ui",
"com.google.android.music\\u003Aui",
"com.google.android.setupwarlock:broker",
"com.google.android.setupwarlock\\u003Abroker",
+ "mobi.mgeek.TunnyBrowser:DolphinNotification",
+ "mobi.mgeek.TunnyBrowser\\u003ADolphinNotification",
+ "com.qo.android.sp.oem:Quickword",
+ "com.qo.android.sp.oem\\u003AQuickword",
"android:ui",
"android\\u003Aui",
+ "system:ui",
+ "system\\u003Aui",
};
enum Type {
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index 23a4e71..9418de1 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -156,7 +156,7 @@
* Fetch the list of configured networks
* and enable all stored networks in supplicant.
*/
- void initialize() {
+ void loadAndEnableAllNetworks() {
if (DBG) log("Loading config and enabling all networks");
loadConfiguredNetworks();
enableAllNetworks();
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 2c3df95..9cae2cb 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1111,6 +1111,7 @@
pw.println("mUserWantsSuspendOpt " + mUserWantsSuspendOpt);
pw.println("mSuspendOptNeedsDisabled " + mSuspendOptNeedsDisabled);
pw.println("Supplicant status " + mWifiNative.status());
+ pw.println("mEnableBackgroundScan " + mEnableBackgroundScan);
pw.println();
mWifiConfigStore.dump(fd, pw, args);
}
@@ -2121,7 +2122,7 @@
mLastSignalLevel = -1;
mWifiInfo.setMacAddress(mWifiNative.getMacAddress());
- mWifiConfigStore.initialize();
+ mWifiConfigStore.loadAndEnableAllNetworks();
initializeWpsDetails();
sendSupplicantConnectionChangedBroadcast(true);
@@ -2657,9 +2658,13 @@
public void exit() {
if (mLastOperationMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) {
setWifiState(WIFI_STATE_ENABLED);
+ // Load and re-enable networks when going back to enabled state
+ // This is essential for networks to show up after restore
+ mWifiConfigStore.loadAndEnableAllNetworks();
mWifiP2pChannel.sendMessage(CMD_ENABLE_P2P);
+ } else {
+ mWifiConfigStore.enableAllNetworks();
}
- mWifiConfigStore.enableAllNetworks();
mWifiNative.reconnect();
}
@Override