Skip to content

Commit

Permalink
Added logics for composition, but none of the devices tested doesn't …
Browse files Browse the repository at this point in the history
…seem to support this feature.
  • Loading branch information
PBBB committed Mar 9, 2022
1 parent 2e5f263 commit f802f24
Show file tree
Hide file tree
Showing 7 changed files with 262 additions and 6 deletions.
1 change: 1 addition & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 12 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,25 @@
package="com.pbb.study.hapticfeedback">

<uses-permission android:name="android.permission.VIBRATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".VibratorActivity"
android:parentActivityName=".MainActivity">
</activity>
<activity android:name=".MainActivity" android:launchMode="singleTop" android:exported="true">
<activity
android:name=".CompositionActivity"
android:parentActivityName=".MainActivity"
android:exported="false" />
<activity
android:name=".VibratorActivity"
android:parentActivityName=".MainActivity"></activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.pbb.study.hapticfeedback

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.VibrationEffect
import android.os.Vibrator
import android.view.HapticFeedbackConstants
import android.view.View
import android.widget.Button
import kotlinx.android.synthetic.main.activity_composition.*

class CompositionActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_composition)
this.title = "Composition"

// Check support for primitives
val vibrator = applicationContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
if (vibrator.areAllPrimitivesSupported(VibrationEffect.Composition.PRIMITIVE_CLICK)) {
primSupportTextView.text = "This device support some of the following primitives."
}
}

fun performPrimitives(view: View) {
if (view is Button) {
val vibrator = applicationContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
var compositon = VibrationEffect.startComposition()

when (view.text.toString()) {
"PRIMITIVE_CLICK (1)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
"PRIMITIVE_THUD (2, Android S)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_THUD)
"PRIMITIVE_SPIN (3, Android S)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_SPIN)
"PRIMITIVE_QUICK_RISE (4)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE)
"PRIMITIVE_SLOW_RISE (5)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE)
"PRIMITIVE_QUICK_FALL (6)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_FALL)
"PRIMITIVE_TICK (7)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK)
"PRIMITIVE_LOW_TICK (8, Android S)" -> compositon = compositon.addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK)
}

val viborationEffect = compositon.compose()
vibrator.vibrate(viborationEffect)
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ class MainActivity : AppCompatActivity() {
startActivity(intent)
true
}
R.id.composition -> {
val intent = Intent(this, CompositionActivity::class.java)
startActivity(intent)
true
}
else -> super.onOptionsItemSelected(item)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class VibratorActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_vibrator)
this.title = "Vibrator"
this.title = "OneShot & Waveform"

// Check support for amplitude control
val vibrator = applicationContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
Expand Down
195 changes: 195 additions & 0 deletions app/src/main/res/layout/activity_composition.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CompositionActivity">

<ScrollView
android:id="@+id/scrollView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="8dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/primSupportTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingVertical="8dp"
android:paddingBottom="8dp"
android:text="This device may not support the following primitives."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:longClickable="true"
android:onClick="performPrimitives"
android:text="PRIMITIVE_CLICK (1)" />

<TextView
android:id="@+id/prim1TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="This effect should produce a sharp, crisp click sensation."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_THUD (2, Android S)" />

<TextView
android:id="@+id/prim2TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="A haptic effect that simulates downwards movement with gravity. Often followed by extra energy of hitting and reverberation to augment physicality."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_SPIN (3, Android S)" />

<TextView
android:id="@+id/prim3TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="A haptic effect that simulates spinning momentum."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_QUICK_RISE (4)" />

<TextView
android:id="@+id/prim4TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="A haptic effect that simulates quick upward movement against gravity."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_SLOW_RISE (5)" />

<TextView
android:id="@+id/prim5TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="A haptic effect that simulates slow upward movement against gravity."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_QUICK_FALL (6)" />

<TextView
android:id="@+id/prim6TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="A haptic effect that simulates quick downwards movement with gravity."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_TICK (7)" />

<TextView
android:id="@+id/prim7TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="This very short effect should produce a light crisp sensation intended to be used repetitively for dynamic feedback."
android:textAlignment="viewStart" />

<Button
android:id="@+id/buttonPrim8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="PRIMITIVE_LOW_TICK (8, Android S)" />

<TextView
android:id="@+id/prim8TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:paddingHorizontal="8dp"
android:paddingBottom="8dp"
android:text="This very short low frequency effect should produce a light crisp sensation intended to be used repetitively for dynamic feedback."
android:textAlignment="viewStart" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<EditText
android:id="@+id/hapticsID"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:autofillHints="hapticsID"
android:ems="10"
android:hint="Custom ID"
android:inputType="number"
android:minHeight="48dp" />

<Button
android:id="@+id/button14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performPrimitives"
android:text="Play Haptics" />

</LinearLayout>
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
2 changes: 1 addition & 1 deletion app/src/main/res/menu/menus.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<item
android:id="@+id/composition"
android:title="Composition" />
android:title="Composition (Android R)" />
<item
android:id="@+id/vibrator"
android:title="OneShot &amp; Waveform"
Expand Down

0 comments on commit f802f24

Please sign in to comment.