nx: Squashed restoration of RSMouse notifications

This is a squashed revert restoring the following:
```
commit 691e69edf4a060b9228954b4c9674a9b013bef4e
Author: Thomas Makin <halorocker89@gmail.com>
Date:   Sun Jan 11 01:46:28 2026 +0000

    Revert "devicesettings: add rsmouse feature notif"

    Revert submission 419502

    Reason for revert: need sepolicy
    Reverted changes: /q/submissionid:419502

    Change-Id: Iaa64bce011731cf685480078d82e8933dbe4c28a

commit cfb7bf60b35eda85c22148b66daa739488a06feb
Author: Thomas Makin <halorocker89@gmail.com>
Date:   Sun Jan 11 01:46:28 2026 +0000

    Revert "devicesettings: update androidx components"

    Revert submission 419502

    Reason for revert: need sepolicy
    Reverted changes: /q/submissionid:419502

    Change-Id: I8d9c7fb496bc3e9c30e65cd3cb586f6c3327d6ae

commit e59af96db10855d0414cbb60c799caa192cf0887
Author: Thomas Makin <halorocker89@gmail.com>
Date:   Sun Jan 11 01:46:28 2026 +0000

    Revert "devicesettings: add rsmouse settings"

    Revert submission 419502

    Reason for revert: need sepolicy
    Reverted changes: /q/submissionid:419502

    Change-Id: I3325fa5b6124dcd3c0bb0b9bf2cc8ecc3a00e3f4
```

Change-Id: I7d1e56a41b999fb09db5b0c48d46ad150eaa3cfd
This commit is contained in:
Nolen Johnson committed 2026-01-11 02:50:28 -05:00
1 parent 5401fecdd4
commit 2aaadf25a0
9 files changed
+193 -11

No files matched your search

+1
View File
@@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-feature
android:name="android.software.leanback"
android:required="false" />
+4
View File
@@ -18,4 +18,8 @@
<integer name="mode_confirmation_wait_time">15</integer>
<integer name="max_brightness">255</integer>
<integer name="min_brightness">255</integer>
<integer name="min_rsmouse_sense">0</integer>
<integer name="max_rsmouse_sense">50</integer>
<integer name="min_rsmouse_dead">0</integer>
<integer name="max_rsmouse_dead">50</integer>
</resources>
+7
View File
@@ -17,6 +17,7 @@
<resources>
<string name="display_panel_title">Switch Configuration</string>
<string name="display_panel_summary">Adjust docking, performance, and controller settings</string>
<string name="notif_provider_desc">Provides important info about new features</string>
<string name="cust_category_title">Customization</string>
<string name="bright_pref_title">Adjust System Brightness</string>
<string name="perf_setting_title">Performance Mode</string>
@@ -31,7 +32,13 @@
<string name="joycon_category_title">Nintendo Controller Customization</string>
<string name="analog_title">Analog Trigger Emulation</string>
<string name="analog_summary">Enable/disable L2/R2 analog trigger emulation on Nintendo Controllers</string>
<string name="rsmouse_title">Right Stick Mouse</string>
<string name="rsmouse_summary">Use the right stick to control a virtual mouse pointer. Click with triggers, toggle usability with screenshot button</string>
<string name="rsmouse_sense_title">Right Stick Mouse Sensitivity</string>
<string name="rsmouse_dead_title">Right Stick Mouse Deadzone</string>
<string name="disable_internal_on_external_connected_title">Turn off when an external display is connected</string>
<string name="disable_internal_on_external_connected_summary_on">The internal panel will be turned off when an external display is connected</string>
<string name="disable_internal_on_external_connected_summary_off">Both the internal panel and external display will show the same image</string>
<string name="rsmouse_notif_title">Right Stick Mouse Now Enabled by Default</string>
<string name="rsmouse_notif_content">Click with triggers, toggle mouse with screenshot button</string>
</resources>
+19 -2
View File
@@ -23,7 +23,7 @@
android:key="customization_category"
android:title="@string/cust_category_title">
<SwitchPreference
<SwitchPreferenceCompat
android:key="perf_mode"
android:title="@string/perf_setting_title"
android:summary="@string/perf_setting_summary" />
@@ -33,10 +33,27 @@
android:key="joycon_category"
android:title="@string/joycon_category_title">
<SwitchPreference
<SwitchPreferenceCompat
android:key="joycon_analog"
android:title="@string/analog_title"
android:summary="@string/analog_summary" />
<SwitchPreferenceCompat
android:key="joycon_rsmouse"
android:title="@string/rsmouse_title"
android:summary="@string/rsmouse_summary" />
<SeekBarPreference
android:key="joycon_rsmouse_sense"
android:title="@string/rsmouse_sense_title"
android:max="@integer/max_rsmouse_sense"
android:min="@integer/min_rsmouse_sense" />
<SeekBarPreference
android:key="joycon_rsmouse_deadzone"
android:title="@string/rsmouse_dead_title"
android:max="@integer/max_rsmouse_dead"
android:min="@integer/min_rsmouse_dead" />
</PreferenceCategory>
</PreferenceScreen>
@@ -26,7 +26,7 @@
android:max="@integer/max_brightness"
android:min="@integer/min_brightness" />
<SwitchPreference
<SwitchPreferenceCompat
android:key="perf_mode"
android:title="@string/perf_setting_title"
android:summary="@string/perf_setting_summary" />
@@ -36,10 +36,27 @@
android:key="joycon_category"
android:title="@string/joycon_category_title">
<SwitchPreference
<SwitchPreferenceCompat
android:key="joycon_analog"
android:title="@string/analog_title"
android:summary="@string/analog_summary" />
<SwitchPreferenceCompat
android:key="joycon_rsmouse"
android:title="@string/rsmouse_title"
android:summary="@string/rsmouse_summary" />
<SeekBarPreference
android:key="joycon_rsmouse_sense"
android:title="@string/rsmouse_sense_title"
android:max="@integer/max_rsmouse_sense"
android:min="@integer/min_rsmouse_sense" />
<SeekBarPreference
android:key="joycon_rsmouse_deadzone"
android:title="@string/rsmouse_dead_title"
android:max="@integer/max_rsmouse_dead"
android:min="@integer/min_rsmouse_dead" />
</PreferenceCategory>
</PreferenceScreen>
@@ -27,8 +27,14 @@ import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationChannelCompat;
import androidx.core.app.NotificationManagerCompat;
public class BootCompletedReceiver extends BroadcastReceiver {
private static final String TAG = BootCompletedReceiver.class.getSimpleName();
private static final String SEEN_RSMOUSE_PROP = "persist.devicesettingsnx.hasseenrsmouse";
private static final String CHANNEL_ID = "switchconfig";
private IPower mPerfMgr;
@Override
@@ -63,5 +69,31 @@ public class BootCompletedReceiver extends BroadcastReceiver {
DisplayUtils.setPanelColorMode(panelMode);
}
if (!SystemProperties.getBoolean(SEEN_RSMOUSE_PROP, false)) {
NotificationChannelCompat channel = new NotificationChannelCompat.Builder(
CHANNEL_ID,
NotificationManagerCompat.IMPORTANCE_MAX
)
.setName(context.getString(R.string.display_panel_title))
.setDescription(context.getString(R.string.notif_provider_desc))
.setShowBadge(true)
.build();
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(context);
notificationManager.createNotificationChannel(channel);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_settings_additional_buttons)
.setContentTitle(context.getString(R.string.rsmouse_notif_title))
.setContentText(context.getString(R.string.rsmouse_notif_content))
.setCategory(NotificationCompat.CATEGORY_SYSTEM)
.setPriority(NotificationCompat.PRIORITY_MAX)
.extend(new NotificationCompat.TvExtender().setChannelId(CHANNEL_ID));
SystemProperties.set(SEEN_RSMOUSE_PROP, "true");
notificationManager.notify(1, builder.build());
}
}
}
@@ -16,7 +16,6 @@
package org.lineageos.settings.device;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
@@ -25,6 +24,8 @@ import android.os.RemoteException;
import android.os.SystemProperties;
import android.util.Log;
import android.view.MenuItem;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -18,7 +18,6 @@ package org.lineageos.settings.device;
import java.util.HashMap;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
@@ -28,6 +27,7 @@ import android.os.SystemProperties;
import android.util.Log;
import android.view.MenuItem;
import androidx.appcompat.app.AlertDialog;
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat;
import androidx.leanback.preference.LeanbackSettingsFragmentCompat;
import androidx.preference.DialogPreference;
@@ -121,6 +121,8 @@ public class DisplaySettingsFragmentLeanback extends LeanbackSettingsFragmentCom
if (!sku.equals("vali")) {
commonPrefs.createDisplaySettings(preferenceScreen);
}
commonPrefs.createJoyConSettings(preferenceScreen);
}
@Override
@@ -6,7 +6,6 @@ import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -19,6 +18,7 @@ import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.Log;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -26,7 +26,8 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.preference.SeekBarPreference;
import androidx.preference.SwitchPreferenceCompat;
import vendor.nvidia.hardware.graphics.display.V1_0.HwcSvcDisplay;
import vendor.nvidia.hardware.graphics.display.V1_0.HwcSvcDisplayMode;
@@ -38,6 +39,16 @@ public class DisplaySettingsPrefsCommon {
private static final String TAG = DisplaySettingsPrefsCommon.class.getSimpleName();
public static final String JOYCOND_ANALOG_PROP = "persist.vendor.joycond.analog";
public static final String JOYCOND_COMBINED_PROP = "persist.vendor.joycond.combined";
public static final String JOYCOND_RSMOUSE_PROP = "persist.vendor.joycond.rsmouse";
public static final String JOYCOND_SENSE_X_PROP = "persist.vendor.joycond.mouse_sense.x";
public static final String JOYCOND_SENSE_Y_PROP = "persist.vendor.joycond.mouse_sense.y";
public static final String JOYCOND_DEAD_X_PROP = "persist.vendor.joycond.mouse_dead.x";
public static final String JOYCOND_DEAD_Y_PROP = "persist.vendor.joycond.mouse_dead.y";
public static final float JOYCON_SENSE_MULTIPLIER = 100000f;
public static final String JOYCON_SENSE_DEFAULT = "0.0003";
public static final float JOYCON_DEAD_MULTIPLIER = 1f;
public static final String JOYCON_DEAD_DEFAULT = "1";
private PreferenceFragmentCompat fragment;
private Activity activity;
@@ -66,6 +77,9 @@ public class DisplaySettingsPrefsCommon {
public void createJoyConSettings(PreferenceScreen preferenceScreen) {
int index;
boolean analog = true;
boolean rsmouse = true;
float mouseSense = 0;
float mouseDead = 0;
final List<KeyMap> mapping;
if (mJoycond == null) {
@@ -74,7 +88,7 @@ public class DisplaySettingsPrefsCommon {
}
// Analog trigger preference
SwitchPreference analogPref = fragment.findPreference("joycon_analog");
SwitchPreferenceCompat analogPref = fragment.findPreference("joycon_analog");
if (analogPref == null) {
Log.e(TAG, "No preference with key joycon_analog found! Skipping JoyCon settings creation...");
@@ -106,6 +120,92 @@ public class DisplaySettingsPrefsCommon {
}
});
// RSMouse preference
SwitchPreferenceCompat rsmousePref = fragment.findPreference("joycon_rsmouse");
if (rsmousePref == null) {
Log.e(TAG, "No preference with key joycon_rsmouse found! " +
"Skipping rest of JoyCon settings creation...");
return;
}
try {
rsmouse = mJoycond.getRsmouse();
} catch (RemoteException e) {
Log.w(TAG, "Could not get rsmouse preference! Inferring from prop...");
rsmouse = SystemProperties.getBoolean(JOYCOND_RSMOUSE_PROP, true);
}
Log.i(TAG, "Joycond current rsmouse value: " + String.valueOf(rsmouse));
rsmousePref.setChecked(analog);
rsmousePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
try {
mJoycond.setRsmouse((boolean) newValue);
} catch (RemoteException e) {
Log.w(TAG, "Could not set rsmouse preference! Setting prop and deferring...");
SystemProperties.set(JOYCOND_RSMOUSE_PROP, (boolean) newValue ? "1" : "0");
}
return true;
}
});
// RSMouse sense preference
SeekBarPreference mouseSensePref = fragment.findPreference("joycon_rsmouse_sense");
if (mouseSensePref == null) {
Log.e(TAG, "No preference with key joycon_rsmouse_sense found! " +
"Skipping rest of JoyCon settings creation...");
return;
}
// assume X and Y are same, go by X otherwise
mouseSense = Float.parseFloat(
SystemProperties.get(JOYCOND_SENSE_X_PROP, JOYCON_SENSE_DEFAULT));
Log.i(TAG, "Joycond current sense (x) value: " + String.valueOf(mouseSense));
mouseSensePref.setDefaultValue((int)(JOYCON_SENSE_MULTIPLIER * mouseSense));
mouseSensePref.setUpdatesContinuously(true);
mouseSensePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String sense = String.valueOf((Integer)newValue / JOYCON_SENSE_MULTIPLIER);
Log.i(TAG, "Setting Joycond sense value: " + sense);
SystemProperties.set(JOYCOND_SENSE_X_PROP, sense);
SystemProperties.set(JOYCOND_SENSE_Y_PROP, sense);
return true;
}
});
// RSMouse dead preference
SeekBarPreference mouseDeadPref = fragment.findPreference("joycon_rsmouse_deadzone");
if (mouseDeadPref == null) {
Log.e(TAG, "No preference with key joycon_rsmouse_deadzone found! " +
"Skipping rest of JoyCon settings creation...");
return;
}
// assume X and Y are same, go by X otherwise
mouseDead = Float.parseFloat(
SystemProperties.get(JOYCOND_DEAD_X_PROP, JOYCON_DEAD_DEFAULT));
Log.i(TAG, "Joycond current dead (x) value: " + String.valueOf(mouseDead));
mouseDeadPref.setDefaultValue((int)mouseDead);
mouseDeadPref.setUpdatesContinuously(true);
mouseDeadPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String dead = String.valueOf((Integer)newValue);
Log.i(TAG, "Setting Joycond dead value: " + dead);
SystemProperties.set(JOYCOND_DEAD_X_PROP, dead);
SystemProperties.set(JOYCOND_DEAD_Y_PROP, dead);
return true;
}
});
// Controller mapping
try {
@@ -196,7 +296,7 @@ public class DisplaySettingsPrefsCommon {
}
public void createPerfSettings() {
SwitchPreference perfPreference = fragment.findPreference("perf_mode");
SwitchPreferenceCompat perfPreference = fragment.findPreference("perf_mode");
perfPreference.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@@ -405,7 +505,8 @@ public class DisplaySettingsPrefsCommon {
// Show checkbox to disable internal panel when an external display is connected
if (display == HwcSvcDisplay.HWC_SVC_DISPLAY_PANEL) {
SwitchPreference disableInternalOnExternalConnectedPreference = new SwitchPreference(category.getContext());
SwitchPreferenceCompat disableInternalOnExternalConnectedPreference =
new SwitchPreferenceCompat(category.getContext());
disableInternalOnExternalConnectedPreference
.setTitle(R.string.disable_internal_on_external_connected_title);
disableInternalOnExternalConnectedPreference