add preference screen

This commit is contained in:
Benjamin Wiegand
2025-07-12 13:28:49 -07:00
parent 9b335d8563
commit 74816e7d97
7 changed files with 130 additions and 0 deletions
+1
View File
@@ -36,6 +36,7 @@ dependencies {
implementation libs.bouncycastle
implementation libs.androidx.leanback
implementation libs.gson
implementation libs.preference
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
+6
View File
@@ -106,6 +106,12 @@
</intent-filter>
</activity>
<activity
android:name=".ui.preference.BasicSettingsActivity"
android:exported="false"
android:theme="@style/Theme.ATVRemoteReceiver.Leanback"
/>
<service
android:name=".control.AccessibilityInputService"
android:exported="false"
@@ -0,0 +1,21 @@
package io.benwiegand.atvremote.receiver.ui.preference;
import android.os.Bundle;
import androidx.annotation.XmlRes;
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat;
// this is boilerplate for preference api
public class BasicPreferenceFragment extends LeanbackPreferenceFragmentCompat {
@XmlRes
private final int preferenceRes;
public BasicPreferenceFragment(int preferenceRes) {
this.preferenceRes = preferenceRes;
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(preferenceRes, rootKey);
}
}
@@ -0,0 +1,44 @@
package io.benwiegand.atvremote.receiver.ui.preference;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.XmlRes;
import androidx.fragment.app.FragmentActivity;
import io.benwiegand.atvremote.receiver.R;
// even more boilerplate for the preferences api
public class BasicSettingsActivity extends FragmentActivity {
private static final String TAG = BasicSettingsActivity.class.getSimpleName();
public static final String EXTRA_PREFERENCE_XML_RESOURCE = "xmlres";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_basic_settings);
int preferenceRes = getIntent().getIntExtra(EXTRA_PREFERENCE_XML_RESOURCE, -1);
if (preferenceRes == -1) {
Log.wtf(TAG, "required extra for preference xml resource id not provided!");
assert false;
finish();
return;
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.root, new BasicSettingsFragment(preferenceRes))
.commitNow();
}
public static Intent getLaunchIntent(Context context, @XmlRes int preferenceRes) {
return new Intent(context, BasicSettingsActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
.putExtra(EXTRA_PREFERENCE_XML_RESOURCE, preferenceRes);
}
}
@@ -0,0 +1,48 @@
package io.benwiegand.atvremote.receiver.ui.preference;
import android.util.Log;
import androidx.annotation.XmlRes;
import androidx.fragment.app.Fragment;
import androidx.leanback.preference.LeanbackSettingsFragmentCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import java.util.function.Supplier;
// more boilerplate for preference api
public class BasicSettingsFragment extends LeanbackSettingsFragmentCompat {
private static final String TAG = BasicSettingsFragment.class.getSimpleName();
private final Supplier<Fragment> initialScreenSupplier;
public BasicSettingsFragment(Supplier<Fragment> initialScreenSupplier) {
this.initialScreenSupplier = initialScreenSupplier;
}
/**
* creates a BasicSettingsFragment initialized with a BasicPreferenceFragment
* @param basicPreferenceRes the xml preference resource to use for constructing the BasicPreferenceFragment
*/
public BasicSettingsFragment(@XmlRes int basicPreferenceRes) {
this(() -> new BasicPreferenceFragment(basicPreferenceRes));
}
@Override
public void onPreferenceStartInitialScreen() {
startPreferenceFragment(initialScreenSupplier.get());
}
@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
Log.wtf(TAG, "preference fragment not handled: " + pref.getFragment());
return false;
}
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
Log.wtf(TAG, "preference screen not handled: " + pref.getFragment());
return false;
}
}
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</FrameLayout>
+2
View File
@@ -7,6 +7,7 @@ appcompat = "1.7.0"
material = "1.12.0"
activity = "1.10.1"
leanback = "1.2.0"
leanback-preference = "1.2.0"
bouncycastle = "1.45"
gson = "2.13.1"
@@ -20,6 +21,7 @@ activity = { group = "androidx.activity", name = "activity", version.ref = "acti
androidx-leanback = { group = "androidx.leanback", name = "leanback", version.ref = "leanback" }
bouncycastle = { group = "org.bouncycastle", name = "bcprov-jdk16", version.ref = "bouncycastle" }
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
preference = { group = "androidx.leanback", name = "leanback-preference", version.ref = "leanback-preference" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }