1 package org.robolectric.shadows; 2 3 import static com.google.common.base.Preconditions.checkNotNull; 4 5 import android.app.wearable.WearableSensingManager; 6 import android.app.wearable.WearableSensingManager.StatusCode; 7 import android.content.ComponentName; 8 import android.os.ParcelFileDescriptor; 9 import android.os.PersistableBundle; 10 import android.os.SharedMemory; 11 import com.google.common.collect.Iterables; 12 import java.util.ArrayList; 13 import java.util.List; 14 import java.util.concurrent.Executor; 15 import java.util.function.Consumer; 16 import javax.annotation.Nonnull; 17 import javax.annotation.Nullable; 18 import org.robolectric.annotation.Implementation; 19 import org.robolectric.annotation.Implements; 20 import org.robolectric.annotation.Resetter; 21 import org.robolectric.versioning.AndroidVersions.U; 22 import org.robolectric.versioning.AndroidVersions.V; 23 24 /** Shadow for VirtualDeviceManager. */ 25 @Implements( 26 value = WearableSensingManager.class, 27 minSdk = U.SDK_INT, 28 // TODO: remove when minimum supported compileSdk is >= 34 29 isInAndroidSdk = false) 30 public class ShadowWearableSensingManager { 31 32 private static @StatusCode Integer provideDataStreamResult = 33 WearableSensingManager.STATUS_SUCCESS; 34 private static @StatusCode Integer provideDataResult = WearableSensingManager.STATUS_SUCCESS; 35 private static @StatusCode Integer startHotwordRecognitionResult = 36 WearableSensingManager.STATUS_SUCCESS; 37 private static @StatusCode Integer stopHotwordRecognitionResult = 38 WearableSensingManager.STATUS_SUCCESS; 39 private static final ArrayList<PersistableBundle> dataBundleList = new ArrayList<>(); 40 private static final ArrayList<SharedMemory> sharedMemoryList = new ArrayList<>(); 41 private static ParcelFileDescriptor lastParcelFileDescriptor; 42 43 @Implementation provideDataStream( ParcelFileDescriptor parcelFileDescriptor, Executor executor, Consumer<Integer> statusConsumer)44 protected void provideDataStream( 45 ParcelFileDescriptor parcelFileDescriptor, 46 Executor executor, 47 Consumer<Integer> statusConsumer) { 48 lastParcelFileDescriptor = parcelFileDescriptor; 49 executor.execute(() -> statusConsumer.accept(provideDataStreamResult)); 50 } 51 52 @Implementation provideData( PersistableBundle data, SharedMemory sharedMemory, Executor executor, @StatusCode Consumer<Integer> statusConsumer)53 protected void provideData( 54 PersistableBundle data, 55 SharedMemory sharedMemory, 56 Executor executor, 57 @StatusCode Consumer<Integer> statusConsumer) { 58 dataBundleList.add(data); 59 sharedMemoryList.add(sharedMemory); 60 executor.execute(() -> statusConsumer.accept(provideDataResult)); 61 } 62 63 @Implementation(minSdk = V.SDK_INT) startHotwordRecognition( @ullable ComponentName targetVisComponentName, @Nonnull Executor executor, @Nonnull @StatusCode Consumer<Integer> statusConsumer)64 protected void startHotwordRecognition( 65 @Nullable ComponentName targetVisComponentName, 66 @Nonnull Executor executor, 67 @Nonnull @StatusCode Consumer<Integer> statusConsumer) { 68 checkNotNull(executor); 69 checkNotNull(statusConsumer); 70 executor.execute(() -> statusConsumer.accept(startHotwordRecognitionResult)); 71 } 72 73 @Implementation(minSdk = V.SDK_INT) stopHotwordRecognition( @onnull Executor executor, @Nonnull @StatusCode Consumer<Integer> statusConsumer)74 protected void stopHotwordRecognition( 75 @Nonnull Executor executor, @Nonnull @StatusCode Consumer<Integer> statusConsumer) { 76 checkNotNull(executor); 77 checkNotNull(statusConsumer); 78 executor.execute(() -> statusConsumer.accept(stopHotwordRecognitionResult)); 79 } 80 setProvideDataStreamResult(@tatusCode Integer provideDataStreamResult)81 public void setProvideDataStreamResult(@StatusCode Integer provideDataStreamResult) { 82 ShadowWearableSensingManager.provideDataStreamResult = provideDataStreamResult; 83 } 84 setProvideDataResult(@tatusCode Integer provideDataResult)85 public void setProvideDataResult(@StatusCode Integer provideDataResult) { 86 ShadowWearableSensingManager.provideDataResult = provideDataResult; 87 } 88 89 /** 90 * Sets the status code that will be sent to the {@code @StatusCode Consumer<Integer>} when {@link 91 * #startHotwordRecognition} is called. 92 */ setStartHotwordRecognitionResult( @onnull @tatusCode Integer startHotwordRecognitionResult)93 public void setStartHotwordRecognitionResult( 94 @Nonnull @StatusCode Integer startHotwordRecognitionResult) { 95 checkNotNull(startHotwordRecognitionResult); 96 ShadowWearableSensingManager.startHotwordRecognitionResult = startHotwordRecognitionResult; 97 } 98 99 /** 100 * Sets the status code that will be sent to the {@code @StatusCode Consumer<Integer>} when {@link 101 * #stopHotwordRecognition} is called. 102 */ setStopHotwordRecognitionResult( @onnull @tatusCode Integer stopHotwordRecognitionResult)103 public void setStopHotwordRecognitionResult( 104 @Nonnull @StatusCode Integer stopHotwordRecognitionResult) { 105 checkNotNull(stopHotwordRecognitionResult); 106 ShadowWearableSensingManager.stopHotwordRecognitionResult = stopHotwordRecognitionResult; 107 } 108 getLastParcelFileDescriptor()109 public ParcelFileDescriptor getLastParcelFileDescriptor() { 110 return lastParcelFileDescriptor; 111 } 112 getLastDataBundle()113 public PersistableBundle getLastDataBundle() { 114 return dataBundleList.isEmpty() ? null : Iterables.getLast(dataBundleList); 115 } 116 getAllDataBundles()117 public List<PersistableBundle> getAllDataBundles() { 118 return new ArrayList<>(dataBundleList); 119 } 120 getLastSharedMemory()121 public SharedMemory getLastSharedMemory() { 122 return sharedMemoryList.isEmpty() ? null : Iterables.getLast(sharedMemoryList); 123 } 124 getAllSharedMemories()125 public List<SharedMemory> getAllSharedMemories() { 126 return new ArrayList<>(sharedMemoryList); 127 } 128 129 @Resetter reset()130 public static void reset() { 131 provideDataStreamResult = WearableSensingManager.STATUS_SUCCESS; 132 provideDataResult = WearableSensingManager.STATUS_SUCCESS; 133 startHotwordRecognitionResult = WearableSensingManager.STATUS_SUCCESS; 134 stopHotwordRecognitionResult = WearableSensingManager.STATUS_SUCCESS; 135 dataBundleList.clear(); 136 sharedMemoryList.clear(); 137 lastParcelFileDescriptor = null; 138 } 139 } 140