Fix issue #22564918: Request is inactive
Add Request.isActive() API. Also improve documentation to tell
people what things cause it to become inactive. And fix a race
where we were modifying the active list from outside the main
thread without locking it.
Change-Id: I9248e014126cb121612edbe595108ace753456e2
diff --git a/api/current.txt b/api/current.txt
index 21ca33c..79d5ea0 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -28898,6 +28898,7 @@
method public java.lang.String getCallingPackage();
method public int getCallingUid();
method public android.os.Bundle getExtras();
+ method public boolean isActive();
}
public abstract class VoiceInteractionSessionService extends android.app.Service {
diff --git a/api/system-current.txt b/api/system-current.txt
index bbff8c0..0af72d5 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -31050,6 +31050,7 @@
method public java.lang.String getCallingPackage();
method public int getCallingUid();
method public android.os.Bundle getExtras();
+ method public boolean isActive();
}
public abstract class VoiceInteractionSessionService extends android.app.Service {
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index a3ccbd3..f08e93c 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -322,6 +322,22 @@
return mExtras;
}
+ /**
+ * Check whether this request is currently active. A request becomes inactive after
+ * calling {@link #cancel} or a final result method that completes the request. After
+ * this point, further interactions with the request will result in
+ * {@link java.lang.IllegalStateException} errors; you should not catch these errors,
+ * but can use this method if you need to determine the state of the request. Returns
+ * true if the request is still active.
+ */
+ public boolean isActive() {
+ VoiceInteractionSession session = mSession.get();
+ if (session == null) {
+ return false;
+ }
+ return session.isRequestActive(mInterface.asBinder());
+ }
+
void finishRequest() {
VoiceInteractionSession session = mSession.get();
if (session == null) {
@@ -338,6 +354,7 @@
/**
* Ask the app to cancel this current request.
+ * This also finishes the request (it is no longer active).
*/
public void cancel() {
try {
@@ -389,6 +406,7 @@
* in a call to
* {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult
* VoiceInteractor.ConfirmationRequest.onConfirmationResult}.
+ * This finishes the request (it is no longer active).
*/
public void sendConfirmationResult(boolean confirmed, Bundle result) {
try {
@@ -475,6 +493,7 @@
* and resulting in a call to
* {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult
* VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished.
+ * This finishes the request (it is no longer active).
*/
public void sendPickOptionResult(
VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
@@ -522,6 +541,7 @@
* in a call to
* {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult
* VoiceInteractor.CompleteVoiceRequest.onCompleteResult}.
+ * This finishes the request (it is no longer active).
*/
public void sendCompleteResult(Bundle result) {
try {
@@ -570,7 +590,8 @@
* Report that the voice interactor has finished aborting the voice operation, resulting
* in a call to
* {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult
- * VoiceInteractor.AbortVoiceRequest.onAbortResult}.
+ * VoiceInteractor.AbortVoiceRequest.onAbortResult}. This finishes the request (it
+ * is no longer active).
*/
public void sendAbortResult(Bundle result) {
try {
@@ -630,6 +651,7 @@
* Report the final result of the request, completing the request and resulting in a call to
* {@link android.app.VoiceInteractor.CommandRequest#onCommandResult
* VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted.
+ * This finishes the request (it is no longer active).
*/
public void sendResult(Bundle result) {
sendCommandResult(true, result);
@@ -820,7 +842,15 @@
}
void addRequest(Request req) {
- mActiveRequests.put(req.mInterface.asBinder(), req);
+ synchronized (this) {
+ mActiveRequests.put(req.mInterface.asBinder(), req);
+ }
+ }
+
+ boolean isRequestActive(IBinder reqInterface) {
+ synchronized (this) {
+ return mActiveRequests.containsKey(reqInterface);
+ }
}
Request removeRequest(IBinder reqInterface) {