From d5730bc88c24531d63ca4e818d7063498470b69e Mon Sep 17 00:00:00 2001
From: Sandeep Siddhartha <sansid@google.com>
Date: Fri, 8 Aug 2014 18:29:43 -0700
Subject: Remove direct field access from event payload

Change-Id: I0b4462e56a977bfbaaebd2dd31d9246051af1b99
---
 api/current.txt                                    |  5 +-
 .../service/voice/AlwaysOnHotwordDetector.java     | 93 ++++++++++++++--------
 2 files changed, 63 insertions(+), 35 deletions(-)

diff --git a/api/current.txt b/api/current.txt
index 8045c83..eb991ad 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -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 {
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index f1e1943..03ce795 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -185,48 +185,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;
+            }
         }
     }
 
-- 
cgit v1.1