Loading msdllib/src/com/google/android/msdl/domain/MSDLPlayer.kt +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.data.repository.MSDLRepository import com.google.android.msdl.data.repository.MSDLRepositoryImpl import com.google.android.msdl.domain.MSDLPlayerImpl.Companion.REQUIRED_PRIMITIVES import com.google.android.msdl.logging.MSDLEvent import java.util.concurrent.Executor import java.util.concurrent.Executors Loading Loading @@ -51,6 +52,12 @@ interface MSDLPlayer { */ fun playToken(token: MSDLToken, properties: InteractionProperties? = null) /** * Get the history of recent [MSDLEvent]s. The list can be useful to include in loggers and * system dumps for debugging purposes. */ fun getHistory(): List<MSDLEvent> companion object { // TODO(b/355230334): remove once we have a system setting for the level Loading msdllib/src/com/google/android/msdl/domain/MSDLPlayerImpl.kt +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import com.google.android.msdl.data.model.FeedbackLevel import com.google.android.msdl.data.model.HapticComposition import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.data.repository.MSDLRepository import com.google.android.msdl.logging.MSDLEvent import com.google.android.msdl.logging.MSDLHistoryLogger import com.google.android.msdl.logging.MSDLHistoryLoggerImpl import java.util.concurrent.Executor /** Loading @@ -43,6 +46,9 @@ internal class MSDLPlayerImpl( private val useHapticFallbackForToken: Map<MSDLToken, Boolean?>, ) : MSDLPlayer { /** A logger to keep a history of playback events */ private val historyLogger = MSDLHistoryLoggerImpl(MSDLHistoryLogger.HISTORY_SIZE) // TODO(b/355230334): This should be retrieved from the system Settings override fun getSystemFeedbackLevel(): FeedbackLevel = MSDLPlayer.SYSTEM_FEEDBACK_LEVEL Loading Loading @@ -90,11 +96,16 @@ internal class MSDLPlayerImpl( VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_TOUCH).build() } executor.execute { vibrator.vibrate(effect, attributes) } // 3. Log the event historyLogger.addEvent(MSDLEvent(token, properties)) } else { // TODO(b/345248875): Play audio and haptics } } override fun getHistory(): List<MSDLEvent> = historyLogger.getHistory() companion object { val REQUIRED_PRIMITIVES = listOf( Loading msdllib/src/com/google/android/msdl/logging/MSDLEvent.kt 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.domain.InteractionProperties /** * A summary that represents a MSDL event. The event summarizes the delivery of playback from a * [MSDLToken] along with optional [InteractionProperties]. * * @param[tokenName] The name of the [MSDLToken] played. * @param[properties] The text representation of [InteractionProperties] used to play the token. * @param[timeStamp] A formatted time stamp for when the event occurred. The format for this time * stamp is [MSDLHistoryLogger.DATE_FORMAT] */ data class MSDLEvent(val tokenName: String, val properties: String?, val timeStamp: String) { constructor( token: MSDLToken, properties: InteractionProperties?, ) : this( token.name, properties?.toString(), MSDLHistoryLogger.DATE_FORMAT.format(System.currentTimeMillis()), ) } msdllib/src/com/google/android/msdl/logging/MSDLHistoryLogger.kt 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import java.text.SimpleDateFormat import java.util.Locale /** A logging component to keep track of recent [MSDLEvent]s */ interface MSDLHistoryLogger { /** * Add an event to the history. * * @param[event] The event to log. */ fun addEvent(event: MSDLEvent) /** Get the history of latest events. */ fun getHistory(): List<MSDLEvent> companion object { const val HISTORY_SIZE = 20 val DATE_FORMAT = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US) } } msdllib/src/com/google/android/msdl/logging/MSDLHistoryLoggerImpl.kt 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting.Companion.PACKAGE_PRIVATE import java.util.ArrayDeque import java.util.Deque @VisibleForTesting(otherwise = PACKAGE_PRIVATE) class MSDLHistoryLoggerImpl(private val maxHistorySize: Int) : MSDLHistoryLogger { // Use an [ArrayDequeue] with a fixed size as the history structure private val history: Deque<MSDLEvent> = ArrayDeque(maxHistorySize) override fun addEvent(event: MSDLEvent) { // Keep the history as a FIFO structure if (history.size == maxHistorySize) { history.removeFirst() } history.addLast(event) } override fun getHistory(): List<MSDLEvent> = history.toList() } Loading
msdllib/src/com/google/android/msdl/domain/MSDLPlayer.kt +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.data.repository.MSDLRepository import com.google.android.msdl.data.repository.MSDLRepositoryImpl import com.google.android.msdl.domain.MSDLPlayerImpl.Companion.REQUIRED_PRIMITIVES import com.google.android.msdl.logging.MSDLEvent import java.util.concurrent.Executor import java.util.concurrent.Executors Loading Loading @@ -51,6 +52,12 @@ interface MSDLPlayer { */ fun playToken(token: MSDLToken, properties: InteractionProperties? = null) /** * Get the history of recent [MSDLEvent]s. The list can be useful to include in loggers and * system dumps for debugging purposes. */ fun getHistory(): List<MSDLEvent> companion object { // TODO(b/355230334): remove once we have a system setting for the level Loading
msdllib/src/com/google/android/msdl/domain/MSDLPlayerImpl.kt +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import com.google.android.msdl.data.model.FeedbackLevel import com.google.android.msdl.data.model.HapticComposition import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.data.repository.MSDLRepository import com.google.android.msdl.logging.MSDLEvent import com.google.android.msdl.logging.MSDLHistoryLogger import com.google.android.msdl.logging.MSDLHistoryLoggerImpl import java.util.concurrent.Executor /** Loading @@ -43,6 +46,9 @@ internal class MSDLPlayerImpl( private val useHapticFallbackForToken: Map<MSDLToken, Boolean?>, ) : MSDLPlayer { /** A logger to keep a history of playback events */ private val historyLogger = MSDLHistoryLoggerImpl(MSDLHistoryLogger.HISTORY_SIZE) // TODO(b/355230334): This should be retrieved from the system Settings override fun getSystemFeedbackLevel(): FeedbackLevel = MSDLPlayer.SYSTEM_FEEDBACK_LEVEL Loading Loading @@ -90,11 +96,16 @@ internal class MSDLPlayerImpl( VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_TOUCH).build() } executor.execute { vibrator.vibrate(effect, attributes) } // 3. Log the event historyLogger.addEvent(MSDLEvent(token, properties)) } else { // TODO(b/345248875): Play audio and haptics } } override fun getHistory(): List<MSDLEvent> = historyLogger.getHistory() companion object { val REQUIRED_PRIMITIVES = listOf( Loading
msdllib/src/com/google/android/msdl/logging/MSDLEvent.kt 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.domain.InteractionProperties /** * A summary that represents a MSDL event. The event summarizes the delivery of playback from a * [MSDLToken] along with optional [InteractionProperties]. * * @param[tokenName] The name of the [MSDLToken] played. * @param[properties] The text representation of [InteractionProperties] used to play the token. * @param[timeStamp] A formatted time stamp for when the event occurred. The format for this time * stamp is [MSDLHistoryLogger.DATE_FORMAT] */ data class MSDLEvent(val tokenName: String, val properties: String?, val timeStamp: String) { constructor( token: MSDLToken, properties: InteractionProperties?, ) : this( token.name, properties?.toString(), MSDLHistoryLogger.DATE_FORMAT.format(System.currentTimeMillis()), ) }
msdllib/src/com/google/android/msdl/logging/MSDLHistoryLogger.kt 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import java.text.SimpleDateFormat import java.util.Locale /** A logging component to keep track of recent [MSDLEvent]s */ interface MSDLHistoryLogger { /** * Add an event to the history. * * @param[event] The event to log. */ fun addEvent(event: MSDLEvent) /** Get the history of latest events. */ fun getHistory(): List<MSDLEvent> companion object { const val HISTORY_SIZE = 20 val DATE_FORMAT = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US) } }
msdllib/src/com/google/android/msdl/logging/MSDLHistoryLoggerImpl.kt 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.google.android.msdl.logging import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting.Companion.PACKAGE_PRIVATE import java.util.ArrayDeque import java.util.Deque @VisibleForTesting(otherwise = PACKAGE_PRIVATE) class MSDLHistoryLoggerImpl(private val maxHistorySize: Int) : MSDLHistoryLogger { // Use an [ArrayDequeue] with a fixed size as the history structure private val history: Deque<MSDLEvent> = ArrayDeque(maxHistorySize) override fun addEvent(event: MSDLEvent) { // Keep the history as a FIFO structure if (history.size == maxHistorySize) { history.removeFirst() } history.addLast(event) } override fun getHistory(): List<MSDLEvent> = history.toList() }