From 6adb73bf5e614d35973709a509bb2a2140c47d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Wi=C5=9Bnia?= Date: Tue, 28 Mar 2023 00:01:50 +0200 Subject: [PATCH 1/3] Add separate sensitivity for gyroscope in plugin MousePad --- res/values/strings.xml | 3 + res/xml/mousepadplugin_preferences.xml | 131 +++++++++--------- .../MousePadPlugin/MousePadActivity.java | 14 +- 3 files changed, 80 insertions(+), 68 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3fd701ea..01a3eb88 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -73,6 +73,9 @@ Reverse Scrolling Direction mousepad_scroll_direction gyro_mouse_enabled + Enable gyroscope mouse + Gyroscope sensitivity + gyro_mouse_sensitivity Left click Right click diff --git a/res/xml/mousepadplugin_preferences.xml b/res/xml/mousepadplugin_preferences.xml index 53312215..5d07d924 100644 --- a/res/xml/mousepadplugin_preferences.xml +++ b/res/xml/mousepadplugin_preferences.xml @@ -1,89 +1,96 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:keep="@xml/mousepadplugin_preferences"> + android:id="@+id/mousepad_single_tap_preference" + android:defaultValue="@string/mousepad_default_single" + android:entries="@array/mousepad_tap_entries" + android:entryValues="@array/mousepad_tap_values" + android:key="@string/mousepad_single_tap_key" + android:summary="%s" + android:title="@string/mousepad_single_tap_settings_title" /> + android:id="@+id/mousepad_double_tap_preference" + android:defaultValue="@string/mousepad_default_double" + android:entries="@array/mousepad_tap_entries" + android:entryValues="@array/mousepad_tap_values" + android:key="@string/mousepad_double_tap_key" + android:summary="%s" + android:title="@string/mousepad_double_tap_settings_title" /> + android:id="@+id/mousepad_triple_tap_preference" + android:defaultValue="@string/mousepad_default_triple" + android:entries="@array/mousepad_tap_entries" + android:entryValues="@array/mousepad_tap_values" + android:key="@string/mousepad_triple_tap_key" + android:summary="%s" + android:title="@string/mousepad_triple_tap_settings_title" /> + android:id="@+id/mousepad_sensitivity_preference" + android:defaultValue="@string/mousepad_default_sensitivity" + android:entries="@array/mousepad_sensitivity_entries" + android:entryValues="@array/mousepad_sensitivity_values" + android:key="@string/mousepad_sensitivity_key" + android:summary="%s" + android:title="@string/mousepad_sensitivity_settings_title" /> + android:id="@+id/mousepad_acceleration_profile_preference" + android:defaultValue="@string/mousepad_default_acceleration_profile" + android:entries="@array/mousepad_acceleration_profile_entries" + android:entryValues="@array/mousepad_acceleration_profile_values" + android:key="@string/mousepad_acceleration_profile_key" + android:summary="%s" + android:title="@string/mousepad_acceleration_profile_settings_title" /> + android:id="@+id/mousepad_scroll_preference" + android:defaultValue="false" + android:key="@string/mousepad_scroll_direction" + android:title="@string/mousepad_scroll_direction_title" /> + android:id="@+id/gyro_mouse_enabled" + android:defaultValue="false" + android:key="@string/gyro_mouse_enabled" + android:title="@string/gyro_mouse_enabled_title"/> + + + android:key="@string/sendkeystrokes_pref_category" + android:summary="@string/sendkeystrokes_pref_category_summary" + android:title="@string/sendkeystrokes_pref_category_title"> + android:id="@+id/pref_keystrokes_enable" + android:defaultValue="true" + android:key="@string/pref_sendkeystrokes_enabled" + android:title="@string/sendkeystrokes_pref_enabled" + android:summary="@string/sendkeystrokes_pref_enabled_summary" + /> + android:id="@+id/pref_send_safe_text_immediately" + android:defaultValue="true" + android:key="@string/pref_send_safe_text_immediately" + android:title="@string/sendkeystrokes_safe_text_enabled" + android:summary="@string/sendkeystrokes_safe_text_enabled_summary" + /> diff --git a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java index 7867b005..0afeccff 100644 --- a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java +++ b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java @@ -50,6 +50,7 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect private int scrollDirection = 1; private boolean allowGyro = false; private boolean gyroEnabled = false; + private int gyroscopeSensitivity = 100; private boolean isScrolling = false; private float accumulatedDistanceY = 0; @@ -89,26 +90,26 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect public void onSensorChanged(SensorEvent event) { float[] values = event.values; - float X = -values[2] * 70 * mCurrentSensitivity * displayDpiMultiplier; - float Y = -values[0] * 70 * mCurrentSensitivity * displayDpiMultiplier; + float X = -values[2] * 70 * (gyroscopeSensitivity/100.0f); + float Y = -values[0] * 70 * (gyroscopeSensitivity/100.0f); if (X < 0.25 && X > -0.25) { X = 0; } else { - X = X * mCurrentSensitivity * displayDpiMultiplier; + X = X * (gyroscopeSensitivity/100.0f); } if (Y < 0.25 && Y > -0.25) { Y = 0; } else { - Y = Y * mCurrentSensitivity * displayDpiMultiplier; + Y = Y * (gyroscopeSensitivity/100.0f); } final float nX = X; final float nY = Y; BackgroundService.RunWithPlugin(this, deviceId, MousePadPlugin.class, plugin -> { - plugin.sendMouseDelta(nX, nY); + plugin.sendMouseDelta(nX, nY); }); } @@ -143,7 +144,9 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect } if ((prefs.getBoolean(getString(R.string.gyro_mouse_enabled), false)) && (mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null)) { allowGyro = true; + gyroscopeSensitivity = prefs.getInt(getString(R.string.gyro_mouse_sensitivity),100); } + String singleTapSetting = prefs.getString(getString(R.string.mousepad_single_tap_key), getString(R.string.mousepad_default_single)); String doubleTapSetting = prefs.getString(getString(R.string.mousepad_double_tap_key), @@ -476,4 +479,3 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect return true; } } - From f5b3523ec6cf1bf0389ee332a05d6639697ccff8 Mon Sep 17 00:00:00 2001 From: Dmitry Yudin Date: Sun, 23 Apr 2023 22:50:05 +0200 Subject: [PATCH 2/3] Fix applying preferences changes when returned from plugin settings --- .../MousePadPlugin/MousePadActivity.java | 149 +++++++++++------- 1 file changed, 93 insertions(+), 56 deletions(-) diff --git a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java index 2fc8f54a..8212622a 100644 --- a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java +++ b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java @@ -33,7 +33,13 @@ import org.kde.kdeconnect_tp.R; import java.util.Objects; -public class MousePadActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener, MousePadGestureDetector.OnGestureListener, SensorEventListener { +public class MousePadActivity + extends AppCompatActivity + implements GestureDetector.OnGestureListener, + GestureDetector.OnDoubleTapListener, + MousePadGestureDetector.OnGestureListener, + SensorEventListener, + SharedPreferences.OnSharedPreferenceChangeListener { private String deviceId; private final static float MinDistanceToSendScroll = 2.5f; // touch gesture scroll @@ -63,6 +69,8 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect private SharedPreferences prefs = null; + private boolean prefsApplied = false; + enum ClickType { LEFT, RIGHT, MIDDLE, NONE; @@ -123,6 +131,10 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); + findViewById(R.id.mouse_click_left).setOnClickListener(v -> sendLeftClick()); + findViewById(R.id.mouse_click_middle).setOnClickListener(v -> sendMiddleClick()); + findViewById(R.id.mouse_click_right).setOnClickListener(v -> sendRightClick()); + deviceId = getIntent().getStringExtra("deviceId"); getWindow().getDecorView().setHapticFeedbackEnabled(true); @@ -136,57 +148,13 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect keyListenerView.setDeviceId(deviceId); prefs = PreferenceManager.getDefaultSharedPreferences(this); + prefs.registerOnSharedPreferenceChangeListener(this); - if (prefs.getBoolean(getString(R.string.mousepad_scroll_direction), false)) { - scrollDirection = -1; - } else { - scrollDirection = 1; - } - if (mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null - && prefs.getBoolean(getString(R.string.gyro_mouse_enabled), false)) { - allowGyro = true; - } - String singleTapSetting = prefs.getString(getString(R.string.mousepad_single_tap_key), - getString(R.string.mousepad_default_single)); - String doubleTapSetting = prefs.getString(getString(R.string.mousepad_double_tap_key), - getString(R.string.mousepad_default_double)); - String tripleTapSetting = prefs.getString(getString(R.string.mousepad_triple_tap_key), - getString(R.string.mousepad_default_triple)); - String sensitivitySetting = prefs.getString(getString(R.string.mousepad_sensitivity_key), - getString(R.string.mousepad_default_sensitivity)); - - String accelerationProfileName = prefs.getString(getString(R.string.mousepad_acceleration_profile_key), - getString(R.string.mousepad_default_acceleration_profile)); - - mPointerAccelerationProfile = PointerAccelerationProfileFactory.getProfileWithName(accelerationProfileName); - - singleTapAction = ClickType.fromString(singleTapSetting); - doubleTapAction = ClickType.fromString(doubleTapSetting); - tripleTapAction = ClickType.fromString(tripleTapSetting); + applyPrefs(); //Technically xdpi and ydpi should be handled separately, //but since ydpi is usually almost equal to xdpi, only xdpi is used for the multiplier. displayDpiMultiplier = StandardDpi / getResources().getDisplayMetrics().xdpi; - switch (sensitivitySetting) { - case "slowest": - mCurrentSensitivity = 0.2f; - break; - case "aboveSlowest": - mCurrentSensitivity = 0.5f; - break; - case "default": - mCurrentSensitivity = 1.0f; - break; - case "aboveDefault": - mCurrentSensitivity = 1.5f; - break; - case "fastest": - mCurrentSensitivity = 2.0f; - break; - default: - mCurrentSensitivity = 1.0f; - return; - } final View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener(visibility -> { @@ -205,19 +173,13 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect @Override protected void onResume() { + applyPrefs(); + if (allowGyro && !gyroEnabled) { mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME); gyroEnabled = true; } - if (prefs.getBoolean(getString(R.string.mousepad_mouse_buttons_enabled_pref), true)) { - findViewById(R.id.mouse_buttons).setVisibility(View.VISIBLE); - findViewById(R.id.mouse_click_left).setOnClickListener(v -> sendLeftClick()); - findViewById(R.id.mouse_click_middle).setOnClickListener(v -> sendMiddleClick()); - findViewById(R.id.mouse_click_right).setOnClickListener(v -> sendRightClick()); - } else { - findViewById(R.id.mouse_buttons).setVisibility(View.GONE); - } invalidateMenu(); super.onResume(); @@ -232,7 +194,8 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect super.onPause(); } - @Override protected void onStop() { + @Override + protected void onStop() { if (gyroEnabled) { mSensorManager.unregisterListener(this); gyroEnabled = false; @@ -240,6 +203,12 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect super.onStop(); } + @Override + protected void onDestroy() { + prefs.unregisterOnSharedPreferenceChangeListener(this); + super.onDestroy(); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); @@ -465,6 +434,11 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect return true; } + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (prefsApplied) prefsApplied = false; + } + private void sendLeftClick() { BackgroundService.RunWithPlugin(this, deviceId, MousePadPlugin.class, MousePadPlugin::sendLeftClick); @@ -495,6 +469,69 @@ public class MousePadActivity extends AppCompatActivity implements GestureDetect startActivity(intent); } + private void applyPrefs() { + if (prefsApplied) return; + + if (prefs.getBoolean(getString(R.string.mousepad_scroll_direction), false)) { + scrollDirection = -1; + } else { + scrollDirection = 1; + } + + allowGyro = isGyroSensorAvailable() && prefs.getBoolean(getString(R.string.gyro_mouse_enabled), false); + + String singleTapSetting = prefs.getString(getString(R.string.mousepad_single_tap_key), + getString(R.string.mousepad_default_single)); + String doubleTapSetting = prefs.getString(getString(R.string.mousepad_double_tap_key), + getString(R.string.mousepad_default_double)); + String tripleTapSetting = prefs.getString(getString(R.string.mousepad_triple_tap_key), + getString(R.string.mousepad_default_triple)); + String sensitivitySetting = prefs.getString(getString(R.string.mousepad_sensitivity_key), + getString(R.string.mousepad_default_sensitivity)); + + String accelerationProfileName = prefs.getString(getString(R.string.mousepad_acceleration_profile_key), + getString(R.string.mousepad_default_acceleration_profile)); + + mPointerAccelerationProfile = PointerAccelerationProfileFactory.getProfileWithName(accelerationProfileName); + + singleTapAction = ClickType.fromString(singleTapSetting); + doubleTapAction = ClickType.fromString(doubleTapSetting); + tripleTapAction = ClickType.fromString(tripleTapSetting); + + switch (sensitivitySetting) { + case "slowest": + mCurrentSensitivity = 0.2f; + break; + case "aboveSlowest": + mCurrentSensitivity = 0.5f; + break; + case "default": + mCurrentSensitivity = 1.0f; + break; + case "aboveDefault": + mCurrentSensitivity = 1.5f; + break; + case "fastest": + mCurrentSensitivity = 2.0f; + break; + default: + mCurrentSensitivity = 1.0f; + return; + } + + if (prefs.getBoolean(getString(R.string.mousepad_mouse_buttons_enabled_pref), true)) { + findViewById(R.id.mouse_buttons).setVisibility(View.VISIBLE); + } else { + findViewById(R.id.mouse_buttons).setVisibility(View.GONE); + } + + prefsApplied = true; + } + + private boolean isGyroSensorAvailable() { + return mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null; + } + @Override public boolean onSupportNavigateUp() { super.onBackPressed(); From c15469f4770af0bc5d1c7b7a622727f29c01b9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Wi=C5=9Bnia?= Date: Tue, 25 Apr 2023 01:46:09 +0200 Subject: [PATCH 3/3] Add gyro sensitivity pref --- res/xml/mousepadplugin_preferences.xml | 9 ++++++++- .../Plugins/MousePadPlugin/MousePadActivity.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/res/xml/mousepadplugin_preferences.xml b/res/xml/mousepadplugin_preferences.xml index e31f67d9..37d4f272 100644 --- a/res/xml/mousepadplugin_preferences.xml +++ b/res/xml/mousepadplugin_preferences.xml @@ -61,7 +61,14 @@ android:id="@+id/gyro_mouse_enabled" android:defaultValue="false" android:key="@string/gyro_mouse_enabled" - android:title="Gyro mouse" /> + android:title="@string/gyro_mouse_enabled_title" /> + +