Merge "Add callbacks to VoiceInteractionManagerService" into nyc-mr1-dev

This commit is contained in:
Annie Chin
2016-07-06 23:22:09 +00:00
committed by Android (Google) Code Review
8 changed files with 127 additions and 3 deletions

View File

@@ -308,6 +308,7 @@ LOCAL_SRC_FILES += \
core/java/com/android/internal/app/IEphemeralResolver.aidl \
core/java/com/android/internal/app/ISoundTriggerService.aidl \
core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl \
core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl \
core/java/com/android/internal/app/IVoiceInteractionSessionShowCallback.aidl \
core/java/com/android/internal/app/IVoiceInteractor.aidl \
core/java/com/android/internal/app/IVoiceInteractorCallback.aidl \

View File

@@ -132,6 +132,16 @@ public class AssistUtils {
}
}
public void registerVoiceInteractionSessionListener(IVoiceInteractionSessionListener listener) {
try {
if (mVoiceInteractionManagerService != null) {
mVoiceInteractionManagerService.registerVoiceInteractionSessionListener(listener);
}
} catch (RemoteException e) {
Log.w(TAG, "Failed to register voice interaction listener", e);
}
}
public ComponentName getAssistComponentForUser(int userId) {
final String setting = Settings.Secure.getStringForUser(mContext.getContentResolver(),
Settings.Secure.ASSISTANT, userId);

View File

@@ -22,6 +22,7 @@ import android.os.Bundle;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.IVoiceInteractionSessionListener;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
import android.hardware.soundtrigger.SoundTrigger;
import android.service.voice.IVoiceInteractionService;
@@ -136,4 +137,9 @@ interface IVoiceInteractionManagerService {
* Called when the lockscreen got shown.
*/
void onLockscreenShown();
/**
* Register a voice interaction listener.
*/
void registerVoiceInteractionSessionListener(IVoiceInteractionSessionListener listener);
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) 2016 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.android.internal.app;
oneway interface IVoiceInteractionSessionListener {
/**
* Called when a voice session is shown.
*/
void onVoiceSessionShown();
/**
* Called when a voice session is hidden.
*/
void onVoiceSessionHidden();
}

View File

@@ -15,6 +15,7 @@ import android.graphics.PixelFormat;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
@@ -28,9 +29,9 @@ import android.view.WindowManager;
import android.widget.ImageView;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.IVoiceInteractionSessionListener;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.CommandQueue;
@@ -52,7 +53,7 @@ public class AssistManager {
private AssistOrbContainer mView;
private final BaseStatusBar mBar;
private final AssistUtils mAssistUtils;
protected final AssistUtils mAssistUtils;
private IVoiceInteractionSessionShowCallback mShowCallback =
new IVoiceInteractionSessionShowCallback.Stub() {
@@ -82,6 +83,23 @@ public class AssistManager {
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mAssistUtils = new AssistUtils(context);
mAssistDisclosure = new AssistDisclosure(context, new Handler());
registerVoiceInteractionSessionListener();
}
protected void registerVoiceInteractionSessionListener() {
mAssistUtils.registerVoiceInteractionSessionListener(
new IVoiceInteractionSessionListener.Stub() {
@Override
public void onVoiceSessionShown() throws RemoteException {
Log.v(TAG, "Voice open");
}
@Override
public void onVoiceSessionHidden() throws RemoteException {
Log.v(TAG, "Voice closed");
}
});
}
public void onConfigurationChanged() {

View File

@@ -41,6 +41,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
@@ -55,15 +56,16 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import com.android.internal.app.IVoiceInteractionSessionListener;
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;
import com.android.server.LocalServices;
import com.android.server.soundtrigger.SoundTriggerInternal;
import com.android.server.SystemService;
import com.android.server.UiThread;
import com.android.server.soundtrigger.SoundTriggerInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -1037,6 +1039,13 @@ public class VoiceInteractionManagerService extends SystemService {
}
}
@Override
public void registerVoiceInteractionSessionListener(
IVoiceInteractionSessionListener listener) {
enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE);
mImpl.registerVoiceInteractionSessionListener(listener);
}
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP)

View File

@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -41,6 +42,7 @@ import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.view.IWindowManager;
import com.android.internal.app.IVoiceInteractionSessionListener;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.server.LocalServices;
@@ -71,6 +73,9 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
VoiceInteractionSessionConnection mActiveSession;
int mDisabledShowContext;
private final RemoteCallbackList<IVoiceInteractionSessionListener>
mVoiceInteractionSessionListeners = new RemoteCallbackList<>();
final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -353,10 +358,52 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
}
}
public void registerVoiceInteractionSessionListener(
IVoiceInteractionSessionListener listener) {
synchronized (mLock) {
mVoiceInteractionSessionListeners.register(listener);
}
}
@Override
public void sessionConnectionGone(VoiceInteractionSessionConnection connection) {
synchronized (mLock) {
finishLocked(connection.mToken, false);
}
}
@Override
public void onSessionShown(VoiceInteractionSessionConnection connection) {
synchronized (mLock) {
final int size = mVoiceInteractionSessionListeners.beginBroadcast();
for (int i = 0; i < size; ++i) {
final IVoiceInteractionSessionListener listener =
mVoiceInteractionSessionListeners.getBroadcastItem(i);
try {
listener.onVoiceSessionShown();
} catch (RemoteException e) {
Slog.e(TAG, "Error delivering voice interaction open event.", e);
}
}
mVoiceInteractionSessionListeners.finishBroadcast();
}
}
@Override
public void onSessionHidden(VoiceInteractionSessionConnection connection) {
synchronized (mLock) {
final int size = mVoiceInteractionSessionListeners.beginBroadcast();
for (int i = 0; i < size; ++i) {
final IVoiceInteractionSessionListener listener =
mVoiceInteractionSessionListeners.getBroadcastItem(i);
try {
listener.onVoiceSessionHidden();
} catch (RemoteException e) {
Slog.e(TAG, "Error delivering voice interaction closed event.", e);
}
}
mVoiceInteractionSessionListeners.finishBroadcast();
}
}
}

View File

@@ -130,6 +130,8 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
public interface Callback {
public void sessionConnectionGone(VoiceInteractionSessionConnection connection);
public void onSessionShown(VoiceInteractionSessionConnection connection);
public void onSessionHidden(VoiceInteractionSessionConnection connection);
}
final ServiceConnection mFullConnection = new ServiceConnection() {
@@ -313,6 +315,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
} else if (showCallback != null) {
mPendingShowCallbacks.add(showCallback);
}
mCallback.onSessionShown(this);
return true;
}
if (showCallback != null) {
@@ -468,6 +471,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {
} catch (RemoteException e) {
}
}
mCallback.onSessionHidden(this);
}
if (mFullyBound) {
mContext.unbindService(mFullConnection);