Merge the Share process of the two classes into one
A new class has been added in the util package: NewPipeTextViewHelper. It shares the selected text of a TextView with ShareUtils#shareText (with the created shareSelectedTextWithShareUtils static method). Only this static method can be used by other classes, other methods are private.
This commit is contained in:
parent
3ded6feddb
commit
aab09c0c65
|
@ -0,0 +1,86 @@
|
||||||
|
package org.schabi.newpipe.util;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.Selection;
|
||||||
|
import android.text.Spannable;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||||
|
import org.schabi.newpipe.views.NewPipeEditText;
|
||||||
|
import org.schabi.newpipe.views.NewPipeTextView;
|
||||||
|
|
||||||
|
public final class NewPipeTextViewHelper {
|
||||||
|
private NewPipeTextViewHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Share the selected text of {@link NewPipeTextView NewPipeTextViews} and
|
||||||
|
* {@link NewPipeEditText NewPipeEditTexts} with
|
||||||
|
* {@link ShareUtils#shareText(Context, String, String)}.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This allows EMUI users to get the Android share sheet instead of the EMUI share sheet when
|
||||||
|
* using the {@code Share} command of the popup menu which appears when selecting text.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param textView the {@link TextView} on which sharing the selected text. It should be a
|
||||||
|
* {@link NewPipeTextView} or a {@link NewPipeEditText} (even if
|
||||||
|
* {@link TextView standard TextViews} are supported).
|
||||||
|
*
|
||||||
|
* @return true if no exceptions occurred when getting the selected text, sharing it and
|
||||||
|
* deselecting it, otherwise an exception
|
||||||
|
*/
|
||||||
|
public static boolean shareSelectedTextWithShareUtils(@NonNull final TextView textView) {
|
||||||
|
if (textView instanceof NewPipeTextView) {
|
||||||
|
final NewPipeTextView newPipeTextView = (NewPipeTextView) textView;
|
||||||
|
final CharSequence text = newPipeTextView.getText();
|
||||||
|
final CharSequence selectedText = getSelectedText(newPipeTextView, text);
|
||||||
|
|
||||||
|
shareSelectedTextIfNotNullAndNotEmpty(newPipeTextView, selectedText);
|
||||||
|
|
||||||
|
final Spannable spannable = (text instanceof Spannable) ? (Spannable) text : null;
|
||||||
|
Selection.setSelection(spannable, newPipeTextView.getSelectionEnd());
|
||||||
|
} else if (textView instanceof NewPipeEditText) {
|
||||||
|
final NewPipeEditText editText = (NewPipeEditText) textView;
|
||||||
|
final Spannable text = editText.getText();
|
||||||
|
|
||||||
|
final CharSequence selectedText = getSelectedText(textView, text);
|
||||||
|
shareSelectedTextIfNotNullAndNotEmpty(textView, selectedText);
|
||||||
|
Selection.setSelection(text, editText.getSelectionEnd());
|
||||||
|
} else {
|
||||||
|
final CharSequence text = textView.getText();
|
||||||
|
final CharSequence selectedText = getSelectedText(textView, text);
|
||||||
|
|
||||||
|
shareSelectedTextIfNotNullAndNotEmpty(textView, selectedText);
|
||||||
|
|
||||||
|
final Spannable spannable = (text instanceof Spannable) ? (Spannable) text : null;
|
||||||
|
Selection.setSelection(spannable, textView.getSelectionEnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static CharSequence getSelectedText(@NonNull final TextView textView,
|
||||||
|
@Nullable final CharSequence text) {
|
||||||
|
if (!textView.hasSelection() || text == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int start = textView.getSelectionStart();
|
||||||
|
final int end = textView.getSelectionEnd();
|
||||||
|
return String.valueOf(start > end ? text.subSequence(end, start)
|
||||||
|
: text.subSequence(start, end));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void shareSelectedTextIfNotNullAndNotEmpty(
|
||||||
|
@NonNull final TextView textView,
|
||||||
|
@Nullable final CharSequence selectedText) {
|
||||||
|
if (selectedText != null && selectedText.length() != 0) {
|
||||||
|
ShareUtils.shareText(textView.getContext(), "", selectedText.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,6 @@
|
||||||
package org.schabi.newpipe.views;
|
package org.schabi.newpipe.views;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.Selection;
|
|
||||||
import android.text.Spannable;
|
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
@ -11,6 +9,8 @@ import androidx.appcompat.widget.AppCompatEditText;
|
||||||
|
|
||||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.util.NewPipeTextViewHelper.shareSelectedTextWithShareUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)}
|
* An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)}
|
||||||
* when sharing selected text by using the {@code Share} command of the floating actions.
|
* when sharing selected text by using the {@code Share} command of the floating actions.
|
||||||
|
@ -38,27 +38,8 @@ public class NewPipeEditText extends AppCompatEditText {
|
||||||
@Override
|
@Override
|
||||||
public boolean onTextContextMenuItem(final int id) {
|
public boolean onTextContextMenuItem(final int id) {
|
||||||
if (id == android.R.id.shareText) {
|
if (id == android.R.id.shareText) {
|
||||||
final Spannable text = getText();
|
return shareSelectedTextWithShareUtils(this);
|
||||||
final CharSequence selectedText = getSelectedText(text);
|
|
||||||
if (selectedText != null && selectedText.length() != 0) {
|
|
||||||
ShareUtils.shareText(getContext(), "", selectedText.toString());
|
|
||||||
}
|
|
||||||
Selection.setSelection(text, getSelectionEnd());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return super.onTextContextMenuItem(id);
|
|
||||||
}
|
}
|
||||||
}
|
return super.onTextContextMenuItem(id);
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private CharSequence getSelectedText(@Nullable final CharSequence text) {
|
|
||||||
if (!hasSelection() || text == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int start = getSelectionStart();
|
|
||||||
final int end = getSelectionEnd();
|
|
||||||
return String.valueOf(start > end ? text.subSequence(end, start)
|
|
||||||
: text.subSequence(start, end));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package org.schabi.newpipe.views;
|
package org.schabi.newpipe.views;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.Selection;
|
|
||||||
import android.text.Spannable;
|
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
@ -11,6 +9,8 @@ import androidx.appcompat.widget.AppCompatTextView;
|
||||||
|
|
||||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.util.NewPipeTextViewHelper.shareSelectedTextWithShareUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)}
|
* An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)}
|
||||||
* when sharing selected text by using the {@code Share} command of the floating actions.
|
* when sharing selected text by using the {@code Share} command of the floating actions.
|
||||||
|
@ -38,28 +38,8 @@ public class NewPipeTextView extends AppCompatTextView {
|
||||||
@Override
|
@Override
|
||||||
public boolean onTextContextMenuItem(final int id) {
|
public boolean onTextContextMenuItem(final int id) {
|
||||||
if (id == android.R.id.shareText) {
|
if (id == android.R.id.shareText) {
|
||||||
final CharSequence text = getText();
|
return shareSelectedTextWithShareUtils(this);
|
||||||
final CharSequence selectedText = getSelectedText(text);
|
|
||||||
if (selectedText != null && selectedText.length() != 0) {
|
|
||||||
ShareUtils.shareText(getContext(), "", selectedText.toString());
|
|
||||||
}
|
|
||||||
final Spannable spannable = (text instanceof Spannable) ? (Spannable) text : null;
|
|
||||||
Selection.setSelection(spannable, getSelectionEnd());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return super.onTextContextMenuItem(id);
|
|
||||||
}
|
}
|
||||||
}
|
return super.onTextContextMenuItem(id);
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private CharSequence getSelectedText(@Nullable final CharSequence text) {
|
|
||||||
if (!hasSelection() || text == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int start = getSelectionStart();
|
|
||||||
final int end = getSelectionEnd();
|
|
||||||
return String.valueOf(start > end ? text.subSequence(end, start)
|
|
||||||
: text.subSequence(start, end));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue