summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt2
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java8
-rw-r--r--core/java/android/content/Intent.java6
-rw-r--r--core/java/android/content/pm/PackageManager.java21
-rw-r--r--core/java/android/content/pm/PackageParser.java66
-rw-r--r--core/java/android/speech/tts/TextToSpeech.java83
-rw-r--r--core/java/android/webkit/FindActionModeCallback.java2
-rw-r--r--core/java/android/webkit/ViewStateSerializer.java3
-rw-r--r--core/java/android/widget/RelativeLayout.java26
-rw-r--r--core/java/com/android/internal/content/PackageMonitor.java41
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java2
-rw-r--r--core/res/res/values-af/strings.xml2
-rw-r--r--core/res/res/values-am/strings.xml2
-rw-r--r--core/res/res/values-ar/strings.xml2
-rw-r--r--core/res/res/values-be/strings.xml2
-rw-r--r--core/res/res/values-bg/strings.xml2
-rw-r--r--core/res/res/values-ca/strings.xml2
-rw-r--r--core/res/res/values-cs/strings.xml18
-rw-r--r--core/res/res/values-da/strings.xml2
-rw-r--r--core/res/res/values-de/strings.xml2
-rw-r--r--core/res/res/values-el/strings.xml2
-rw-r--r--core/res/res/values-en-rGB/strings.xml2
-rw-r--r--core/res/res/values-es-rUS/strings.xml2
-rw-r--r--core/res/res/values-es/strings.xml2
-rw-r--r--core/res/res/values-et/strings.xml2
-rw-r--r--core/res/res/values-fa/strings.xml2
-rw-r--r--core/res/res/values-fi/strings.xml2
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-hi/strings.xml2
-rw-r--r--core/res/res/values-hr/strings.xml2
-rw-r--r--core/res/res/values-hu/strings.xml2
-rw-r--r--core/res/res/values-in/strings.xml2
-rw-r--r--core/res/res/values-it/strings.xml2
-rw-r--r--core/res/res/values-iw/strings.xml2
-rw-r--r--core/res/res/values-ja/strings.xml24
-rw-r--r--core/res/res/values-ko/strings.xml2
-rw-r--r--core/res/res/values-lt/strings.xml2
-rw-r--r--core/res/res/values-lv/strings.xml2
-rw-r--r--core/res/res/values-ms/strings.xml2
-rw-r--r--core/res/res/values-nb/strings.xml2
-rw-r--r--core/res/res/values-nl/strings.xml2
-rw-r--r--core/res/res/values-pl/strings.xml2
-rw-r--r--core/res/res/values-pt-rPT/strings.xml2
-rw-r--r--core/res/res/values-pt/strings.xml2
-rw-r--r--core/res/res/values-rm/strings.xml4
-rw-r--r--core/res/res/values-ro/strings.xml2
-rw-r--r--core/res/res/values-ru/strings.xml2
-rw-r--r--core/res/res/values-sk/strings.xml2
-rw-r--r--core/res/res/values-sl/strings.xml2
-rw-r--r--core/res/res/values-sr/strings.xml2
-rw-r--r--core/res/res/values-sv/strings.xml2
-rw-r--r--core/res/res/values-sw/strings.xml2
-rw-r--r--core/res/res/values-th/strings.xml2
-rw-r--r--core/res/res/values-tl/strings.xml2
-rw-r--r--core/res/res/values-tr/strings.xml2
-rw-r--r--core/res/res/values-uk/strings.xml2
-rw-r--r--core/res/res/values-vi/strings.xml2
-rw-r--r--core/res/res/values-zh-rCN/strings.xml2
-rw-r--r--core/res/res/values-zh-rTW/strings.xml6
-rw-r--r--core/res/res/values-zu/strings.xml2
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--graphics/java/android/renderscript/Matrix3f.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java28
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java43
-rw-r--r--services/java/com/android/server/RecognitionManagerService.java12
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java6
-rw-r--r--services/java/com/android/server/pm/Settings.java7
-rw-r--r--services/java/com/android/server/usb/UsbSettingsManager.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java19
-rw-r--r--telephony/java/android/telephony/SignalStrength.java2
-rw-r--r--tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs2
-rw-r--r--tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs2
-rw-r--r--tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs3
-rw-r--r--tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh3
-rw-r--r--tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs2
-rw-r--r--tests/RenderScriptTests/MathErr/Android.mk27
-rw-r--r--tests/RenderScriptTests/MathErr/AndroidManifest.xml29
-rw-r--r--tests/RenderScriptTests/MathErr/res/layout/main.xml31
-rw-r--r--tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java86
-rw-r--r--tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java37
-rw-r--r--tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs84
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/Android.mk5
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs25
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh2
-rw-r--r--tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs2
-rw-r--r--voip/java/android/net/sip/SipAudioCall.java95
-rw-r--r--voip/java/android/net/sip/SipManager.java5
-rw-r--r--voip/java/android/net/sip/SipSession.java45
-rw-r--r--voip/java/com/android/server/sip/SipHelper.java40
-rw-r--r--voip/java/com/android/server/sip/SipService.java271
-rw-r--r--voip/java/com/android/server/sip/SipSessionGroup.java272
-rw-r--r--voip/java/com/android/server/sip/SipSessionListenerProxy.java40
-rw-r--r--voip/java/com/android/server/sip/SipWakeLock.java14
-rw-r--r--voip/java/com/android/server/sip/SipWakeupTimer.java61
-rw-r--r--wifi/java/android/net/wifi/WifiConfigStore.java35
-rw-r--r--wifi/java/android/net/wifi/WifiEnterpriseConfig.java35
132 files changed, 1301 insertions, 549 deletions
diff --git a/api/current.txt b/api/current.txt
index d367a00..1995416 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6627,6 +6627,7 @@ package android.content.pm {
method public abstract void verifyPendingInstall(int, int);
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
+ field public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4; // 0x4
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
field public static final int DONT_KILL_APP = 1; // 0x1
@@ -6673,6 +6674,7 @@ package android.content.pm {
field public static final int GET_ACTIVITIES = 1; // 0x1
field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
field public static final int GET_DISABLED_COMPONENTS = 512; // 0x200
+ field public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 32768; // 0x8000
field public static final int GET_GIDS = 256; // 0x100
field public static final int GET_INSTRUMENTATION = 16; // 0x10
field public static final int GET_INTENT_FILTERS = 32; // 0x20
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 39539b4..f0e3370 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -135,6 +135,11 @@ public final class Pm {
return;
}
+ if ("disable-until-used".equals(op)) {
+ runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
+ return;
+ }
+
if ("grant".equals(op)) {
runGrantRevokePermission(true);
return;
@@ -1178,6 +1183,8 @@ public final class Pm {
return "disabled";
case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER:
return "disabled-user";
+ case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
+ return "disabled-until-used";
}
return "unknown";
}
@@ -1459,6 +1466,7 @@ public final class Pm {
System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT");
System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT");
System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT");
+ System.err.println(" pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT");
System.err.println(" pm grant PACKAGE PERMISSION");
System.err.println(" pm revoke PACKAGE PERMISSION");
System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]");
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 89b1bbd..b5349fd 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1588,7 +1588,7 @@ public class Intent implements Parcelable, Cloneable {
* <ul>
* <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
* <li> {@link #EXTRA_CHANGED_COMPONENT_NAME_LIST} containing the class name
- * of the changed components.
+ * of the changed components (or the package name itself).
* <li> {@link #EXTRA_DONT_KILL_APP} containing boolean field to override the
* default action of restarting the application.
* </ul>
@@ -2969,7 +2969,9 @@ public class Intent implements Parcelable, Cloneable {
/**
* This field is part of {@link android.content.Intent#ACTION_PACKAGE_CHANGED},
- * and contains a string array of all of the components that have changed.
+ * and contains a string array of all of the components that have changed. If
+ * the state of the overall package has changed, then it will contain an entry
+ * with the package name itself.
*/
public static final String EXTRA_CHANGED_COMPONENT_NAME_LIST =
"android.intent.extra.changed_component_name_list";
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index a69f220..d80598c 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -175,6 +175,14 @@ public abstract class PackageManager {
public static final int GET_CONFIGURATIONS = 0x00004000;
/**
+ * {@link PackageInfo} flag: include disabled components which are in
+ * that state only because of {@link #COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED}
+ * in the returned info. Note that if you set this flag, applications
+ * that are in this disabled state will be reported as enabled.
+ */
+ public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 0x00008000;
+
+ /**
* Resolution and querying flag: if set, only filters that support the
* {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for
* matching. This is a synonym for including the CATEGORY_DEFAULT in your
@@ -265,6 +273,19 @@ public abstract class PackageManager {
public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
/**
+ * Flag for {@link #setApplicationEnabledSetting(String, int, int)} only: This
+ * application should be considered, until the point where the user actually
+ * wants to use it. This means that it will not normally show up to the user
+ * (such as in the launcher), but various parts of the user interface can
+ * use {@link #GET_DISABLED_UNTIL_USED_COMPONENTS} to still see it and allow
+ * the user to select it (as for example an IME, device admin, etc). Such code,
+ * once the user has selected the app, should at that point also make it enabled.
+ * This option currently <strong>can not</strong> be used with
+ * {@link #setComponentEnabledSetting(ComponentName, int, int)}.
+ */
+ public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
+
+ /**
* Flag parameter for {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} to
* indicate that this package should be installed as forward locked, i.e. only the app itself
* should have access to its code and non-resource assets.
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 3e8c2a8..e1887bc 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3527,29 +3527,45 @@ public class PackageParser {
return generateApplicationInfo(p, flags, state, UserHandle.getCallingUserId());
}
+ private static void updateApplicationInfo(ApplicationInfo ai, int flags,
+ PackageUserState state) {
+ // CompatibilityMode is global state.
+ if (!sCompatibilityModeEnabled) {
+ ai.disableCompatibilityMode();
+ }
+ if (state.installed) {
+ ai.flags |= ApplicationInfo.FLAG_INSTALLED;
+ } else {
+ ai.flags &= ~ApplicationInfo.FLAG_INSTALLED;
+ }
+ if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
+ ai.enabled = true;
+ } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+ ai.enabled = (flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0;
+ } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+ || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ ai.enabled = false;
+ }
+ ai.enabledSetting = state.enabled;
+ }
+
public static ApplicationInfo generateApplicationInfo(Package p, int flags,
PackageUserState state, int userId) {
if (p == null) return null;
if (!checkUseInstalled(flags, state)) {
return null;
}
- if (!copyNeeded(flags, p, state, null, userId)) {
- // CompatibilityMode is global state. It's safe to modify the instance
- // of the package.
- if (!sCompatibilityModeEnabled) {
- p.applicationInfo.disableCompatibilityMode();
- }
- // Make sure we report as installed. Also safe to do, since the
- // default state should be installed (we will always copy if we
- // need to report it is not installed).
- p.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED;
- if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- p.applicationInfo.enabled = true;
- } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
- || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
- p.applicationInfo.enabled = false;
- }
- p.applicationInfo.enabledSetting = state.enabled;
+ if (!copyNeeded(flags, p, state, null, userId)
+ && ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) == 0
+ || state.enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
+ // In this case it is safe to directly modify the internal ApplicationInfo state:
+ // - CompatibilityMode is global state, so will be the same for every call.
+ // - We only come in to here if the app should reported as installed; this is the
+ // default state, and we will do a copy otherwise.
+ // - The enable state will always be reported the same for the application across
+ // calls; the only exception is for the UNTIL_USED mode, and in that case we will
+ // be doing a copy.
+ updateApplicationInfo(p.applicationInfo, flags, state);
return p.applicationInfo;
}
@@ -3565,26 +3581,12 @@ public class PackageParser {
if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
ai.sharedLibraryFiles = p.usesLibraryFiles;
}
- if (!sCompatibilityModeEnabled) {
- ai.disableCompatibilityMode();
- }
if (state.stopped) {
ai.flags |= ApplicationInfo.FLAG_STOPPED;
} else {
ai.flags &= ~ApplicationInfo.FLAG_STOPPED;
}
- if (state.installed) {
- ai.flags |= ApplicationInfo.FLAG_INSTALLED;
- } else {
- ai.flags &= ~ApplicationInfo.FLAG_INSTALLED;
- }
- if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- ai.enabled = true;
- } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
- || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
- ai.enabled = false;
- }
- ai.enabledSetting = state.enabled;
+ updateApplicationInfo(ai, flags, state);
return ai;
}
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 30a8626..e2dc5d5 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -479,6 +479,7 @@ public class TextToSpeech {
}
private final Context mContext;
+ private Connection mConnectingServiceConnection;
private Connection mServiceConnection;
private OnInitListener mInitListener;
// Written from an unspecified application thread, read from
@@ -554,21 +555,24 @@ public class TextToSpeech {
initTts();
}
- private <R> R runActionNoReconnect(Action<R> action, R errorResult, String method) {
- return runAction(action, errorResult, method, false);
+ private <R> R runActionNoReconnect(Action<R> action, R errorResult, String method,
+ boolean onlyEstablishedConnection) {
+ return runAction(action, errorResult, method, false, onlyEstablishedConnection);
}
private <R> R runAction(Action<R> action, R errorResult, String method) {
- return runAction(action, errorResult, method, true);
+ return runAction(action, errorResult, method, true, true);
}
- private <R> R runAction(Action<R> action, R errorResult, String method, boolean reconnect) {
+ private <R> R runAction(Action<R> action, R errorResult, String method,
+ boolean reconnect, boolean onlyEstablishedConnection) {
synchronized (mStartLock) {
if (mServiceConnection == null) {
Log.w(TAG, method + " failed: not bound to TTS engine");
return errorResult;
}
- return mServiceConnection.runAction(action, errorResult, method, reconnect);
+ return mServiceConnection.runAction(action, errorResult, method, reconnect,
+ onlyEstablishedConnection);
}
}
@@ -631,6 +635,7 @@ public class TextToSpeech {
return false;
} else {
Log.i(TAG, "Sucessfully bound to " + engine);
+ mConnectingServiceConnection = connection;
return true;
}
}
@@ -654,6 +659,16 @@ public class TextToSpeech {
* so the TextToSpeech engine can be cleanly stopped.
*/
public void shutdown() {
+ // Special case, we are asked to shutdown connection that did finalize its connection.
+ synchronized (mStartLock) {
+ if (mConnectingServiceConnection != null) {
+ mContext.unbindService(mConnectingServiceConnection);
+ mConnectingServiceConnection = null;
+ return;
+ }
+ }
+
+ // Post connection case
runActionNoReconnect(new Action<Void>() {
@Override
public Void run(ITextToSpeechService service) throws RemoteException {
@@ -671,7 +686,7 @@ public class TextToSpeech {
mCurrentEngine = null;
return null;
}
- }, null, "shutdown");
+ }, null, "shutdown", false);
}
/**
@@ -1310,7 +1325,9 @@ public class TextToSpeech {
private class Connection implements ServiceConnection {
private ITextToSpeechService mService;
- private OnServiceConnectedAsyncTask mOnServiceConnectedAsyncTask;
+ private SetupConnectionAsyncTask mOnSetupConnectionAsyncTask;
+
+ private boolean mEstablished;
private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() {
@Override
@@ -1338,13 +1355,11 @@ public class TextToSpeech {
}
};
- private class OnServiceConnectedAsyncTask extends AsyncTask<Void, Void, Integer> {
+ private class SetupConnectionAsyncTask extends AsyncTask<Void, Void, Integer> {
private final ComponentName mName;
- private final ITextToSpeechService mConnectedService;
- public OnServiceConnectedAsyncTask(ComponentName name, IBinder service) {
+ public SetupConnectionAsyncTask(ComponentName name) {
mName = name;
- mConnectedService = ITextToSpeechService.Stub.asInterface(service);
}
@Override
@@ -1355,8 +1370,8 @@ public class TextToSpeech {
}
try {
- mConnectedService.setCallback(getCallerIdentity(), mCallback);
- String[] defaultLanguage = mConnectedService.getClientDefaultLanguage();
+ mService.setCallback(getCallerIdentity(), mCallback);
+ String[] defaultLanguage = mService.getClientDefaultLanguage();
mParams.putString(Engine.KEY_PARAM_LANGUAGE, defaultLanguage[0]);
mParams.putString(Engine.KEY_PARAM_COUNTRY, defaultLanguage[1]);
@@ -1374,13 +1389,10 @@ public class TextToSpeech {
@Override
protected void onPostExecute(Integer result) {
synchronized(mStartLock) {
- if (mOnServiceConnectedAsyncTask == this) {
- mOnServiceConnectedAsyncTask = null;
+ if (mOnSetupConnectionAsyncTask == this) {
+ mOnSetupConnectionAsyncTask = null;
}
-
- mServiceConnection = Connection.this;
- mService = mConnectedService;
-
+ mEstablished = true;
dispatchOnInit(result);
}
}
@@ -1389,14 +1401,20 @@ public class TextToSpeech {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized(mStartLock) {
+ mConnectingServiceConnection = null;
+
Log.i(TAG, "Connected to " + name);
- if (mOnServiceConnectedAsyncTask != null) {
- mOnServiceConnectedAsyncTask.cancel(false);
+ if (mOnSetupConnectionAsyncTask != null) {
+ mOnSetupConnectionAsyncTask.cancel(false);
}
- mOnServiceConnectedAsyncTask = new OnServiceConnectedAsyncTask(name, service);
- mOnServiceConnectedAsyncTask.execute();
+ mService = ITextToSpeechService.Stub.asInterface(service);
+ mServiceConnection = Connection.this;
+
+ mEstablished = false;
+ mOnSetupConnectionAsyncTask = new SetupConnectionAsyncTask(name);
+ mOnSetupConnectionAsyncTask.execute();
}
}
@@ -1407,14 +1425,14 @@ public class TextToSpeech {
/**
* Clear connection related fields and cancel mOnServiceConnectedAsyncTask if set.
*
- * @return true if we cancel mOnServiceConnectedAsyncTask in progress.
+ * @return true if we cancel mOnSetupConnectionAsyncTask in progress.
*/
private boolean clearServiceConnection() {
synchronized(mStartLock) {
boolean result = false;
- if (mOnServiceConnectedAsyncTask != null) {
- result = mOnServiceConnectedAsyncTask.cancel(false);
- mOnServiceConnectedAsyncTask = null;
+ if (mOnSetupConnectionAsyncTask != null) {
+ result = mOnSetupConnectionAsyncTask.cancel(false);
+ mOnSetupConnectionAsyncTask = null;
}
mService = null;
@@ -1445,13 +1463,22 @@ public class TextToSpeech {
clearServiceConnection();
}
- public <R> R runAction(Action<R> action, R errorResult, String method, boolean reconnect) {
+ public boolean isEstablished() {
+ return mService != null && mEstablished;
+ }
+
+ public <R> R runAction(Action<R> action, R errorResult, String method,
+ boolean reconnect, boolean onlyEstablishedConnection) {
synchronized (mStartLock) {
try {
if (mService == null) {
Log.w(TAG, method + " failed: not connected to TTS engine");
return errorResult;
}
+ if (onlyEstablishedConnection && isEstablished()) {
+ Log.w(TAG, method + " failed: TTS engine connection not fully setuped");
+ return errorResult;
+ }
return action.run(mService);
} catch (RemoteException ex) {
Log.e(TAG, method + " failed", ex);
diff --git a/core/java/android/webkit/FindActionModeCallback.java b/core/java/android/webkit/FindActionModeCallback.java
index d7a0b60..c68b450 100644
--- a/core/java/android/webkit/FindActionModeCallback.java
+++ b/core/java/android/webkit/FindActionModeCallback.java
@@ -163,7 +163,7 @@ public class FindActionModeCallback implements ActionMode.Callback, TextWatcher,
mActiveMatchIndex = matchIndex;
updateMatchesString();
} else {
- mMatches.setVisibility(View.INVISIBLE);
+ mMatches.setVisibility(View.GONE);
mNumberOfMatches = 0;
}
}
diff --git a/core/java/android/webkit/ViewStateSerializer.java b/core/java/android/webkit/ViewStateSerializer.java
index 096d4cda..1d44b96 100644
--- a/core/java/android/webkit/ViewStateSerializer.java
+++ b/core/java/android/webkit/ViewStateSerializer.java
@@ -31,7 +31,8 @@ class ViewStateSerializer {
private static final int WORKING_STREAM_STORAGE = 16 * 1024;
- static final int VERSION = 1;
+ // VERSION = 1 was for pictures encoded using a previous copy of libskia
+ static final int VERSION = 2;
static boolean serializeViewState(OutputStream stream, DrawData draw)
throws IOException {
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e749e63..2b7e162 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -444,21 +444,14 @@ public class RelativeLayout extends ViewGroup {
// We need to know our size for doing the correct computation of positioning in RTL mode
if (isLayoutRtl() && (myWidth == -1 || isWrapContentWidth)) {
int w = getPaddingStart() + getPaddingEnd();
- final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
for (int i = 0; i < count; i++) {
View child = views[i];
if (child.getVisibility() != GONE) {
LayoutParams params = (LayoutParams) child.getLayoutParams();
- // Would be similar to a call to measureChildHorizontal(child, params, -1, myHeight)
- // but we cannot change for now the behavior of measureChildHorizontal() for
- // taking care or a "-1" for "mywidth" so use here our own version of that code.
- int childHeightMeasureSpec;
- if (params.width == LayoutParams.MATCH_PARENT) {
- childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.EXACTLY);
- } else {
- childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.AT_MOST);
- }
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ int[] rules = params.getRules(View.LAYOUT_DIRECTION_LTR);
+
+ applyHorizontalSizeRules(params, myWidth, rules);
+ measureChildHorizontal(child, params, -1, myHeight);
w += child.getMeasuredWidth();
w += params.leftMargin + params.rightMargin;
@@ -476,13 +469,16 @@ public class RelativeLayout extends ViewGroup {
}
}
+ final int layoutDirection = getLayoutDirection();
for (int i = 0; i < count; i++) {
View child = views[i];
if (child.getVisibility() != GONE) {
LayoutParams params = (LayoutParams) child.getLayoutParams();
+ int[] rules = params.getRules(layoutDirection);
- applyHorizontalSizeRules(params, myWidth);
+ applyHorizontalSizeRules(params, myWidth, rules);
measureChildHorizontal(child, params, myWidth, myHeight);
+
if (positionChildHorizontal(child, params, myWidth, isWrapContentWidth)) {
offsetHorizontalAxis = true;
}
@@ -543,8 +539,6 @@ public class RelativeLayout extends ViewGroup {
}
}
- final int layoutDirection = getLayoutDirection();
-
if (isWrapContentWidth) {
// Width already has left padding in it since it was calculated by looking at
// the right of each child view
@@ -862,9 +856,7 @@ public class RelativeLayout extends ViewGroup {
return rules[ALIGN_PARENT_BOTTOM] != 0;
}
- private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth) {
- final int layoutDirection = getLayoutDirection();
- int[] rules = childParams.getRules(layoutDirection);
+ private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth, int[] rules) {
RelativeLayout.LayoutParams anchorParams;
// -1 indicated a "soft requirement" in that direction. For example:
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 20ecace..424c19b 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -153,8 +153,33 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
public void onPackageUpdateFinished(String packageName, int uid) {
}
-
- public void onPackageChanged(String packageName, int uid, String[] components) {
+
+ /**
+ * Direct reflection of {@link Intent#ACTION_PACKAGE_CHANGED
+ * Intent.ACTION_PACKAGE_CHANGED} being received, informing you of
+ * changes to the enabled/disabled state of components in a package
+ * and/or of the overall package.
+ *
+ * @param packageName The name of the package that is changing.
+ * @param uid The user ID the package runs under.
+ * @param components Any components in the package that are changing. If
+ * the overall package is changing, this will contain an entry of the
+ * package name itself.
+ * @return Return true to indicate you care about this change, which will
+ * result in {@link #onSomePackagesChanged()} being called later. If you
+ * return false, no further callbacks will happen about this change. The
+ * default implementation returns true if this is a change to the entire
+ * package.
+ */
+ public boolean onPackageChanged(String packageName, int uid, String[] components) {
+ if (components != null) {
+ for (String name : components) {
+ if (packageName.equals(name)) {
+ return true;
+ }
+ }
+ }
+ return false;
}
public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
@@ -189,7 +214,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
*/
public void onPackageAppeared(String packageName, int reason) {
}
-
+
+ /**
+ * Called when an existing package is updated or its disabled state changes.
+ */
public void onPackageModified(String packageName) {
}
@@ -328,9 +356,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
if (pkg != null) {
mModifiedPackages = mTempArray;
mTempArray[0] = pkg;
- onPackageChanged(pkg, uid, components);
- // XXX Don't want this to always cause mSomePackagesChanged,
- // since it can happen a fair amount.
+ mChangeType = PACKAGE_PERMANENT_CHANGE;
+ if (onPackageChanged(pkg, uid, components)) {
+ mSomePackagesChanged = true;
+ }
onPackageModified(pkg);
}
} else if (Intent.ACTION_QUERY_PACKAGE_RESTART.equals(action)) {
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 4d41e42..3d7e1ff 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -536,7 +536,7 @@ public class InputMethodUtils {
}
}
- private String getEnabledInputMethodsStr() {
+ public String getEnabledInputMethodsStr() {
mEnabledInputMethodsStrCache = Settings.Secure.getStringForUser(
mResolver, Settings.Secure.ENABLED_INPUT_METHODS, mCurrentUserId);
if (DEBUG) {
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ad64eb6..029908b 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Laat \'n program toe om die huidige lae-vlak batteryverbruikdata te lees. Kan die program toelaat om gedetailleerde inligting te vind oor watter programme jy gebruik."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"verander batterystatistieke"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Laat die program toe om versamelde battery-statistieke te verander. Nie vir gebruik deur normale programme nie."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"haal programwerking-statistieke op"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Laat die program toe om versamelde programwerking-statistieke te herwin. Nie vir gebruik deur normale programme nie."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"verander programwerking-statistieke"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Laat die program toe om versamelde programwerking-statistieke te verander. Nie vir gebruik deur normale programme nie."</string>
<string name="permlab_backup" msgid="470013022865453920">"beheerstelsel-rugsteun en -teruglaai"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 9fa0a06..5aa6d41 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"አንድ መተግበሪያ የአሁኑን የዝቅተኛ-ደረጃ ባትሪ አጠቃቀም ውሂብን እንዲያነብ ያስችላል። መተግበሪያው ስለሚጠቀሟቸው መተግበሪያዎች ዝርዝር መረጃ እንዲያገኝ ሊያስችለው ይችላል።"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"የባትሪ ስታስቲክስን ይቀይራል"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"የተሰበሰቡ የባትሪ ስታስቲክሶችን እንዲቀይር ለመተግበሪያው ያስችለዋል። ለመደበኛ መተግበሪያዎች ጥቅም አይደለም።"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"የመተግበሪያ ክወናዎች ስታቲስቲክስን ሰርስረህ አውጣ"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"መተግበሪያው የተሰበሰቡ የክወና ስታስቲክሶችን ሰርስሮ እንዲያወጣ ይፈቅድለታል። ለመደበኛ መተግበሪያዎች ጥቅም ያልሆነ።"</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"የመተግበሪያ ክወናዎች ስታቲስቲክስን ይቀይሩ"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"መተግበሪያው የተሰበሰቡ የክወና ስታስቲክሶችን እንዲቀይር ይፈቅድሎታል። ለመደበኛ መተግበሪያዎች ጥቅም ያልሆነ።"</string>
<string name="permlab_backup" msgid="470013022865453920">"የስርዓት መጠባበቂያን ተቆጣጠር እናእነበረበት መልስ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d919829..50047b6 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"للسماح لتطبيق بقراءة البيانات الحالية التي تستهلك مستوى منخفضًا من البطارية. قد يتيح التطبيق معرفة معلومات تفصيلية عن التطبيقات التي تستخدمها."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"تعديل إحصاءات البطارية"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"للسماح للتطبيق بتعديل إحصاءات البطارية المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"استرداد إحصاءات عمليات التطبيق"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"للسماح للتطبيق باسترداد إحصاءات عمليات التطبيق المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"تعديل إحصاءات تشغيل التطبيق"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"للسماح للتطبيق بتعديل إحصاءات تشغيل التطبيق المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
<string name="permlab_backup" msgid="470013022865453920">"التحكم في النسخة الاحتياطية للنظام واستعادتها"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 0b37f93..baf6456 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Прыкладанне можа счытваць бягучыя звесткi пры нiзкi зарад акумулятара. Прыкладанне можа знайсцi падрабязную iнфармацы. пра прыкладаннi, якiя вы выкарыстоўваеце."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"змяняць статыстыку батарэі"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дазваляе прыкладанням змяняць сабраную статыстыку батарэi. Не патрабуецца для звычайных прыкладанняў."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"атрымлiваць статыстыку выкарыстання прыкладання"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дазваляе прыкладанню атрымлiваць сабраную статыстыку выкарыстання прыкладання. Не для выкарыстання звычайнымі прыкладаннямі."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"змяняць статыстыку выкарыстання прыкладання"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дазваляе прыкладанню змяняць сабраную статыстыку выкарыстання прыкладання. Не для выкарыстання звычайнымі прыкладаннямі."</string>
<string name="permlab_backup" msgid="470013022865453920">"кантраляваць рэзервовае капіяванне і аднаўленне сістэмы"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 9bb46c1..1c85a7c 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Разрешава на приложението да чете текущите данни за работа при ниско ниво на батерията. Може да му разреши да намери подробна информация за ползваните от вас приложения."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"промяна на статистическите данни за батерията"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Разрешава на приложението да променя събраните статистически данни за батерията. Не е предназначено за нормални приложения."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"извличане на статистическите данни за операциите на приложението"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Разрешава на приложението да извлича събраните статистически данни за операциите си. Не е предназначено за нормални приложения."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"промяна на статистическите данни за операциите на приложението"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Разрешава на приложението да променя събраните статистически данни за операциите си. Не е предназначено за нормални приложения."</string>
<string name="permlab_backup" msgid="470013022865453920">"контролиране на създаването и възстановяването на резервни копия на системата"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index eeda2cc..20ed8e3 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permet que l\'aplicació llegeixi l\'ús de dades actual quan hi ha poca bateria. Pot permetre que l\'aplicació recopili informació detallada sobre les aplicacions que fas servir."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifica les estadístiques de la bateria"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permet que l\'aplicació modifiqui les estadístiques d\'ús de la bateria recopilades. No ho poden fer servir les aplicacions normals."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperació d\'estadístiques d\'ús de l\'aplicació"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permet que l\'aplicació recuperi les estadístiques d\'ús de l\'aplicació recopilades. No indicat per a les aplicacions normals."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifica les estadístiques d\'ús de l\'aplicació"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permet que l\'aplicació modifiqui les estadístiques d\'ús de l\'aplicació recopilades. No indicat per a les aplicacions normals."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlar la còpia de seguretat i restauració del sistema"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f39e602..a08c0d9 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Umožňuje aplikaci číst aktuální podrobné údaje o využití baterie. Aplikace to může využít k získání podrobných informací o tom, které aplikace používáte."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"změna statistických údajů o baterii"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Umožňuje aplikaci upravit shromážděné statistiky o baterii. Toto oprávnění není určeno pro běžné aplikace."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"načtení statistik operací aplikace"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Umožňuje aplikaci načíst shromážděné statistiky operací aplikace. Toto oprávnění není určeno pro běžné aplikace."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"upravit statistiky operací aplikace"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Umožňuje aplikaci upravit shromážděné statistiky operací aplikace. Toto oprávnění není určeno pro běžné aplikace."</string>
<string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
@@ -408,19 +410,19 @@
<string name="permlab_writeContacts" msgid="5107492086416793544">"úprava kontaktů"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
- <string name="permlab_readCallLog" msgid="3478133184624102739">"číst seznam hovorů"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"čtení seznamu hovorů"</string>
<string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Umožňuje aplikaci číst seznam hovorů v tabletu, včetně dat o příchozích a odchozích hovorech. Toto oprávnění umožňuje aplikaci ukládat údaje ze seznamu hovorů. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
<string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Umožňuje aplikaci číst seznam hovorů v telefonu, včetně dat o příchozích a odchozích hovorech. Toto oprávnění umožňuje aplikaci ukládat údaje ze seznamu hovorů. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
- <string name="permlab_writeCallLog" msgid="8552045664743499354">"zapisovat seznam hovorů"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"zápis do seznamu hovorů"</string>
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Umožňuje aplikaci upravovat seznam hovorů vašeho tabletu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Umožňuje aplikaci upravovat seznam hovorů vašeho telefonu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"čtení vaší vlastní vizitky"</string>
<string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Umožňuje aplikaci číst údaje v osobním profilu uložené v zařízení, například jméno nebo kontaktní údaje. Znamená to, že vás aplikace může identifikovat a odeslat údaje z profilu dalším aplikacím."</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"úprava vaší vlastní vizitky"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Umožňuje aplikaci změnit nebo přidat údaje osobního profilu uložené v zařízení, například jméno nebo kontaktní údaje. Znamená to, že vás aplikace může identifikovat a odeslat údaje z profilu dalším aplikacím."</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"číst váš sociální stream"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"čtení vašeho sociálního streamu"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Umožňuje aplikaci získat přístup k sociálním aktualizacím od vašich přátel a synchronizaci těchto aktualizací. Při sdílení informací buďte opatrní – toto oprávnění umožňuje aplikaci číst komunikaci mezi vámi a vašimi přáteli v sociálních sítích bez ohledu na její důvěrnost. Poznámka: Toto oprávnění nemusí platit pro všechny sociální sítě."</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zapisovat do vašeho sociálního streamu"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zápis do sociálního streamu"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Umožňuje aplikaci zobrazit sociální aktualizace od vašich přátel. Při sdílení informací buďte opatrní – aplikace s tímto oprávněním může vytvářet zprávy, které zdánlivě pochází od vašich přátel. Poznámka: Toto oprávnění nemusí platit pro všechny sociální sítě."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"čtení událostí kalendáře a důvěrné informace"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Umožňuje aplikaci číst všechny události kalendáře uložené v tabletu, včetně událostí přátel nebo spolupracovníků. Aplikace s tímto oprávněním může sdílet nebo ukládat údaje v kalendáři bez ohledu na důvěrnost nebo citlivost těchto údajů."</string>
@@ -503,8 +505,8 @@
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním smí bez upozornění přepínat sítě, zapínat a vypínat bezdrátový modul telefonu a podobně."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"čtení stavu a identity telefonu"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Toto oprávnění umožňuje aplikaci zjistit telefonní číslo telefonu, identifikační čísla zařízení, zda zrovna probíhá hovor, a vzdálené číslo, ke kterému je hovor připojen."</string>
- <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zabránění přechodu tabletu do režimu spánku"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"zabránění přechodu telefonu do režimu spánku"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"bránění přechodu tabletu do režimu spánku"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"bránění přechodu telefonu do režimu spánku"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Umožňuje aplikaci zabránit přechodu tabletu do režimu spánku."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Umožňuje aplikaci zabránit přechodu telefonu do režimu spánku."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"zapnutí či vypnutí tabletu"</string>
@@ -528,12 +530,12 @@
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Umožňuje aplikaci změnit časové pásmo telefonu."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"role služby AccountManagerService"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"Umožňuje aplikaci volat funkce AccountAuthenticator."</string>
- <string name="permlab_getAccounts" msgid="1086795467760122114">"vyhledání účtů v zařízení"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"vyhledávání účtů v zařízení"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Umožňuje aplikaci získat seznam účtů v tabletu. Mohou sem patřit i účty vytvořené aplikacemi, které jste nainstalovali."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Umožňuje aplikaci získat seznam účtů v telefonu. Mohou sem patřit i účty vytvořené aplikacemi, které jste nainstalovali."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"vytváření účtů a nastavení hesel"</string>
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Umožňuje aplikaci používat funkce aplikace AccountManager související s ověřováním účtů – včetně vytváření účtů a získávání a nastavování hesel."</string>
- <string name="permlab_manageAccounts" msgid="4983126304757177305">"přidání nebo odebrání účtů"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"přidávání nebo odebírání účtů"</string>
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"Umožňuje aplikaci provádět operace, jako je přidávání nebo odebírání účtů nebo mazání jejich hesel."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"používání účtů v zařízení"</string>
<string name="permdesc_useCredentials" msgid="7984227147403346422">"Umožňuje aplikaci požadovat ověřovací tokeny."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 45f551c..723f95e 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Tillader, at en applikation læser de aktuelle data for batteriforbruget. Kan tillade, at applikationen henter detaljerede oplysninger om, hvilke apps du bruger."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"rediger batteristatistikker"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tillader, at appen kan ændre indsamlede batteristatistikker. Anvendes ikke af normale apps."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hent statistikker for handlinger i appen"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Tillader, at appen indhenter statistikker for handlinger i applikationen. Denne handling bruges ikke i almindelige apps."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"lav ændringer i statistik for handlinger i appen"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tillader, at appen kan ændre indsamlede statistikker for handlinger i applikationen. Dette kan ikke bruges af almindelige apps."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontroller sikkerhedskopiering af system, og gendan"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 1ef42f6..4cffe2f 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Ermöglicht einer Anwendung, den momentan niedrigen Akkustand zu erkennen. Unter Umständen erhält die App detaillierte Informationen darüber, welche Apps Sie verwenden."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"Akkudaten ändern"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ermöglicht der App, erfasste Akkudaten zu ändern. Nicht für normale Apps vorgesehen."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"App-Vorgangsstatistiken abrufen"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ermöglicht der App, erfasste App-Vorgangsstatistiken abzurufen. Kann nicht von normalen Apps verwendet werden."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"App-Vorgangsstatistiken ändern"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ermöglicht der App, erfasste App-Vorgangsstatistiken zu ändern. Kann nicht von normalen Apps verwendet werden"</string>
<string name="permlab_backup" msgid="470013022865453920">"Systemsicherung und -wiederherstellung kontrollieren"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f3333dd..e0415aa 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Επιτρέπει σε μια εφαρμογή να διαβάζει τα δεδομένα τρέχουσας χαμηλού επιπέδου χρήσης μπαταρίας. Ενδέχεται να επιτρέπει στην εφαρμογή να εντοπίσει λεπτομερείς πληροφορίες σχετικά με τις εφαρμογές που χρησιμοποιείτε."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"τροποποίηση στατιστικών στοιχείων μπαταρίας"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Επιτρέπει στην εφαρμογή την τροποποίηση στατιστικών στοιχείων μπαταρίας που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"ανάκτηση στατιστικών στοιχείων λειτουργίας για εφαρμογές"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Επιτρέπει στην εφαρμογή την ανάκτηση των στατιστικών στοιχείων λειτουργίας για τις εφαρμογές που έχουν συλλεχθεί. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"τροποποίηση στατιστικών στοιχείων λειτουργιών εφαρμογών"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Επιτρέπει στην εφαρμογή την τροποποίηση των στατιστικών στοιχείων λειτουργίας εφαρμογών που έχουν συλλεχθεί. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
<string name="permlab_backup" msgid="470013022865453920">"αντίγραφο ασφαλείας και επαναφορά συστήματος"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 538dd66..c093c21 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Allows an application to read the current low-level battery use data. May allow the application to find out detailed information about which apps you use."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modify battery statistics"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Allows the app to modify collected battery statistics. Not for use by normal apps."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"retrieve app ops statistics"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Allows the app to retrieve collected application operation statistics. Not for use by normal apps."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modify app ops statistics"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Allows the app to modify collected component usage statistics. Not for use by normal apps."</string>
<string name="permlab_backup" msgid="470013022865453920">"control system back up and restore"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 8fc1450..948f18d 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite a una aplicación leer los datos actuales de uso de batería de bajo nivel. Puede permitir a la aplicación buscar información detallada sobre las aplicaciones que usas."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar las estadísticas de la batería"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite a la aplicación modificar las estadísticas recopiladas de la batería. Las aplicaciones normales no deben utilizarlo."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Recuperar estadísticas de operaciones de la aplicación"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que la aplicación recupere las estadísticas recopiladas de operación de la aplicación. Las aplicaciones normales no deben utilizar este permiso."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estadísticas de uso de aplicaciones"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que la aplicación modifique las estadísticas recopiladas sobre el uso de aplicaciones. Las aplicaciones normales no deben utilizar este permiso."</string>
<string name="permlab_backup" msgid="470013022865453920">"copia de seguridad y restauración del sistema de control"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 17a7e86..47a2b00 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que una aplicación consulte los datos actuales de uso de batería de nivel inferior. Puede permitir que la aplicación obtenga información detallada sobre las aplicaciones que utilizas."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estadísticas de la batería"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que la aplicación modifique las estadísticas recopiladas sobre la batería. Las aplicaciones normales no deben usar este permiso."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estadísticas de operaciones de aplicaciones"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que la aplicación recupere las estadísticas recopiladas sobre operaciones de aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estadísticas de operaciones de aplicaciones"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que la aplicación modifique las estadísticas recopiladas sobre operaciones de aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlar las copias de seguridad y las restauraciones del sistema"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 8b4408a..bd9464b 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Lubab rakendusel lugeda madala akutaseme kasutusandmeid. Võib lubada rakendusel hankida üksikasjalikku teavet selle kohta, mis rakendusi te kasutate."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"aku statistika muutmine"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Võimaldab rakendusel muuta aku kohta kogutud statistikat. Mitte kasutada tavarakenduste puhul."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"rakenduse tööstatistika hankimine"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Võimaldab rakendusel hankida kogutud rakenduse tööstatistikat. Mitte kasutada tavarakenduste puhul."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"rakenduse tööstatistika muutmine"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Võimaldab rakendusel muuta kogutud rakenduse tööstatistikat. Mitte kasutada tavarakenduste puhul."</string>
<string name="permlab_backup" msgid="470013022865453920">"juhi süsteemi varundust ja taastet"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 3f2da2c..067d9d8 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"به یک برنامه کاربردی اجازه می‌دهد که داده‌های استفاده کننده از میزان باتری کم کنونی را بخواند. این کار ممکن است به برنامه این امکان را بدهد که اطلاعات جزئی درباره برنامه‌هایی که استفاده می‌کنید، بدست آورد."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"اصلاح آمار باتری"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"به برنامه اجازه می‎دهد تا آمار جمع‌آوری شده باتری را تغییر دهد. برای استفاده برنامه‎های عادی نیست."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"بازیابی آمار مربوط به کارکرد برنامه"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"به برنامه امکان می‌دهد آمار جمع‌آوری شده مربوط به عملکرد برنامه را بازیابی کند. برای استفاده توسط برنامه‌های معمولی، در نظر گرفته نشده است."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"تغییر آمار کارکرد برنامه"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"به برنامه اجازه تغییر آمار کارکرد جمع‌آوری شده از برنامه را می‌دهد. برای استفاده توسط برنامه‌های معمولی نیست."</string>
<string name="permlab_backup" msgid="470013022865453920">"کنترل نسخهٔ پشتیبان سیستم و بازیابی"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7573f41..61a09f9 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Antaa sovelluksen lukea nykyisiä alhaisen tason akunkäyttötietoja. Sovellus saattaa saada tietoonsa, mitä sovelluksia käytät."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"muokkaa akkutilastoja"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Antaa sovelluksen muokata kerättyjä akkutilastoja. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"nouda sovellusten toimintatilastoja"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Antaa sovelluksen noutaa kerättyjä sovellusten toimintatilastoja. Ei tavallisten sovellusten käyttöön."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"sovellusten käyttötilastojen muokkaus"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Antaa sovelluksen muokata kerättyjä sovellusten käyttötilastoja. Ei tavallisten sovellusten käyttöön."</string>
<string name="permlab_backup" msgid="470013022865453920">"hallitse järjestelmän varmuuskopiointia ja palauttamista"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index e4aad26..67f7644 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permet à une application de lire les données de consommation actuelles indiquant le faible niveau de la batterie. Permet éventuellement à l\'application d\'obtenir des informations détaillées sur les applications que vous utilisez."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifier les statistiques de la batterie"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permet à l\'application de modifier les statistiques collectées concernant la batterie. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"récupérer les statistiques de fonctionnement des applications"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permet à l\'application de récupérer les statistiques de fonctionnement des applications recueillies. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifier les statistiques de fonctionnement des applications"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permet à l\'application de modifier les statistiques de fonctionnement des applications collectées. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
<string name="permlab_backup" msgid="470013022865453920">"contrôler la sauvegarde et la restauration du système"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index f4e2d3e..5007669 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"एप्लिकेशन को वर्तमान निम्न-स्तरीय बैटरी उपयोग डेटा पढ़ने देती है. एप्लिकेशन को आपके द्वारा उपयोग किए जाने वाले एप्लिकेशन के बारे में विस्तृत जानकारी ढूंढने दे सकती है."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"बैटरी के आंकड़े संशोधित करें"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"एप्‍लिकेशन को बैटरी के संकलित आंकड़ों को संशोधित करने देती है. सामान्‍य एप्‍लिकेशन के द्वारा उपयोग करने के लिए नहीं."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"एप्लिकेशन संचालन आंकड़े प्राप्त करें"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"एप्लिकेशन को संकलित एप्लिकेशन संचालन आंकड़े प्राप्त करने देता है. सामान्य एप्लिकेशन के द्वारा उपयोग के लिए नहीं."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"एप्लिकेशन कार्यवाही के आंकड़े बदलें"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"एप्लिकेशन को एप्लिकेशन कार्यवाही के एकत्रित आंकड़े बदलने देता है. सामान्य एप्लिकेशन के द्वारा उपयोग करने के लिए नहीं."</string>
<string name="permlab_backup" msgid="470013022865453920">"सिस्‍टम बैकअप नियंत्रित और पुनर्स्‍थापित करें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index a7085f4..e30410f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Aplikacija može očitavati podatke o trenutačnoj potrošnji baterije na niskoj razini. Tako može doznati detaljne informacije o aplikacijama koje upotrebljavate."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"izmjena statistike o bateriji"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Omogućuje aplikaciji promjenu prikupljene statistike o potrošnji baterije. Nije namijenjena uobičajenim aplikacijama."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"dohvaćanje statistike o radu aplikacije"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Aplikaciji omogućuje dohvaćanje prikupljene statistike o radu aplikacije. Nije namijenjena uobičajenim aplikacijama."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"izmjena statistike o radu aplikacije"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Aplikaciji omogućuje promjenu prikupljene statistike o radu aplikacije. Nije namijenjena uobičajenim aplikacijama."</string>
<string name="permlab_backup" msgid="470013022865453920">"sigurnosna kopija i oporavak nadzornog sustava"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 840ed06..6b64637 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Lehetővé teszi egy alkalmazás számára, hogy leolvassa az aktuális alacsony szintű akkumulátorhasználatra vonatkozó adatokat. Ezáltal az alkalmazás részletes adatokhoz jut az Ön által használt alkalmazásokról."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"akkumulátorstatisztikák módosítása"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Lehetővé teszi az alkalmazás számára az összegyűjtött akkumulátorhasználati statisztikák módosítását. Normál alkalmazások nem használhatják."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"alkalmazásműveleti statisztikák lekérdezése"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Lehetővé teszi az alkalmazás számára az összegyűjtött alkalmazásműveleti statisztikák lekérdezését. Normál alkalmazások nem használhatják."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"alkalmazásműveleti statisztikák módosítása"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Lehetővé teszi az alkalmazás számára az összegyűjtött alkalmazásműveleti statisztikák módosítását. Normál alkalmazások nem használhatják."</string>
<string name="permlab_backup" msgid="470013022865453920">"rendszer biztonsági mentésének és helyreállításának vezérlése"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 638528f..3fb0b21 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Mengizinkan aplikasi membaca data penggunaan baterai tingkat rendah. Dapat mengizinkan aplikasi mencari informasi mendetail tentang aplikasi mana yang Anda gunakan."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ubah statistik baterai"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Mengizinkan aplikasi mengubah statistik baterai yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"mengambil statistik pengoperasian aplikasi"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Mengizinkan aplikasi mengambil statistik pengoperasian aplikasi yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"memodifikasi statistik pengoperasian aplikasi"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Mengizinkan aplikasi memodifikasi statistik pengoperasian aplikasi yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
<string name="permlab_backup" msgid="470013022865453920">"mengontrol cadangan dan pemulihan sistem"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index d3eaa61..98f8972 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Consente a un\'applicazione di leggere i dati di utilizzo della batteria di basso livello correnti. Potrebbe consentire all\'applicazione di trovare informazioni dettagliate sulle applicazioni che utilizzi."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifica statistiche batteria"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Consente all\'applicazione di modificare le statistiche raccolte sulla batteria. Da non usare per normali applicazioni."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recupero statistiche funzion. app"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Consente all\'applicazione di recuperare le statistiche raccolte sul funzionamento dell\'applicazione. Da non usare per normali applicazioni."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifica statistiche funzionamento app"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Consente all\'applicazione di modificare le statistiche raccolte sul funzionamento dell\'applicazione. Da non usare per normali applicazioni."</string>
<string name="permlab_backup" msgid="470013022865453920">"controllo del backup di sistema e ripristino"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 784a893..d38710a 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"מאפשר ליישום לקרוא את נתוני השימוש הנוכחיים של הסוללה ברמה נמוכה. עשוי לאפשר ליישום לגלות מידע מפורט לגבי היישומים שבהם אתה משתמש."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"שינוי הנתונים הסטטיסטיים של הסוללה"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"מאפשר ליישום לשנות נתונים סטטיסטיים שנאספו לגבי הסוללה. לא מיועד לשימוש על ידי יישומים רגילים."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"אחזור נתונים סטטיסטיים של פעולות יישום"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"הרשאה זו מאפשרת ליישום לאחזר נתונים סטטיסטיים שנאספו לגבי פעולות יישום. לא מיועד לשימוש על ידי יישומים רגילים."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"שינוי סטטיסטיקת ההפעלה של היישום"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"מאפשר ליישום לשנות נתונים סטטיסטיים שנאספו לגבי הפעלתו. לא מיועד לשימוש על ידי יישומים רגילים."</string>
<string name="permlab_backup" msgid="470013022865453920">"שלוט בגיבוי ובשחזור של המערכת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index e53ff29..9d5a1a5 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"現在の電池消費量の低レベルデータを読み取ることをアプリに許可します。このアプリが、使用しているアプリの詳細情報を確認できるようになります。"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"電池統計情報の変更"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"電池に関して収集した統計情報の変更をアプリに許可します。通常のアプリでは使用しません。"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"アプリの操作状況に関する統計情報の取得"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"アプリの操作状況に関して収集された統計情報の取得をアプリに許可します。通常のアプリでは使用しません。"</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"アプリの操作状況に関する統計情報の変更"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"アプリの操作状況に関して収集された統計情報の変更をアプリに許可します。通常のアプリでは使用しません。"</string>
<string name="permlab_backup" msgid="470013022865453920">"システムのバックアップと復元を制御する"</string>
@@ -785,11 +787,11 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ユーザーガイドをご覧いただくか、お客様サポートにお問い合わせください。"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIMカードはロックされています。"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIMカードのロック解除中..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"正しくないパスワードを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"正しくないPINを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"正しくないパスワードを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"正しくないPINを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、タブレットは工場出荷状態にリセットされ、ユーザーのデータはすべて失われます。"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"端末のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、端末は工場出荷状態にリセットされ、ユーザーのデータはすべて失われます。"</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"タブレットのロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。タブレットを工場出荷状態にリセットします。"</string>
@@ -1420,7 +1422,7 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PINが正しくありません"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"パターンを入力"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PINを入力"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PINを入力"</string>
@@ -1442,15 +1444,15 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"ユーザー名またはパスワードが無効です。"</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ユーザー名またはパスワードを忘れた場合は"\n" "<b>"google.com/accounts/recovery"</b>" にアクセスしてください。"</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"アカウントをチェックしています…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"パスワードの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"パスワードの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、タブレットは出荷時設定にリセットされ、ユーザーのデータはすべて失われます。"</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"携帯端末のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、端末は出荷時設定にリセットされ、ユーザーのデータはすべて失われます。"</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"タブレットのロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。タブレットは出荷時設定にリセットされます。"</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"携帯端末のロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。端末は出荷時設定にリセットされます。"</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"削除"</string>
<string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"安全レベルを超えるまで音量を上げますか?"\n"大音量で長時間聞き続けると、聴力を損なう恐れがあります。"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 17006fd..cc7a934 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"애플리케이션이 현재의 낮은 수준 배터리 사용 데이터를 읽을 수 있도록 합니다. 이 경우 애플리케이션이 내가 사용하는 앱에 대한 세부정보를 파악할 수도 있습니다."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"배터리 통계 수정"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"앱이 수집된 배터리 통계를 수정할 수 있도록 허용합니다. 일반 앱에서는 사용하지 않습니다."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"앱 운영 통계 검색"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"앱이 수집된 애플리케이션 운영 통계를 검색하도록 합니다. 일반 앱에서는 사용하지 않습니다."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"앱 운영 통계 수정"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"앱이 수집된 애플리케이션 운영 통계를 수정하도록 합니다. 일반 앱에서는 사용하지 않습니다."</string>
<string name="permlab_backup" msgid="470013022865453920">"시스템 백업 및 복원 관리"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7700f1c..682958e 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Leidžiama programai skaityti dabartinius išsikraunančio akumuliatoriaus naudojimo duomenis. Gali būti leidžiama programai sužinoti išsamią informaciją apie jūsų naudojamas programas."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"keisti akumuliatoriaus statistiką"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Leidžiama programai keisti surinktą akumuliatoriaus statistiką. Neskirta naudoti įprastoms programoms."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"nuskaityti programos naudojimo statistiką"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Programai leidžiama nuskaityti surinktą programos naudojimo statistiką. Neskirta naudoti įprastoms programoms."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"keisti programos naudojimo statistiką"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Programai leidžiama keisti surinktą programos naudojimo statistiką. Neskirta naudoti įprastoms programoms."</string>
<string name="permlab_backup" msgid="470013022865453920">"valdyti sistemos atsarginę kopiją ir atkūrimą"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 040beb1..ab05871 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Ļauj lietojumprogrammai lasīt pašreizējos zema akumulatora enerģijas patēriņa datus. Var atļaut lietojumprogrammai iegūt detalizētu informāciju par to, kuras lietotnes izmantojat."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"akumulatora statistikas pārveidošana"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ļauj lietotnei pārveidot apkopoto statistiku par akumulatoru. Atļauja neattiecas uz parastām lietotnēm."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Izgūt lietotnes darbību statistiku"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ļauj lietotnei izgūt apkopoto statistiku par lietojumprogrammas darbību. Atļauja neattiecas uz parastām lietotnēm."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"Pārveidot lietotnes darbības statistiku"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ļauj lietotnei pārveidot apkopoto statistiku par lietojumprogrammas darbību. Atļauja neattiecas uz parastām lietotnēm."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrolēt sistēmas dublējumu un atjaunošanu"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 436a1db..ac1bcd5 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Membenarkan aplikasi membaca data penggunaan bateri tahap rendah semasa. Boleh membenarkan aplikasi untuk mencari maklumat terperinci tentang apl yang anda gunakan."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ubah suai statistik bateri"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Membenarkan apl mengubah suai statistik bateri yang dikumpul. Bukan untuk penggunaan apl normal."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"dapatkan semula statistik pengendalian apl"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Membenarkan apl mendapatkan semula statistik pengendalian aplikasi yang dikumpul. Bukan untuk kegunaan apl biasa."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"ubah suai apl ops statistik"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Membenarkan apl mengubah suai statistik operasi aplikasi yang dikumpul. Bukan untuk kegunaan apl biasa."</string>
<string name="permlab_backup" msgid="470013022865453920">"sandaran dan pemulihan sistem kawalan"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3a7cd46..095b75d 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Lar apper lese gjeldende data på lavt nivå om batteribruk. Kan også la appen finne ut detaljert informasjon om hvilke apper du bruker."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"endre batteristatistikk"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Lar appen endre innsamlet batteristatistikk. Ikke beregnet på vanlige apper."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hente bruksstatistikk for appen"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Lar appen hente innsamlet bruksstatistikk. Ikke beregnet på vanlige apper."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"endre bruksstatistikk for appen"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Lar appen endre innsamlet bruksstatistikk. Ikke beregnet på vanlige apper."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrollere sikkerhetskopiering og gjenoppretting"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1dd9fe9..55ee0c9 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Hiermee kan de app het huidige accugebruik voor gegevens op laag niveau lezen. Een app kan hierdoor mogelijk gedetailleerde informatie achterhalen over de door u gebruikte apps."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"accustatistieken aanpassen"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Hiermee kan de app verzamelde accustatistieken wijzigen. Niet voor gebruik door normale apps."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"bewerkingsstatistieken van apps ophalen"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Hiermee kan de app verzamelde bewerkingsstatistieken van apps ophalen. Niet voor gebruik door normale apps."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"bewerkingsstatistieken van apps wijzigen"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Hiermee kan de app verzamelde bewerkingsstatistieken van apps wijzigen. Niet voor gebruik door normale apps."</string>
<string name="permlab_backup" msgid="470013022865453920">"systeemback-up en -herstel beheren"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 8123bea..ee2722f 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Zezwala aplikacji na odczytywanie bieżących danych niskiego poziomu o wykorzystaniu baterii. Możliwe jest wtedy zbieranie przez aplikację szczegółowych danych o używanych aplikacjach."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"zmienianie statystyk dotyczących baterii"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Zezwala aplikacji na modyfikowanie zebranych statystyk dotyczących baterii. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"pobieranie statystyk działania aplikacji"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Zezwala aplikacji na pobieranie zebranych statystyk działania aplikacji. Nieprzeznaczone dla zwykłych aplikacji."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modyfikowanie statystyk działania aplikacji"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Zezwala aplikacji na modyfikowanie zebranych statystyk działania aplikacji. Nieprzeznaczone dla zwykłych aplikacji."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrolowanie tworzenia i przywracania kopii zapasowych systemu"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 66879ee..ad6de6f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que uma aplicação leia os atuais dados de utilização da bateria de baixo nível. Poderá permitir que a aplicação encontre informações detalhadas sobre as aplicações que utiliza."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estatísticas da bateria"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que a aplicação modifique as estatísticas recolhidas sobre a bateria. Não se destina a utilização por aplicações normais."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"obter estatísticas de utilização da aplicação"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que a aplicação obtenha as estatísticas de utilização da aplicação recolhidas. Não se destina a utilização por aplicações normais."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de utilização da aplicação"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que a aplicação modifique as estatísticas de utilização de aplicação recolhidas. Não se destina a utilização por aplicações normais."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlar a cópia de segurança e restauro do sistema"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index b9167ef..6ace353 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que o aplicativo leia os dados de uso da bateria de baixo nível atuais. Pode fornecer ao aplicativo informações detalhadas sobre os aplicativos usados por você."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estatísticas da bateria"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que o aplicativo modifique as estatísticas coletadas da bateria. Não deve ser usado em aplicativos normais."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estatísticas de operações de aplicativos"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que o aplicativo recupere as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de operações de aplicativos"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que o aplicativo modifique as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlar backup e restauração do sistema"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 8d8d882..589df10 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -477,6 +477,10 @@
<skip />
<!-- no translation found for permdesc_updateBatteryStats (6862817857178025002) -->
<skip />
+ <!-- no translation found for permlab_getAppOpsStats (1508779687436585744) -->
+ <skip />
+ <!-- no translation found for permdesc_getAppOpsStats (6243887041577912877) -->
+ <skip />
<!-- no translation found for permlab_updateAppOpsStats (8829097373851521505) -->
<skip />
<!-- no translation found for permdesc_updateAppOpsStats (50784596594403483) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 30276cb..5952d2f 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite unei aplicaţii să citească datele actuale privind utilizarea la nivel redus a bateriei. Cu această permisiune, aplicaţia poate afla informaţii detaliate despre aplicaţiile pe care le utilizaţi."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifică statistici referitoare la baterie"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite aplicaţiei să modifice statisticile colectate despre baterie. Nu se utilizează de aplicaţiile obişnuite."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"preluarea statisticilor privind operațiile aplicației"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite aplicației să preia statisticile colectate privind operațiile aplicației. Nu se utilizează de aplicațiile obișnuite."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificarea statisticilor privind utilizarea aplicației"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite aplicației să modifice statisticile colectate despre utilizarea aplicației. Nu se utilizează de aplicațiile obișnuite."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlare copiere de rezervă şi restabilire a sistemului"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index bbfd928..c2685db 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Разрешает приложению получать данные об использовании батареи на низшем уровне. В результате оно может иметь доступ к информации об используемых вами программах."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"изменять статистику батареи"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Приложение сможет изменять собранную статистику использования заряда батареи. Это разрешение не используется обычными приложениями."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"получать статистику операций в приложениях"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Приложение сможет получать собранную статистику операций в приложениях. Это разрешение не используется обычными программами."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"изменять статистику операций в приложениях"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Приложение сможет изменять собранную статистику операций в приложениях. Это разрешение не используется обычными приложениями."</string>
<string name="permlab_backup" msgid="470013022865453920">"управление резервным копированием и восстановлением системы"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c0147eb..51624d2 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Umožňuje aplikácii čítať aktuálne údaje nízkej úrovne o používaní batérie. Pomocou tejto funkcie môže aplikácia zistiť podrobnosti o tom, ktoré aplikácie používate."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"zmena štatistických údajov o batérii"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Umožňuje aplikácii zmeniť zhromaždené štatistické údaje o batérii. Bežné aplikácie toto nastavenie nepoužívajú."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"získať štatistické údaje o fungovaní aplikácií"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Umožňuje aplikácii získať zhromaždené štatistické údaje o fungovaní aplikácií. Bežné aplikácie toto nastavenie nepoužívajú."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"upraviť štatistické údaje o fungovaní aplikácií"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Umožňuje aplikácii zmeniť zhromaždené štatistické údaje o fungovaní aplikácií. Bežné aplikácie toto nastavenie nepoužívajú."</string>
<string name="permlab_backup" msgid="470013022865453920">"Ovládať zálohovanie a obnovu systému"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 5e90928..2d9303c 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Aplikaciji omogoča branje podatkov o trenutni nizki napolnjenosti akumulatorja. Aplikaciji lahko tudi dovoli dostop do podrobnosti o tem, katere aplikacije uporabljate."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"spreminjanje statističnih podatkov o akumulatorju"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Aplikaciji omogoča spreminjanje zbranih statističnih podatkov o akumulatorju. Ni primerno za uporabo z običajnimi aplikacijami."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"pridobi statistične podatke o delovanju aplikacij"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Aplikaciji dovoli pridobivanje zbranih statističnih podatkov o delovanju aplikacij. Ni za uporabo v navadnih aplikacijah."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"spreminjanje statističnih podatkov o delovanju aplikacije"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Aplikaciji dovoli spreminjanje zbranih statističnih podatkov o delovanju aplikacij. Ni za uporabo v navadnih aplikacijah."</string>
<string name="permlab_backup" msgid="470013022865453920">"nadzor varnostnega kopiranja sistema in obnovitev"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 736a545..bbe2059 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Дозвољава апликацији да чита опште податке о тренутној употреби батерије на измаку. Можда ће апликацији дозволити да сазна детаљне информације о томе које апликације користите."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"измена статистике о батерији"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дозвољава апликацији да мења прикупљену статистику о батерији. Не користе је обичне апликације."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"преузимање статистике о функционисању апликације"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дозвољава апликацији да преузима прикупљену статистику о функционисању апликације. Не користе је уобичајене апликације."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"измена статистике о функционисању апликације"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дозвољава апликацији да измени прикупљену статистику о функционисању апликације. Не користе је уобичајене апликације."</string>
<string name="permlab_backup" msgid="470013022865453920">"контрола резервне копије система и враћање почетних вредности"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index e975f68..9407d89 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Tillåter att en app läser de aktuella uppgifterna om låg batterianvändningsnivå. Appen kan tillåtas få reda på detaljerade uppgifter om vilka appar du använder."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ändra batteristatistik"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tillåter att appen ändrar samlad batteristatistik. Används inte av vanliga appar."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hämta åtgärdsstatistik för appar"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Tillåter att appen hämtar samlad åtgärdsstatistik för appar. Används inte av vanliga appar."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"ändra appars åtgärdsstatistik"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tillåter att appen ändrar samlad åtgärdsstatistik för appar. Används inte av vanliga appar."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrollera säkerhetskopiering och återställning av systemet"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index fff8a16..17a8c3e 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Inaruhusu programu kusoma data ya sasa ya matumizi ya kiwango cha chini cha betri. Huenda ikaruhusu kupata maelezo ya kina kuhusu programu unazozitumia."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"rekebisha takwimu za betri"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Inaruhusu programu kurekebisha takwimu za betri zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"epua takwimu za oparesheni ya programu"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Inaruhusu programu kuepua takwimu za matumizi ya programu zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"rekebisha takwimu za oparesheni ya programu"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Inaruhusu programu kurekebisha takwimu za matumizi ya programu zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
<string name="permlab_backup" msgid="470013022865453920">"Dhibiti kuhifadhi nakala na kurejesha kwa mfumo"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 96e03b1..7f3e7fe 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลการใช้แบตเตอรี่ที่มีพลังงานเหลือน้อยในปัจจุบัน โดยอาจอนุญาตให้แอปพลิเคชันค้นหาข้อมูลรายละเอียดว่าคุณใช้งานแอปพลิเคชันใดบ้าง"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"แก้ไขสถิติของแบตเตอรี่"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"อนุญาตให้แอปพลิเคชันแก้ไขสถิติของแบตเตอรี่่ที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"เรียกคืนสถิติการทำงานของแอปพลิเคชัน"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"อนุญาตให้แอปพลิเคชันเรียกคืนสถิติการทำงานของแอปพลิเคชันที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"แก้ไขสถิติการทำงานของแอปพลิเคชัน"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"อนุญาตให้แอปพลิเคชันแก้ไขสถิติการทำงานของแอปพลิเคชันที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
<string name="permlab_backup" msgid="470013022865453920">"ควบคุมการสำรองและคืนค่า"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 95d8cf2..b0878af 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Binibigyang-daan ang application na basahin ang kasalukuyang data sa paggamit ng mababang antas ng baterya. Maaaring bigyang-daan ang application na malaman ang detalyadong impormasyon tungkol sa kung aling apps ang ginagamit mo."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"baguhin ang mga istatistika ng baterya"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Binibigyang-daan ang app na baguhin ang mga nakolektang istatistika ng baterya. Hindi para sa paggamit ng normal na apps."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"bawiin ang mga istatistika ng pagpapagana ng app"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Binibigyang-daan ang app na bawiin ang mga nakolektang istatistika ng pagpapagana ng application. Hindi para sa paggamit ng normal na apps."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"baguhin ang mga istatistika ng pagpapatakbo ng app"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Binibigyang-daan ang app na baguhin ang mga nakolektang istatistika ng pagpapatakbo ng application. Hindi para sa paggamit ng normal na apps."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrolin ang system backup at pagbawi"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 7308264..d8dc8ea 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Uygulamaya, mevcut pil kullanım verilerini alt düzeyde okuma izni verir. Uygulamanın hangi uygulamaları kullandığınızla ilgili ayrıntılı bilgi edinmesine olanak sağlayabilir."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"pil istatistiklerini değiştir"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Uygulamaya, toplanan pil kullanım istatistiklerini değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"uygulama çalışma istatistiklerini al"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Uygulamaya, uygulama çalışma istatistiklerini alma izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"uygulama çalışma istatistiklerini değiştir"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Uygulamaya, uygulama çalışma istatistiklerini değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
<string name="permlab_backup" msgid="470013022865453920">"sistem yedeğini kontrol et ve geri yükle"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 17460f1..5fa13cc 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Дозволяє програмі зчитувати дані про поточний низький рівень споживання заряду акумулятора. Програма може отримувати докладну інформацію про те, якими програмами ви користуєтеся."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"змінювати статистику акумулятора"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дозволяє програмі змінювати зібрану статистику акумулятора. Не для використання звичайними програмами."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"отримувати статистику роботи програми"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дозволяє програмі отримувати зібрану статистику роботи програми. Не використовується звичайними програмами."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"змінювати статистику роботи програми"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дозволяє програмі змінювати зібрану статистику роботи програми. Не використовується звичайними програмами."</string>
<string name="permlab_backup" msgid="470013022865453920">"контр. резерв. копіюв. і відн. сист."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 148f4a8..9e34a8f 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Cho phép ứng dụng đọc dữ liệu sử dụng pin mức thấp hiện tại. Có thể cho phép ứng dụng biết thông tin chi tiết về ứng dụng bạn sử dụng."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"sửa đổi số liệu thống kê về pin"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Cho phép ứng dụng sửa đổi các số liệu thống kê về pin đã được thu thập. Không dành cho các ứng dụng thông thường."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"truy xuất số liệu thống kê hoạt động của ứng dụng"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Cho phép ứng dụng truy xuất số liệu thống kê hoạt động của ứng dụng đã thu thập. Không dành cho ứng dụng thông thường."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"sửa đổi số liệu thống kê hoạt động của ứng dụng"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Cho phép ứng dụng sửa đổi số liệu thống kê hoạt động của ứng dụng đã thu thập. Không dành cho ứng dụng thông thường."</string>
<string name="permlab_backup" msgid="470013022865453920">"kiểm soát sao lưu và khôi phục hệ thống"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fa43c99..a1fda84 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"允许应用读取当前电量使用情况的基础数据,此权限可让应用了解关于您使用了哪些应用的详细信息。"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"修改电池使用统计信息"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"允许该应用修改收集到的电池统计信息。普通应用不应使用此权限。"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"检索应用操作统计信息"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"允许该应用检索收集到的应用操作统计信息。普通应用不应使用此权限。"</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改应用操作统计信息"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允许该应用修改收集到的应用操作统计信息。普通应用不应使用此权限。"</string>
<string name="permlab_backup" msgid="470013022865453920">"控制系统备份和还原"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 3bfed3c..9bb6b99 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -315,8 +315,10 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"允許應用程式讀取目前的低電量使用資料。應用程式可能藉此找到一些詳細資訊,例如您所使用的應用程式為何。"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"修改電池使用統計資料"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"允許應用程式修改收集到的電池使用統計資料 (不建議一般應用程式使用)。"</string>
- <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改應用程式作業統計資料"</string>
- <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允許應用程式修改收集到的應用程式作業統計資料 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"擷取應用程式作業統計資料"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"允許應用程式擷取收集到的應用程式作業統計資料 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改應用程式操作統計資料"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允許應用程式修改收集到的應用程式操作統計資料 (不建議一般應用程式使用)。"</string>
<string name="permlab_backup" msgid="470013022865453920">"控制系統備份與還原"</string>
<string name="permdesc_backup" msgid="6912230525140589891">"允許應用程式控制系統備份與還原機制 (不建議一般應用程式使用)。"</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"確認完整備份或還原作業"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 54be6ea..1d2e497 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -315,6 +315,8 @@
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Ivumela uhlelo lokusebenza ukufunda idatha yokusebenza yebhethri leleveli ephansi yamanje. Ingavumela uhlelo lokusebenza ukuthola ulwazi lemininingwane mayelana nokuthi iziphi izinhlelo zokusebenza ozisebenzisayo."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"guqula izibalo zebhetri"</string>
<string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ivumela uhlelo lokusebenza ukuthi luguqule izibalo zebhethri eziqoqiwe. Akwenzelwe ukuthi kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"thola izibalo zokusebenza kohlelo lokusebenza"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ivumela uhlelo lokusebenza ukuthi lithole izibalo zokusebenza kohlelo lokusebenza. Akumele kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"shintsha izinombolo zokusebenza zohlelo lokusebenza"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ivumela uhlelo lokusebenza ukuthi lishintshe izinombolo zokusebenza kohlelo lokusebenza lokuqoqiwe. Akufanele kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
<string name="permlab_backup" msgid="470013022865453920">"lawula ukusekela ngokulondoloza uhlelo bese ubuyisela esimweni"</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6db89d9..9071440 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1337,7 +1337,6 @@
<java-symbol type="id" name="sliding_layout" />
<java-symbol type="id" name="keyguard_add_widget" />
<java-symbol type="id" name="keyguard_add_widget_view" />
- <java-symbol type="id" name="sliding_layout" />
<java-symbol type="id" name="multi_pane_challenge" />
<java-symbol type="id" name="keyguard_user_selector" />
<java-symbol type="id" name="key_enter" />
diff --git a/graphics/java/android/renderscript/Matrix3f.java b/graphics/java/android/renderscript/Matrix3f.java
index 66f2c81..0bad7e0 100644
--- a/graphics/java/android/renderscript/Matrix3f.java
+++ b/graphics/java/android/renderscript/Matrix3f.java
@@ -138,7 +138,7 @@ public class Matrix3f {
mMat[6] = zx*nc + ys;
mMat[1] = xy*nc + zs;
mMat[4] = y*y*nc + c;
- mMat[9] = yz*nc - xs;
+ mMat[7] = yz*nc - xs;
mMat[2] = zx*nc - ys;
mMat[6] = yz*nc + xs;
mMat[8] = z*z*nc + c;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 17b0b50..280b368 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -72,6 +72,13 @@ class SaveImageInBackgroundData {
Runnable finisher;
int iconSize;
int result;
+
+ void clearImage() {
+ context = null;
+ image = null;
+ imageUri = null;
+ iconSize = 0;
+ }
}
/**
@@ -165,6 +172,10 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
@Override
protected SaveImageInBackgroundData doInBackground(SaveImageInBackgroundData... params) {
if (params.length != 1) return null;
+ if (isCancelled()) {
+ params[0].clearImage();
+ return null;
+ }
// By default, AsyncTask sets the worker thread to have background thread priority, so bump
// it back up so that we save a little quicker.
@@ -225,8 +236,7 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
} catch (Exception e) {
// IOException/UnsupportedOperationException may be thrown if external storage is not
// mounted
- params[0].imageUri = null;
- params[0].image = null;
+ params[0].clearImage();
params[0].result = 1;
}
@@ -240,6 +250,12 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
@Override
protected void onPostExecute(SaveImageInBackgroundData params) {
+ if (isCancelled()) {
+ params.finisher.run();
+ params.clearImage();
+ return;
+ }
+
if (params.result > 0) {
// Show a message that we've failed to save the image to disk
GlobalScreenshot.notifyScreenshotError(params.context, mNotificationManager);
@@ -308,6 +324,8 @@ class GlobalScreenshot {
private float mBgPadding;
private float mBgPaddingScale;
+ private AsyncTask<SaveImageInBackgroundData, Void, SaveImageInBackgroundData> mSaveInBgTask;
+
private MediaActionSound mCameraSound;
@@ -374,7 +392,10 @@ class GlobalScreenshot {
data.image = mScreenBitmap;
data.iconSize = mNotificationIconSize;
data.finisher = finisher;
- new SaveImageInBackgroundTask(mContext, data, mNotificationManager,
+ if (mSaveInBgTask != null) {
+ mSaveInBgTask.cancel(false);
+ }
+ mSaveInBgTask = new SaveImageInBackgroundTask(mContext, data, mNotificationManager,
SCREENSHOT_NOTIFICATION_ID).execute(data);
}
@@ -455,6 +476,7 @@ class GlobalScreenshot {
// Setup the animation with the screenshot just taken
if (mScreenshotAnimation != null) {
mScreenshotAnimation.end();
+ mScreenshotAnimation.removeAllListeners();
}
mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams);
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 593b9bf..0f14265 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -382,6 +382,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private boolean mInputBoundToKeyguard;
class SettingsObserver extends ContentObserver {
+ String mLastEnabled = "";
+
SettingsObserver(Handler handler) {
super(handler);
ContentResolver resolver = mContext.getContentResolver();
@@ -395,7 +397,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override public void onChange(boolean selfChange) {
synchronized (mMethodMap) {
- updateFromSettingsLocked();
+ boolean enabledChanged = false;
+ String newEnabled = mSettings.getEnabledInputMethodsStr();
+ if (!mLastEnabled.equals(newEnabled)) {
+ mLastEnabled = newEnabled;
+ enabledChanged = true;
+ }
+ updateFromSettingsLocked(enabledChanged);
}
}
}
@@ -539,7 +547,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
if (changed) {
- updateFromSettingsLocked();
+ updateFromSettingsLocked(false);
}
}
}
@@ -674,7 +682,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
mSettingsObserver = new SettingsObserver(mHandler);
- updateFromSettingsLocked();
+ updateFromSettingsLocked(true);
// IMMS wants to receive Intent.ACTION_LOCALE_CHANGED in order to update the current IME
// according to the new system locale.
@@ -748,7 +756,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// If the locale is changed, needs to reset the default ime
resetDefaultImeLocked(mContext);
}
- updateFromSettingsLocked();
+ updateFromSettingsLocked(true);
mLastSystemLocale = newLocale;
if (!updateOnlyWhenLocaleChanged) {
try {
@@ -1533,7 +1541,27 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return false;
}
- void updateFromSettingsLocked() {
+ void updateFromSettingsLocked(boolean enabledMayChange) {
+ if (enabledMayChange) {
+ List<InputMethodInfo> enabled = mSettings.getEnabledInputMethodListLocked();
+ for (int i=0; i<enabled.size(); i++) {
+ // We allow the user to select "disabled until used" apps, so if they
+ // are enabling one of those here we now need to make it enabled.
+ InputMethodInfo imm = enabled.get(i);
+ try {
+ ApplicationInfo ai = mIPackageManager.getApplicationInfo(imm.getPackageName(),
+ PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
+ mSettings.getCurrentUserId());
+ if (ai.enabledSetting
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+ mIPackageManager.setApplicationEnabledSetting(imm.getPackageName(),
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP, mSettings.getCurrentUserId());
+ }
+ } catch (RemoteException e) {
+ }
+ }
+ }
// We are assuming that whoever is changing DEFAULT_INPUT_METHOD and
// ENABLED_INPUT_METHODS is taking care of keeping them correctly in
// sync, so we will never have a DEFAULT_INPUT_METHOD that is not
@@ -2383,7 +2411,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final List<ResolveInfo> services = pm.queryIntentServicesAsUser(
new Intent(InputMethod.SERVICE_INTERFACE),
- PackageManager.GET_META_DATA, mSettings.getCurrentUserId());
+ PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
+ mSettings.getCurrentUserId());
final HashMap<String, List<InputMethodSubtype>> additionalSubtypes =
mFileManager.getAllAdditionalInputMethodSubtypes();
@@ -2429,7 +2458,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (!map.containsKey(defaultImiId)) {
Slog.w(TAG, "Default IME is uninstalled. Choose new default IME.");
if (chooseNewDefaultIMELocked()) {
- updateFromSettingsLocked();
+ updateFromSettingsLocked(true);
}
} else {
// Double check that the default IME is certainly enabled.
diff --git a/services/java/com/android/server/RecognitionManagerService.java b/services/java/com/android/server/RecognitionManagerService.java
index 1e0755d..c2e749d 100644
--- a/services/java/com/android/server/RecognitionManagerService.java
+++ b/services/java/com/android/server/RecognitionManagerService.java
@@ -89,17 +89,15 @@ public class RecognitionManagerService extends Binder {
private void initForUser(int userHandle) {
if (DEBUG) Slog.i(TAG, "initForUser user=" + userHandle);
ComponentName comp = getCurRecognizer(userHandle);
+ ServiceInfo info = null;
if (comp != null) {
- // See if the current recognizer is no longer available.
+ // See if the current recognizer is still available.
try {
- mIPm.getServiceInfo(comp, 0, userHandle);
+ info = mIPm.getServiceInfo(comp, 0, userHandle);
} catch (RemoteException e) {
- comp = findAvailRecognizer(null, userHandle);
- if (comp != null) {
- setCurRecognizer(comp, userHandle);
- }
}
- } else {
+ }
+ if (info == null) {
comp = findAvailRecognizer(null, userHandle);
if (comp != null) {
setCurRecognizer(comp, userHandle);
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 3277593..b893062 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -20,6 +20,7 @@ import static android.Manifest.permission.GRANT_REVOKE_PERMISSIONS;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static com.android.internal.util.ArrayUtils.appendInt;
@@ -8913,13 +8914,14 @@ public class PackageManagerService extends IPackageManager.Stub {
if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT
|| newState == COMPONENT_ENABLED_STATE_ENABLED
|| newState == COMPONENT_ENABLED_STATE_DISABLED
- || newState == COMPONENT_ENABLED_STATE_DISABLED_USER)) {
+ || newState == COMPONENT_ENABLED_STATE_DISABLED_USER
+ || newState == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
throw new IllegalArgumentException("Invalid new component state: "
+ newState);
}
PackageSetting pkgSetting;
final int uid = Binder.getCallingUid();
- final int permission = mContext.checkCallingPermission(
+ final int permission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
enforceCrossUserPermission(uid, userId, false, "set enabled");
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 06f11bc..e336524 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -18,6 +18,7 @@ package com.android.server.pm;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
@@ -2412,8 +2413,14 @@ final class Settings {
return false;
}
PackageUserState ustate = packageSettings.readUserState(userId);
+ if ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0) {
+ if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+ return true;
+ }
+ }
if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED
|| ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
+ || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
|| (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
&& ustate.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
return false;
diff --git a/services/java/com/android/server/usb/UsbSettingsManager.java b/services/java/com/android/server/usb/UsbSettingsManager.java
index 4b2bbfe..f9aaa17 100644
--- a/services/java/com/android/server/usb/UsbSettingsManager.java
+++ b/services/java/com/android/server/usb/UsbSettingsManager.java
@@ -364,8 +364,9 @@ class UsbSettingsManager {
}
@Override
- public void onPackageChanged(String packageName, int uid, String[] components) {
+ public boolean onPackageChanged(String packageName, int uid, String[] components) {
handlePackageUpdate(packageName);
+ return false;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 167b6c2..47ce130 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -557,6 +557,25 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
}
}
+ public void testCycleTodayJanuary() throws Exception {
+ final NetworkPolicy policy = new NetworkPolicy(
+ sTemplateWifi, 14, "US/Pacific", 1024L, 1024L, false);
+
+ assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+ computeNextCycleBoundary(parseTime("2013-01-13T23:59:59.000-08:00"), policy));
+ assertTimeEquals(parseTime("2013-02-14T00:00:00.000-08:00"),
+ computeNextCycleBoundary(parseTime("2013-01-14T00:00:01.000-08:00"), policy));
+ assertTimeEquals(parseTime("2013-02-14T00:00:00.000-08:00"),
+ computeNextCycleBoundary(parseTime("2013-01-14T15:11:00.000-08:00"), policy));
+
+ assertTimeEquals(parseTime("2012-12-14T00:00:00.000-08:00"),
+ computeLastCycleBoundary(parseTime("2013-01-13T23:59:59.000-08:00"), policy));
+ assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+ computeLastCycleBoundary(parseTime("2013-01-14T00:00:01.000-08:00"), policy));
+ assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+ computeLastCycleBoundary(parseTime("2013-01-14T15:11:00.000-08:00"), policy));
+ }
+
public void testNetworkPolicyAppliedCycleLastMonth() throws Exception {
NetworkState[] state = null;
NetworkStats stats = null;
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index e2da53e..3ed9cef 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -335,7 +335,7 @@ public class SignalStrength implements Parcelable {
mCdmaEcio = (mCdmaEcio > 0) ? -mCdmaEcio : -160;
mEvdoDbm = (mEvdoDbm > 0) ? -mEvdoDbm : -120;
- mEvdoEcio = (mEvdoEcio > 0) ? -mEvdoEcio : -1;
+ mEvdoEcio = (mEvdoEcio >= 0) ? -mEvdoEcio : -1;
mEvdoSnr = ((mEvdoSnr > 0) && (mEvdoSnr <= 8)) ? mEvdoSnr : -1;
// TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
index 2818bf5..03e5a79 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
@@ -16,7 +16,7 @@
#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
static float sr = 0.f;
static float sg = 0.f;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
index 81cb9d0..7ee3405 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
@@ -16,7 +16,7 @@
#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
static double shadowFilterMap[] = {
-0.00591, 0.0001,
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
index 677e857..fae94a1 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
@@ -16,7 +16,6 @@
#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
float vibrance = 0.f;
@@ -39,7 +38,7 @@ void vibranceKernel(const uchar4 *in, uchar4 *out) {
int g = in->g;
int b = in->b;
float red = (r-max(g, b))/256.f;
- float sx = (float)(Vib/(1+exp(-red*3)));
+ float sx = (float)(Vib/(1+native_exp(-red*3)));
S = sx+1;
MS = 1.0f - S;
Rt = Rf * MS;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
index 05a5929..5668621 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
@@ -50,8 +50,7 @@ uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
const float2 inCoord = {(float)x, (float)y};
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
const float sloped_dist_ratio = fast_length(axis_scale * coord) * sloped_inv_max_dist;
- // TODO: add half_exp once implemented
- const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * exp(sloped_dist_ratio));
+ const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * native_exp(sloped_dist_ratio));
float4 fout;
fout.rgb = fin.rgb * lumen;
fout.w = fin.w;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
index b9c28fc..8c825f2 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
@@ -16,7 +16,7 @@
#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
static int histR[256] = {0}, histG[256] = {0}, histB[256] = {0};
diff --git a/tests/RenderScriptTests/MathErr/Android.mk b/tests/RenderScriptTests/MathErr/Android.mk
new file mode 100644
index 0000000..b3edd02
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/Android.mk
@@ -0,0 +1,27 @@
+#
+# 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_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+ $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := RsMathErr
+
+include $(BUILD_PACKAGE)
diff --git a/tests/RenderScriptTests/MathErr/AndroidManifest.xml b/tests/RenderScriptTests/MathErr/AndroidManifest.xml
new file mode 100644
index 0000000..6a3db2c
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.rs.matherr">
+
+ <uses-sdk android:minSdkVersion="17" />
+ <application android:label="RS Math Err">
+ <activity android:name="MathErrActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/RenderScriptTests/MathErr/res/layout/main.xml b/tests/RenderScriptTests/MathErr/res/layout/main.xml
new file mode 100644
index 0000000..7b2c76a
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/res/layout/main.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:id="@+id/displayin"
+ android:layout_width="320dip"
+ android:layout_height="266dip" />
+
+ <ImageView
+ android:id="@+id/displayout"
+ android:layout_width="320dip"
+ android:layout_height="266dip" />
+
+</LinearLayout>
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java
new file mode 100644
index 0000000..4561267
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+package com.example.android.rs.matherr;
+
+import android.content.res.Resources;
+import android.renderscript.*;
+import java.lang.Float;
+import java.lang.Math;
+
+public class MathErr {
+ private RenderScript mRS;
+ private Allocation mAllocationSrc;
+ private Allocation mAllocationRes;
+ private ScriptC_math_err mScript;
+ private java.util.Random mRand = new java.util.Random();
+
+ private final int BUF_SIZE = 4096;
+ float mSrc[] = new float[BUF_SIZE];
+ float mRef[] = new float[BUF_SIZE];
+ float mRes[] = new float[BUF_SIZE];
+
+ MathErr(RenderScript rs) {
+ mRS = rs;
+ mScript = new ScriptC_math_err(mRS);
+
+ mAllocationSrc = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
+ mAllocationRes = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
+
+ testExp2();
+ testLog2();
+ }
+
+ void buildRand() {
+ for (int i=0; i < BUF_SIZE; i++) {
+ mSrc[i] = (((float)i) / 9) - 200;
+ //mSrc[i] = Float.intBitsToFloat(mRand.nextInt());
+ }
+ mAllocationSrc.copyFrom(mSrc);
+ }
+
+ void logErr() {
+ mAllocationRes.copyTo(mRes);
+ for (int i=0; i < BUF_SIZE; i++) {
+ int err = Float.floatToRawIntBits(mRef[i]) - Float.floatToRawIntBits(mRes[i]);
+ err = Math.abs(err);
+ if (err > 8096) {
+ android.util.Log.v("err", "error " + err + " src " + mSrc[i] + " ref " + mRef[i] + " res " + mRes[i]);
+ }
+ }
+ }
+
+ void testExp2() {
+ android.util.Log.v("err", "testing exp2");
+ buildRand();
+ mScript.forEach_testExp2(mAllocationSrc, mAllocationRes);
+ for (int i=0; i < BUF_SIZE; i++) {
+ mRef[i] = (float)Math.pow(2.f, mSrc[i]);
+ }
+ logErr();
+ }
+
+ void testLog2() {
+ android.util.Log.v("err", "testing log2");
+ buildRand();
+ mScript.forEach_testLog2(mAllocationSrc, mAllocationRes);
+ for (int i=0; i < BUF_SIZE; i++) {
+ mRef[i] = (float)Math.log(mSrc[i]) * 1.442695041f;
+ }
+ logErr();
+ }
+
+}
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java
new file mode 100644
index 0000000..74d7b71
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+package com.example.android.rs.matherr;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.renderscript.RenderScript;
+import android.renderscript.Allocation;
+import android.util.Log;
+
+public class MathErrActivity extends Activity {
+ private MathErr mME;
+ private RenderScript mRS;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ mRS = RenderScript.create(this);
+ mME = new MathErr(mRS);
+ }
+}
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs
new file mode 100644
index 0000000..a26770b
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(com.example.android.rs.matherr)
+
+typedef union
+{
+ float fv;
+ int32_t iv;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float. */
+
+#define GET_FLOAT_WORD(i,d) \
+do { \
+ ieee_float_shape_type gf_u; \
+ gf_u.fv = (d); \
+ (i) = gf_u.iv; \
+} while (0)
+
+/* Set a float from a 32 bit int. */
+
+#define SET_FLOAT_WORD(d,i) \
+do { \
+ ieee_float_shape_type sf_u; \
+ sf_u.iv = (i); \
+ (d) = sf_u.fv; \
+} while (0)
+
+
+static float fast_log2(float v) {
+ int32_t ibits;
+ GET_FLOAT_WORD(ibits, v);
+
+ int32_t e = (ibits >> 23) & 0xff;
+
+ ibits &= 0x7fffff;
+ ibits |= 127 << 23;
+
+ float ir;
+ SET_FLOAT_WORD(ir, ibits);
+
+ ir -= 1.5f;
+ float ir2 = ir*ir;
+ float adj2 = 0.405465108f + // -0.00009f +
+ (0.666666667f * ir) -
+ (0.222222222f * ir2) +
+ (0.098765432f * ir*ir2) -
+ (0.049382716f * ir2*ir2) +
+ (0.026337449f * ir*ir2*ir2) -
+ (0.014631916f * ir2*ir2*ir2);
+ adj2 *= (1.f / 0.693147181f);
+
+ return (float)(e - 127) + adj2;
+}
+
+void testExp2(const float *in, float *out) {
+ float i = *in;
+ if (i > (-125.f) && i < 125.f) {
+ *out = native_exp2(i);
+ } else {
+ *out = exp2(i);
+ }
+ *out = native_exp2(i);
+}
+
+void testLog2(const float *in, float *out) {
+ *out = fast_log2(*in);
+}
+
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/Android.mk b/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
index e79c780..0fd0d96 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
+++ b/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
@@ -29,6 +29,11 @@ LOCAL_SDK_VERSION := 8
LOCAL_RENDERSCRIPT_TARGET_API := 18
LOCAL_RENDERSCRIPT_COMPATIBILITY := 18
+LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC)
+LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE := \
+ $(TOPDIR)external/clang/lib/Headers \
+ $(TOPDIR)frameworks/rs/scriptc
+
LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript
LOCAL_REQUIRED_MODULES := librsjni
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml b/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
index f45b555..53219e7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
+++ b/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.rs.test">
+ package="com.android.rs.test_compat">
<uses-sdk android:minSdkVersion="8" />
<uses-sdk android:targetSdkVersion="8" />
<application
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
index c667122..b76f21e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.support.v8.renderscript.RenderScript;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
index 6b3df32..51f8a4d 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
index 92362b8..ddc6a99 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
index 7be30a5..751187b 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
index 9c4b420..f8b2fd3 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
index 9f94b7f..7fe4b36 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
index 18389ed..5da5288 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
index e8b865a..1f28abc 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
index 738b121..d880e68 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
index aca656b..3085032 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
index bc2797d..a7cb226 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
index 5f3ffb7..269bcef 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
index e94a877..f435dde 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
index 8176903..abfa44c 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
index c518a00..c3f3ca0 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
index 7ba10de..653ebd5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
index 279b881..960df24 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
index ae1eb0f..9592798 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
index 6830fda..ec67665 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
index 5945bac..07538ec 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
index a696ac4..055c454 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
index 14a5fa0..a7e7429 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
index dc58088..384cd13 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
index 57fa515..cea9fe5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
index 0f897c8..69fc97f 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
index e0ebc1b..3c663a8 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
index d61a7a0..e6317d5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
index 4a2e295..740180e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
index b6b9447..86e35a8 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
index 2c13734..3245eca 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
index 61f4aad..d8d5a78 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
index 053112f..43bbaf7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
index adb1710..0e16240 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
index 47b7a6a..6ba822e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
index a95584f..01abf2f 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rs.test;
+package com.android.rs.test_compat;
import android.content.Context;
import android.util.Log;
import android.support.v8.renderscript.RenderScript.RSMessageHandler;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs
new file mode 100644
index 0000000..650243e
--- /dev/null
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs
@@ -0,0 +1,25 @@
+// 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.
+
+#pragma version(1)
+
+#pragma rs java_package_name(com.android.rs.test_compat)
+
+typedef struct ListAllocs_s {
+ rs_allocation text;
+ int result;
+} ListAllocs;
+
+ListAllocs *gList;
+
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
index 3adc999..b05a354 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
@@ -1,6 +1,6 @@
#pragma version(1)
-#pragma rs java_package_name(com.android.rs.test)
+#pragma rs java_package_name(com.android.rs.test_compat)
typedef struct TestResult_s {
rs_allocation name;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
index 6dc83ba..89e7de7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
@@ -1,7 +1,7 @@
// Fountain test script
#pragma version(1)
-#pragma rs java_package_name(com.android.rs.test)
+#pragma rs java_package_name(com.android.rs.test_compat)
#pragma stateFragment(parent)
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
index 1d67055..ea943e9 100644
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ b/voip/java/android/net/sip/SipAudioCall.java
@@ -25,17 +25,11 @@ import android.net.rtp.RtpStream;
import android.net.sip.SimpleSessionDescription.Media;
import android.net.wifi.WifiManager;
import android.os.Message;
-import android.os.RemoteException;
+import android.telephony.Rlog;
import android.text.TextUtils;
-import android.util.Log;
-
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
/**
* Handles an Internet audio call over SIP. You can instantiate this class with {@link SipManager},
@@ -60,7 +54,8 @@ import java.util.Map;
* </div>
*/
public class SipAudioCall {
- private static final String TAG = SipAudioCall.class.getSimpleName();
+ private static final String LOG_TAG = SipAudioCall.class.getSimpleName();
+ private static final boolean DBG = true;
private static final boolean RELEASE_SOCKET = true;
private static final boolean DONT_RELEASE_SOCKET = false;
private static final int SESSION_TIMEOUT = 5; // in seconds
@@ -191,7 +186,6 @@ public class SipAudioCall {
private boolean mMuted = false;
private boolean mHold = false;
- private SipProfile mPendingCallRequest;
private WifiManager mWm;
private WifiManager.WifiLock mWifiHighPerfLock;
@@ -261,7 +255,7 @@ public class SipAudioCall {
}
}
} catch (Throwable t) {
- Log.e(TAG, "setListener()", t);
+ loge("setListener()", t);
}
}
@@ -371,7 +365,7 @@ public class SipAudioCall {
mAudioStream = new AudioStream(InetAddress.getByName(
getLocalIp()));
} catch (Throwable t) {
- Log.i(TAG, "transferToNewSession(): " + t);
+ loge("transferToNewSession():", t);
}
}
if (origin != null) origin.endCall();
@@ -382,26 +376,26 @@ public class SipAudioCall {
return new SipSession.Listener() {
@Override
public void onCalling(SipSession session) {
- Log.d(TAG, "calling... " + session);
+ if (DBG) log("onCalling: session=" + session);
Listener listener = mListener;
if (listener != null) {
try {
listener.onCalling(SipAudioCall.this);
} catch (Throwable t) {
- Log.i(TAG, "onCalling(): " + t);
+ loge("onCalling():", t);
}
}
}
@Override
public void onRingingBack(SipSession session) {
- Log.d(TAG, "sip call ringing back: " + session);
+ if (DBG) log("onRingingBackk: " + session);
Listener listener = mListener;
if (listener != null) {
try {
listener.onRingingBack(SipAudioCall.this);
} catch (Throwable t) {
- Log.i(TAG, "onRingingBack(): " + t);
+ loge("onRingingBack():", t);
}
}
}
@@ -424,7 +418,7 @@ public class SipAudioCall {
String answer = createAnswer(sessionDescription).encode();
mSipSession.answerCall(answer, SESSION_TIMEOUT);
} catch (Throwable e) {
- Log.e(TAG, "onRinging()", e);
+ loge("onRinging():", e);
session.endCall();
}
}
@@ -434,7 +428,7 @@ public class SipAudioCall {
public void onCallEstablished(SipSession session,
String sessionDescription) {
mPeerSd = sessionDescription;
- Log.v(TAG, "onCallEstablished()" + mPeerSd);
+ if (DBG) log("onCallEstablished(): " + mPeerSd);
// TODO: how to notify the UI that the remote party is changed
if ((mTransferringSession != null)
@@ -452,14 +446,14 @@ public class SipAudioCall {
listener.onCallEstablished(SipAudioCall.this);
}
} catch (Throwable t) {
- Log.i(TAG, "onCallEstablished(): " + t);
+ loge("onCallEstablished(): ", t);
}
}
}
@Override
public void onCallEnded(SipSession session) {
- Log.d(TAG, "sip call ended: " + session + " mSipSession:" + mSipSession);
+ if (DBG) log("onCallEnded: " + session + " mSipSession:" + mSipSession);
// reset the trasnferring session if it is the one.
if (session == mTransferringSession) {
mTransferringSession = null;
@@ -475,7 +469,7 @@ public class SipAudioCall {
try {
listener.onCallEnded(SipAudioCall.this);
} catch (Throwable t) {
- Log.i(TAG, "onCallEnded(): " + t);
+ loge("onCallEnded(): ", t);
}
}
close();
@@ -483,13 +477,13 @@ public class SipAudioCall {
@Override
public void onCallBusy(SipSession session) {
- Log.d(TAG, "sip call busy: " + session);
+ if (DBG) log("onCallBusy: " + session);
Listener listener = mListener;
if (listener != null) {
try {
listener.onCallBusy(SipAudioCall.this);
} catch (Throwable t) {
- Log.i(TAG, "onCallBusy(): " + t);
+ loge("onCallBusy(): ", t);
}
}
close(false);
@@ -498,7 +492,7 @@ public class SipAudioCall {
@Override
public void onCallChangeFailed(SipSession session, int errorCode,
String message) {
- Log.d(TAG, "sip call change failed: " + message);
+ if (DBG) log("onCallChangedFailed: " + message);
mErrorCode = errorCode;
mErrorMessage = message;
Listener listener = mListener;
@@ -507,7 +501,7 @@ public class SipAudioCall {
listener.onError(SipAudioCall.this, mErrorCode,
message);
} catch (Throwable t) {
- Log.i(TAG, "onCallBusy(): " + t);
+ loge("onCallBusy():", t);
}
}
}
@@ -542,8 +536,8 @@ public class SipAudioCall {
@Override
public void onCallTransferring(SipSession newSession,
String sessionDescription) {
- Log.v(TAG, "onCallTransferring mSipSession:"
- + mSipSession + " newSession:" + newSession);
+ if (DBG) log("onCallTransferring: mSipSession="
+ + mSipSession + " newSession=" + newSession);
mTransferringSession = newSession;
try {
if (sessionDescription == null) {
@@ -554,7 +548,7 @@ public class SipAudioCall {
newSession.answerCall(answer, SESSION_TIMEOUT);
}
} catch (Throwable e) {
- Log.e(TAG, "onCallTransferring()", e);
+ loge("onCallTransferring()", e);
newSession.endCall();
}
}
@@ -562,7 +556,7 @@ public class SipAudioCall {
}
private void onError(int errorCode, String message) {
- Log.d(TAG, "sip session error: "
+ if (DBG) log("onError: "
+ SipErrorCode.toString(errorCode) + ": " + message);
mErrorCode = errorCode;
mErrorMessage = message;
@@ -571,7 +565,7 @@ public class SipAudioCall {
try {
listener.onError(this, errorCode, message);
} catch (Throwable t) {
- Log.i(TAG, "onError(): " + t);
+ loge("onError():", t);
}
}
synchronized (this) {
@@ -600,11 +594,11 @@ public class SipAudioCall {
synchronized (this) {
mSipSession = session;
mPeerSd = sessionDescription;
- Log.v(TAG, "attachCall()" + mPeerSd);
+ if (DBG) log("attachCall(): " + mPeerSd);
try {
session.setListener(createListener());
} catch (Throwable e) {
- Log.e(TAG, "attachCall()", e);
+ loge("attachCall()", e);
throwSipException(e);
}
}
@@ -627,6 +621,7 @@ public class SipAudioCall {
*/
public void makeCall(SipProfile peerProfile, SipSession sipSession,
int timeout) throws SipException {
+ if (DBG) log("makeCall: " + peerProfile + " session=" + sipSession + " timeout=" + timeout);
if (!SipManager.isVoipSupported(mContext)) {
throw new SipException("VOIP API is not supported");
}
@@ -640,6 +635,7 @@ public class SipAudioCall {
sipSession.makeCall(peerProfile, createOffer().encode(),
timeout);
} catch (IOException e) {
+ loge("makeCall:", e);
throw new SipException("makeCall()", e);
}
}
@@ -650,6 +646,7 @@ public class SipAudioCall {
* @throws SipException if the SIP service fails to end the call
*/
public void endCall() throws SipException {
+ if (DBG) log("endCall: mSipSession" + mSipSession);
synchronized (this) {
stopCall(RELEASE_SOCKET);
mInCall = false;
@@ -672,9 +669,11 @@ public class SipAudioCall {
* @throws SipException if the SIP service fails to hold the call
*/
public void holdCall(int timeout) throws SipException {
+ if (DBG) log("holdCall: mSipSession" + mSipSession + " timeout=" + timeout);
synchronized (this) {
if (mHold) return;
if (mSipSession == null) {
+ loge("holdCall:");
throw new SipException("Not in a call to hold call");
}
mSipSession.changeCall(createHoldOffer().encode(), timeout);
@@ -695,6 +694,7 @@ public class SipAudioCall {
* @throws SipException if the SIP service fails to answer the call
*/
public void answerCall(int timeout) throws SipException {
+ if (DBG) log("answerCall: mSipSession" + mSipSession + " timeout=" + timeout);
synchronized (this) {
if (mSipSession == null) {
throw new SipException("No call to answer");
@@ -704,6 +704,7 @@ public class SipAudioCall {
getLocalIp()));
mSipSession.answerCall(createAnswer(mPeerSd).encode(), timeout);
} catch (IOException e) {
+ loge("answerCall:", e);
throw new SipException("answerCall()", e);
}
}
@@ -722,6 +723,7 @@ public class SipAudioCall {
* @throws SipException if the SIP service fails to unhold the call
*/
public void continueCall(int timeout) throws SipException {
+ if (DBG) log("continueCall: mSipSession" + mSipSession + " timeout=" + timeout);
synchronized (this) {
if (!mHold) return;
mSipSession.changeCall(createContinueOffer().encode(), timeout);
@@ -740,6 +742,7 @@ public class SipAudioCall {
media.setRtpPayload(codec.type, codec.rtpmap, codec.fmtp);
}
media.setRtpPayload(127, "telephone-event/8000", "0-15");
+ if (DBG) log("createOffer: offer=" + offer);
return offer;
}
@@ -798,18 +801,22 @@ public class SipAudioCall {
}
}
if (codec == null) {
+ loge("createAnswer: no suitable codes");
throw new IllegalStateException("Reject SDP: no suitable codecs");
}
+ if (DBG) log("createAnswer: answer=" + answer);
return answer;
}
private SimpleSessionDescription createHoldOffer() {
SimpleSessionDescription offer = createContinueOffer();
offer.setAttribute("sendonly", "");
+ if (DBG) log("createHoldOffer: offer=" + offer);
return offer;
}
private SimpleSessionDescription createContinueOffer() {
+ if (DBG) log("createContinueOffer");
SimpleSessionDescription offer =
new SimpleSessionDescription(mSessionId, getLocalIp());
Media media = offer.newMedia(
@@ -825,17 +832,17 @@ public class SipAudioCall {
private void grabWifiHighPerfLock() {
if (mWifiHighPerfLock == null) {
- Log.v(TAG, "acquire wifi high perf lock");
+ if (DBG) log("grabWifiHighPerfLock:");
mWifiHighPerfLock = ((WifiManager)
mContext.getSystemService(Context.WIFI_SERVICE))
- .createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
+ .createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, LOG_TAG);
mWifiHighPerfLock.acquire();
}
}
private void releaseWifiHighPerfLock() {
if (mWifiHighPerfLock != null) {
- Log.v(TAG, "release wifi high perf lock");
+ if (DBG) log("releaseWifiHighPerfLock:");
mWifiHighPerfLock.release();
mWifiHighPerfLock = null;
}
@@ -912,7 +919,7 @@ public class SipAudioCall {
AudioGroup audioGroup = getAudioGroup();
if ((audioGroup != null) && (mSipSession != null)
&& (SipSession.State.IN_CALL == getState())) {
- Log.v(TAG, "send DTMF: " + code);
+ if (DBG) log("sendDtmf: code=" + code + " result=" + result);
audioGroup.sendDtmf(code);
}
if (result != null) result.sendToTarget();
@@ -971,6 +978,7 @@ public class SipAudioCall {
*/
public void setAudioGroup(AudioGroup group) {
synchronized (this) {
+ if (DBG) log("setAudioGroup: group=" + group);
if ((mAudioStream != null) && (mAudioStream.getGroup() != null)) {
mAudioStream.join(group);
}
@@ -997,8 +1005,8 @@ public class SipAudioCall {
}
private synchronized void startAudioInternal() throws UnknownHostException {
+ if (DBG) loge("startAudioInternal: mPeerSd=" + mPeerSd);
if (mPeerSd == null) {
- Log.v(TAG, "startAudioInternal() mPeerSd = null");
throw new IllegalStateException("mPeerSd = null");
}
@@ -1082,6 +1090,7 @@ public class SipAudioCall {
// set audio group mode based on current audio configuration
private void setAudioGroupMode() {
AudioGroup audioGroup = getAudioGroup();
+ if (DBG) log("setAudioGroupMode: audioGroup=" + audioGroup);
if (audioGroup != null) {
if (mHold) {
audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
@@ -1096,7 +1105,7 @@ public class SipAudioCall {
}
private void stopCall(boolean releaseSocket) {
- Log.d(TAG, "stop audiocall");
+ if (DBG) log("stopCall: releaseSocket=" + releaseSocket);
releaseWifiHighPerfLock();
if (mAudioStream != null) {
mAudioStream.join(null);
@@ -1120,7 +1129,15 @@ public class SipAudioCall {
}
}
- private SipProfile getPeerProfile(SipSession session) {
- return session.getPeerProfile();
+ private void log(String s) {
+ Rlog.d(LOG_TAG, s);
+ }
+
+ private void loge(String s) {
+ Rlog.e(LOG_TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(LOG_TAG, s, t);
}
}
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index 74c3672..a94232a 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -21,10 +21,9 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.IBinder;
-import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.util.Log;
+import android.telephony.Rlog;
import java.text.ParseException;
@@ -591,7 +590,7 @@ public class SipManager {
: session.getLocalProfile().getUriString());
} catch (Throwable e) {
// SipService died? SIP stack died?
- Log.w(TAG, "getUri(): " + e);
+ Rlog.e(TAG, "getUri(): ", e);
return null;
}
}
diff --git a/voip/java/android/net/sip/SipSession.java b/voip/java/android/net/sip/SipSession.java
index e03cf9f..edbc66f 100644
--- a/voip/java/android/net/sip/SipSession.java
+++ b/voip/java/android/net/sip/SipSession.java
@@ -17,7 +17,7 @@
package android.net.sip;
import android.os.RemoteException;
-import android.util.Log;
+import android.telephony.Rlog;
/**
* Represents a SIP session that is associated with a SIP dialog or a standalone
@@ -242,7 +242,7 @@ public final class SipSession {
try {
realSession.setListener(createListener());
} catch (RemoteException e) {
- Log.e(TAG, "SipSession.setListener(): " + e);
+ loge("SipSession.setListener:", e);
}
}
}
@@ -261,7 +261,7 @@ public final class SipSession {
try {
return mSession.getLocalIp();
} catch (RemoteException e) {
- Log.e(TAG, "getLocalIp(): " + e);
+ loge("getLocalIp:", e);
return "127.0.0.1";
}
}
@@ -275,7 +275,7 @@ public final class SipSession {
try {
return mSession.getLocalProfile();
} catch (RemoteException e) {
- Log.e(TAG, "getLocalProfile(): " + e);
+ loge("getLocalProfile:", e);
return null;
}
}
@@ -290,7 +290,7 @@ public final class SipSession {
try {
return mSession.getPeerProfile();
} catch (RemoteException e) {
- Log.e(TAG, "getPeerProfile(): " + e);
+ loge("getPeerProfile:", e);
return null;
}
}
@@ -305,7 +305,7 @@ public final class SipSession {
try {
return mSession.getState();
} catch (RemoteException e) {
- Log.e(TAG, "getState(): " + e);
+ loge("getState:", e);
return State.NOT_DEFINED;
}
}
@@ -319,7 +319,7 @@ public final class SipSession {
try {
return mSession.isInCall();
} catch (RemoteException e) {
- Log.e(TAG, "isInCall(): " + e);
+ loge("isInCall:", e);
return false;
}
}
@@ -333,7 +333,7 @@ public final class SipSession {
try {
return mSession.getCallId();
} catch (RemoteException e) {
- Log.e(TAG, "getCallId(): " + e);
+ loge("getCallId:", e);
return null;
}
}
@@ -364,7 +364,7 @@ public final class SipSession {
try {
mSession.register(duration);
} catch (RemoteException e) {
- Log.e(TAG, "register(): " + e);
+ loge("register:", e);
}
}
@@ -381,7 +381,7 @@ public final class SipSession {
try {
mSession.unregister();
} catch (RemoteException e) {
- Log.e(TAG, "unregister(): " + e);
+ loge("unregister:", e);
}
}
@@ -402,7 +402,7 @@ public final class SipSession {
try {
mSession.makeCall(callee, sessionDescription, timeout);
} catch (RemoteException e) {
- Log.e(TAG, "makeCall(): " + e);
+ loge("makeCall:", e);
}
}
@@ -420,7 +420,7 @@ public final class SipSession {
try {
mSession.answerCall(sessionDescription, timeout);
} catch (RemoteException e) {
- Log.e(TAG, "answerCall(): " + e);
+ loge("answerCall:", e);
}
}
@@ -436,7 +436,7 @@ public final class SipSession {
try {
mSession.endCall();
} catch (RemoteException e) {
- Log.e(TAG, "endCall(): " + e);
+ loge("endCall:", e);
}
}
@@ -453,7 +453,7 @@ public final class SipSession {
try {
mSession.changeCall(sessionDescription, timeout);
} catch (RemoteException e) {
- Log.e(TAG, "changeCall(): " + e);
+ loge("changeCall:", e);
}
}
@@ -463,12 +463,14 @@ public final class SipSession {
private ISipSessionListener createListener() {
return new ISipSessionListener.Stub() {
+ @Override
public void onCalling(ISipSession session) {
if (mListener != null) {
mListener.onCalling(SipSession.this);
}
}
+ @Override
public void onRinging(ISipSession session, SipProfile caller,
String sessionDescription) {
if (mListener != null) {
@@ -477,12 +479,14 @@ public final class SipSession {
}
}
+ @Override
public void onRingingBack(ISipSession session) {
if (mListener != null) {
mListener.onRingingBack(SipSession.this);
}
}
+ @Override
public void onCallEstablished(ISipSession session,
String sessionDescription) {
if (mListener != null) {
@@ -491,18 +495,21 @@ public final class SipSession {
}
}
+ @Override
public void onCallEnded(ISipSession session) {
if (mListener != null) {
mListener.onCallEnded(SipSession.this);
}
}
+ @Override
public void onCallBusy(ISipSession session) {
if (mListener != null) {
mListener.onCallBusy(SipSession.this);
}
}
+ @Override
public void onCallTransferring(ISipSession session,
String sessionDescription) {
if (mListener != null) {
@@ -513,6 +520,7 @@ public final class SipSession {
}
}
+ @Override
public void onCallChangeFailed(ISipSession session, int errorCode,
String message) {
if (mListener != null) {
@@ -521,24 +529,28 @@ public final class SipSession {
}
}
+ @Override
public void onError(ISipSession session, int errorCode, String message) {
if (mListener != null) {
mListener.onError(SipSession.this, errorCode, message);
}
}
+ @Override
public void onRegistering(ISipSession session) {
if (mListener != null) {
mListener.onRegistering(SipSession.this);
}
}
+ @Override
public void onRegistrationDone(ISipSession session, int duration) {
if (mListener != null) {
mListener.onRegistrationDone(SipSession.this, duration);
}
}
+ @Override
public void onRegistrationFailed(ISipSession session, int errorCode,
String message) {
if (mListener != null) {
@@ -547,6 +559,7 @@ public final class SipSession {
}
}
+ @Override
public void onRegistrationTimeout(ISipSession session) {
if (mListener != null) {
mListener.onRegistrationTimeout(SipSession.this);
@@ -554,4 +567,8 @@ public final class SipSession {
}
};
}
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(TAG, s, t);
+ }
}
diff --git a/voip/java/com/android/server/sip/SipHelper.java b/voip/java/com/android/server/sip/SipHelper.java
index 113f007..c708be8 100644
--- a/voip/java/com/android/server/sip/SipHelper.java
+++ b/voip/java/com/android/server/sip/SipHelper.java
@@ -24,7 +24,7 @@ import gov.nist.javax.sip.header.extensions.ReferredByHeader;
import gov.nist.javax.sip.header.extensions.ReplacesHeader;
import android.net.sip.SipProfile;
-import android.util.Log;
+import android.telephony.Rlog;
import java.text.ParseException;
import java.util.ArrayList;
@@ -46,9 +46,7 @@ import javax.sip.SipFactory;
import javax.sip.SipProvider;
import javax.sip.SipStack;
import javax.sip.Transaction;
-import javax.sip.TransactionAlreadyExistsException;
import javax.sip.TransactionTerminatedEvent;
-import javax.sip.TransactionUnavailableException;
import javax.sip.TransactionState;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
@@ -73,8 +71,8 @@ import javax.sip.message.Response;
*/
class SipHelper {
private static final String TAG = SipHelper.class.getSimpleName();
- private static final boolean DEBUG = false;
- private static final boolean DEBUG_PING = false;
+ private static final boolean DBG = false;
+ private static final boolean DBG_PING = false;
private SipStack mSipStack;
private SipProvider mSipProvider;
@@ -262,7 +260,7 @@ class SipHelper {
ClientTransaction tid = responseEvent.getClientTransaction();
ClientTransaction ct = authenticationHelper.handleChallenge(
responseEvent.getResponse(), tid, mSipProvider, 5);
- if (DEBUG) Log.d(TAG, "send request with challenge response: "
+ if (DBG) log("send request with challenge response: "
+ ct.getRequest());
ct.sendRequest();
return ct;
@@ -301,7 +299,7 @@ class SipHelper {
"application", "sdp"));
ClientTransaction clientTransaction =
mSipProvider.getNewClientTransaction(request);
- if (DEBUG) Log.d(TAG, "send INVITE: " + request);
+ if (DBG) log("send INVITE: " + request);
clientTransaction.sendRequest();
return clientTransaction;
} catch (ParseException e) {
@@ -326,7 +324,7 @@ class SipHelper {
ClientTransaction clientTransaction =
mSipProvider.getNewClientTransaction(request);
- if (DEBUG) Log.d(TAG, "send RE-INVITE: " + request);
+ if (DBG) log("send RE-INVITE: " + request);
dialog.sendRequest(clientTransaction);
return clientTransaction;
} catch (ParseException e) {
@@ -360,7 +358,7 @@ class SipHelper {
ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
toHeader.setTag(tag);
response.addHeader(toHeader);
- if (DEBUG) Log.d(TAG, "send RINGING: " + response);
+ if (DBG) log("send RINGING: " + response);
transaction.sendResponse(response);
return transaction;
} catch (ParseException e) {
@@ -390,7 +388,7 @@ class SipHelper {
}
if (inviteTransaction.getState() != TransactionState.COMPLETED) {
- if (DEBUG) Log.d(TAG, "send OK: " + response);
+ if (DBG) log("send OK: " + response);
inviteTransaction.sendResponse(response);
}
@@ -412,7 +410,7 @@ class SipHelper {
}
if (inviteTransaction.getState() != TransactionState.COMPLETED) {
- if (DEBUG) Log.d(TAG, "send BUSY HERE: " + response);
+ if (DBG) log("send BUSY HERE: " + response);
inviteTransaction.sendResponse(response);
}
} catch (ParseException e) {
@@ -429,20 +427,20 @@ class SipHelper {
long cseq = ((CSeqHeader) response.getHeader(CSeqHeader.NAME))
.getSeqNumber();
Request ack = dialog.createAck(cseq);
- if (DEBUG) Log.d(TAG, "send ACK: " + ack);
+ if (DBG) log("send ACK: " + ack);
dialog.sendAck(ack);
}
public void sendBye(Dialog dialog) throws SipException {
Request byeRequest = dialog.createRequest(Request.BYE);
- if (DEBUG) Log.d(TAG, "send BYE: " + byeRequest);
+ if (DBG) log("send BYE: " + byeRequest);
dialog.sendRequest(mSipProvider.getNewClientTransaction(byeRequest));
}
public void sendCancel(ClientTransaction inviteTransaction)
throws SipException {
Request cancelRequest = inviteTransaction.createCancel();
- if (DEBUG) Log.d(TAG, "send CANCEL: " + cancelRequest);
+ if (DBG) log("send CANCEL: " + cancelRequest);
mSipProvider.getNewClientTransaction(cancelRequest).sendRequest();
}
@@ -452,9 +450,9 @@ class SipHelper {
Request request = event.getRequest();
Response response = mMessageFactory.createResponse(
responseCode, request);
- if (DEBUG && (!Request.OPTIONS.equals(request.getMethod())
- || DEBUG_PING)) {
- Log.d(TAG, "send response: " + response);
+ if (DBG && (!Request.OPTIONS.equals(request.getMethod())
+ || DBG_PING)) {
+ log("send response: " + response);
}
getServerTransaction(event).sendResponse(response);
} catch (ParseException e) {
@@ -474,7 +472,7 @@ class SipHelper {
"message", "sipfrag"));
request.addHeader(mHeaderFactory.createEventHeader(
ReferencesHeader.REFER));
- if (DEBUG) Log.d(TAG, "send NOTIFY: " + request);
+ if (DBG) log("send NOTIFY: " + request);
dialog.sendRequest(mSipProvider.getNewClientTransaction(request));
} catch (ParseException e) {
throw new SipException("sendReferNotify()", e);
@@ -486,7 +484,7 @@ class SipHelper {
try {
Response response = mMessageFactory.createResponse(
Response.REQUEST_TERMINATED, inviteRequest);
- if (DEBUG) Log.d(TAG, "send response: " + response);
+ if (DBG) log("send response: " + response);
inviteTransaction.sendResponse(response);
} catch (ParseException e) {
throw new SipException("sendInviteRequestTerminated()", e);
@@ -532,4 +530,8 @@ class SipHelper {
private static String getCallId(Dialog dialog) {
return dialog.getCallId().getCallId();
}
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
}
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java
index a477fd1..80fe68c 100644
--- a/voip/java/com/android/server/sip/SipService.java
+++ b/voip/java/com/android/server/sip/SipService.java
@@ -16,7 +16,6 @@
package com.android.server.sip;
-import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -44,22 +43,15 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
+import android.telephony.Rlog;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
import java.util.concurrent.Executor;
import javax.sip.SipException;
@@ -68,7 +60,7 @@ import javax.sip.SipException;
*/
public final class SipService extends ISipService.Stub {
static final String TAG = "SipService";
- static final boolean DEBUG = false;
+ static final boolean DBG = true;
private static final int EXPIRY_TIME = 3600;
private static final int SHORT_EXPIRY_TIME = 10;
private static final int MIN_EXPIRY_TIME = 60;
@@ -82,7 +74,7 @@ public final class SipService extends ISipService.Stub {
private WifiManager.WifiLock mWifiLock;
private boolean mSipOnWifiOnly;
- private IntervalMeasurementProcess mIntervalMeasurementProcess;
+ private SipKeepAliveProcessCallback mSipKeepAliveProcessCallback;
private MyExecutor mExecutor = new MyExecutor();
@@ -107,12 +99,12 @@ public final class SipService extends ISipService.Stub {
if (SipManager.isApiSupported(context)) {
ServiceManager.addService("sip", new SipService(context));
context.sendBroadcast(new Intent(SipManager.ACTION_SIP_SERVICE_UP));
- if (DEBUG) Log.d(TAG, "SIP service started");
+ if (DBG) slog("start:");
}
}
private SipService(Context context) {
- if (DEBUG) Log.d(TAG, " service started!");
+ if (DBG) log("SipService: started!");
mContext = context;
mConnectivityReceiver = new ConnectivityReceiver();
@@ -128,6 +120,7 @@ public final class SipService extends ISipService.Stub {
mTimer = new SipWakeupTimer(context, mExecutor);
}
+ @Override
public synchronized SipProfile[] getListOfProfiles() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
@@ -141,6 +134,7 @@ public final class SipService extends ISipService.Stub {
return profiles.toArray(new SipProfile[profiles.size()]);
}
+ @Override
public synchronized void open(SipProfile localProfile) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
@@ -148,11 +142,12 @@ public final class SipService extends ISipService.Stub {
try {
createGroup(localProfile);
} catch (SipException e) {
- Log.e(TAG, "openToMakeCalls()", e);
+ loge("openToMakeCalls()", e);
// TODO: how to send the exception back
}
}
+ @Override
public synchronized void open3(SipProfile localProfile,
PendingIntent incomingCallPendingIntent,
ISipSessionListener listener) {
@@ -160,11 +155,11 @@ public final class SipService extends ISipService.Stub {
android.Manifest.permission.USE_SIP, null);
localProfile.setCallingUid(Binder.getCallingUid());
if (incomingCallPendingIntent == null) {
- Log.w(TAG, "incomingCallPendingIntent cannot be null; "
+ if (DBG) log("open3: incomingCallPendingIntent cannot be null; "
+ "the profile is not opened");
return;
}
- if (DEBUG) Log.d(TAG, "open3: " + localProfile.getUriString() + ": "
+ if (DBG) log("open3: " + localProfile.getUriString() + ": "
+ incomingCallPendingIntent + ": " + listener);
try {
SipSessionGroupExt group = createGroup(localProfile,
@@ -174,7 +169,7 @@ public final class SipService extends ISipService.Stub {
updateWakeLocks();
}
} catch (SipException e) {
- Log.e(TAG, "openToReceiveCalls()", e);
+ loge("open3:", e);
// TODO: how to send the exception back
}
}
@@ -192,13 +187,14 @@ public final class SipService extends ISipService.Stub {
return (Binder.getCallingUid() == Process.PHONE_UID);
}
+ @Override
public synchronized void close(String localProfileUri) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
SipSessionGroupExt group = mSipGroups.get(localProfileUri);
if (group == null) return;
if (!isCallerCreatorOrRadio(group)) {
- Log.w(TAG, "only creator or radio can close this profile");
+ if (DBG) log("only creator or radio can close this profile");
return;
}
@@ -209,6 +205,7 @@ public final class SipService extends ISipService.Stub {
updateWakeLocks();
}
+ @Override
public synchronized boolean isOpened(String localProfileUri) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
@@ -217,11 +214,12 @@ public final class SipService extends ISipService.Stub {
if (isCallerCreatorOrRadio(group)) {
return true;
} else {
- Log.w(TAG, "only creator or radio can query on the profile");
+ if (DBG) log("only creator or radio can query on the profile");
return false;
}
}
+ @Override
public synchronized boolean isRegistered(String localProfileUri) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
@@ -230,11 +228,12 @@ public final class SipService extends ISipService.Stub {
if (isCallerCreatorOrRadio(group)) {
return group.isRegistered();
} else {
- Log.w(TAG, "only creator or radio can query on the profile");
+ if (DBG) log("only creator or radio can query on the profile");
return false;
}
}
+ @Override
public synchronized void setRegistrationListener(String localProfileUri,
ISipSessionListener listener) {
mContext.enforceCallingOrSelfPermission(
@@ -244,25 +243,31 @@ public final class SipService extends ISipService.Stub {
if (isCallerCreator(group)) {
group.setListener(listener);
} else {
- Log.w(TAG, "only creator can set listener on the profile");
+ if (DBG) log("only creator can set listener on the profile");
}
}
+ @Override
public synchronized ISipSession createSession(SipProfile localProfile,
ISipSessionListener listener) {
+ if (DBG) log("createSession: profile" + localProfile);
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
localProfile.setCallingUid(Binder.getCallingUid());
- if (mNetworkType == -1) return null;
+ if (mNetworkType == -1) {
+ if (DBG) log("createSession: mNetworkType==-1 ret=null");
+ return null;
+ }
try {
SipSessionGroupExt group = createGroup(localProfile);
return group.createSession(listener);
} catch (SipException e) {
- if (DEBUG) Log.d(TAG, "createSession()", e);
+ if (DBG) loge("createSession;", e);
return null;
}
}
+ @Override
public synchronized ISipSession getPendingSession(String callId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.USE_SIP, null);
@@ -276,7 +281,7 @@ public final class SipService extends ISipService.Stub {
s.connect(InetAddress.getByName("192.168.1.1"), 80);
return s.getLocalAddress().getHostAddress();
} catch (IOException e) {
- if (DEBUG) Log.d(TAG, "determineLocalIp()", e);
+ if (DBG) loge("determineLocalIp()", e);
// dont do anything; there should be a connectivity change going
return null;
}
@@ -317,7 +322,7 @@ public final class SipService extends ISipService.Stub {
}
private void notifyProfileAdded(SipProfile localProfile) {
- if (DEBUG) Log.d(TAG, "notify: profile added: " + localProfile);
+ if (DBG) log("notify: profile added: " + localProfile);
Intent intent = new Intent(SipManager.ACTION_SIP_ADD_PHONE);
intent.putExtra(SipManager.EXTRA_LOCAL_URI, localProfile.getUriString());
mContext.sendBroadcast(intent);
@@ -327,7 +332,7 @@ public final class SipService extends ISipService.Stub {
}
private void notifyProfileRemoved(SipProfile localProfile) {
- if (DEBUG) Log.d(TAG, "notify: profile removed: " + localProfile);
+ if (DBG) log("notify: profile removed: " + localProfile);
Intent intent = new Intent(SipManager.ACTION_SIP_REMOVE_PHONE);
intent.putExtra(SipManager.EXTRA_LOCAL_URI, localProfile.getUriString());
mContext.sendBroadcast(intent);
@@ -337,9 +342,9 @@ public final class SipService extends ISipService.Stub {
}
private void stopPortMappingMeasurement() {
- if (mIntervalMeasurementProcess != null) {
- mIntervalMeasurementProcess.stop();
- mIntervalMeasurementProcess = null;
+ if (mSipKeepAliveProcessCallback != null) {
+ mSipKeepAliveProcessCallback.stop();
+ mSipKeepAliveProcessCallback = null;
}
}
@@ -351,10 +356,10 @@ public final class SipService extends ISipService.Stub {
private void startPortMappingLifetimeMeasurement(
SipProfile localProfile, int maxInterval) {
- if ((mIntervalMeasurementProcess == null)
+ if ((mSipKeepAliveProcessCallback == null)
&& (mKeepAliveInterval == -1)
&& isBehindNAT(mLocalIp)) {
- Log.d(TAG, "start NAT port mapping timeout measurement on "
+ if (DBG) log("startPortMappingLifetimeMeasurement: profile="
+ localProfile.getUriString());
int minInterval = mLastGoodKeepAliveInterval;
@@ -363,11 +368,11 @@ public final class SipService extends ISipService.Stub {
// to the default min
minInterval = mLastGoodKeepAliveInterval
= DEFAULT_KEEPALIVE_INTERVAL;
- Log.d(TAG, " reset min interval to " + minInterval);
+ log(" reset min interval to " + minInterval);
}
- mIntervalMeasurementProcess = new IntervalMeasurementProcess(
+ mSipKeepAliveProcessCallback = new SipKeepAliveProcessCallback(
localProfile, minInterval, maxInterval);
- mIntervalMeasurementProcess.start();
+ mSipKeepAliveProcessCallback.start();
}
}
@@ -382,10 +387,10 @@ public final class SipService extends ISipService.Stub {
try {
cleanUpPendingSessions();
mPendingSessions.put(session.getCallId(), session);
- if (DEBUG) Log.d(TAG, "#pending sess=" + mPendingSessions.size());
+ if (DBG) log("#pending sess=" + mPendingSessions.size());
} catch (RemoteException e) {
// should not happen with a local call
- Log.e(TAG, "addPendingSession()", e);
+ loge("addPendingSession()", e);
}
}
@@ -405,7 +410,7 @@ public final class SipService extends ISipService.Stub {
String callId = ringingSession.getCallId();
for (SipSessionGroupExt group : mSipGroups.values()) {
if ((group != ringingGroup) && group.containsSession(callId)) {
- if (DEBUG) Log.d(TAG, "call self: "
+ if (DBG) log("call self: "
+ ringingSession.getLocalProfile().getUriString()
+ " -> " + group.getLocalProfile().getUriString());
return true;
@@ -428,31 +433,36 @@ public final class SipService extends ISipService.Stub {
private boolean isBehindNAT(String address) {
try {
+ // TODO: How is isBehindNAT used and why these constanst address:
+ // 10.x.x.x | 192.168.x.x | 172.16.x.x .. 172.19.x.x
byte[] d = InetAddress.getByName(address).getAddress();
if ((d[0] == 10) ||
- (((0x000000FF & ((int)d[0])) == 172) &&
- ((0x000000F0 & ((int)d[1])) == 16)) ||
- (((0x000000FF & ((int)d[0])) == 192) &&
- ((0x000000FF & ((int)d[1])) == 168))) {
+ (((0x000000FF & d[0]) == 172) &&
+ ((0x000000F0 & d[1]) == 16)) ||
+ (((0x000000FF & d[0]) == 192) &&
+ ((0x000000FF & d[1]) == 168))) {
return true;
}
} catch (UnknownHostException e) {
- Log.e(TAG, "isBehindAT()" + address, e);
+ loge("isBehindAT()" + address, e);
}
return false;
}
private class SipSessionGroupExt extends SipSessionAdapter {
+ private static final String SSGE_TAG = "SipSessionGroupExt";
+ private static final boolean SSGE_DBG = true;
private SipSessionGroup mSipGroup;
private PendingIntent mIncomingCallPendingIntent;
private boolean mOpenedToReceiveCalls;
- private AutoRegistrationProcess mAutoRegistration =
- new AutoRegistrationProcess();
+ private SipAutoReg mAutoRegistration =
+ new SipAutoReg();
public SipSessionGroupExt(SipProfile localProfile,
PendingIntent incomingCallPendingIntent,
ISipSessionListener listener) throws SipException {
+ if (SSGE_DBG) log("SipSessionGroupExt: profile=" + localProfile);
mSipGroup = new SipSessionGroup(duplicate(localProfile),
localProfile.getPassword(), mTimer, mMyWakeLock);
mIncomingCallPendingIntent = incomingCallPendingIntent;
@@ -481,7 +491,7 @@ public final class SipService extends ISipService.Stub {
try {
return new SipProfile.Builder(p).setPassword("*").build();
} catch (Exception e) {
- Log.wtf(TAG, "duplicate()", e);
+ loge("duplicate()", e);
throw new RuntimeException("duplicate profile", e);
}
}
@@ -500,20 +510,21 @@ public final class SipService extends ISipService.Stub {
mSipGroup.openToReceiveCalls(this);
mAutoRegistration.start(mSipGroup);
}
- if (DEBUG) Log.d(TAG, " openToReceiveCalls: " + getUri() + ": "
+ if (SSGE_DBG) log("openToReceiveCalls: " + getUri() + ": "
+ mIncomingCallPendingIntent);
}
public void onConnectivityChanged(boolean connected)
throws SipException {
+ if (SSGE_DBG) {
+ log("onConnectivityChanged: connected=" + connected + " uri="
+ + getUri() + ": " + mIncomingCallPendingIntent);
+ }
mSipGroup.onConnectivityChanged();
if (connected) {
mSipGroup.reset();
if (mOpenedToReceiveCalls) openToReceiveCalls();
} else {
- // close mSipGroup but remember mOpenedToReceiveCalls
- if (DEBUG) Log.d(TAG, " close auto reg temporarily: "
- + getUri() + ": " + mIncomingCallPendingIntent);
mSipGroup.close();
mAutoRegistration.stop();
}
@@ -523,23 +534,23 @@ public final class SipService extends ISipService.Stub {
mOpenedToReceiveCalls = false;
mSipGroup.close();
mAutoRegistration.stop();
- if (DEBUG) Log.d(TAG, " close: " + getUri() + ": "
- + mIncomingCallPendingIntent);
+ if (SSGE_DBG) log("close: " + getUri() + ": " + mIncomingCallPendingIntent);
}
public ISipSession createSession(ISipSessionListener listener) {
+ if (SSGE_DBG) log("createSession");
return mSipGroup.createSession(listener);
}
@Override
public void onRinging(ISipSession s, SipProfile caller,
String sessionDescription) {
- if (DEBUG) Log.d(TAG, "<<<<< onRinging()");
SipSessionGroup.SipSessionImpl session =
(SipSessionGroup.SipSessionImpl) s;
synchronized (SipService.this) {
try {
if (!isRegistered() || callingSelf(this, session)) {
+ if (SSGE_DBG) log("onRinging: end notReg or self");
session.endCall();
return;
}
@@ -548,13 +559,13 @@ public final class SipService extends ISipService.Stub {
addPendingSession(session);
Intent intent = SipManager.createIncomingCallBroadcast(
session.getCallId(), sessionDescription);
- if (DEBUG) Log.d(TAG, " ringing~~ " + getUri() + ": "
+ if (SSGE_DBG) log("onRinging: uri=" + getUri() + ": "
+ caller.getUri() + ": " + session.getCallId()
+ " " + mIncomingCallPendingIntent);
mIncomingCallPendingIntent.send(mContext,
SipManager.INCOMING_CALL_RESULT_CODE, intent);
} catch (PendingIntent.CanceledException e) {
- Log.w(TAG, "pendingIntent is canceled, drop incoming call");
+ loge("onRinging: pendingIntent is canceled, drop incoming call", e);
session.endCall();
}
}
@@ -563,7 +574,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onError(ISipSession session, int errorCode,
String message) {
- if (DEBUG) Log.d(TAG, "sip session error: "
+ if (SSGE_DBG) log("onError: errorCode=" + errorCode + " desc="
+ SipErrorCode.toString(errorCode) + ": " + message);
}
@@ -578,14 +589,23 @@ public final class SipService extends ISipService.Stub {
private String getUri() {
return mSipGroup.getLocalProfileUri();
}
+
+ private void log(String s) {
+ Rlog.d(SSGE_TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(SSGE_TAG, s, t);
+ }
+
}
- private class IntervalMeasurementProcess implements Runnable,
+ private class SipKeepAliveProcessCallback implements Runnable,
SipSessionGroup.KeepAliveProcessCallback {
- private static final String TAG = "SipKeepAliveInterval";
+ private static final String SKAI_TAG = "SipKeepAliveProcessCallback";
+ private static final boolean SKAI_DBG = true;
private static final int MIN_INTERVAL = 5; // in seconds
private static final int PASS_THRESHOLD = 10;
- private static final int MAX_RETRY_COUNT = 5;
private static final int NAT_MEASUREMENT_RETRY_INTERVAL = 120; // in seconds
private SipProfile mLocalProfile;
private SipSessionGroupExt mGroup;
@@ -595,7 +615,7 @@ public final class SipService extends ISipService.Stub {
private int mInterval;
private int mPassCount;
- public IntervalMeasurementProcess(SipProfile localProfile,
+ public SipKeepAliveProcessCallback(SipProfile localProfile,
int minInterval, int maxInterval) {
mMaxInterval = maxInterval;
mMinInterval = minInterval;
@@ -613,13 +633,13 @@ public final class SipService extends ISipService.Stub {
// Don't start measurement if the interval is too small
if (mInterval < DEFAULT_KEEPALIVE_INTERVAL || checkTermination()) {
- Log.w(TAG, "measurement aborted; interval=[" +
+ if (SKAI_DBG) log("start: measurement aborted; interval=[" +
mMinInterval + "," + mMaxInterval + "]");
return;
}
try {
- Log.d(TAG, "start measurement w interval=" + mInterval);
+ if (SKAI_DBG) log("start: interval=" + mInterval);
mGroup = new SipSessionGroupExt(mLocalProfile, null, null);
// TODO: remove this line once SipWakeupTimer can better handle
@@ -646,6 +666,7 @@ public final class SipService extends ISipService.Stub {
mGroup = null;
}
mTimer.cancel(this);
+ if (SKAI_DBG) log("stop");
}
}
@@ -654,13 +675,13 @@ public final class SipService extends ISipService.Stub {
// Return immediately if the measurement process is stopped
if (mSession == null) return;
- Log.d(TAG, "restart measurement w interval=" + mInterval);
+ if (SKAI_DBG) log("restart: interval=" + mInterval);
try {
mSession.stopKeepAliveProcess();
mPassCount = 0;
mSession.startKeepAliveProcess(mInterval, this);
} catch (SipException e) {
- Log.e(TAG, "restart()", e);
+ loge("restart", e);
}
}
}
@@ -681,8 +702,8 @@ public final class SipService extends ISipService.Stub {
mLastGoodKeepAliveInterval = mKeepAliveInterval;
}
mKeepAliveInterval = mMinInterval = mInterval;
- if (DEBUG) {
- Log.d(TAG, "measured good keepalive interval: "
+ if (SKAI_DBG) {
+ log("onResponse: portChanged=" + portChanged + " mKeepAliveInterval="
+ mKeepAliveInterval);
}
onKeepAliveIntervalChanged();
@@ -698,16 +719,16 @@ public final class SipService extends ISipService.Stub {
// measurement with min interval=DEFAULT_KEEPALIVE_INTERVAL
// will be conducted.
mKeepAliveInterval = mMinInterval;
- if (DEBUG) {
- Log.d(TAG, "measured keepalive interval: "
+ if (SKAI_DBG) {
+ log("onResponse: checkTermination mKeepAliveInterval="
+ mKeepAliveInterval);
}
} else {
// calculate the new interval and continue.
mInterval = (mMaxInterval + mMinInterval) / 2;
- if (DEBUG) {
- Log.d(TAG, "current interval: " + mKeepAliveInterval
- + ", test new interval: " + mInterval);
+ if (SKAI_DBG) {
+ log("onResponse: mKeepAliveInterval=" + mKeepAliveInterval
+ + ", new mInterval=" + mInterval);
}
restart();
}
@@ -717,7 +738,7 @@ public final class SipService extends ISipService.Stub {
// SipSessionGroup.KeepAliveProcessCallback
@Override
public void onError(int errorCode, String description) {
- Log.w(TAG, "interval measurement error: " + description);
+ if (SKAI_DBG) loge("onError: errorCode=" + errorCode + " desc=" + description);
restartLater();
}
@@ -735,12 +756,25 @@ public final class SipService extends ISipService.Stub {
mTimer.set(interval * 1000, this);
}
}
+
+ private void log(String s) {
+ Rlog.d(SKAI_TAG, s);
+ }
+
+ private void loge(String s) {
+ Rlog.d(SKAI_TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.d(SKAI_TAG, s, t);
+ }
}
- private class AutoRegistrationProcess extends SipSessionAdapter
+ private class SipAutoReg extends SipSessionAdapter
implements Runnable, SipSessionGroup.KeepAliveProcessCallback {
+ private String SAR_TAG;
+ private static final boolean SAR_DBG = true;
private static final int MIN_KEEPALIVE_SUCCESS_COUNT = 10;
- private String TAG = "SipAutoReg";
private SipSessionGroup.SipSessionImpl mSession;
private SipSessionGroup.SipSessionImpl mKeepAliveSession;
@@ -754,10 +788,6 @@ public final class SipService extends ISipService.Stub {
private int mKeepAliveSuccessCount = 0;
- private String getAction() {
- return toString();
- }
-
public void start(SipSessionGroup group) {
if (!mRunning) {
mRunning = true;
@@ -772,12 +802,13 @@ public final class SipService extends ISipService.Stub {
// in registration to avoid adding duplicate entries to server
mMyWakeLock.acquire(mSession);
mSession.unregister();
- TAG = "SipAutoReg:" + mSession.getLocalProfile().getUriString();
+ SAR_TAG = "SipAutoReg:" + mSession.getLocalProfile().getUriString();
+ if (SAR_DBG) log("start: group=" + group);
}
}
private void startKeepAliveProcess(int interval) {
- if (DEBUG) Log.d(TAG, "start keepalive w interval=" + interval);
+ if (SAR_DBG) log("startKeepAliveProcess: interval=" + interval);
if (mKeepAliveSession == null) {
mKeepAliveSession = mSession.duplicate();
} else {
@@ -786,8 +817,7 @@ public final class SipService extends ISipService.Stub {
try {
mKeepAliveSession.startKeepAliveProcess(interval, this);
} catch (SipException e) {
- Log.e(TAG, "failed to start keepalive w interval=" + interval,
- e);
+ loge("startKeepAliveProcess: interval=" + interval, e);
}
}
@@ -806,17 +836,19 @@ public final class SipService extends ISipService.Stub {
if (portChanged) {
int interval = getKeepAliveInterval();
if (mKeepAliveSuccessCount < MIN_KEEPALIVE_SUCCESS_COUNT) {
- Log.i(TAG, "keepalive doesn't work with interval "
- + interval + ", past success count="
- + mKeepAliveSuccessCount);
+ if (SAR_DBG) {
+ log("onResponse: keepalive doesn't work with interval "
+ + interval + ", past success count="
+ + mKeepAliveSuccessCount);
+ }
if (interval > DEFAULT_KEEPALIVE_INTERVAL) {
restartPortMappingLifetimeMeasurement(
mSession.getLocalProfile(), interval);
mKeepAliveSuccessCount = 0;
}
} else {
- if (DEBUG) {
- Log.i(TAG, "keep keepalive going with interval "
+ if (SAR_DBG) {
+ log("keep keepalive going with interval "
+ interval + ", past success count="
+ mKeepAliveSuccessCount);
}
@@ -847,8 +879,8 @@ public final class SipService extends ISipService.Stub {
// SipSessionGroup.KeepAliveProcessCallback
@Override
public void onError(int errorCode, String description) {
- if (DEBUG) {
- Log.e(TAG, "keepalive error: " + description);
+ if (SAR_DBG) {
+ loge("onError: errorCode=" + errorCode + " desc=" + description);
}
onResponse(true); // re-register immediately
}
@@ -872,8 +904,8 @@ public final class SipService extends ISipService.Stub {
public void onKeepAliveIntervalChanged() {
if (mKeepAliveSession != null) {
int newInterval = getKeepAliveInterval();
- if (DEBUG) {
- Log.v(TAG, "restart keepalive w interval=" + newInterval);
+ if (SAR_DBG) {
+ log("onKeepAliveIntervalChanged: interval=" + newInterval);
}
mKeepAliveSuccessCount = 0;
startKeepAliveProcess(newInterval);
@@ -916,7 +948,7 @@ public final class SipService extends ISipService.Stub {
String.valueOf(state));
}
} catch (Throwable t) {
- Log.w(TAG, "setListener(): " + t);
+ loge("setListener: ", t);
}
}
}
@@ -933,7 +965,7 @@ public final class SipService extends ISipService.Stub {
mErrorCode = SipErrorCode.NO_ERROR;
mErrorMessage = null;
- if (DEBUG) Log.d(TAG, "registering");
+ if (SAR_DBG) log("run: registering");
if (mNetworkType != -1) {
mMyWakeLock.acquire(mSession);
mSession.register(EXPIRY_TIME);
@@ -942,7 +974,7 @@ public final class SipService extends ISipService.Stub {
}
private void restart(int duration) {
- Log.d(TAG, "Refresh registration " + duration + "s later.");
+ if (SAR_DBG) log("restart: duration=" + duration + "s later.");
mTimer.cancel(this);
mTimer.set(duration * 1000, this);
}
@@ -959,7 +991,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onRegistering(ISipSession session) {
- if (DEBUG) Log.d(TAG, "onRegistering(): " + session);
+ if (SAR_DBG) log("onRegistering: " + session);
synchronized (SipService.this) {
if (notCurrentSession(session)) return;
@@ -979,7 +1011,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onRegistrationDone(ISipSession session, int duration) {
- if (DEBUG) Log.d(TAG, "onRegistrationDone(): " + session);
+ if (SAR_DBG) log("onRegistrationDone: " + session);
synchronized (SipService.this) {
if (notCurrentSession(session)) return;
@@ -1008,7 +1040,7 @@ public final class SipService extends ISipService.Stub {
} else {
mRegistered = false;
mExpiryTime = -1L;
- if (DEBUG) Log.d(TAG, "Refresh registration immediately");
+ if (SAR_DBG) log("Refresh registration immediately");
run();
}
}
@@ -1017,7 +1049,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onRegistrationFailed(ISipSession session, int errorCode,
String message) {
- if (DEBUG) Log.d(TAG, "onRegistrationFailed(): " + session + ": "
+ if (SAR_DBG) log("onRegistrationFailed: " + session + ": "
+ SipErrorCode.toString(errorCode) + ": " + message);
synchronized (SipService.this) {
if (notCurrentSession(session)) return;
@@ -1025,7 +1057,7 @@ public final class SipService extends ISipService.Stub {
switch (errorCode) {
case SipErrorCode.INVALID_CREDENTIALS:
case SipErrorCode.SERVER_UNREACHABLE:
- if (DEBUG) Log.d(TAG, " pause auto-registration");
+ if (SAR_DBG) log(" pause auto-registration");
stop();
break;
default:
@@ -1041,7 +1073,7 @@ public final class SipService extends ISipService.Stub {
@Override
public void onRegistrationTimeout(ISipSession session) {
- if (DEBUG) Log.d(TAG, "onRegistrationTimeout(): " + session);
+ if (SAR_DBG) log("onRegistrationTimeout: " + session);
synchronized (SipService.this) {
if (notCurrentSession(session)) return;
@@ -1053,9 +1085,22 @@ public final class SipService extends ISipService.Stub {
}
private void restartLater() {
+ if (SAR_DBG) loge("restartLater");
mRegistered = false;
restart(backoffDuration());
}
+
+ private void log(String s) {
+ Rlog.d(SAR_TAG, s);
+ }
+
+ private void loge(String s) {
+ Rlog.e(SAR_TAG, s);
+ }
+
+ private void loge(String s, Throwable e) {
+ Rlog.e(SAR_TAG, s, e);
+ }
}
private class ConnectivityReceiver extends BroadcastReceiver {
@@ -1068,6 +1113,7 @@ public final class SipService extends ISipService.Stub {
// Run the handler in MyExecutor to be protected by wake lock
mExecutor.execute(new Runnable() {
+ @Override
public void run() {
onConnectivityChanged(info);
}
@@ -1079,12 +1125,12 @@ public final class SipService extends ISipService.Stub {
private void registerReceivers() {
mContext.registerReceiver(mConnectivityReceiver,
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
- if (DEBUG) Log.d(TAG, " +++ register receivers");
+ if (DBG) log("registerReceivers:");
}
private void unregisterReceivers() {
mContext.unregisterReceiver(mConnectivityReceiver);
- if (DEBUG) Log.d(TAG, " --- unregister receivers");
+ if (DBG) log("unregisterReceivers:");
// Reset variables maintained by ConnectivityReceiver.
mWifiLock.release();
@@ -1131,10 +1177,11 @@ public final class SipService extends ISipService.Stub {
// Ignore the event if the current active network is not changed.
if (mNetworkType == networkType) {
+ // TODO: Maybe we need to send seq/generation number
return;
}
- if (DEBUG) {
- Log.d(TAG, "onConnectivityChanged(): " + mNetworkType +
+ if (DBG) {
+ log("onConnectivityChanged: " + mNetworkType +
" -> " + networkType);
}
@@ -1158,7 +1205,7 @@ public final class SipService extends ISipService.Stub {
}
updateWakeLocks();
} catch (SipException e) {
- Log.e(TAG, "onConnectivityChanged()", e);
+ loge("onConnectivityChanged()", e);
}
}
@@ -1186,7 +1233,7 @@ public final class SipService extends ISipService.Stub {
if (msg.obj instanceof Runnable) {
executeInternal((Runnable) msg.obj);
} else {
- Log.w(TAG, "can't handle msg: " + msg);
+ if (DBG) log("handleMessage: not Runnable ignore msg=" + msg);
}
}
@@ -1194,10 +1241,22 @@ public final class SipService extends ISipService.Stub {
try {
task.run();
} catch (Throwable t) {
- Log.e(TAG, "run task: " + task, t);
+ loge("run task: " + task, t);
} finally {
mMyWakeLock.release(task);
}
}
}
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
+
+ private static void slog(String s) {
+ Rlog.d(TAG, s);
+ }
+
+ private void loge(String s, Throwable e) {
+ Rlog.e(TAG, s, e);
+ }
}
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index 6acd456..e820f35 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -35,7 +35,7 @@ import android.net.sip.SipProfile;
import android.net.sip.SipSession;
import android.net.sip.SipSessionAdapter;
import android.text.TextUtils;
-import android.util.Log;
+import android.telephony.Rlog;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -43,7 +43,6 @@ import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
-import java.util.Collection;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
@@ -53,7 +52,6 @@ import javax.sip.ClientTransaction;
import javax.sip.Dialog;
import javax.sip.DialogTerminatedEvent;
import javax.sip.IOExceptionEvent;
-import javax.sip.ListeningPoint;
import javax.sip.ObjectInUseException;
import javax.sip.RequestEvent;
import javax.sip.ResponseEvent;
@@ -65,9 +63,7 @@ import javax.sip.SipProvider;
import javax.sip.SipStack;
import javax.sip.TimeoutEvent;
import javax.sip.Transaction;
-import javax.sip.TransactionState;
import javax.sip.TransactionTerminatedEvent;
-import javax.sip.TransactionUnavailableException;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
@@ -88,8 +84,8 @@ import javax.sip.message.Response;
*/
class SipSessionGroup implements SipListener {
private static final String TAG = "SipSession";
- private static final boolean DEBUG = false;
- private static final boolean DEBUG_PING = false;
+ private static final boolean DBG = false;
+ private static final boolean DBG_PING = false;
private static final String ANONYMOUS = "anonymous";
// Limit the size of thread pool to 1 for the order issue when the phone is
// waken up from sleep and there are many packets to be processed in the SIP
@@ -105,9 +101,6 @@ class SipSessionGroup implements SipListener {
private static final EventObject DEREGISTER = new EventObject("Deregister");
private static final EventObject END_CALL = new EventObject("End call");
- private static final EventObject HOLD_CALL = new EventObject("Hold call");
- private static final EventObject CONTINUE_CALL
- = new EventObject("Continue call");
private final SipProfile mLocalProfile;
private final String mPassword;
@@ -133,7 +126,7 @@ class SipSessionGroup implements SipListener {
/**
* @param profile the local profile with password crossed out
* @param password the password of the profile
- * @throws IOException if cannot assign requested address
+ * @throws SipException if cannot assign requested address
*/
public SipSessionGroup(SipProfile profile, String password,
SipWakeupTimer timer, SipWakeLock wakeLock) throws SipException {
@@ -206,7 +199,7 @@ class SipSessionGroup implements SipListener {
throw new SipException("failed to initialize SIP stack", e);
}
- Log.d(TAG, " start stack for " + mLocalProfile.getUriString());
+ if (DBG) log("reset: start stack for " + mLocalProfile.getUriString());
mSipStack.start();
}
@@ -224,8 +217,8 @@ class SipSessionGroup implements SipListener {
}
synchronized void resetExternalAddress() {
- if (DEBUG) {
- Log.d(TAG, " reset external addr on " + mSipStack);
+ if (DBG) {
+ log("resetExternalAddress: " + mSipStack);
}
mExternalIp = null;
mExternalPort = 0;
@@ -244,7 +237,7 @@ class SipSessionGroup implements SipListener {
}
public synchronized void close() {
- Log.d(TAG, " close stack for " + mLocalProfile.getUriString());
+ if (DBG) log("close: " + mLocalProfile.getUriString());
onConnectivityChanged();
mSessionMap.clear();
closeToNotReceiveCalls();
@@ -285,10 +278,10 @@ class SipSessionGroup implements SipListener {
String key = SipHelper.getCallId(event);
SipSessionImpl session = mSessionMap.get(key);
if ((session != null) && isLoggable(session)) {
- Log.d(TAG, "session key from event: " + key);
- Log.d(TAG, "active sessions:");
+ if (DBG) log("getSipSession: event=" + key);
+ if (DBG) log("getSipSession: active sessions:");
for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " ..." + k + ": " + mSessionMap.get(k));
+ if (DBG) log("getSipSession: ..." + k + ": " + mSessionMap.get(k));
}
}
return ((session != null) ? session : mCallReceiverSession);
@@ -299,9 +292,9 @@ class SipSessionGroup implements SipListener {
String key = newSession.getCallId();
mSessionMap.put(key, newSession);
if (isLoggable(newSession)) {
- Log.d(TAG, "+++ add a session with key: '" + key + "'");
+ if (DBG) log("addSipSession: key='" + key + "'");
for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " " + k + ": " + mSessionMap.get(k));
+ if (DBG) log("addSipSession: " + k + ": " + mSessionMap.get(k));
}
}
}
@@ -312,7 +305,7 @@ class SipSessionGroup implements SipListener {
SipSessionImpl s = mSessionMap.remove(key);
// sanity check
if ((s != null) && (s != session)) {
- Log.w(TAG, "session " + session + " is not associated with key '"
+ if (DBG) log("removeSession: " + session + " is not associated with key '"
+ key + "'");
mSessionMap.put(key, s);
for (Map.Entry<String, SipSessionImpl> entry
@@ -325,16 +318,17 @@ class SipSessionGroup implements SipListener {
}
if ((s != null) && isLoggable(s)) {
- Log.d(TAG, "remove session " + session + " @key '" + key + "'");
+ if (DBG) log("removeSession: " + session + " @key '" + key + "'");
for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " " + k + ": " + mSessionMap.get(k));
+ if (DBG) log("removeSession: " + k + ": " + mSessionMap.get(k));
}
}
}
+ @Override
public void processRequest(final RequestEvent event) {
if (isRequestEvent(Request.INVITE, event)) {
- if (DEBUG) Log.d(TAG, "<<<<< got INVITE, thread:"
+ if (DBG) log("processRequest: mWakeLock.acquire got INVITE, thread:"
+ Thread.currentThread());
// Acquire a wake lock and keep it for WAKE_LOCK_HOLDING_TIME;
// should be large enough to bring up the app.
@@ -343,22 +337,27 @@ class SipSessionGroup implements SipListener {
process(event);
}
+ @Override
public void processResponse(ResponseEvent event) {
process(event);
}
+ @Override
public void processIOException(IOExceptionEvent event) {
process(event);
}
+ @Override
public void processTimeout(TimeoutEvent event) {
process(event);
}
+ @Override
public void processTransactionTerminated(TransactionTerminatedEvent event) {
process(event);
}
+ @Override
public void processDialogTerminated(DialogTerminatedEvent event) {
process(event);
}
@@ -369,11 +368,11 @@ class SipSessionGroup implements SipListener {
boolean isLoggable = isLoggable(session, event);
boolean processed = (session != null) && session.process(event);
if (isLoggable && processed) {
- Log.d(TAG, "new state after: "
+ log("process: event new state after: "
+ SipSession.State.toString(session.mState));
}
} catch (Throwable e) {
- Log.w(TAG, "event process error: " + event, getRootCause(e));
+ loge("process: error event=" + event, getRootCause(e));
session.onError(e);
}
}
@@ -404,8 +403,8 @@ class SipSessionGroup implements SipListener {
if ((rport > 0) && (externalIp != null)) {
mExternalIp = externalIp;
mExternalPort = rport;
- if (DEBUG) {
- Log.d(TAG, " got external addr " + externalIp + ":" + rport
+ if (DBG) {
+ log("extractExternalAddress: external addr " + externalIp + ":" + rport
+ " on " + mSipStack);
}
}
@@ -436,6 +435,9 @@ class SipSessionGroup implements SipListener {
}
private class SipSessionCallReceiverImpl extends SipSessionImpl {
+ private static final String SSCRI_TAG = "SipSessionCallReceiverImpl";
+ private static final boolean SSCRI_DBG = true;
+
public SipSessionCallReceiverImpl(ISipSessionListener listener) {
super(listener);
}
@@ -473,8 +475,8 @@ class SipSessionGroup implements SipListener {
SipSessionImpl newSession = null;
if (replaces != null) {
int response = processInviteWithReplaces(event, replaces);
- if (DEBUG) {
- Log.v(TAG, "ReplacesHeader: " + replaces
+ if (SSCRI_DBG) {
+ log("processNewInviteRequest: " + replaces
+ " response=" + response);
}
if (response == Response.OK) {
@@ -501,10 +503,11 @@ class SipSessionGroup implements SipListener {
if (newSession != null) addSipSession(newSession);
}
+ @Override
public boolean process(EventObject evt) throws SipException {
- if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~ " + this + ": "
+ if (isLoggable(this, evt)) log("process: " + this + ": "
+ SipSession.State.toString(mState) + ": processing "
- + log(evt));
+ + logEvt(evt));
if (isRequestEvent(Request.INVITE, evt)) {
processNewInviteRequest((RequestEvent) evt);
return true;
@@ -515,6 +518,10 @@ class SipSessionGroup implements SipListener {
return false;
}
}
+
+ private void log(String s) {
+ Rlog.d(SSCRI_TAG, s);
+ }
}
static interface KeepAliveProcessCallback {
@@ -524,6 +531,9 @@ class SipSessionGroup implements SipListener {
}
class SipSessionImpl extends ISipSession.Stub {
+ private static final String SSI_TAG = "SipSessionImpl";
+ private static final boolean SSI_DBG = true;
+
SipProfile mPeerProfile;
SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
int mState = SipSession.State.READY_TO_CALL;
@@ -536,9 +546,9 @@ class SipSessionGroup implements SipListener {
SessionTimer mSessionTimer;
int mAuthenticationRetryCount;
- private KeepAliveProcess mKeepAliveProcess;
+ private SipKeepAlive mSipKeepAlive;
- private SipSessionImpl mKeepAliveSession;
+ private SipSessionImpl mSipSessionImpl;
// the following three members are used for handling refer request.
SipSessionImpl mReferSession;
@@ -551,6 +561,7 @@ class SipSessionGroup implements SipListener {
void start(final int timeout) {
new Thread(new Runnable() {
+ @Override
public void run() {
sleep(timeout);
if (mRunning) timeout();
@@ -573,7 +584,7 @@ class SipSessionGroup implements SipListener {
try {
this.wait(timeout * 1000);
} catch (InterruptedException e) {
- Log.e(TAG, "session timer interrupted!");
+ loge("session timer interrupted!", e);
}
}
}
@@ -617,28 +628,33 @@ class SipSessionGroup implements SipListener {
cancelSessionTimer();
- if (mKeepAliveSession != null) {
- mKeepAliveSession.stopKeepAliveProcess();
- mKeepAliveSession = null;
+ if (mSipSessionImpl != null) {
+ mSipSessionImpl.stopKeepAliveProcess();
+ mSipSessionImpl = null;
}
}
+ @Override
public boolean isInCall() {
return mInCall;
}
+ @Override
public String getLocalIp() {
return mLocalIp;
}
+ @Override
public SipProfile getLocalProfile() {
return mLocalProfile;
}
+ @Override
public SipProfile getPeerProfile() {
return mPeerProfile;
}
+ @Override
public String getCallId() {
return SipHelper.getCallId(getTransaction());
}
@@ -649,10 +665,12 @@ class SipSessionGroup implements SipListener {
return null;
}
+ @Override
public int getState() {
return mState;
}
+ @Override
public void setListener(ISipSessionListener listener) {
mProxy.setListener((listener instanceof SipSessionListenerProxy)
? ((SipSessionListenerProxy) listener).getListener()
@@ -662,11 +680,12 @@ class SipSessionGroup implements SipListener {
// process the command in a new thread
private void doCommandAsync(final EventObject command) {
new Thread(new Runnable() {
+ @Override
public void run() {
try {
processCommand(command);
} catch (Throwable e) {
- Log.w(TAG, "command error: " + command + ": "
+ loge("command error: " + command + ": "
+ mLocalProfile.getUriString(),
getRootCause(e));
onError(e);
@@ -675,12 +694,14 @@ class SipSessionGroup implements SipListener {
}, "SipSessionAsyncCmdThread").start();
}
+ @Override
public void makeCall(SipProfile peerProfile, String sessionDescription,
int timeout) {
doCommandAsync(new MakeCallCommand(peerProfile, sessionDescription,
timeout));
}
+ @Override
public void answerCall(String sessionDescription, int timeout) {
synchronized (SipSessionGroup.this) {
if (mPeerProfile == null) return;
@@ -689,10 +710,12 @@ class SipSessionGroup implements SipListener {
}
}
+ @Override
public void endCall() {
doCommandAsync(END_CALL);
}
+ @Override
public void changeCall(String sessionDescription, int timeout) {
synchronized (SipSessionGroup.this) {
if (mPeerProfile == null) return;
@@ -701,16 +724,18 @@ class SipSessionGroup implements SipListener {
}
}
+ @Override
public void register(int duration) {
doCommandAsync(new RegisterCommand(duration));
}
+ @Override
public void unregister() {
doCommandAsync(DEREGISTER);
}
private void processCommand(EventObject command) throws SipException {
- if (isLoggable(command)) Log.d(TAG, "process cmd: " + command);
+ if (isLoggable(command)) log("process cmd: " + command);
if (!process(command)) {
onError(SipErrorCode.IN_PROGRESS,
"cannot initiate a new transaction to execute: "
@@ -723,6 +748,7 @@ class SipSessionGroup implements SipListener {
return String.valueOf((long) (Math.random() * 0x100000000L));
}
+ @Override
public String toString() {
try {
String s = super.toString();
@@ -734,15 +760,15 @@ class SipSessionGroup implements SipListener {
}
public boolean process(EventObject evt) throws SipException {
- if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~ " + this + ": "
+ if (isLoggable(this, evt)) log(" ~~~~~ " + this + ": "
+ SipSession.State.toString(mState) + ": processing "
- + log(evt));
+ + logEvt(evt));
synchronized (SipSessionGroup.this) {
if (isClosed()) return false;
- if (mKeepAliveProcess != null) {
+ if (mSipKeepAlive != null) {
// event consumed by keepalive process
- if (mKeepAliveProcess.process(evt)) return true;
+ if (mSipKeepAlive.process(evt)) return true;
}
Dialog dialog = null;
@@ -824,7 +850,7 @@ class SipSessionGroup implements SipListener {
if (mDialog == event.getDialog()) {
onError(new SipException("dialog terminated"));
} else {
- Log.d(TAG, "not the current dialog; current=" + mDialog
+ if (SSI_DBG) log("not the current dialog; current=" + mDialog
+ ", terminated=" + event.getDialog());
}
}
@@ -838,11 +864,11 @@ class SipSessionGroup implements SipListener {
: event.getClientTransaction();
if ((current != target) && (mState != SipSession.State.PINGING)) {
- Log.d(TAG, "not the current transaction; current="
+ if (SSI_DBG) log("not the current transaction; current="
+ toString(current) + ", target=" + toString(target));
return false;
} else if (current != null) {
- Log.d(TAG, "transaction terminated: " + toString(current));
+ if (SSI_DBG) log("transaction terminated: " + toString(current));
return true;
} else {
// no transaction; shouldn't be here; ignored
@@ -865,17 +891,17 @@ class SipSessionGroup implements SipListener {
switch (mState) {
case SipSession.State.IN_CALL:
case SipSession.State.READY_TO_CALL:
- Log.d(TAG, "Transaction terminated; do nothing");
+ if (SSI_DBG) log("Transaction terminated; do nothing");
break;
default:
- Log.d(TAG, "Transaction terminated early: " + this);
+ if (SSI_DBG) log("Transaction terminated early: " + this);
onError(SipErrorCode.TRANSACTION_TERMINTED,
"transaction terminated");
}
}
private void processTimeout(TimeoutEvent event) {
- Log.d(TAG, "processing Timeout...");
+ if (SSI_DBG) log("processing Timeout...");
switch (mState) {
case SipSession.State.REGISTERING:
case SipSession.State.DEREGISTERING:
@@ -890,7 +916,7 @@ class SipSessionGroup implements SipListener {
break;
default:
- Log.d(TAG, " do nothing");
+ if (SSI_DBG) log(" do nothing");
break;
}
}
@@ -912,8 +938,8 @@ class SipSessionGroup implements SipListener {
if (expires != null && time < expires.getExpires()) {
time = expires.getExpires();
}
- if (DEBUG) {
- Log.v(TAG, "Expiry time = " + time);
+ if (SSI_DBG) {
+ log("Expiry time = " + time);
}
return time;
}
@@ -960,7 +986,7 @@ class SipSessionGroup implements SipListener {
mDialog = mClientTransaction.getDialog();
mAuthenticationRetryCount++;
if (isLoggable(this, event)) {
- Log.d(TAG, " authentication retry count="
+ if (SSI_DBG) log(" authentication retry count="
+ mAuthenticationRetryCount);
}
return true;
@@ -984,19 +1010,23 @@ class SipSessionGroup implements SipListener {
private AccountManager getAccountManager() {
return new AccountManager() {
+ @Override
public UserCredentials getCredentials(ClientTransaction
challengedTransaction, String realm) {
return new UserCredentials() {
+ @Override
public String getUserName() {
String username = mLocalProfile.getAuthUserName();
return (!TextUtils.isEmpty(username) ? username :
mLocalProfile.getUserName());
}
+ @Override
public String getPassword() {
return mPassword;
}
+ @Override
public String getSipDomain() {
return mLocalProfile.getSipDomain();
}
@@ -1097,8 +1127,7 @@ class SipSessionGroup implements SipListener {
return false;
}
- private boolean incomingCallToInCall(EventObject evt)
- throws SipException {
+ private boolean incomingCallToInCall(EventObject evt) {
// expect ACK, CANCEL request
if (isRequestEvent(Request.ACK, evt)) {
String sdp = extractContent(((RequestEvent) evt).getRequest());
@@ -1154,8 +1183,7 @@ class SipSessionGroup implements SipListener {
}
return true;
case Response.REQUEST_PENDING:
- // TODO:
- // rfc3261#section-14.1; re-schedule invite
+ // TODO: rfc3261#section-14.1; re-schedule invite
return true;
default:
if (mReferSession != null) {
@@ -1342,17 +1370,17 @@ class SipSessionGroup implements SipListener {
}
private void enableKeepAlive() {
- if (mKeepAliveSession != null) {
- mKeepAliveSession.stopKeepAliveProcess();
+ if (mSipSessionImpl != null) {
+ mSipSessionImpl.stopKeepAliveProcess();
} else {
- mKeepAliveSession = duplicate();
+ mSipSessionImpl = duplicate();
}
try {
- mKeepAliveSession.startKeepAliveProcess(
+ mSipSessionImpl.startKeepAliveProcess(
INCALL_KEEPALIVE_INTERVAL, mPeerProfile, null);
} catch (SipException e) {
- Log.w(TAG, "keepalive cannot be enabled; ignored", e);
- mKeepAliveSession.stopKeepAliveProcess();
+ loge("keepalive cannot be enabled; ignored", e);
+ mSipSessionImpl.stopKeepAliveProcess();
}
}
@@ -1454,12 +1482,6 @@ class SipSessionGroup implements SipListener {
mProxy.onRegistrationFailed(this, errorCode, message);
}
- private void onRegistrationFailed(Throwable exception) {
- exception = getRootCause(exception);
- onRegistrationFailed(getErrorCode(exception),
- exception.toString());
- }
-
private void onRegistrationFailed(Response response) {
int statusCode = response.getStatusCode();
onRegistrationFailed(getErrorCode(statusCode),
@@ -1480,28 +1502,30 @@ class SipSessionGroup implements SipListener {
public void startKeepAliveProcess(int interval, SipProfile peerProfile,
KeepAliveProcessCallback callback) throws SipException {
synchronized (SipSessionGroup.this) {
- if (mKeepAliveProcess != null) {
+ if (mSipKeepAlive != null) {
throw new SipException("Cannot create more than one "
+ "keepalive process in a SipSession");
}
mPeerProfile = peerProfile;
- mKeepAliveProcess = new KeepAliveProcess();
- mProxy.setListener(mKeepAliveProcess);
- mKeepAliveProcess.start(interval, callback);
+ mSipKeepAlive = new SipKeepAlive();
+ mProxy.setListener(mSipKeepAlive);
+ mSipKeepAlive.start(interval, callback);
}
}
public void stopKeepAliveProcess() {
synchronized (SipSessionGroup.this) {
- if (mKeepAliveProcess != null) {
- mKeepAliveProcess.stop();
- mKeepAliveProcess = null;
+ if (mSipKeepAlive != null) {
+ mSipKeepAlive.stop();
+ mSipKeepAlive = null;
}
}
}
- class KeepAliveProcess extends SipSessionAdapter implements Runnable {
- private static final String TAG = "SipKeepAlive";
+ class SipKeepAlive extends SipSessionAdapter implements Runnable {
+ private static final String SKA_TAG = "SipKeepAlive";
+ private static final boolean SKA_DBG = true;
+
private boolean mRunning = false;
private KeepAliveProcessCallback mCallback;
@@ -1516,8 +1540,8 @@ class SipSessionGroup implements SipListener {
mInterval = interval;
mCallback = new KeepAliveProcessCallbackProxy(callback);
mWakeupTimer.set(interval * 1000, this);
- if (DEBUG) {
- Log.d(TAG, "start keepalive:"
+ if (SKA_DBG) {
+ log("start keepalive:"
+ mLocalProfile.getUriString());
}
@@ -1526,7 +1550,7 @@ class SipSessionGroup implements SipListener {
}
// return true if the event is consumed
- boolean process(EventObject evt) throws SipException {
+ boolean process(EventObject evt) {
if (mRunning && (mState == SipSession.State.PINGING)) {
if (evt instanceof ResponseEvent) {
if (parseOptionsResult(evt)) {
@@ -1560,18 +1584,18 @@ class SipSessionGroup implements SipListener {
synchronized (SipSessionGroup.this) {
if (!mRunning) return;
- if (DEBUG_PING) {
+ if (DBG_PING) {
String peerUri = (mPeerProfile == null)
? "null"
: mPeerProfile.getUriString();
- Log.d(TAG, "keepalive: " + mLocalProfile.getUriString()
+ log("keepalive: " + mLocalProfile.getUriString()
+ " --> " + peerUri + ", interval=" + mInterval);
}
try {
sendKeepAlive();
} catch (Throwable t) {
- if (DEBUG) {
- Log.w(TAG, "keepalive error: "
+ if (SKA_DBG) {
+ loge("keepalive error: "
+ mLocalProfile.getUriString(), getRootCause(t));
}
// It's possible that the keepalive process is being stopped
@@ -1584,8 +1608,8 @@ class SipSessionGroup implements SipListener {
void stop() {
synchronized (SipSessionGroup.this) {
- if (DEBUG) {
- Log.d(TAG, "stop keepalive:" + mLocalProfile.getUriString()
+ if (SKA_DBG) {
+ log("stop keepalive:" + mLocalProfile.getUriString()
+ ",RPort=" + mRPort);
}
mRunning = false;
@@ -1594,7 +1618,7 @@ class SipSessionGroup implements SipListener {
}
}
- private void sendKeepAlive() throws SipException, InterruptedException {
+ private void sendKeepAlive() throws SipException {
synchronized (SipSessionGroup.this) {
mState = SipSession.State.PINGING;
mClientTransaction = mSipHelper.sendOptions(
@@ -1615,14 +1639,14 @@ class SipSessionGroup implements SipListener {
if (mRPort == 0) mRPort = rPort;
if (mRPort != rPort) {
mPortChanged = true;
- if (DEBUG) Log.d(TAG, String.format(
+ if (SKA_DBG) log(String.format(
"rport is changed: %d <> %d", mRPort, rPort));
mRPort = rPort;
} else {
- if (DEBUG) Log.d(TAG, "rport is the same: " + rPort);
+ if (SKA_DBG) log("rport is the same: " + rPort);
}
} else {
- if (DEBUG) Log.w(TAG, "peer did not respond rport");
+ if (SKA_DBG) log("peer did not respond rport");
}
return true;
}
@@ -1634,6 +1658,14 @@ class SipSessionGroup implements SipListener {
SIPHeaderNames.VIA));
return (viaHeader == null) ? -1 : viaHeader.getRPort();
}
+
+ private void log(String s) {
+ Rlog.d(SKA_TAG, s);
+ }
+ }
+
+ private void log(String s) {
+ Rlog.d(SSI_TAG, s);
}
}
@@ -1670,22 +1702,6 @@ class SipSessionGroup implements SipListener {
return false;
}
- /**
- * @return true if the event is a response event and the response code and
- * CSeqHeader method match the given arguments; false otherwise
- */
- private static boolean expectResponse(
- int responseCode, String expectedMethod, EventObject evt) {
- if (evt instanceof ResponseEvent) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
- if (response.getStatusCode() == responseCode) {
- return expectedMethod.equalsIgnoreCase(getCseqMethod(response));
- }
- }
- return false;
- }
-
private static SipProfile createPeerProfile(HeaderAddress header)
throws SipException {
try {
@@ -1710,10 +1726,10 @@ class SipSessionGroup implements SipListener {
if (s != null) {
switch (s.mState) {
case SipSession.State.PINGING:
- return DEBUG_PING;
+ return DBG_PING;
}
}
- return DEBUG;
+ return DBG;
}
private static boolean isLoggable(EventObject evt) {
@@ -1727,19 +1743,19 @@ class SipSessionGroup implements SipListener {
if (evt instanceof ResponseEvent) {
Response response = ((ResponseEvent) evt).getResponse();
if (Request.OPTIONS.equals(response.getHeader(CSeqHeader.NAME))) {
- return DEBUG_PING;
+ return DBG_PING;
}
- return DEBUG;
+ return DBG;
} else if (evt instanceof RequestEvent) {
if (isRequestEvent(Request.OPTIONS, evt)) {
- return DEBUG_PING;
+ return DBG_PING;
}
- return DEBUG;
+ return DBG;
}
return false;
}
- private static String log(EventObject evt) {
+ private static String logEvt(EventObject evt) {
if (evt instanceof RequestEvent) {
return ((RequestEvent) evt).getRequest().toString();
} else if (evt instanceof ResponseEvent) {
@@ -1767,11 +1783,6 @@ class SipSessionGroup implements SipListener {
private int mTimeout; // in seconds
public MakeCallCommand(SipProfile peerProfile,
- String sessionDescription) {
- this(peerProfile, sessionDescription, -1);
- }
-
- public MakeCallCommand(SipProfile peerProfile,
String sessionDescription, int timeout) {
super(peerProfile);
mSessionDescription = sessionDescription;
@@ -1793,6 +1804,7 @@ class SipSessionGroup implements SipListener {
/** Class to help safely run KeepAliveProcessCallback in a different thread. */
static class KeepAliveProcessCallbackProxy implements KeepAliveProcessCallback {
+ private static final String KAPCP_TAG = "KeepAliveProcessCallbackProxy";
private KeepAliveProcessCallback mCallback;
KeepAliveProcessCallbackProxy(KeepAliveProcessCallback callback) {
@@ -1806,30 +1818,46 @@ class SipSessionGroup implements SipListener {
new Thread(runnable, "SIP-KeepAliveProcessCallbackThread").start();
}
+ @Override
public void onResponse(final boolean portChanged) {
if (mCallback == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mCallback.onResponse(portChanged);
} catch (Throwable t) {
- Log.w(TAG, "onResponse", t);
+ loge("onResponse", t);
}
}
});
}
+ @Override
public void onError(final int errorCode, final String description) {
if (mCallback == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mCallback.onError(errorCode, description);
} catch (Throwable t) {
- Log.w(TAG, "onError", t);
+ loge("onError", t);
}
}
});
}
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(KAPCP_TAG, s, t);
+ }
+ }
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(TAG, s, t);
}
}
diff --git a/voip/java/com/android/server/sip/SipSessionListenerProxy.java b/voip/java/com/android/server/sip/SipSessionListenerProxy.java
index 8655a3a..7a4ae8d 100644
--- a/voip/java/com/android/server/sip/SipSessionListenerProxy.java
+++ b/voip/java/com/android/server/sip/SipSessionListenerProxy.java
@@ -20,11 +20,11 @@ import android.net.sip.ISipSession;
import android.net.sip.ISipSessionListener;
import android.net.sip.SipProfile;
import android.os.DeadObjectException;
-import android.util.Log;
+import android.telephony.Rlog;
/** Class to help safely run a callback in a different thread. */
class SipSessionListenerProxy extends ISipSessionListener.Stub {
- private static final String TAG = "SipSession";
+ private static final String TAG = "SipSessionListnerProxy";
private ISipSessionListener mListener;
@@ -43,9 +43,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
new Thread(runnable, "SipSessionCallbackThread").start();
}
+ @Override
public void onCalling(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCalling(session);
@@ -56,10 +58,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRinging(final ISipSession session, final SipProfile caller,
final String sessionDescription) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRinging(session, caller, sessionDescription);
@@ -70,9 +74,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRingingBack(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRingingBack(session);
@@ -83,10 +89,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onCallEstablished(final ISipSession session,
final String sessionDescription) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCallEstablished(session, sessionDescription);
@@ -97,9 +105,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onCallEnded(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCallEnded(session);
@@ -110,10 +120,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onCallTransferring(final ISipSession newSession,
final String sessionDescription) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCallTransferring(newSession, sessionDescription);
@@ -124,9 +136,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onCallBusy(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCallBusy(session);
@@ -137,10 +151,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onCallChangeFailed(final ISipSession session,
final int errorCode, final String message) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onCallChangeFailed(session, errorCode, message);
@@ -151,10 +167,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onError(final ISipSession session, final int errorCode,
final String message) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onError(session, errorCode, message);
@@ -165,9 +183,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRegistering(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRegistering(session);
@@ -178,10 +198,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRegistrationDone(final ISipSession session,
final int duration) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRegistrationDone(session, duration);
@@ -192,10 +214,12 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRegistrationFailed(final ISipSession session,
final int errorCode, final String message) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRegistrationFailed(session, errorCode, message);
@@ -206,9 +230,11 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
});
}
+ @Override
public void onRegistrationTimeout(final ISipSession session) {
if (mListener == null) return;
proxy(new Runnable() {
+ @Override
public void run() {
try {
mListener.onRegistrationTimeout(session);
@@ -225,7 +251,15 @@ class SipSessionListenerProxy extends ISipSessionListener.Stub {
// This creates race but it's harmless. Just don't log the error
// when it happens.
} else if (mListener != null) {
- Log.w(TAG, message, t);
+ loge(message, t);
}
}
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(TAG, s, t);
+ }
}
diff --git a/voip/java/com/android/server/sip/SipWakeLock.java b/voip/java/com/android/server/sip/SipWakeLock.java
index 0c4d14c..b3fbb56 100644
--- a/voip/java/com/android/server/sip/SipWakeLock.java
+++ b/voip/java/com/android/server/sip/SipWakeLock.java
@@ -17,13 +17,13 @@
package com.android.server.sip;
import android.os.PowerManager;
-import android.util.Log;
+import android.telephony.Rlog;
import java.util.HashSet;
class SipWakeLock {
- private static final boolean DEBUG = false;
private static final String TAG = "SipWakeLock";
+ private static final boolean DBG = false;
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
private PowerManager.WakeLock mTimerWakeLock;
@@ -34,7 +34,7 @@ class SipWakeLock {
}
synchronized void reset() {
- if (DEBUG) Log.v(TAG, "reset count=" + mHolders.size());
+ if (DBG) log("reset count=" + mHolders.size());
mHolders.clear();
release(null);
}
@@ -55,7 +55,7 @@ class SipWakeLock {
PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock");
}
if (!mWakeLock.isHeld()) mWakeLock.acquire();
- if (DEBUG) Log.v(TAG, "acquire count=" + mHolders.size());
+ if (DBG) log("acquire count=" + mHolders.size());
}
synchronized void release(Object holder) {
@@ -64,6 +64,10 @@ class SipWakeLock {
&& mWakeLock.isHeld()) {
mWakeLock.release();
}
- if (DEBUG) Log.v(TAG, "release count=" + mHolders.size());
+ if (DBG) log("release count=" + mHolders.size());
+ }
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
}
}
diff --git a/voip/java/com/android/server/sip/SipWakeupTimer.java b/voip/java/com/android/server/sip/SipWakeupTimer.java
index 00d47ac..3ba43312 100644
--- a/voip/java/com/android/server/sip/SipWakeupTimer.java
+++ b/voip/java/com/android/server/sip/SipWakeupTimer.java
@@ -23,31 +23,20 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.SystemClock;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Collection;
+import android.telephony.Rlog;
+
import java.util.Comparator;
-import java.util.HashMap;
import java.util.Iterator;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
import java.util.TreeSet;
import java.util.concurrent.Executor;
-import javax.sip.SipException;
/**
* Timer that can schedule events to occur even when the device is in sleep.
*/
class SipWakeupTimer extends BroadcastReceiver {
- private static final String TAG = "_SIP.WkTimer_";
+ private static final String TAG = "SipWakeupTimer";
+ private static final boolean DBG = SipService.DBG && true; // STOPSHIP if true
private static final String TRIGGER_TIME = "TriggerTime";
- private static final boolean DEBUG_TIMER = SipService.DEBUG && false;
private Context mContext;
private AlarmManager mAlarmManager;
@@ -85,7 +74,7 @@ class SipWakeupTimer extends BroadcastReceiver {
private boolean stopped() {
if (mEventQueue == null) {
- Log.w(TAG, "Timer stopped");
+ if (DBG) log("Timer stopped");
return true;
} else {
return false;
@@ -112,11 +101,11 @@ class SipWakeupTimer extends BroadcastReceiver {
}
TreeSet<MyEvent> newQueue = new TreeSet<MyEvent>(
mEventQueue.comparator());
- newQueue.addAll((Collection<MyEvent>) mEventQueue);
+ newQueue.addAll(mEventQueue);
mEventQueue.clear();
mEventQueue = newQueue;
- if (DEBUG_TIMER) {
- Log.d(TAG, "queue re-calculated");
+ if (DBG) {
+ log("queue re-calculated");
printQueue();
}
}
@@ -172,8 +161,8 @@ class SipWakeupTimer extends BroadcastReceiver {
}
long triggerTime = event.mTriggerTime;
- if (DEBUG_TIMER) {
- Log.d(TAG, " add event " + event + " scheduled on "
+ if (DBG) {
+ log("set: add event " + event + " scheduled on "
+ showTime(triggerTime) + " at " + showTime(now)
+ ", #events=" + mEventQueue.size());
printQueue();
@@ -187,7 +176,7 @@ class SipWakeupTimer extends BroadcastReceiver {
*/
public synchronized void cancel(Runnable callback) {
if (stopped() || mEventQueue.isEmpty()) return;
- if (DEBUG_TIMER) Log.d(TAG, "cancel:" + callback);
+ if (DBG) log("cancel:" + callback);
MyEvent firstEvent = mEventQueue.first();
for (Iterator<MyEvent> iter = mEventQueue.iterator();
@@ -195,7 +184,7 @@ class SipWakeupTimer extends BroadcastReceiver {
MyEvent event = iter.next();
if (event.mCallback == callback) {
iter.remove();
- if (DEBUG_TIMER) Log.d(TAG, " cancel found:" + event);
+ if (DBG) log(" cancel found:" + event);
}
}
if (mEventQueue.isEmpty()) {
@@ -209,8 +198,8 @@ class SipWakeupTimer extends BroadcastReceiver {
recalculatePeriods();
scheduleNext();
}
- if (DEBUG_TIMER) {
- Log.d(TAG, "after cancel:");
+ if (DBG) {
+ log("cancel: X");
printQueue();
}
}
@@ -242,33 +231,33 @@ class SipWakeupTimer extends BroadcastReceiver {
long triggerTime = intent.getLongExtra(TRIGGER_TIME, -1L);
execute(triggerTime);
} else {
- Log.d(TAG, "unrecognized intent: " + intent);
+ log("onReceive: unrecognized intent: " + intent);
}
}
private void printQueue() {
int count = 0;
for (MyEvent event : mEventQueue) {
- Log.d(TAG, " " + event + ": scheduled at "
+ log(" " + event + ": scheduled at "
+ showTime(event.mTriggerTime) + ": last at "
+ showTime(event.mLastTriggerTime));
if (++count >= 5) break;
}
if (mEventQueue.size() > count) {
- Log.d(TAG, " .....");
+ log(" .....");
} else if (count == 0) {
- Log.d(TAG, " <empty>");
+ log(" <empty>");
}
}
private void execute(long triggerTime) {
- if (DEBUG_TIMER) Log.d(TAG, "time's up, triggerTime = "
+ if (DBG) log("time's up, triggerTime = "
+ showTime(triggerTime) + ": " + mEventQueue.size());
if (stopped() || mEventQueue.isEmpty()) return;
for (MyEvent event : mEventQueue) {
if (event.mTriggerTime != triggerTime) continue;
- if (DEBUG_TIMER) Log.d(TAG, "execute " + event);
+ if (DBG) log("execute " + event);
event.mLastTriggerTime = triggerTime;
event.mTriggerTime += event.mPeriod;
@@ -276,8 +265,8 @@ class SipWakeupTimer extends BroadcastReceiver {
// run the callback in the handler thread to prevent deadlock
mExecutor.execute(event.mCallback);
}
- if (DEBUG_TIMER) {
- Log.d(TAG, "after timeout execution");
+ if (DBG) {
+ log("after timeout execution");
printQueue();
}
scheduleNext();
@@ -327,6 +316,7 @@ class SipWakeupTimer extends BroadcastReceiver {
// Sort the events by mMaxPeriod so that the first event can be used to
// align events with larger periods
private static class MyEventComparator implements Comparator<MyEvent> {
+ @Override
public int compare(MyEvent e1, MyEvent e2) {
if (e1 == e2) return 0;
int diff = e1.mMaxPeriod - e2.mMaxPeriod;
@@ -334,8 +324,13 @@ class SipWakeupTimer extends BroadcastReceiver {
return diff;
}
+ @Override
public boolean equals(Object that) {
return (this == that);
}
}
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
}
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index ac53eb2..66c2f3f 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -1089,17 +1089,19 @@ class WifiConfigStore {
break setVariables;
}
- HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
- for (String key : enterpriseFields.keySet()) {
- String value = enterpriseFields.get(key);
- if (!mWifiNative.setNetworkVariable(
- netId,
- key,
- value)) {
- loge(config.SSID + ": failed to set " + key +
- ": " + value);
- break setVariables;
- }
+ if (config.enterpriseConfig != null) {
+ HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
+ for (String key : enterpriseFields.keySet()) {
+ String value = enterpriseFields.get(key);
+ if (!mWifiNative.setNetworkVariable(
+ netId,
+ key,
+ value)) {
+ loge(config.SSID + ": failed to set " + key +
+ ": " + value);
+ break setVariables;
+ }
+ }
}
updateFailed = false;
}
@@ -1398,11 +1400,16 @@ class WifiConfigStore {
}
}
- HashMap<String, String> entepriseFields = config.enterpriseConfig.getFields();
- for (String key : entepriseFields.keySet()) {
+ if (config.enterpriseConfig == null) {
+ config.enterpriseConfig = new WifiEnterpriseConfig();
+ }
+ HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
+ for (String key : WifiEnterpriseConfig.getSupplicantKeys()) {
value = mWifiNative.getNetworkVariable(netId, key);
if (!TextUtils.isEmpty(value)) {
- entepriseFields.put(key, removeDoubleQuotes(value));
+ enterpriseFields.put(key, removeDoubleQuotes(value));
+ } else {
+ enterpriseFields.put(key, WifiEnterpriseConfig.EMPTY_VALUE);
}
}
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
index 46e446e..4dca7ac 100644
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
@@ -74,18 +74,14 @@ public class WifiEnterpriseConfig implements Parcelable {
/** This represents an empty value of an enterprise field.
* NULL is used at wpa_supplicant to indicate an empty value
*/
- private static final String EMPTY_VALUE = "NULL";
+ static final String EMPTY_VALUE = "NULL";
public WifiEnterpriseConfig() {
- // Set the required defaults
- mFields.put(EAP_KEY, Eap.strings[Eap.PEAP]);
- mFields.put(ENGINE_KEY, ENGINE_DISABLE);
+ // Do not set defaults so that the enterprise fields that are not changed
+ // by API are not changed underneath
+ // This is essential because an app may not have all fields like password
+ // available. It allows modification of subset of fields.
- for (String key : new String[] {PHASE2_KEY, IDENTITY_KEY, ANON_IDENTITY_KEY,
- PASSWORD_KEY, CLIENT_CERT_KEY, ENGINE_ID_KEY, PRIVATE_KEY_ID_KEY,
- CA_CERT_KEY, SUBJECT_MATCH_KEY}) {
- mFields.put(key, EMPTY_VALUE);
- }
}
/** Copy constructor */
@@ -128,6 +124,8 @@ public class WifiEnterpriseConfig implements Parcelable {
};
public static final class Eap {
+ /* NONE represents an empty enterprise config */
+ public static final int NONE = -1;
public static final int PEAP = 0;
public static final int TLS = 1;
public static final int TTLS = 2;
@@ -152,6 +150,13 @@ public class WifiEnterpriseConfig implements Parcelable {
return mFields;
}
+ /** Internal use only @hide */
+ public static String[] getSupplicantKeys() {
+ return new String[] { EAP_KEY, PHASE2_KEY, IDENTITY_KEY, ANON_IDENTITY_KEY, PASSWORD_KEY,
+ CLIENT_CERT_KEY, CA_CERT_KEY, SUBJECT_MATCH_KEY, ENGINE_KEY, ENGINE_ID_KEY,
+ PRIVATE_KEY_ID_KEY };
+ }
+
/**
* Set the EAP authentication method.
* @param eapMethod is one {@link Eap#PEAP}, {@link Eap#TLS}, {@link Eap#TTLS} or
@@ -177,7 +182,7 @@ public class WifiEnterpriseConfig implements Parcelable {
*/
public int getEapMethod() {
String eapMethod = mFields.get(EAP_KEY);
- return getStringIndex(Eap.strings, eapMethod, Eap.PEAP);
+ return getStringIndex(Eap.strings, eapMethod, Eap.NONE);
}
/**
@@ -211,7 +216,11 @@ public class WifiEnterpriseConfig implements Parcelable {
* @return a phase 2 method defined at {@link Phase2}
* */
public int getPhase2Method() {
- String phase2Method = mFields.get(PHASE2_KEY);
+ String phase2Method = removeDoubleQuotes(mFields.get(PHASE2_KEY));
+ // Remove auth= prefix
+ if (phase2Method.startsWith(Phase2.PREFIX)) {
+ phase2Method = phase2Method.substring(Phase2.PREFIX.length());
+ }
return getStringIndex(Phase2.strings, phase2Method, Phase2.NONE);
}
@@ -387,9 +396,7 @@ public class WifiEnterpriseConfig implements Parcelable {
*/
private int getStringIndex(String arr[], String toBeFound, int defaultIndex) {
for (int i = 0; i < arr.length; i++) {
- // toBeFound can be formatted with a prefix. For example, phase2
- // string has "auth=" as the prefix.
- if (toBeFound.contains(arr[i])) return i;
+ if (toBeFound.equals(arr[i])) return i;
}
return defaultIndex;
}