mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-30 05:37:43 +00:00
Make plugin settings use material design
This commit is contained in:
parent
a75fe69554
commit
31271ec4f9
@ -18,39 +18,20 @@
|
||||
type in the "widget_frame" layout. -->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:gravity="center_vertical"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:paddingEnd="?android:attr/scrollbarSize"
|
||||
android:paddingLeft="12dip"
|
||||
android:paddingRight="?android:attr/scrollbarSize"
|
||||
android:paddingStart="12dip">
|
||||
|
||||
<!-- Preference will place its actual preference widget here. -->
|
||||
<LinearLayout
|
||||
android:id="@android:id/widget_frame"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="left|center_vertical|start"
|
||||
android:minWidth="56dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
>
|
||||
<RelativeLayout
|
||||
android:id="@+id/content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="6dip"
|
||||
android:layout_marginEnd="4dip"
|
||||
android:layout_marginLeft="4dip"
|
||||
android:layout_marginRight="4dip"
|
||||
android:layout_marginStart="4dip"
|
||||
android:layout_marginTop="6dip"
|
||||
android:layout_weight="1">
|
||||
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center"
|
||||
android:padding="16dp"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
>
|
||||
<TextView
|
||||
android:id="@android:id/title"
|
||||
android:layout_width="wrap_content"
|
||||
@ -58,8 +39,9 @@
|
||||
android:ellipsize="marquee"
|
||||
android:fadingEdge="horizontal"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
tools:text="Plugin title"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@android:id/summary"
|
||||
android:layout_width="wrap_content"
|
||||
@ -69,18 +51,26 @@
|
||||
android:layout_below="@android:id/title"
|
||||
android:maxLines="3"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textColor="?android:attr/textColorSecondary" />
|
||||
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
tools:text="Plugin description"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/settingsButton"
|
||||
<View
|
||||
android:id="@+id/divider"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_gravity="center"
|
||||
android:background="?android:attr/textColorSecondary"
|
||||
/>
|
||||
<!-- Preference will place its actual preference widget here. -->
|
||||
<LinearLayout
|
||||
android:id="@android:id/widget_frame"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/abc_btn_borderless_material"
|
||||
android:contentDescription="@string/settings_icon_description"
|
||||
android:padding="8dip"
|
||||
app:tint="?attr/colorControlNormal"
|
||||
android:src="@drawable/ic_settings_white_32dp" />
|
||||
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="16dp"
|
||||
android:orientation="vertical"
|
||||
tools:background="@color/primary"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
@ -1,6 +1,7 @@
|
||||
package org.kde.kdeconnect.UserInterface;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
|
||||
import org.kde.kdeconnect.Device;
|
||||
@ -9,10 +10,10 @@ import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.preference.CheckBoxPreference;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
public class PluginPreference extends CheckBoxPreference {
|
||||
public class PluginPreference extends SwitchPreference {
|
||||
private final Device device;
|
||||
private final String pluginKey;
|
||||
private final View.OnClickListener listener;
|
||||
@ -51,22 +52,55 @@ setIcon(android.R.color.transparent);
|
||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||
super.onBindViewHolder(holder);
|
||||
|
||||
final View button = holder.findViewById(R.id.settingsButton);
|
||||
|
||||
if (listener == null) {
|
||||
button.setVisibility(View.GONE);
|
||||
} else {
|
||||
button.setEnabled(isChecked());
|
||||
button.setVisibility(View.VISIBLE);
|
||||
button.setOnClickListener(listener);
|
||||
}
|
||||
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
View.OnClickListener toggleListener = v -> {
|
||||
boolean newState = !device.isPluginEnabled(pluginKey);
|
||||
setChecked(newState); //It actually works on API<14
|
||||
button.setEnabled(newState);
|
||||
onStateChanged(holder, newState);
|
||||
device.setPluginEnabled(pluginKey, newState);
|
||||
});
|
||||
};
|
||||
|
||||
View content = holder.findViewById(R.id.content);
|
||||
View widget = holder.findViewById(android.R.id.widget_frame);
|
||||
View parent = holder.itemView;
|
||||
content.setOnClickListener(listener);
|
||||
widget.setOnClickListener(toggleListener);
|
||||
parent.setOnClickListener(toggleListener);
|
||||
|
||||
// Disable child backgrounds when known to be unneeded to prevent duplicate ripples
|
||||
int selectableItemBackground;
|
||||
if (listener == null) {
|
||||
selectableItemBackground = 0;
|
||||
} else {
|
||||
TypedValue value = new TypedValue();
|
||||
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
|
||||
selectableItemBackground = value.resourceId;
|
||||
}
|
||||
content.setBackgroundResource(selectableItemBackground);
|
||||
widget.setBackgroundResource(selectableItemBackground);
|
||||
|
||||
onStateChanged(holder, isChecked());
|
||||
}
|
||||
|
||||
private void onStateChanged(PreferenceViewHolder holder, boolean state) {
|
||||
View content = holder.findViewById(R.id.content);
|
||||
View divider = holder.findViewById(R.id.divider);
|
||||
View widget = holder.findViewById(android.R.id.widget_frame);
|
||||
View parent = holder.itemView;
|
||||
|
||||
boolean hasDetails = state && listener != null;
|
||||
|
||||
divider.setVisibility(hasDetails ? View.VISIBLE : View.GONE);
|
||||
content.setClickable(hasDetails);
|
||||
widget.setClickable(hasDetails);
|
||||
parent.setClickable(!hasDetails);
|
||||
|
||||
if (hasDetails) {
|
||||
// Cancel duplicate ripple caused by pressed state of parent propagating down
|
||||
content.setPressed(false);
|
||||
content.getBackground().jumpToCurrentState();
|
||||
widget.setPressed(false);
|
||||
widget.getBackground().jumpToCurrentState();
|
||||
}
|
||||
}
|
||||
|
||||
interface PluginPreferenceCallback {
|
||||
|
Loading…
x
Reference in New Issue
Block a user