• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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