1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os.cts; 18 19 import static android.os.vibrator.Flags.FLAG_VIBRATION_XML_APIS; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.junit.Assume.assumeFalse; 24 import static org.junit.Assume.assumeTrue; 25 26 import android.os.VibrationEffect; 27 import android.os.Vibrator; 28 import android.os.VibratorManager; 29 import android.os.vibrator.persistence.ParsedVibration; 30 import android.platform.test.annotations.RequiresFlagsEnabled; 31 import android.platform.test.flag.junit.CheckFlagsRule; 32 import android.platform.test.flag.junit.DeviceFlagsValueProvider; 33 34 import androidx.test.platform.app.InstrumentationRegistry; 35 import androidx.test.runner.AndroidJUnit4; 36 37 import com.android.compatibility.common.util.ApiTest; 38 39 import org.junit.Before; 40 import org.junit.Rule; 41 import org.junit.Test; 42 import org.junit.runner.RunWith; 43 44 import java.util.Arrays; 45 46 /** 47 * Tests for {@link ParsedVibration}. 48 */ 49 @RunWith(AndroidJUnit4.class) 50 @ApiTest(apis = { 51 "android.os.vibrator.persistence.ParsedVibration#resolve", 52 }) 53 @RequiresFlagsEnabled(FLAG_VIBRATION_XML_APIS) 54 public class ParsedVibrationTest { 55 56 private static final VibrationEffect ONE_SHOT_DEFAULT_AMPLITUDE = 57 VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE); 58 private static final VibrationEffect ONE_SHOT_WITH_AMPLITUDE = 59 VibrationEffect.createOneShot(10, 100); 60 private static final VibrationEffect WAVEFORM_DEFAULT_AMPLITUDE = 61 VibrationEffect.createWaveform(new long[] { 10, 20, 30 }, /* repeat= */ -1); 62 private static final VibrationEffect WAVEFORM_WITH_AMPLITUDE = 63 VibrationEffect.createWaveform( 64 new long[] { 10, 20, 30 }, new int[] { 64, 128, 255 }, /* repeat= */ -1); 65 private static final VibrationEffect PREDEFINED_CLICK = 66 VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK); 67 private static final VibrationEffect PRIMITIVE_CLICK = VibrationEffect.startComposition() 68 .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) 69 .compose(); 70 private static final VibrationEffect PRIMITIVE_LOW_TICK = VibrationEffect.startComposition() 71 .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) 72 .addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK) 73 .compose(); 74 75 @Rule 76 public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); 77 78 private Vibrator mVibrator; 79 80 @Before setUp()81 public void setUp() { 82 mVibrator = InstrumentationRegistry.getInstrumentation().getContext() 83 .getSystemService(VibratorManager.class).getDefaultVibrator(); 84 } 85 86 @Test resolve_noEffect_returnsNull()87 public void resolve_noEffect_returnsNull() { 88 assertThat(createParsedVibration().resolve(mVibrator)).isNull(); 89 } 90 91 @Test resolve_allUnsupported_returnsNull()92 public void resolve_allUnsupported_returnsNull() { 93 assumeFalse(mVibrator.hasAmplitudeControl()); 94 95 ParsedVibration vibration = 96 createParsedVibration(ONE_SHOT_WITH_AMPLITUDE, WAVEFORM_WITH_AMPLITUDE); 97 assertThat(vibration.resolve(mVibrator)).isNull(); 98 } 99 100 @Test resolve_defaultAmplitude_returnsFirstEffect()101 public void resolve_defaultAmplitude_returnsFirstEffect() { 102 ParsedVibration vibration = 103 createParsedVibration(ONE_SHOT_DEFAULT_AMPLITUDE, WAVEFORM_DEFAULT_AMPLITUDE); 104 assertThat(vibration.resolve(mVibrator)).isEqualTo(ONE_SHOT_DEFAULT_AMPLITUDE); 105 106 vibration = 107 createParsedVibration(WAVEFORM_DEFAULT_AMPLITUDE, PREDEFINED_CLICK); 108 assertThat(vibration.resolve(mVibrator)).isEqualTo(WAVEFORM_DEFAULT_AMPLITUDE); 109 } 110 111 @Test resolve_predefined_returnsFirstEffect()112 public void resolve_predefined_returnsFirstEffect() { 113 ParsedVibration vibration = 114 createParsedVibration(PREDEFINED_CLICK, ONE_SHOT_DEFAULT_AMPLITUDE); 115 assertThat(vibration.resolve(mVibrator)).isEqualTo(PREDEFINED_CLICK); 116 } 117 118 @Test resolve_amplitudeWithAmplitudeControl_returnsFirstEffect()119 public void resolve_amplitudeWithAmplitudeControl_returnsFirstEffect() { 120 assumeTrue(mVibrator.hasAmplitudeControl()); 121 122 ParsedVibration vibration = 123 createParsedVibration(ONE_SHOT_WITH_AMPLITUDE, ONE_SHOT_DEFAULT_AMPLITUDE); 124 assertThat(vibration.resolve(mVibrator)).isEqualTo(ONE_SHOT_WITH_AMPLITUDE); 125 } 126 127 @Test resolve_amplitudeWithoutAmplitudeControl_returnsSecondEffect()128 public void resolve_amplitudeWithoutAmplitudeControl_returnsSecondEffect() { 129 assumeFalse(mVibrator.hasAmplitudeControl()); 130 131 ParsedVibration vibration = 132 createParsedVibration(WAVEFORM_WITH_AMPLITUDE, WAVEFORM_DEFAULT_AMPLITUDE); 133 assertThat(vibration.resolve(mVibrator)).isEqualTo(WAVEFORM_DEFAULT_AMPLITUDE); 134 } 135 136 @Test resolve_compositionOfSupportedPrimitives_returnsFirstEffect()137 public void resolve_compositionOfSupportedPrimitives_returnsFirstEffect() { 138 assumeTrue(mVibrator.areAllPrimitivesSupported( 139 VibrationEffect.Composition.PRIMITIVE_CLICK)); 140 141 ParsedVibration vibration = 142 createParsedVibration(PRIMITIVE_CLICK, ONE_SHOT_DEFAULT_AMPLITUDE); 143 assertThat(vibration.resolve(mVibrator)).isEqualTo(PRIMITIVE_CLICK); 144 } 145 146 @Test resolve_compositionWithUnsupportedPrimitives_returnsSecondEffect()147 public void resolve_compositionWithUnsupportedPrimitives_returnsSecondEffect() { 148 assumeFalse(mVibrator.areAllPrimitivesSupported( 149 VibrationEffect.Composition.PRIMITIVE_LOW_TICK)); 150 151 ParsedVibration vibration = 152 createParsedVibration(PRIMITIVE_LOW_TICK, PREDEFINED_CLICK); 153 assertThat(vibration.resolve(mVibrator)).isEqualTo(PREDEFINED_CLICK); 154 } 155 createParsedVibration(VibrationEffect... effects)156 private static ParsedVibration createParsedVibration(VibrationEffect... effects) { 157 return new ParsedVibration(Arrays.asList(effects)); 158 } 159 } 160