parent
233569b40e
commit
b30614abe4
|
|
@ -488,7 +488,8 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
|
||||||
sb.setSpan(foregroundColorSpan, sb.length() - recommended.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
|
sb.setSpan(foregroundColorSpan, sb.length() - recommended.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
holder.hint.setText(sb);
|
if (sb.length() == 0) holder.hint.setVisibility(View.GONE);
|
||||||
|
else holder.hint.setText(sb);
|
||||||
|
|
||||||
if (!isPick) {
|
if (!isPick) {
|
||||||
holder.root.setAlpha(moduleUtil.isModuleEnabled(item.packageName) ? 1.0f : .5f);
|
holder.root.setAlpha(moduleUtil.isModuleEnabled(item.packageName) ? 1.0f : .5f);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* <!--This file is part of LSPosed.
|
||||||
|
*
|
||||||
|
* LSPosed is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* LSPosed is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 LSPosed Contributors-->
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.lsposed.manager.ui.widget;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.Layout;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
|
import android.text.Spanned;
|
||||||
|
import android.text.method.LinkMovementMethod;
|
||||||
|
import android.text.style.ClickableSpan;
|
||||||
|
import android.transition.TransitionManager;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import org.lsposed.manager.R;
|
||||||
|
|
||||||
|
public class ExpandableTextView extends TextView {
|
||||||
|
private CharSequence text = null;
|
||||||
|
private int nextLines = 0;
|
||||||
|
private final int maxLines;
|
||||||
|
private final SpannableString collapse;
|
||||||
|
private final SpannableString expand;
|
||||||
|
private final SpannableStringBuilder sb = new SpannableStringBuilder();
|
||||||
|
|
||||||
|
public ExpandableTextView(Context context) {
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExpandableTextView(Context context, AttributeSet attrs) {
|
||||||
|
this(context, attrs, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
maxLines = getMaxLines();
|
||||||
|
collapse = new SpannableString(context.getString(R.string.collapse));
|
||||||
|
ClickableSpan span = new ClickableSpan() {
|
||||||
|
@Override
|
||||||
|
public void onClick(@NonNull View widget) {
|
||||||
|
TransitionManager.beginDelayedTransition((ViewGroup) getParent());
|
||||||
|
setMaxLines(nextLines);
|
||||||
|
ExpandableTextView.super.setText(text);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
collapse.setSpan(span, 0, collapse.length(), 0);
|
||||||
|
expand = new SpannableString(context.getString(R.string.expand));
|
||||||
|
expand.setSpan(span, 0, expand.length(), 0);
|
||||||
|
setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setText(CharSequence text, BufferType type) {
|
||||||
|
this.text = text;
|
||||||
|
super.setText(text, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPreDraw() {
|
||||||
|
var lineCount = getLayout().getLineCount();
|
||||||
|
if (lineCount > maxLines) {
|
||||||
|
SpannableString s;
|
||||||
|
int end;
|
||||||
|
if (maxLines == getMaxLines()) {
|
||||||
|
nextLines = lineCount + 1;
|
||||||
|
end = getLayout().getLineStart(getMaxLines() - 1);
|
||||||
|
s = expand;
|
||||||
|
} else {
|
||||||
|
nextLines = maxLines;
|
||||||
|
end = text.length();
|
||||||
|
s = collapse;
|
||||||
|
}
|
||||||
|
sb.clearSpans();
|
||||||
|
sb.clear();
|
||||||
|
sb.append(text, 0, end - 1);
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(s);
|
||||||
|
super.setText(sb, BufferType.NORMAL);
|
||||||
|
}
|
||||||
|
return super.onPreDraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(@NonNull MotionEvent event) {
|
||||||
|
Layout layout = this.getLayout();
|
||||||
|
if (layout != null) {
|
||||||
|
int line = layout.getLineForVertical((int) event.getY());
|
||||||
|
int offset = layout.getOffsetForHorizontal(line, event.getX());
|
||||||
|
|
||||||
|
if (getText() instanceof Spanned) {
|
||||||
|
Spanned spanned = (Spanned) getText();
|
||||||
|
|
||||||
|
ClickableSpan[] links = spanned.getSpans(offset, offset, ClickableSpan.class);
|
||||||
|
|
||||||
|
if (links.length == 0) {
|
||||||
|
super.onTouchEvent(event);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.onTouchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
android:id="@+id/item_root"
|
android:id="@+id/item_root"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:animateLayoutChanges="true"
|
||||||
tools:ignore="RtlSymmetry">
|
tools:ignore="RtlSymmetry">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
|
@ -61,11 +62,12 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="@tools:sample/first_names" />
|
tools:text="@tools:sample/first_names" />
|
||||||
|
|
||||||
<TextView
|
<org.lsposed.manager.ui.widget.ExpandableTextView
|
||||||
android:id="@+id/description"
|
android:id="@+id/description"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:maxLines="5"
|
||||||
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintBottom_toBottomOf="@id/hint"
|
app:layout_constraintBottom_toBottomOf="@id/hint"
|
||||||
|
|
@ -114,8 +116,8 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@android:color/transparent"
|
android:background="@android:color/transparent"
|
||||||
android:focusable="false"
|
|
||||||
android:clickable="false"
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
|
|
||||||
|
|
@ -221,4 +221,6 @@
|
||||||
<string name="color_brown">Brown</string>
|
<string name="color_brown">Brown</string>
|
||||||
<string name="color_grey">Grey</string>
|
<string name="color_grey">Grey</string>
|
||||||
<string name="color_blue_grey">Blue grey</string>
|
<string name="color_blue_grey">Blue grey</string>
|
||||||
|
<string name="expand">expand</string>
|
||||||
|
<string name="collapse">collapse</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue