mirror of
https://github.com/2009scape/2009Scape-mobile.git
synced 2025-12-21 09:01:56 -07:00
Feature: Gyroscope controls
This commit is contained in:
parent
c9e9466977
commit
27a3bb8121
7 changed files with 162 additions and 4 deletions
|
|
@ -0,0 +1,59 @@
|
|||
package net.kdt.pojavlaunch;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.util.Log;
|
||||
|
||||
import net.kdt.pojavlaunch.prefs.LauncherPreferences;
|
||||
|
||||
import org.lwjgl.glfw.CallbackBridge;
|
||||
|
||||
public class GyroControl implements SensorEventListener, GrabListener {
|
||||
private final SensorManager mSensorManager;
|
||||
private final Sensor mSensor;
|
||||
private boolean mShouldHandleEvents;
|
||||
|
||||
private float mLastX, mLastY;
|
||||
|
||||
public GyroControl(Context context) {
|
||||
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
|
||||
}
|
||||
|
||||
public void enable() {
|
||||
if(mSensor == null) return;
|
||||
mSensorManager.registerListener(this, mSensor, 1000 * LauncherPreferences.PREF_GYRO_SAMPLE_RATE);
|
||||
mShouldHandleEvents = CallbackBridge.isGrabbing();
|
||||
CallbackBridge.addGrabListener(this);
|
||||
}
|
||||
|
||||
public void disable() {
|
||||
if(mSensor == null) return;
|
||||
mSensorManager.unregisterListener(this);
|
||||
CallbackBridge.removeGrabListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent sensorEvent) {
|
||||
if(mShouldHandleEvents && sensorEvent.sensor == mSensor) {
|
||||
CallbackBridge.mouseX += (sensorEvent.values[0]-mLastX) * LauncherPreferences.PREF_GYRO_SENSITIVITY * 1000;
|
||||
CallbackBridge.mouseY += (sensorEvent.values[1]-mLastY) * LauncherPreferences.PREF_GYRO_SENSITIVITY * 1000;
|
||||
CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY);
|
||||
mLastX = sensorEvent.values[0];
|
||||
mLastY = sensorEvent.values[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int i) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabState(boolean isGrabbing) {
|
||||
mShouldHandleEvents = isGrabbing;
|
||||
}
|
||||
}
|
||||
|
|
@ -62,6 +62,7 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
private DrawerLayout drawerLayout;
|
||||
private ListView navDrawer;
|
||||
private View mDrawerPullButton;
|
||||
private GyroControl mGyroControl = null;
|
||||
public static ControlLayout mControlLayout;
|
||||
|
||||
|
||||
|
|
@ -87,6 +88,7 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
initLayout(R.layout.activity_basemain);
|
||||
CallbackBridge.addGrabListener(touchpad);
|
||||
CallbackBridge.addGrabListener(minecraftGLView);
|
||||
if(LauncherPreferences.PREF_ENALBE_GYRO) mGyroControl = new GyroControl(this);
|
||||
|
||||
// Enabling this on TextureView results in a broken white result
|
||||
if(PREF_USE_ALTERNATE_SURFACE) getWindow().setBackgroundDrawable(null);
|
||||
|
|
@ -168,7 +170,8 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
case 2: minecraftGLView.togglepointerDebugging(); break;
|
||||
case 3: dialogSendCustomKey(); break;
|
||||
case 4: adjustMouseSpeedLive(); break;
|
||||
case 5: openCustomControls(); break;
|
||||
case 5: adjustGyroSensitivityLive(); break;
|
||||
case 6: openCustomControls(); break;
|
||||
}
|
||||
drawerLayout.closeDrawers();
|
||||
};
|
||||
|
|
@ -240,6 +243,7 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
public void onResume() {
|
||||
super.onResume();
|
||||
mIsResuming = true;
|
||||
if(mGyroControl != null) mGyroControl.enable();
|
||||
final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
|
||||
final View decorView = getWindow().getDecorView();
|
||||
decorView.setSystemUiVisibility(uiOptions);
|
||||
|
|
@ -248,6 +252,7 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
if(mGyroControl != null) mGyroControl.disable();
|
||||
if (CallbackBridge.isGrabbing()){
|
||||
sendKeyPress(LwjglGlfwKeycode.GLFW_KEY_ESCAPE);
|
||||
}
|
||||
|
|
@ -509,6 +514,46 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
|||
b.show();
|
||||
}
|
||||
|
||||
int tmpGyroSensitivity;
|
||||
public void adjustGyroSensitivityLive() {
|
||||
if(!LauncherPreferences.PREF_ENALBE_GYRO) {
|
||||
Toast.makeText(this, R.string.toast_turn_on_gyro, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
AlertDialog.Builder b = new AlertDialog.Builder(this);
|
||||
b.setTitle(R.string.preference_gyro_sensitivity_title);
|
||||
View v = LayoutInflater.from(this).inflate(R.layout.dialog_live_mouse_speed_editor,null);
|
||||
final SeekBar sb = v.findViewById(R.id.mouseSpeed);
|
||||
final TextView tv = v.findViewById(R.id.mouseSpeedTV);
|
||||
sb.setMax(275);
|
||||
tmpGyroSensitivity = (int) ((LauncherPreferences.PREF_GYRO_SENSITIVITY*100));
|
||||
sb.setProgress(tmpGyroSensitivity -25);
|
||||
tv.setText(tmpGyroSensitivity +" %");
|
||||
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
||||
tmpGyroSensitivity = i+25;
|
||||
tv.setText(tmpGyroSensitivity +" %");
|
||||
}
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {}
|
||||
});
|
||||
b.setView(v);
|
||||
b.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
|
||||
LauncherPreferences.PREF_GYRO_SENSITIVITY = ((float) tmpGyroSensitivity)/100f;
|
||||
LauncherPreferences.DEFAULT_PREF.edit().putInt("gyroSensitivity", tmpGyroSensitivity).commit();
|
||||
dialogInterface.dismiss();
|
||||
System.gc();
|
||||
});
|
||||
b.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> {
|
||||
dialogInterface.dismiss();
|
||||
System.gc();
|
||||
});
|
||||
b.show();
|
||||
}
|
||||
|
||||
private static void setUri(Context context, String input, Intent intent) {
|
||||
if(input.startsWith("file:")) {
|
||||
int truncLength = 5;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@ public class LauncherPreferences {
|
|||
public static boolean PREF_USE_ALTERNATE_SURFACE = true;
|
||||
public static boolean PREF_JAVA_SANDBOX = true;
|
||||
public static int PREF_SCALE_FACTOR = 100;
|
||||
public static boolean PREF_ENALBE_GYRO = false;
|
||||
public static float PREF_GYRO_SENSITIVITY = 100;
|
||||
public static int PREF_GYRO_SAMPLE_RATE = 16;
|
||||
|
||||
|
||||
public static void loadPreferences(Context ctx) {
|
||||
|
|
@ -85,6 +88,9 @@ public class LauncherPreferences {
|
|||
PREF_USE_ALTERNATE_SURFACE = DEFAULT_PREF.getBoolean("alternate_surface", false);
|
||||
PREF_JAVA_SANDBOX = DEFAULT_PREF.getBoolean("java_sandbox", true);
|
||||
PREF_SCALE_FACTOR = DEFAULT_PREF.getInt("resolutionRatio", 100);
|
||||
PREF_ENALBE_GYRO = DEFAULT_PREF.getBoolean("enableGyro", false);
|
||||
PREF_GYRO_SENSITIVITY = ((float)DEFAULT_PREF.getInt("gyroSensitivity", 100))/100f;
|
||||
PREF_GYRO_SAMPLE_RATE = DEFAULT_PREF.getInt("gyroSampleRate", 16);
|
||||
|
||||
/*
|
||||
if (PREF_CUSTOM_JAVA_ARGS.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -1,21 +1,28 @@
|
|||
package net.kdt.pojavlaunch.prefs.screens;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorManager;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import net.kdt.pojavlaunch.R;
|
||||
import net.kdt.pojavlaunch.prefs.CustomSeekBarPreference;
|
||||
import net.kdt.pojavlaunch.prefs.LauncherPreferences;
|
||||
|
||||
public class LauncherPreferenceControlFragment extends LauncherPreferenceFragment {
|
||||
|
||||
private boolean mGyroAvailable = false;
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle b, String str) {
|
||||
// Get values
|
||||
int longPressTrigger = LauncherPreferences.PREF_LONGPRESS_TRIGGER;
|
||||
int prefButtonSize = (int) LauncherPreferences.PREF_BUTTONSIZE;
|
||||
int mouseScale = (int) LauncherPreferences.PREF_MOUSESCALE;
|
||||
int gyroSampleRate = LauncherPreferences.PREF_GYRO_SAMPLE_RATE;
|
||||
float mouseSpeed = LauncherPreferences.PREF_MOUSESPEED;
|
||||
float gyroSpeed = LauncherPreferences.PREF_GYRO_SENSITIVITY;
|
||||
|
||||
//Triggers a write for some reason which resets the value
|
||||
addPreferencesFromResource(R.xml.pref_control);
|
||||
|
|
@ -40,7 +47,20 @@ public class LauncherPreferenceControlFragment extends LauncherPreferenceFragmen
|
|||
seek6.setValue((int)(mouseSpeed *100f));
|
||||
seek6.setSuffix(" %");
|
||||
|
||||
|
||||
Context context = getContext();
|
||||
if(context != null) {
|
||||
mGyroAvailable = ((SensorManager)context.getSystemService(Context.SENSOR_SERVICE)).getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR) != null;
|
||||
}
|
||||
SwitchPreference gyroSwitch = findPreference("enableGyro");
|
||||
gyroSwitch.setVisible(mGyroAvailable);
|
||||
CustomSeekBarPreference gyroSensitivitySeek = findPreference("gyroSensitivity");
|
||||
gyroSensitivitySeek.setRange(25, 300);
|
||||
gyroSensitivitySeek.setValue((int) (gyroSpeed*100f));
|
||||
gyroSensitivitySeek.setSuffix(" %");
|
||||
CustomSeekBarPreference gyroSampleRateSeek = findPreference("gyroSampleRate");
|
||||
gyroSampleRateSeek.setRange(5, 50);
|
||||
gyroSampleRateSeek.setValue(gyroSampleRate);
|
||||
gyroSampleRateSeek.setSuffix(" ms");
|
||||
computeVisibility();
|
||||
}
|
||||
|
||||
|
|
@ -53,6 +73,10 @@ public class LauncherPreferenceControlFragment extends LauncherPreferenceFragmen
|
|||
private void computeVisibility(){
|
||||
CustomSeekBarPreference seek2 = findPreference("timeLongPressTrigger");
|
||||
seek2.setVisible(!LauncherPreferences.PREF_DISABLE_GESTURES);
|
||||
CustomSeekBarPreference gyroSensitivitySeek = findPreference("gyroSensitivity");
|
||||
gyroSensitivitySeek.setVisible(mGyroAvailable && LauncherPreferences.PREF_ENALBE_GYRO);
|
||||
CustomSeekBarPreference gyroSampleRateSeek = findPreference("gyroSampleRate");
|
||||
gyroSampleRateSeek.setVisible(mGyroAvailable && LauncherPreferences.PREF_ENALBE_GYRO);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
<item>@string/control_adebug</item>
|
||||
<item>@string/control_customkey</item>
|
||||
<item>@string/mcl_setting_title_mousespeed</item>
|
||||
<item>@string/preference_gyro_sensitivity_title</item>
|
||||
<item>@string/mcl_option_customcontrol</item>
|
||||
</string-array>
|
||||
|
||||
|
|
|
|||
|
|
@ -331,4 +331,11 @@
|
|||
<string name="xerr_child">Your account is a child account, and needs to be added into a Family in order to log in.</string>
|
||||
<string name="minecraft_not_owned">It seems like this account does not have a Minecraft profile. If you have Xbox Game Pass, please log in on https://minecraft.net/ and set it up.</string>
|
||||
<string name="xerr_not_available">Xbox Live is not available in your country</string>
|
||||
<string name="preference_enable_gyro_title">Enable gyroscope controls</string>
|
||||
<string name="preference_enable_gyro_description">Enabling this will allow you to turn in game by turning your phone</string>
|
||||
<string name="preference_gyro_sensitivity_title">Gyroscope controls sensitivity</string>
|
||||
<string name="preference_gyro_sensitivity_description">Adjust the sensitivity of gyroscope controls</string>
|
||||
<string name="toast_turn_on_gyro">Enable gyro controls first to use this!</string>
|
||||
<string name="preference_gyro_sample_rate_title">Gyroscope sampling rate</string>
|
||||
<string name="preference_gyro_sample_rate_description">If you have performance issues with the gyroscope controls, increase this</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -77,7 +77,23 @@
|
|||
android:title="@string/preference_mouse_start_title"
|
||||
android:summary="@string/preference_mouse_start_description"
|
||||
/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="enableGyro"
|
||||
android:title="@string/preference_enable_gyro_title"
|
||||
android:summary="@string/preference_enable_gyro_description"/>
|
||||
<net.kdt.pojavlaunch.prefs.CustomSeekBarPreference
|
||||
android:key="gyroSensitivity"
|
||||
android:title="@string/preference_gyro_sensitivity_title"
|
||||
android:summary="@string/preference_gyro_sensitivity_description"
|
||||
app2:selectable="false"
|
||||
app2:seekBarIncrement="5"
|
||||
app2:showSeekBarValue="true"/>
|
||||
<net.kdt.pojavlaunch.prefs.CustomSeekBarPreference
|
||||
android:key="gyroSampleRate"
|
||||
android:title="@string/preference_gyro_sample_rate_title"
|
||||
android:summary="@string/preference_gyro_sample_rate_description"
|
||||
app2:selectable="false"
|
||||
app2:showSeekBarValue="true"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue