diff --git a/samples/demo/haptic-assessment/Android.bp b/samples/demo/haptic-assessment/Android.bp
new file mode 100644
index 0000000000000..1c006091a755d
--- /dev/null
+++ b/samples/demo/haptic-assessment/Android.bp
@@ -0,0 +1,34 @@
+//
+// Copyright (C) 2020 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.
+//
+
+android_app {
+ name: "HapticAssessment",
+ manifest: "AndroidManifest.xml",
+ sdk_version: "current",
+ min_sdk_version: "29",
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+ static_libs: [
+ "androidx.appcompat_appcompat",
+ "androidx-constraintlayout_constraintlayout",
+ ],
+ resource_dirs: [
+ "res",
+ ],
+ dxflags: ["--multi-dex"],
+}
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/AndroidManifest.xml b/samples/demo/haptic-assessment/AndroidManifest.xml
new file mode 100644
index 0000000000000..251646eb975e0
--- /dev/null
+++ b/samples/demo/haptic-assessment/AndroidManifest.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/README.txt b/samples/demo/haptic-assessment/README.txt
new file mode 100644
index 0000000000000..8b84cd8c6807e
--- /dev/null
+++ b/samples/demo/haptic-assessment/README.txt
@@ -0,0 +1,13 @@
+README
+======
+
+This haptic assessment sample app allows the user to play with three different
+types of VibrationEffects:
+
+1) Predefined click effect with default strength.
+
+2) One shot vibration with 20ms duration at max amplitude.
+
+3) Waveform vibration with 500ms duration at half amplitude, then 500ms duration
+ at max amplitude. This will pass if the device supports vibration amplitude
+ control, and visibly fail otherwise.
diff --git a/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml b/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000000..134813eb4d684
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/res/drawable/bluebar.png b/samples/demo/haptic-assessment/res/drawable/bluebar.png
new file mode 100644
index 0000000000000..ae163df4295a5
Binary files /dev/null and b/samples/demo/haptic-assessment/res/drawable/bluebar.png differ
diff --git a/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif b/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif
new file mode 100644
index 0000000000000..cf3561757e38f
Binary files /dev/null and b/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif differ
diff --git a/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml b/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000000..5634f725f245b
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/demo/haptic-assessment/res/layout/activity_main.xml b/samples/demo/haptic-assessment/res/layout/activity_main.xml
new file mode 100644
index 0000000000000..47d45a60a6a49
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/layout/activity_main.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher.xml b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000000..47606a49580ff
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000000000..47606a49580ff
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000000..a571e60098c92
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000..61da551c5594a
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000000..c41dd28531901
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000..db5080a752731
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000000..6dba46dab1924
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000..da31a871c8dc4
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000..15ac681720f3d
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000..b216f2d313cc6
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000..f25a419744727
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000..e96783ccce844
Binary files /dev/null and b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/samples/demo/haptic-assessment/res/values/colors.xml b/samples/demo/haptic-assessment/res/values/colors.xml
new file mode 100644
index 0000000000000..2883b95397a20
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/values/colors.xml
@@ -0,0 +1,21 @@
+
+
+
+ #009688
+ #673AB7
+ #03DAC5
+
diff --git a/samples/demo/haptic-assessment/res/values/dimen.xml b/samples/demo/haptic-assessment/res/values/dimen.xml
new file mode 100644
index 0000000000000..f9090ed39568c
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/values/dimen.xml
@@ -0,0 +1,25 @@
+
+
+
+ 16dp
+ 16dp
+ 350dp
+ 60dp
+ 32dp
+ 5dp
+ 16dp
+
diff --git a/samples/demo/haptic-assessment/res/values/strings.xml b/samples/demo/haptic-assessment/res/values/strings.xml
new file mode 100644
index 0000000000000..a22d8dbe05809
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/values/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+ Haptic Hardware Assessment 2020
+ Effect 1
+ Effect 2
+ Effect 3
+ Effect 3: PASS
+ Effect 3: FAIL
+
diff --git a/samples/demo/haptic-assessment/res/values/styles.xml b/samples/demo/haptic-assessment/res/values/styles.xml
new file mode 100644
index 0000000000000..1abcab1d2dc9b
--- /dev/null
+++ b/samples/demo/haptic-assessment/res/values/styles.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt b/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt
new file mode 100644
index 0000000000000..d198b51b935c4
--- /dev/null
+++ b/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 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.example.android.hapticassessment
+
+import android.graphics.Color
+import android.os.Bundle
+import android.os.VibrationEffect
+import android.os.VibrationEffect.EFFECT_CLICK
+import android.os.Vibrator
+import android.view.View
+import android.widget.Button
+
+import androidx.appcompat.app.AppCompatActivity
+
+/** App main screen. */
+class MainActivity : AppCompatActivity() {
+
+ companion object {
+
+ private const val ONE_SHOT_TIMING = 20L
+ private const val ONE_SHOT_AMPLITUDE = 255
+
+ private val WAVEFORM_TIMINGS = longArrayOf(500, 500)
+ private val WAVEFORM_AMPLITUDES = intArrayOf(128, 255)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ val vibrator = getSystemService(Vibrator::class.java)
+
+ findViewById