From 3ef4201efb7a09be59eb409d1425ecf43089946b Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 27 May 2025 18:09:52 -0400 Subject: [PATCH 1/8] Test create file and end-to-end GitHub setup --- misc/src/main/java/com/example/snippets/ui/haptics/test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/test.txt diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/test.txt b/misc/src/main/java/com/example/snippets/ui/haptics/test.txt new file mode 100644 index 000000000..0c83bf72c --- /dev/null +++ b/misc/src/main/java/com/example/snippets/ui/haptics/test.txt @@ -0,0 +1 @@ +Testing directory creation and GitHub pipeline From 9dd3cbc6dfddc453d54cfaf6adc27030bc555e51 Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 27 May 2025 22:19:10 -0400 Subject: [PATCH 2/8] Add code snippets for haptics in Android docs Provides a more robust and maintainable set of source code, compared to the manually-created snippets currently published on https://developer.android.com/develop/ui/views/haptics/custom-haptic-effects --- .../ui/haptics/CustomVibrationCompositions.kt | 72 ++++++++++++++++ .../CustomVibrationCompositionsJava.java | 61 ++++++++++++++ .../ui/haptics/CustomVibrationPatterns.kt | 82 +++++++++++++++++++ .../haptics/CustomVibrationPatternsJava.java | 72 ++++++++++++++++ 4 files changed, 287 insertions(+) create mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt create mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositionsJava.java create mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt create mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatternsJava.java diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt new file mode 100644 index 000000000..b0db0506b --- /dev/null +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -0,0 +1,72 @@ +package com.example.snippets.ui.haptics; + +import android.Manifest; +import android.app.Activity; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; + +import androidx.annotation.RequiresApi; +import androidx.annotation.RequiresPermission; + +@RequiresApi(api = Build.VERSION_CODES.M) +public class CustomVibrationPatternsJava extends Activity { + Vibrator vibrator = getApplicationContext().getSystemService(Vibrator.class); + + // [START android_ui_haptics_ramp_up] + @RequiresApi(Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + private void rampUpPattern(Vibrator vibrator) { + long[] timings = new long[] { + 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 }; + int[] amplitudes = new int[] { + 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 }; + int repeatIndex = -1; // Don't repeat. + + vibrator.vibrate(VibrationEffect.createWaveform( + timings, amplitudes, repeatIndex)); + } + // [END android_ui_haptics_ramp_up] + + @RequiresApi(api = Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_repeat] + private void startVibrating() { + long[] timings = new long[] { 50, 50, 100, 50, 50 }; + int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; + int repeat = 1; // Repeat from the second entry, index = 1. + VibrationEffect repeatingEffect = VibrationEffect.createWaveform( + timings, amplitudes, repeat); + // repeatingEffect can be used in multiple places. + + vibrator.vibrate(repeatingEffect); + } + + // [START_EXCLUDE] + @RequiresPermission(Manifest.permission.VIBRATE) + // [END_EXCLUDE] + private void stopVibrating() { + vibrator.cancel(); + } + // [END android_ui_haptics_repeat] + + + // [START android_ui_haptics_fallback] + @RequiresApi(api = Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + private void patternWithFallback() { + long[] smoothTimings = new long[] { 50, 50, 100, 50, 50 }; + long[] onOffTimings = new long[] { 50, 100 }; + int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; + int repeatIndex = -1; // Don't repeat. + + if (vibrator.hasAmplitudeControl()) { + vibrator.vibrate(VibrationEffect.createWaveform( + smoothTimings, amplitudes, repeatIndex)); + } else { + vibrator.vibrate(VibrationEffect.createWaveform( + onOffTimings, repeatIndex)); + } + } + // [END android_ui_haptics_fallback] +} diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositionsJava.java b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositionsJava.java new file mode 100644 index 000000000..f4b21d7b0 --- /dev/null +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositionsJava.java @@ -0,0 +1,61 @@ +package com.example.snippets.ui.haptics; + +import android.Manifest; +import android.app.Activity; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; + +import androidx.annotation.RequiresApi; +import androidx.annotation.RequiresPermission; + +@RequiresApi(Build.VERSION_CODES.S) +public class CustomVibrationCompositionsJava extends Activity { + Vibrator vibrator = getApplicationContext().getSystemService(Vibrator.class); + + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_composed_vibration_effect] + private void createComposedVibrationEffect() { + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) + .compose()); + } + // [END android_ui_haptics_composed_vibration_effect] + + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_gap_between_primitives] + private void gapBetweenPrimitives() { + int delayMs = 100; + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.8f) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.6f) + .addPrimitive( + VibrationEffect.Composition.PRIMITIVE_THUD, 1.0f, delayMs) + .compose()); + } + // [END android_ui_haptics_gap_between_primitives] + + @RequiresPermission(Manifest.permission.VIBRATE) + private void checkPrimitivesSupport() { + // [START android_ui_haptics_check_single_primitive_support] + int primitive = VibrationEffect.Composition.PRIMITIVE_LOW_TICK; + + if (vibrator.areAllPrimitivesSupported(primitive)) { + vibrator.vibrate(VibrationEffect.startComposition() + .addPrimitive(primitive).compose()); + } else { + // Play a predefined effect or custom pattern as a fallback. + } + // [END android_ui_haptics_check_single_primitive_support] + + // [START android_ui_haptics_check_multiple_primitives_support] + boolean[] supported = vibrator.arePrimitivesSupported( + VibrationEffect.Composition.PRIMITIVE_LOW_TICK, + VibrationEffect.Composition.PRIMITIVE_TICK, + VibrationEffect.Composition.PRIMITIVE_CLICK); + // [END android_ui_haptics_check_multiple_primitives_support] + } +} diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt new file mode 100644 index 000000000..171b2b7e0 --- /dev/null +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt @@ -0,0 +1,82 @@ +package com.example.snippets.ui.haptics + +import android.Manifest +import android.app.Activity +import android.os.Build +import android.os.VibrationEffect +import android.os.Vibrator +import androidx.annotation.RequiresApi +import androidx.annotation.RequiresPermission + +class CustomVibrationPatterns : Activity() { + @RequiresApi(Build.VERSION_CODES.M) + val vibrator = applicationContext.getSystemService(Vibrator::class.java) as Vibrator + + // [START android_ui_haptics_ramp_up] + @RequiresPermission(Manifest.permission.VIBRATE) + @RequiresApi(Build.VERSION_CODES.O) + fun rampUpPattern(vibrator: Vibrator) { + val timings: LongArray = longArrayOf( + 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 + ) + val amplitudes: IntArray = intArrayOf( + 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 + ) + val repeatIndex = -1 // Don't repeat. + + vibrator.vibrate( + VibrationEffect.createWaveform( + timings, amplitudes, repeatIndex + ) + ) + } + // [END android_ui_haptics_ramp_up] + + @RequiresPermission(Manifest.permission.VIBRATE) + @RequiresApi(Build.VERSION_CODES.O) + // [START android_ui_haptics_repeat] + fun startRepeatVibration() { + val timings: LongArray = longArrayOf(50, 50, 100, 50, 50) + val amplitudes: IntArray = intArrayOf(64, 128, 255, 128, 64) + val repeat = 1 // Repeat from the second entry, index = 1. + val repeatingEffect = VibrationEffect.createWaveform( + timings, amplitudes, repeat) + // repeatingEffect can be used in multiple places. + + vibrator.vibrate(repeatingEffect) + } + + // [START_EXCLUDE] + @RequiresPermission(Manifest.permission.VIBRATE) + @RequiresApi(Build.VERSION_CODES.M) + // [END_EXCLUDE] + fun stopRepeatVibrator() { + vibrator.cancel() + } + // [END android_ui_haptics_repeat] + + @RequiresApi(api = Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_fallback] + private fun patternWithFallback() { + val smoothTimings = longArrayOf(50, 50, 100, 50, 50) + val onOffTimings = longArrayOf(50, 100) + val amplitudes = intArrayOf(64, 128, 255, 128, 64) + val repeatIndex = -1 // Don't repeat. + + if (vibrator.hasAmplitudeControl()) { + vibrator.vibrate( + VibrationEffect.createWaveform( + smoothTimings, amplitudes, repeatIndex + ) + ) + } else { + vibrator.vibrate( + VibrationEffect.createWaveform( + onOffTimings, repeatIndex + ) + ) + } + } + // [END android_ui_haptics_fallback] +} \ No newline at end of file diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatternsJava.java b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatternsJava.java new file mode 100644 index 000000000..b0db0506b --- /dev/null +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatternsJava.java @@ -0,0 +1,72 @@ +package com.example.snippets.ui.haptics; + +import android.Manifest; +import android.app.Activity; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; + +import androidx.annotation.RequiresApi; +import androidx.annotation.RequiresPermission; + +@RequiresApi(api = Build.VERSION_CODES.M) +public class CustomVibrationPatternsJava extends Activity { + Vibrator vibrator = getApplicationContext().getSystemService(Vibrator.class); + + // [START android_ui_haptics_ramp_up] + @RequiresApi(Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + private void rampUpPattern(Vibrator vibrator) { + long[] timings = new long[] { + 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 }; + int[] amplitudes = new int[] { + 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 }; + int repeatIndex = -1; // Don't repeat. + + vibrator.vibrate(VibrationEffect.createWaveform( + timings, amplitudes, repeatIndex)); + } + // [END android_ui_haptics_ramp_up] + + @RequiresApi(api = Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_repeat] + private void startVibrating() { + long[] timings = new long[] { 50, 50, 100, 50, 50 }; + int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; + int repeat = 1; // Repeat from the second entry, index = 1. + VibrationEffect repeatingEffect = VibrationEffect.createWaveform( + timings, amplitudes, repeat); + // repeatingEffect can be used in multiple places. + + vibrator.vibrate(repeatingEffect); + } + + // [START_EXCLUDE] + @RequiresPermission(Manifest.permission.VIBRATE) + // [END_EXCLUDE] + private void stopVibrating() { + vibrator.cancel(); + } + // [END android_ui_haptics_repeat] + + + // [START android_ui_haptics_fallback] + @RequiresApi(api = Build.VERSION_CODES.O) + @RequiresPermission(Manifest.permission.VIBRATE) + private void patternWithFallback() { + long[] smoothTimings = new long[] { 50, 50, 100, 50, 50 }; + long[] onOffTimings = new long[] { 50, 100 }; + int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; + int repeatIndex = -1; // Don't repeat. + + if (vibrator.hasAmplitudeControl()) { + vibrator.vibrate(VibrationEffect.createWaveform( + smoothTimings, amplitudes, repeatIndex)); + } else { + vibrator.vibrate(VibrationEffect.createWaveform( + onOffTimings, repeatIndex)); + } + } + // [END android_ui_haptics_fallback] +} From 029d06d8b26b7d04b3de7bd7a483029720029826 Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 27 May 2025 22:19:10 -0400 Subject: [PATCH 3/8] Add code snippets for haptics in Android docs Provides a more robust and maintainable set of source code, compared to the manually-created snippets currently published on https://developer.android.com/develop/ui/views/haptics/custom-haptic-effects Also remove leftover test file --- misc/src/main/java/com/example/snippets/ui/haptics/test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 misc/src/main/java/com/example/snippets/ui/haptics/test.txt diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/test.txt b/misc/src/main/java/com/example/snippets/ui/haptics/test.txt deleted file mode 100644 index 0c83bf72c..000000000 --- a/misc/src/main/java/com/example/snippets/ui/haptics/test.txt +++ /dev/null @@ -1 +0,0 @@ -Testing directory creation and GitHub pipeline From d14dd06afa0b592bc242f8362d60f8396ebc602e Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 27 May 2025 22:19:10 -0400 Subject: [PATCH 4/8] Add code snippets for haptics in Android docs Provides a more robust and maintainable set of source code, compared to the manually-created snippets currently published on https://developer.android.com/develop/ui/views/haptics/custom-haptic-effects Also remove leftover test file --- .../ui/haptics/CustomVibrationCompositions.kt | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt index b0db0506b..5d256107b 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -1,52 +1,52 @@ -package com.example.snippets.ui.haptics; +package com.example.snippets.ui.haptics -import android.Manifest; -import android.app.Activity; -import android.os.Build; -import android.os.VibrationEffect; -import android.os.Vibrator; +import android.Manifest +import android.app.Activity +import android.os.Build +import android.os.VibrationEffect +import android.os.Vibrator -import androidx.annotation.RequiresApi; -import androidx.annotation.RequiresPermission; +import androidx.annotation.RequiresApi +import androidx.annotation.RequiresPermission @RequiresApi(api = Build.VERSION_CODES.M) -public class CustomVibrationPatternsJava extends Activity { - Vibrator vibrator = getApplicationContext().getSystemService(Vibrator.class); +class CustomVibrationPatternsJava : Activity() { + val vibrator = applicationContext.getSystemService(Vibrator::class.java) as Vibrator // [START android_ui_haptics_ramp_up] @RequiresApi(Build.VERSION_CODES.O) @RequiresPermission(Manifest.permission.VIBRATE) - private void rampUpPattern(Vibrator vibrator) { - long[] timings = new long[] { - 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 }; - int[] amplitudes = new int[] { - 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 }; - int repeatIndex = -1; // Don't repeat. + fun rampUpPattern() { + val timings = longArrayOf( + 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200) + val amplitudes = intArrayOf( + 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255) + val repeatIndex = -1 // Don't repeat. vibrator.vibrate(VibrationEffect.createWaveform( - timings, amplitudes, repeatIndex)); + timings, amplitudes, repeatIndex)) } // [END android_ui_haptics_ramp_up] @RequiresApi(api = Build.VERSION_CODES.O) @RequiresPermission(Manifest.permission.VIBRATE) // [START android_ui_haptics_repeat] - private void startVibrating() { - long[] timings = new long[] { 50, 50, 100, 50, 50 }; - int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; - int repeat = 1; // Repeat from the second entry, index = 1. + fun startVibrating() { + val timings = longArrayOf(50, 50, 100, 50, 50) + val amplitudes = intArrayOf(64, 128, 255, 128, 64) + val repeat = 1 // Repeat from the second entry, index = 1. VibrationEffect repeatingEffect = VibrationEffect.createWaveform( - timings, amplitudes, repeat); + timings, amplitudes, repeat) // repeatingEffect can be used in multiple places. - vibrator.vibrate(repeatingEffect); + vibrator.vibrate(repeatingEffect) } // [START_EXCLUDE] @RequiresPermission(Manifest.permission.VIBRATE) // [END_EXCLUDE] - private void stopVibrating() { - vibrator.cancel(); + fun stopVibrating() { + vibrator.cancel() } // [END android_ui_haptics_repeat] @@ -54,18 +54,18 @@ public class CustomVibrationPatternsJava extends Activity { // [START android_ui_haptics_fallback] @RequiresApi(api = Build.VERSION_CODES.O) @RequiresPermission(Manifest.permission.VIBRATE) - private void patternWithFallback() { - long[] smoothTimings = new long[] { 50, 50, 100, 50, 50 }; - long[] onOffTimings = new long[] { 50, 100 }; - int[] amplitudes = new int[] { 64, 128, 255, 128, 64 }; - int repeatIndex = -1; // Don't repeat. + fun patternWithFallback() { + val smoothTimings = longArrayOf(50, 50, 100, 50, 50) + val onOffTimings = longArrayOf(50, 100) + val amplitudes = intArrayOf(64, 128, 255, 128, 64) + val repeatIndex = -1 // Don't repeat. if (vibrator.hasAmplitudeControl()) { vibrator.vibrate(VibrationEffect.createWaveform( - smoothTimings, amplitudes, repeatIndex)); + smoothTimings, amplitudes, repeatIndex)) } else { vibrator.vibrate(VibrationEffect.createWaveform( - onOffTimings, repeatIndex)); + onOffTimings, repeatIndex)) } } // [END android_ui_haptics_fallback] From 337351fd2496d748972d69f131a3926d8416f7ed Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 27 May 2025 22:19:10 -0400 Subject: [PATCH 5/8] Add code snippets for haptics in Android docs Provides a more robust and maintainable set of source code, compared to the manually-created snippets currently published on https://developer.android.com/develop/ui/views/haptics/custom-haptic-effects Also remove leftover test file --- .../example/snippets/ui/haptics/CustomVibrationCompositions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt index 5d256107b..50d6760f8 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -35,7 +35,7 @@ class CustomVibrationPatternsJava : Activity() { val timings = longArrayOf(50, 50, 100, 50, 50) val amplitudes = intArrayOf(64, 128, 255, 128, 64) val repeat = 1 // Repeat from the second entry, index = 1. - VibrationEffect repeatingEffect = VibrationEffect.createWaveform( + val repeatingEffect = VibrationEffect.createWaveform( timings, amplitudes, repeat) // repeatingEffect can be used in multiple places. From dbea2531ad11b1f8e53b22f635a52c21c302d54f Mon Sep 17 00:00:00 2001 From: khufdev <7457579+khufdev@users.noreply.github.com> Date: Wed, 28 May 2025 02:49:24 +0000 Subject: [PATCH 6/8] Apply Spotless --- .../ui/haptics/CustomVibrationCompositions.kt | 50 ++++++++++++++----- .../ui/haptics/CustomVibrationPatterns.kt | 23 +++++++-- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt index 50d6760f8..ba2cc1682 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 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 + * + * https://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.example.snippets.ui.haptics import android.Manifest @@ -5,7 +21,6 @@ import android.app.Activity import android.os.Build import android.os.VibrationEffect import android.os.Vibrator - import androidx.annotation.RequiresApi import androidx.annotation.RequiresPermission @@ -18,13 +33,18 @@ class CustomVibrationPatternsJava : Activity() { @RequiresPermission(Manifest.permission.VIBRATE) fun rampUpPattern() { val timings = longArrayOf( - 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200) + 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 + ) val amplitudes = intArrayOf( - 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255) + 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 + ) val repeatIndex = -1 // Don't repeat. - vibrator.vibrate(VibrationEffect.createWaveform( - timings, amplitudes, repeatIndex)) + vibrator.vibrate( + VibrationEffect.createWaveform( + timings, amplitudes, repeatIndex + ) + ) } // [END android_ui_haptics_ramp_up] @@ -36,8 +56,9 @@ class CustomVibrationPatternsJava : Activity() { val amplitudes = intArrayOf(64, 128, 255, 128, 64) val repeat = 1 // Repeat from the second entry, index = 1. val repeatingEffect = VibrationEffect.createWaveform( - timings, amplitudes, repeat) - // repeatingEffect can be used in multiple places. + timings, amplitudes, repeat + ) + // repeatingEffect can be used in multiple places. vibrator.vibrate(repeatingEffect) } @@ -50,7 +71,6 @@ class CustomVibrationPatternsJava : Activity() { } // [END android_ui_haptics_repeat] - // [START android_ui_haptics_fallback] @RequiresApi(api = Build.VERSION_CODES.O) @RequiresPermission(Manifest.permission.VIBRATE) @@ -61,11 +81,17 @@ class CustomVibrationPatternsJava : Activity() { val repeatIndex = -1 // Don't repeat. if (vibrator.hasAmplitudeControl()) { - vibrator.vibrate(VibrationEffect.createWaveform( - smoothTimings, amplitudes, repeatIndex)) + vibrator.vibrate( + VibrationEffect.createWaveform( + smoothTimings, amplitudes, repeatIndex + ) + ) } else { - vibrator.vibrate(VibrationEffect.createWaveform( - onOffTimings, repeatIndex)) + vibrator.vibrate( + VibrationEffect.createWaveform( + onOffTimings, repeatIndex + ) + ) } } // [END android_ui_haptics_fallback] diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt index 171b2b7e0..a5909e5ef 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationPatterns.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 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 + * + * https://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.example.snippets.ui.haptics import android.Manifest @@ -40,7 +56,8 @@ class CustomVibrationPatterns : Activity() { val amplitudes: IntArray = intArrayOf(64, 128, 255, 128, 64) val repeat = 1 // Repeat from the second entry, index = 1. val repeatingEffect = VibrationEffect.createWaveform( - timings, amplitudes, repeat) + timings, amplitudes, repeat + ) // repeatingEffect can be used in multiple places. vibrator.vibrate(repeatingEffect) @@ -51,7 +68,7 @@ class CustomVibrationPatterns : Activity() { @RequiresApi(Build.VERSION_CODES.M) // [END_EXCLUDE] fun stopRepeatVibrator() { - vibrator.cancel() + vibrator.cancel() } // [END android_ui_haptics_repeat] @@ -79,4 +96,4 @@ class CustomVibrationPatterns : Activity() { } } // [END android_ui_haptics_fallback] -} \ No newline at end of file +} From 664f231630743a7e267bbdf8bffbfcc3afe63e12 Mon Sep 17 00:00:00 2001 From: khufdev <7457579+khufdev@users.noreply.github.com> Date: Wed, 28 May 2025 02:49:24 +0000 Subject: [PATCH 7/8] Apply Spotless --- .../ui/haptics/CustomVibrationCompositions.kt | 110 ++++++++---------- 1 file changed, 47 insertions(+), 63 deletions(-) diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt index ba2cc1682..902ec77d1 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -24,75 +24,59 @@ import android.os.Vibrator import androidx.annotation.RequiresApi import androidx.annotation.RequiresPermission -@RequiresApi(api = Build.VERSION_CODES.M) -class CustomVibrationPatternsJava : Activity() { - val vibrator = applicationContext.getSystemService(Vibrator::class.java) as Vibrator +@RequiresApi(api = Build.VERSION_CODES.S) +class CustomVibrationCompositions : Activity() { + var vibrator: Vibrator = getApplicationContext().getSystemService(Vibrator::class.java) - // [START android_ui_haptics_ramp_up] - @RequiresApi(Build.VERSION_CODES.O) - @RequiresPermission(Manifest.permission.VIBRATE) - fun rampUpPattern() { - val timings = longArrayOf( - 50, 50, 50, 50, 50, 100, 350, 25, 25, 25, 25, 200 - ) - val amplitudes = intArrayOf( - 33, 51, 75, 113, 170, 255, 0, 38, 62, 100, 160, 255 - ) - val repeatIndex = -1 // Don't repeat. - - vibrator.vibrate( - VibrationEffect.createWaveform( - timings, amplitudes, repeatIndex + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_composed_vibration_effect] + fun createComposedVibrationEffect() { + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) + .compose() ) - ) - } - // [END android_ui_haptics_ramp_up] - - @RequiresApi(api = Build.VERSION_CODES.O) - @RequiresPermission(Manifest.permission.VIBRATE) - // [START android_ui_haptics_repeat] - fun startVibrating() { - val timings = longArrayOf(50, 50, 100, 50, 50) - val amplitudes = intArrayOf(64, 128, 255, 128, 64) - val repeat = 1 // Repeat from the second entry, index = 1. - val repeatingEffect = VibrationEffect.createWaveform( - timings, amplitudes, repeat - ) - // repeatingEffect can be used in multiple places. - - vibrator.vibrate(repeatingEffect) - } - - // [START_EXCLUDE] - @RequiresPermission(Manifest.permission.VIBRATE) - // [END_EXCLUDE] - fun stopVibrating() { - vibrator.cancel() - } - // [END android_ui_haptics_repeat] - - // [START android_ui_haptics_fallback] - @RequiresApi(api = Build.VERSION_CODES.O) - @RequiresPermission(Manifest.permission.VIBRATE) - fun patternWithFallback() { - val smoothTimings = longArrayOf(50, 50, 100, 50, 50) - val onOffTimings = longArrayOf(50, 100) - val amplitudes = intArrayOf(64, 128, 255, 128, 64) - val repeatIndex = -1 // Don't repeat. + } + // [END android_ui_haptics_composed_vibration_effect] - if (vibrator.hasAmplitudeControl()) { + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_gap_between_primitives] + fun gapBetweenPrimitives() { + val delayMs: Int = 100 vibrator.vibrate( - VibrationEffect.createWaveform( - smoothTimings, amplitudes, repeatIndex - ) + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.8f) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.6f) + .addPrimitive( + VibrationEffect.Composition.PRIMITIVE_THUD, 1.0f, delayMs + ) + .compose() ) - } else { - vibrator.vibrate( - VibrationEffect.createWaveform( - onOffTimings, repeatIndex + } + // [END android_ui_haptics_gap_between_primitives] + + @RequiresPermission(Manifest.permission.VIBRATE) + private fun checkPrimitivesSupport() { + // [START android_ui_haptics_check_single_primitive_support] + val primitive: Int = VibrationEffect.Composition.PRIMITIVE_LOW_TICK + + if (vibrator.areAllPrimitivesSupported(primitive)) { + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(primitive).compose() ) + } else { + // Play a predefined effect or custom pattern as a fallback. + } + // [END android_ui_haptics_check_single_primitive_support] + + // [START android_ui_haptics_check_multiple_primitives_support] + val supported: BooleanArray = vibrator.arePrimitivesSupported( + VibrationEffect.Composition.PRIMITIVE_LOW_TICK, + VibrationEffect.Composition.PRIMITIVE_TICK, + VibrationEffect.Composition.PRIMITIVE_CLICK ) + // [END android_ui_haptics_check_multiple_primitives_support] } } - // [END android_ui_haptics_fallback] -} From c41e31b3c9a203c55dff7f2de54fcb116acb8b9c Mon Sep 17 00:00:00 2001 From: khufdev <7457579+khufdev@users.noreply.github.com> Date: Wed, 28 May 2025 03:13:00 +0000 Subject: [PATCH 8/8] Apply Spotless --- .../ui/haptics/CustomVibrationCompositions.kt | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt index 902ec77d1..e6b39f11a 100644 --- a/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt +++ b/misc/src/main/java/com/example/snippets/ui/haptics/CustomVibrationCompositions.kt @@ -26,57 +26,57 @@ import androidx.annotation.RequiresPermission @RequiresApi(api = Build.VERSION_CODES.S) class CustomVibrationCompositions : Activity() { - var vibrator: Vibrator = getApplicationContext().getSystemService(Vibrator::class.java) + var vibrator: Vibrator = getApplicationContext().getSystemService(Vibrator::class.java) - @RequiresPermission(Manifest.permission.VIBRATE) - // [START android_ui_haptics_composed_vibration_effect] - fun createComposedVibrationEffect() { - vibrator.vibrate( - VibrationEffect.startComposition() - .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE) - .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) - .compose() - ) - } - // [END android_ui_haptics_composed_vibration_effect] + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_composed_vibration_effect] + fun createComposedVibrationEffect() { + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK) + .compose() + ) + } + // [END android_ui_haptics_composed_vibration_effect] + + @RequiresPermission(Manifest.permission.VIBRATE) + // [START android_ui_haptics_gap_between_primitives] + fun gapBetweenPrimitives() { + val delayMs: Int = 100 + vibrator.vibrate( + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.8f) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.6f) + .addPrimitive( + VibrationEffect.Composition.PRIMITIVE_THUD, 1.0f, delayMs + ) + .compose() + ) + } + // [END android_ui_haptics_gap_between_primitives] + + @RequiresPermission(Manifest.permission.VIBRATE) + private fun checkPrimitivesSupport() { + // [START android_ui_haptics_check_single_primitive_support] + val primitive: Int = VibrationEffect.Composition.PRIMITIVE_LOW_TICK - @RequiresPermission(Manifest.permission.VIBRATE) - // [START android_ui_haptics_gap_between_primitives] - fun gapBetweenPrimitives() { - val delayMs: Int = 100 + if (vibrator.areAllPrimitivesSupported(primitive)) { vibrator.vibrate( VibrationEffect.startComposition() - .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.8f) - .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN, 0.6f) - .addPrimitive( - VibrationEffect.Composition.PRIMITIVE_THUD, 1.0f, delayMs - ) - .compose() + .addPrimitive(primitive).compose() ) + } else { + // Play a predefined effect or custom pattern as a fallback. } - // [END android_ui_haptics_gap_between_primitives] + // [END android_ui_haptics_check_single_primitive_support] - @RequiresPermission(Manifest.permission.VIBRATE) - private fun checkPrimitivesSupport() { - // [START android_ui_haptics_check_single_primitive_support] - val primitive: Int = VibrationEffect.Composition.PRIMITIVE_LOW_TICK - - if (vibrator.areAllPrimitivesSupported(primitive)) { - vibrator.vibrate( - VibrationEffect.startComposition() - .addPrimitive(primitive).compose() - ) - } else { - // Play a predefined effect or custom pattern as a fallback. - } - // [END android_ui_haptics_check_single_primitive_support] - - // [START android_ui_haptics_check_multiple_primitives_support] - val supported: BooleanArray = vibrator.arePrimitivesSupported( - VibrationEffect.Composition.PRIMITIVE_LOW_TICK, - VibrationEffect.Composition.PRIMITIVE_TICK, - VibrationEffect.Composition.PRIMITIVE_CLICK - ) - // [END android_ui_haptics_check_multiple_primitives_support] - } + // [START android_ui_haptics_check_multiple_primitives_support] + val supported: BooleanArray = vibrator.arePrimitivesSupported( + VibrationEffect.Composition.PRIMITIVE_LOW_TICK, + VibrationEffect.Composition.PRIMITIVE_TICK, + VibrationEffect.Composition.PRIMITIVE_CLICK + ) + // [END android_ui_haptics_check_multiple_primitives_support] } +}