summaryrefslogtreecommitdiffstats
path: root/services/voiceinteraction
diff options
context:
space:
mode:
authorJorim Jaggi <jjaggi@google.com>2015-04-01 11:18:57 -0700
committerJorim Jaggi <jjaggi@google.com>2015-04-03 11:12:03 -0700
commit225d3b5449d29b43e619d8538d024305f6e81ba9 (patch)
tree1b51b10b43df82fe733b89989b6fd765469f78a0 /services/voiceinteraction
parent25e12abc5b8a4aa83cfa150094fd145b777e6e03 (diff)
downloadframeworks_base-225d3b5449d29b43e619d8538d024305f6e81ba9.zip
frameworks_base-225d3b5449d29b43e619d8538d024305f6e81ba9.tar.gz
frameworks_base-225d3b5449d29b43e619d8538d024305f6e81ba9.tar.bz2
Add more internal API's for assist
- When starting a voice interaction session from SysUI, a callback can be passed to know when voice interaction has successfully started - Add a new window type for the voice interaction starting window, which resides behind the voice interaction layer. - SystemUI now also inspects the voice interaction service to get the logo asset for the starting window. - Make VoiceInteractionSession window fullscreen, to accomodate for the visuals. Change-Id: If8c3c445e8b39841f48e8d153e6d1ba81e447286
Diffstat (limited to 'services/voiceinteraction')
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java26
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java6
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java57
3 files changed, 80 insertions, 9 deletions
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index d8b9140..1203735 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -26,6 +26,7 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.database.ContentObserver;
@@ -50,6 +51,7 @@ import android.text.TextUtils;
import android.util.Slog;
import com.android.internal.app.IVoiceInteractionManagerService;
+import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.BackgroundThread;
@@ -396,7 +398,8 @@ public class VoiceInteractionManagerService extends SystemService {
final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- mImpl.showSessionLocked(callingPid, callingUid, args, flags);
+ mImpl.showSessionLocked(callingPid, callingUid, args, flags,
+ null /* showCallback */);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -434,7 +437,8 @@ public class VoiceInteractionManagerService extends SystemService {
final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- return mImpl.showSessionLocked(callingPid, callingUid, sessionArgs, flags);
+ return mImpl.showSessionLocked(callingPid, callingUid, sessionArgs, flags,
+ null /* showCallback */);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -720,7 +724,20 @@ public class VoiceInteractionManagerService extends SystemService {
}
@Override
- public void showSessionForActiveService() {
+ public ComponentName getActiveServiceComponentName() {
+ synchronized (this) {
+ if (mContext.checkCallingPermission(
+ Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Caller does not hold the permission "
+ + Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE);
+ }
+ return mImpl != null ? mImpl.mComponent : null;
+ }
+ }
+
+ @Override
+ public void showSessionForActiveService(IVoiceInteractionSessionShowCallback showCallback) {
synchronized (this) {
if (mContext.checkCallingPermission(
Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE)
@@ -740,7 +757,8 @@ public class VoiceInteractionManagerService extends SystemService {
mImpl.showSessionLocked(callingPid, callingUid, new Bundle() /* sessionArgs */,
VoiceInteractionService.START_SOURCE_SYSTEM
| VoiceInteractionService.START_WITH_ASSIST
- | VoiceInteractionService.START_WITH_SCREENSHOT);
+ | VoiceInteractionService.START_WITH_SCREENSHOT,
+ showCallback);
} finally {
Binder.restoreCallingIdentity(caller);
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
index 5a91b88..1aa0d0b 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
@@ -39,6 +39,7 @@ import android.service.voice.VoiceInteractionServiceInfo;
import android.util.Slog;
import android.view.IWindowManager;
+import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import java.io.FileDescriptor;
@@ -134,12 +135,13 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
mContext.registerReceiver(mBroadcastReceiver, filter, null, handler);
}
- public boolean showSessionLocked(int callingPid, int callingUid, Bundle args, int flags) {
+ public boolean showSessionLocked(int callingPid, int callingUid, Bundle args, int flags,
+ IVoiceInteractionSessionShowCallback showCallback) {
if (mActiveSession == null) {
mActiveSession = new VoiceInteractionSessionConnection(mLock, mSessionComponentName,
mUser, mContext, this, callingPid, callingUid);
}
- return mActiveSession.showLocked(args, flags);
+ return mActiveSession.showLocked(args, flags, showCallback);
}
public boolean hideSessionLocked(int callingPid, int callingUid) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
index 7a379c2..73c7363 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
@@ -41,10 +41,12 @@ import android.util.Slog;
import android.view.IWindowManager;
import android.view.WindowManager;
import com.android.internal.app.IAssistScreenshotReceiver;
+import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.os.IResultReceiver;
import java.io.PrintWriter;
+import java.util.ArrayList;
final class VoiceInteractionSessionConnection implements ServiceConnection {
final static String TAG = "VoiceInteractionServiceManager";
@@ -74,6 +76,26 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
Bundle mAssistData;
boolean mHaveScreenshot;
Bitmap mScreenshot;
+ ArrayList<IVoiceInteractionSessionShowCallback> mPendingShowCallbacks = new ArrayList<>();
+
+ IVoiceInteractionSessionShowCallback mShowCallback =
+ new IVoiceInteractionSessionShowCallback.Stub() {
+ @Override
+ public void onFailed() throws RemoteException {
+ synchronized (mLock) {
+ notifyPendingShowCallbacksFailedLocked();
+ }
+ }
+
+ @Override
+ public void onShown() throws RemoteException {
+ synchronized (mLock) {
+ // TODO: Figure out whether this is good enough or whether we need to hook into
+ // Window manager to actually wait for the window to be drawn.
+ notifyPendingShowCallbacksShownLocked();
+ }
+ }
+ };
public interface Callback {
public void sessionConnectionGone(VoiceInteractionSessionConnection connection);
@@ -151,7 +173,8 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
}
}
- public boolean showLocked(Bundle args, int flags) {
+ public boolean showLocked(Bundle args, int flags,
+ IVoiceInteractionSessionShowCallback showCallback) {
if (mBound) {
if (!mFullyBound) {
mFullyBound = mContext.bindServiceAsUser(mBindIntent, mFullConnection,
@@ -182,15 +205,23 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
}
if (mSession != null) {
try {
- mSession.show(mShowArgs, mShowFlags);
+ mSession.show(mShowArgs, mShowFlags, showCallback);
mShowArgs = null;
mShowFlags = 0;
} catch (RemoteException e) {
}
deliverSessionDataLocked();
+ } else if (showCallback != null) {
+ mPendingShowCallbacks.add(showCallback);
}
return true;
}
+ if (showCallback != null) {
+ try {
+ showCallback.onFailed();
+ } catch (RemoteException e) {
+ }
+ }
return false;
}
@@ -320,7 +351,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
mInteractor = interactor;
if (mShown) {
try {
- session.show(mShowArgs, mShowFlags);
+ session.show(mShowArgs, mShowFlags, mShowCallback);
mShowArgs = null;
mShowFlags = 0;
} catch (RemoteException e) {
@@ -330,6 +361,26 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
return true;
}
+ private void notifyPendingShowCallbacksShownLocked() {
+ for (int i = 0; i < mPendingShowCallbacks.size(); i++) {
+ try {
+ mPendingShowCallbacks.get(i).onShown();
+ } catch (RemoteException e) {
+ }
+ }
+ mPendingShowCallbacks.clear();
+ }
+
+ private void notifyPendingShowCallbacksFailedLocked() {
+ for (int i = 0; i < mPendingShowCallbacks.size(); i++) {
+ try {
+ mPendingShowCallbacks.get(i).onFailed();
+ } catch (RemoteException e) {
+ }
+ }
+ mPendingShowCallbacks.clear();
+ }
+
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized (mLock) {