Skip to content

Commit

Permalink
Merge the Share process of the two classes into one
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
AudricV committed Sep 24, 2021
1 parent 158e7c7 commit 48b3051
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
24 changes: 3 additions & 21 deletions app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.schabi.newpipe.views;

import android.content.Context;
import android.text.Selection;
import android.text.Spannable;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
Expand All @@ -11,6 +9,8 @@

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)}
* when sharing selected text by using the {@code Share} command of the floating actions.
Expand Down Expand Up @@ -38,27 +38,9 @@ public NewPipeEditText(@NonNull final Context context,
@Override
public boolean onTextContextMenuItem(final int id) {
if (id == android.R.id.shareText) {
final Spannable text = getText();
final CharSequence selectedText = getSelectedText(text);
if (selectedText != null && selectedText.length() != 0) {
ShareUtils.shareText(getContext(), "", selectedText.toString());
}
Selection.setSelection(text, getSelectionEnd());
return true;
return shareSelectedTextWithShareUtils(this);
} else {
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));
}
}
25 changes: 3 additions & 22 deletions app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.schabi.newpipe.views;

import android.content.Context;
import android.text.Selection;
import android.text.Spannable;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
Expand All @@ -11,6 +9,8 @@

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)}
* when sharing selected text by using the {@code Share} command of the floating actions.
Expand Down Expand Up @@ -38,28 +38,9 @@ public NewPipeTextView(@NonNull final Context context,
@Override
public boolean onTextContextMenuItem(final int id) {
if (id == android.R.id.shareText) {
final CharSequence text = getText();
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;
return shareSelectedTextWithShareUtils(this);
} else {
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));
}
}

0 comments on commit 48b3051

Please sign in to comment.