From 103e9f92fa7fa09138ad61c309450b32424f3628 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 24 Apr 2018 11:56:01 -0300 Subject: [PATCH] Add haptic feedback to back, view and mic buttons --- android/app/src/main/cpp/native.cpp | 5 +++++ .../highfidelity/hifiinterface/InterfaceActivity.java | 10 ++++++++++ .../io/highfidelity/hifiinterface/MainActivity.java | 10 ++++++++++ interface/src/AndroidHelper.cpp | 4 ++++ interface/src/AndroidHelper.h | 2 ++ interface/src/Application.cpp | 4 ++++ interface/src/Application.h | 1 + scripts/system/+android/actionbar.js | 3 ++- scripts/system/+android/audio.js | 1 + scripts/system/+android/modes.js | 1 + 10 files changed, 40 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 3d6c6879b8..ad1f9e4750 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -155,6 +155,11 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea QAndroidJniObject string = QAndroidJniObject::fromString(a); __interfaceActivity.callMethod("openGotoActivity", "(Ljava/lang/String;)V", string.object()); }); + + QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](const QString &c) { + QAndroidJniObject string = QAndroidJniObject::fromString(c); + __interfaceActivity.callMethod("performHapticFeedback", "(Ljava/lang/String;)V", string.object()); + }); } JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnDestroy(JNIEnv* env, jobject obj) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java index c547fb6ff2..ffc52820c0 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -15,6 +15,7 @@ import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Bundle; +import android.view.HapticFeedbackConstants; import android.view.WindowManager; import android.util.Log; import org.qtproject.qt5.android.bindings.QtActivity; @@ -218,4 +219,13 @@ public class InterfaceActivity extends QtActivity { super.isLoading = false; } + public void performHapticFeedback(String feedbackConstant) { + switch (feedbackConstant) { + case "CONTEXT_CLICK": + default: + findViewById(android.R.id.content).performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + break; + } + } + } \ No newline at end of file diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index b2bfadc039..0c15730643 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -286,4 +286,14 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } } + + @Override + public void onBackPressed() { + int index = getFragmentManager().getBackStackEntryCount() - 1; + if (index > -1) { + super.onBackPressed(); + } else { + finishAffinity(); + } + } } diff --git a/interface/src/AndroidHelper.cpp b/interface/src/AndroidHelper.cpp index e187070a73..6dea89b1d0 100644 --- a/interface/src/AndroidHelper.cpp +++ b/interface/src/AndroidHelper.cpp @@ -48,3 +48,7 @@ void AndroidHelper::notifyLoginComplete(bool success) { emit loginComplete(success); } +void AndroidHelper::performHapticFeedback(const QString& feedbackConstant) { + emit hapticFeedbackRequested(feedbackConstant); +} + diff --git a/interface/src/AndroidHelper.h b/interface/src/AndroidHelper.h index 25a7db8c7c..d0a81b8553 100644 --- a/interface/src/AndroidHelper.h +++ b/interface/src/AndroidHelper.h @@ -28,6 +28,7 @@ public: void goBackFromAndroidActivity(); void notifyLoginComplete(bool success); + void performHapticFeedback(const QString& feedbackConstant); QSharedPointer getAccountManager(); @@ -38,6 +39,7 @@ signals: void backFromAndroidActivity(); void qtAppLoadComplete(); void loginComplete(bool success); + void hapticFeedbackRequested(const QString &feedbackConstant); private: AndroidHelper(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b91e3b1e70..8381f43f4a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7950,6 +7950,10 @@ void Application::restoreAfterAndroidActivity() { #endif } +void Application::performHapticFeedback(const QString& feedbackConstant) { + AndroidHelper::instance().performHapticFeedback(feedbackConstant); +} + #if defined(Q_OS_ANDROID) void Application::enterBackground() { qDebug() << "[Background-HIFI] enterBackground begin"; diff --git a/interface/src/Application.h b/interface/src/Application.h index e56474807b..56799875be 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -408,6 +408,7 @@ public slots: Q_INVOKABLE bool askBeforeSetAvatarUrl(const QString& avatarUrl) { return askToSetAvatarUrl(avatarUrl); } Q_INVOKABLE void openAndroidActivity(const QString& activityName); + Q_INVOKABLE void performHapticFeedback(const QString& feedbackConstant); private slots: void onDesktopRootItemCreated(QQuickItem* qmlContext); diff --git a/scripts/system/+android/actionbar.js b/scripts/system/+android/actionbar.js index a1ddc6f2de..dfe3f8bd5b 100644 --- a/scripts/system/+android/actionbar.js +++ b/scripts/system/+android/actionbar.js @@ -38,7 +38,8 @@ function init() { } function onBackPressed() { - App.openAndroidActivity("Goto"); + App.performHapticFeedback("CONTEXT_CLICK"); + App.openAndroidActivity("Goto"); } diff --git a/scripts/system/+android/audio.js b/scripts/system/+android/audio.js index 4d6d8db008..1661c11315 100644 --- a/scripts/system/+android/audio.js +++ b/scripts/system/+android/audio.js @@ -47,6 +47,7 @@ function onMuteClicked() { printd("On Mute Clicked"); //Menu.setIsOptionChecked("Mute Microphone", !Menu.isOptionChecked("Mute Microphone")); Audio.muted = !Audio.muted; + App.performHapticFeedback("CONTEXT_CLICK"); } function onMuteToggled() { diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js index f5b3609c26..3743e1d068 100644 --- a/scripts/system/+android/modes.js +++ b/scripts/system/+android/modes.js @@ -59,6 +59,7 @@ function init() { switchToMode(getCurrentModeSetting()); modeButton.clicked.connect(function() { + App.performHapticFeedback("CONTEXT_CLICK"); switchToMode(nextMode[currentMode]); }); }