2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-28 12:47:43 +00:00

Migrate PluginPreference to Kotlin

This commit is contained in:
TPJ Schikhof 2024-10-02 20:42:54 +02:00 committed by Philip Cohn-Cort
parent a1ce310f65
commit 7920a1a250

View File

@ -3,112 +3,99 @@
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
package org.kde.kdeconnect.UserInterface
package org.kde.kdeconnect.UserInterface; import android.content.Context
import android.util.TypedValue
import android.view.View
import androidx.preference.PreferenceViewHolder
import androidx.preference.SwitchPreference
import org.kde.kdeconnect.Device
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.PluginFactory.getPluginInfo
import org.kde.kdeconnect_tp.R
import android.content.Context; class PluginPreference : SwitchPreference {
import android.util.TypedValue; private val device: Device
import android.view.View; private val pluginKey: String
private val listener: View.OnClickListener?
import androidx.annotation.NonNull; constructor(context: Context, pluginKey: String, device: Device, callback: PluginPreferenceCallback) : super(context) {
import androidx.preference.PreferenceViewHolder; layoutResource = R.layout.preference_with_button
import androidx.preference.SwitchPreference; this.device = device
this.pluginKey = pluginKey
import org.kde.kdeconnect.Device; val info = getPluginInfo(pluginKey)
import org.kde.kdeconnect.Plugins.Plugin; title = info.displayName
import org.kde.kdeconnect.Plugins.PluginFactory; summary = info.description
import org.kde.kdeconnect_tp.R; isChecked = device.isPluginEnabled(pluginKey)
public class PluginPreference extends SwitchPreference { fun createClickListener() = View.OnClickListener {
private final Device device; val plugin = device.getPluginIncludingWithoutPermissions(pluginKey)
private final String pluginKey;
private final View.OnClickListener listener;
public PluginPreference(@NonNull final Context context, @NonNull final String pluginKey,
@NonNull final Device device, @NonNull PluginPreferenceCallback callback) {
super(context);
setLayoutResource(R.layout.preference_with_button);
this.device = device;
this.pluginKey = pluginKey;
PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(pluginKey);
setTitle(info.getDisplayName());
setSummary(info.getDescription());
setChecked(device.isPluginEnabled(pluginKey));
if (info.getHasSettings()) {
this.listener = v -> {
Plugin plugin = device.getPluginIncludingWithoutPermissions(pluginKey);
if (plugin != null) { if (plugin != null) {
callback.onStartPluginSettingsFragment(plugin); callback.onStartPluginSettingsFragment(plugin)
} else { //Could happen if the device is not connected anymore
callback.onFinish();
} }
}; else { // Could happen if the device is not connected anymore
} else { callback.onFinish()
this.listener = null;
} }
} }
this.listener = if (info.hasSettings) createClickListener() else null
}
@Override override fun onBindViewHolder(holder: PreferenceViewHolder) {
public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { super.onBindViewHolder(holder)
super.onBindViewHolder(holder);
View.OnClickListener toggleListener = v -> { val toggleListener = View.OnClickListener { v: View? ->
boolean newState = !device.isPluginEnabled(pluginKey); val newState = !device.isPluginEnabled(pluginKey)
setChecked(newState); //It actually works on API<14 isChecked = newState // It actually works on API<14
onStateChanged(holder, newState); onStateChanged(holder, newState)
device.setPluginEnabled(pluginKey, newState); device.setPluginEnabled(pluginKey, newState)
}; }
View content = holder.findViewById(R.id.content); val content = holder.findViewById(R.id.content)
View widget = holder.findViewById(android.R.id.widget_frame); val widget = holder.findViewById(android.R.id.widget_frame)
View parent = holder.itemView; val parent = holder.itemView
content.setOnClickListener(listener); content.setOnClickListener(listener)
widget.setOnClickListener(toggleListener); widget.setOnClickListener(toggleListener)
parent.setOnClickListener(toggleListener); parent.setOnClickListener(toggleListener)
// Disable child backgrounds when known to be unneeded to prevent duplicate ripples // Disable child backgrounds when known to be unneeded to prevent duplicate ripples
int selectableItemBackground; fun getSelectableItemBackgroundResource(): Int {
if (listener == null) { val value = TypedValue()
selectableItemBackground = 0; context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
} else { return value.resourceId
TypedValue value = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
selectableItemBackground = value.resourceId;
} }
content.setBackgroundResource(selectableItemBackground); val selectableItemBackground: Int = if (listener == null) 0 else getSelectableItemBackgroundResource()
widget.setBackgroundResource(selectableItemBackground); content.setBackgroundResource(selectableItemBackground)
widget.setBackgroundResource(selectableItemBackground)
onStateChanged(holder, isChecked()); onStateChanged(holder, isChecked)
} }
private void onStateChanged(PreferenceViewHolder holder, boolean state) { private fun onStateChanged(holder: PreferenceViewHolder, state: Boolean) {
View content = holder.findViewById(R.id.content); val content = holder.findViewById(R.id.content)
View divider = holder.findViewById(R.id.divider); val divider = holder.findViewById(R.id.divider)
View widget = holder.findViewById(android.R.id.widget_frame); val widget = holder.findViewById(android.R.id.widget_frame)
View parent = holder.itemView; val parent = holder.itemView
boolean hasDetails = state && listener != null; val hasDetails = state && listener != null
divider.setVisibility(hasDetails ? View.VISIBLE : View.GONE); divider.visibility = if (hasDetails) View.VISIBLE else View.GONE
content.setClickable(hasDetails); content.isClickable = hasDetails
widget.setClickable(hasDetails); widget.isClickable = hasDetails
parent.setClickable(!hasDetails); parent.isClickable = !hasDetails
if (hasDetails) { if (hasDetails) {
// Cancel duplicate ripple caused by pressed state of parent propagating down // Cancel duplicate ripple caused by pressed state of parent propagating down
content.setPressed(false); content.isPressed = false
content.getBackground().jumpToCurrentState(); content.background.jumpToCurrentState()
widget.setPressed(false); widget.isPressed = false
widget.getBackground().jumpToCurrentState(); widget.background.jumpToCurrentState()
} }
} }
interface PluginPreferenceCallback { interface PluginPreferenceCallback {
void onStartPluginSettingsFragment(Plugin plugin); fun onStartPluginSettingsFragment(plugin: Plugin?)
void onFinish(); fun onFinish()
} }
} }