diff options
author | Jorim Jaggi <jjaggi@google.com> | 2015-04-01 11:18:57 -0700 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2015-04-03 11:12:03 -0700 |
commit | 225d3b5449d29b43e619d8538d024305f6e81ba9 (patch) | |
tree | 1b51b10b43df82fe733b89989b6fd765469f78a0 /services/voiceinteraction | |
parent | 25e12abc5b8a4aa83cfa150094fd145b777e6e03 (diff) | |
download | frameworks_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')
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) { |