OSDN Git Service

Merge "Fixed an animation bug with inline view updates" into lmp-dev
authorSelim Cinek <cinek@google.com>
Mon, 11 Aug 2014 17:28:25 +0000 (17:28 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Mon, 11 Aug 2014 17:09:03 +0000 (17:09 +0000)
api/current.txt
core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
core/java/android/provider/CallLog.java
core/java/android/service/voice/AlwaysOnHotwordDetector.java
core/java/android/service/voice/VoiceInteractionService.java
services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java

index 8045c83..eb991ad 100644 (file)
@@ -27774,9 +27774,8 @@ package android.service.voice {
   }
 
   public static class AlwaysOnHotwordDetector.EventPayload {
-    field public final android.media.AudioFormat audioFormat;
-    field public final byte[] data;
-    field public final boolean triggerAvailable;
+    method public android.media.AudioFormat getCaptureAudioFormat();
+    method public byte[] getTriggerAudio();
   }
 
   public class VoiceInteractionService extends android.app.Service {
index 2e96487..0dbde6b 100644 (file)
@@ -33,6 +33,7 @@ import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -263,4 +264,11 @@ public class KeyphraseEnrollmentInfo {
         Slog.w(TAG, "Enrollment application doesn't support the given keyphrase/locale");
         return null;
     }
+
+    @Override
+    public String toString() {
+        return "KeyphraseEnrollmentInfo [Keyphrases=" + Arrays.toString(mKeyphrases)
+                + ", EnrollmentPackage=" + mEnrollmentPackage + ", ParseError=" + mParseError
+                + "]";
+    }
 }
index 47cfa7d..8db99a5 100644 (file)
@@ -510,9 +510,10 @@ public class CallLog {
                 for (int i = 0; i < count; i++) {
                     final UserInfo user = users.get(i);
                     final UserHandle userHandle = user.getUserHandle();
-                    if (userManager.isUserRunning(userHandle) &&
-                            !userManager.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS,
-                                    userHandle)) {
+                    if (userManager.isUserRunning(userHandle)
+                            && !userManager.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS,
+                                    userHandle)
+                            && !user.isManagedProfile()) {
                         Uri uri = addEntryAndRemoveExpiredEntries(context,
                                 ContentProvider.maybeAddUserId(CONTENT_URI, user.id), values);
                         if (user.id == currentUserId) {
index f1e1943..15e66a0 100644 (file)
@@ -39,6 +39,8 @@ import android.util.Slog;
 
 import com.android.internal.app.IVoiceInteractionManagerService;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -185,48 +187,77 @@ public class AlwaysOnHotwordDetector {
      * Additional payload for {@link Callback#onDetected}.
      */
     public static class EventPayload {
+        private final boolean mTriggerAvailable;
+        // Indicates if {@code captureSession} can be used to continue capturing more audio
+        // from the DSP hardware.
+        private final boolean mCaptureAvailable;
+        // The session to use when attempting to capture more audio from the DSP hardware.
+        private final int mCaptureSession;
+        private final AudioFormat mAudioFormat;
+        // Raw data associated with the event.
+        // This is the audio that triggered the keyphrase if {@code isTriggerAudio} is true.
+        private final byte[] mData;
+
+        private EventPayload(boolean triggerAvailable, boolean captureAvailable,
+                AudioFormat audioFormat, int captureSession, byte[] data) {
+            mTriggerAvailable = triggerAvailable;
+            mCaptureAvailable = captureAvailable;
+            mCaptureSession = captureSession;
+            mAudioFormat = audioFormat;
+            mData = data;
+        }
+
         /**
-         * Indicates if {@code data} is the audio that triggered the keyphrase.
+         * Gets the format of the audio obtained using {@link #getTriggerAudio()}.
+         * May be null if there's no audio present.
          */
-        public final boolean triggerAvailable;
+        @Nullable
+        public AudioFormat getCaptureAudioFormat() {
+            return mAudioFormat;
+        }
+
         /**
-         * Indicates if {@code captureSession} can be used to continue capturing more audio from
-         * the DSP hardware.
+         * Gets the raw audio that triggered the keyphrase.
+         * This may be null if the trigger audio isn't available.
+         * If non-null, the format of the audio can be obtained by calling
+         * {@link #getCaptureAudioFormat()}.
          *
-         * Candidate for public API
-         * @hide
+         * @see AlwaysOnHotwordDetector#RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO
          */
-        public final boolean captureAvailable;
+        @Nullable
+        public byte[] getTriggerAudio() {
+            if (mTriggerAvailable) {
+                return mData;
+            } else {
+                return null;
+            }
+        }
+
         /**
-         * The session to use when attempting to capture more audio from the DSP hardware.
+         * Gets the session ID to start a capture from the DSP.
+         * This may be null if streaming capture isn't possible.
+         * If non-null, the format of the audio that can be captured can be
+         * obtained using {@link #getCaptureAudioFormat()}.
+         *
+         * TODO: Candidate for Public API when the API to start capture with a session ID
+         * is made public.
+         *
+         * TODO: Add this to {@link #getCaptureAudioFormat()}:
+         * "Gets the format of the audio obtained using {@link #getTriggerAudio()}
+         * or {@link #getCaptureSession()}. May be null if no audio can be obtained
+         * for either the trigger or a streaming session."
+         *
+         * TODO: Should this return a known invalid value instead?
          *
-         * Candidate for public API
-         * TODO: When unhiding, change javadoc of audioFormat to -
-         * "Format of {@code data} or the audio that may be captured using {@code captureSession}.
-         * May be null if {@code triggerAvailable} and {@code captureAvailable} are false."
          * @hide
          */
-        public final int captureSession;
-        /**
-         * Format of {@code data}.
-         * May be null if {@code triggerAvailable} is false.
-         */
         @Nullable
-        public final AudioFormat audioFormat;
-        /**
-         * Raw data associated with the event.
-         * This is the audio that triggered the keyphrase if {@code isTriggerAudio} is true.
-         */
-        @Nullable
-        public final byte[] data;
-
-        private EventPayload(boolean _triggerAvailable, boolean _captureAvailable,
-                AudioFormat _audioFormat, int _captureSession, byte[] _data) {
-            triggerAvailable = _triggerAvailable;
-            captureAvailable = _captureAvailable;
-            captureSession = _captureSession;
-            audioFormat = _audioFormat;
-            data = _data;
+        public Integer getCaptureSession() {
+            if (mCaptureAvailable) {
+                return mCaptureSession;
+            } else {
+                return null;
+            }
         }
     }
 
@@ -490,7 +521,7 @@ public class AlwaysOnHotwordDetector {
                     new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
                             recognitionExtra, null /* additional data */));
         } catch (RemoteException e) {
-            Slog.w(TAG, "RemoteException in startRecognition!");
+            Slog.w(TAG, "RemoteException in startRecognition!", e);
         }
         if (code != STATUS_OK) {
             Slog.w(TAG, "startRecognition() failed with error code " + code);
@@ -504,7 +535,7 @@ public class AlwaysOnHotwordDetector {
             code = mModelManagementService.stopRecognition(
                     mVoiceInteractionService, mKeyphraseMetadata.id, mInternalCallback);
         } catch (RemoteException e) {
-            Slog.w(TAG, "RemoteException in stopRecognition!");
+            Slog.w(TAG, "RemoteException in stopRecognition!", e);
         }
 
         if (code != STATUS_OK) {
@@ -636,7 +667,7 @@ public class AlwaysOnHotwordDetector {
                 dspModuleProperties =
                         mModelManagementService.getDspModuleProperties(mVoiceInteractionService);
             } catch (RemoteException e) {
-                Slog.w(TAG, "RemoteException in getDspProperties!");
+                Slog.w(TAG, "RemoteException in getDspProperties!", e);
             }
             // No DSP available
             if (dspModuleProperties == null) {
@@ -657,9 +688,20 @@ public class AlwaysOnHotwordDetector {
                 return mModelManagementService.isEnrolledForKeyphrase(
                         mVoiceInteractionService, keyphraseId);
             } catch (RemoteException e) {
-                Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!");
+                Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!", e);
             }
             return false;
         }
     }
+
+    /** @hide */
+    public void dump(String prefix, PrintWriter pw) {
+        synchronized (mLock) {
+            pw.print(prefix); pw.print("Text="); pw.println(mText);
+            pw.print(prefix); pw.print("Locale="); pw.println(mLocale);
+            pw.print(prefix); pw.print("Availability="); pw.println(mAvailability);
+            pw.print(prefix); pw.print("KeyphraseMetadata="); pw.println(mKeyphraseMetadata);
+            pw.print(prefix); pw.print("EnrollmentInfo="); pw.println(mKeyphraseEnrollmentInfo);
+        }
+    }
 }
index 5189404..770d66c 100644 (file)
@@ -33,6 +33,9 @@ import android.provider.Settings;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.IVoiceInteractionManagerService;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
 
 /**
  * Top-level service of the current global voice interactor, which is providing
@@ -244,4 +247,17 @@ public class VoiceInteractionService extends Service {
             // Ignore.
         }
     }
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("VOICE INTERACTION");
+        synchronized (mLock) {
+            pw.println("  AlwaysOnHotwordDetector");
+            if (mHotwordDetector == null) {
+                pw.println("    NULL");
+            } else {
+                mHotwordDetector.dump("    ", pw);
+            }
+        }
+    }
 }
index 994f758..3a64984 100644 (file)
@@ -159,7 +159,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
                 try {
                     mActiveListener.onError(STATUS_ERROR);
                 } catch (RemoteException e) {
-                    Slog.w(TAG, "RemoteException in onDetectionStopped");
+                    Slog.w(TAG, "RemoteException in onDetectionStopped", e);
                 }
                 mActiveListener = null;
             }