Pasted text should have fonts unified (for Caption/Description) (#4667)

* Changed hardcoded "More" to getStrings(R.string.more) for Unlogged user
- MainActivity toolbar showed "More" when clicked on More options
   in other language than English

* Changed hardcoded "More" to getStrings(R.string.more) for Logged user
- MainActivity toolbar showed "More" when clicked on More options
   in other language than English

* Added test for: MainActivity.setUpPager

* Pasted text is now unformatted for caption and description

* Removed other branch contribution

* Added test

* Rename .java to .kt

* Test from Java to Kotlin; +small fix

* PasteSensitiveTextInputEditTextTest - updated
This commit is contained in:
dado1111 2021-12-06 19:59:44 +01:00 committed by GitHub
parent ad0aa7d4ea
commit e910b1d14f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 159 additions and 9 deletions

View file

@ -0,0 +1,79 @@
package fr.free.nrw.commons.ui
import android.R
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import androidx.test.core.app.ApplicationProvider
import androidx.test.runner.AndroidJUnit4
import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import java.lang.Exception
import kotlin.Throws
@RunWith(AndroidJUnit4::class)
class PasteSensitiveTextInputEditTextTest {
private var context: Context? = null
private var textView: PasteSensitiveTextInputEditText? = null
@Before
fun setup() {
context = ApplicationProvider.getApplicationContext()
textView = PasteSensitiveTextInputEditText(context)
}
@Test
fun onTextContextMenuItemPasteFormattingDisabled() {
textView!!.setFormattingAllowed(false);
textView!!.setText("Text")
textView!!.onTextContextMenuItem(R.id.paste)
Assert.assertEquals("Text", textView!!.text.toString())
}
@Test
fun onTextContextMenuItemPasteFormattingAllowed() {
textView!!.setFormattingAllowed(true);
textView!!.setText("Text")
textView!!.onTextContextMenuItem(R.id.paste)
Assert.assertEquals("Text", textView!!.text.toString())
}
@Test
fun onTextContextMenuItemPaste() {
textView!!.setText("Text")
textView!!.onTextContextMenuItem(R.id.paste)
Assert.assertEquals("Text", textView!!.text.toString())
}
@Test
fun onTextContextMenuItemNotPaste() {
textView!!.setText("Text")
textView!!.onTextContextMenuItem(R.id.copy)
Assert.assertEquals("Text", textView!!.text.toString())
}
// this test has no real value, just % for test code coverage
@Test
fun extractFormattingAttributeSet(){
val methodExtractFormattingAttribute = textView!!.javaClass.getDeclaredMethod(
"extractFormattingAttribute", Context::class.java, AttributeSet::class.java)
methodExtractFormattingAttribute.isAccessible = true
methodExtractFormattingAttribute.invoke(textView, context, null)
}
@Test
@Throws(Exception::class)
fun setFormattingAllowed() {
val fieldFormattingAllowed = textView!!.javaClass.getDeclaredField("formattingAllowed")
fieldFormattingAllowed.isAccessible = true
textView!!.setFormattingAllowed(true)
Assert.assertTrue(fieldFormattingAllowed.getBoolean(textView))
textView!!.setFormattingAllowed(false)
Assert.assertFalse(fieldFormattingAllowed.getBoolean(textView))
}
}

View file

@ -0,0 +1,67 @@
package fr.free.nrw.commons.ui;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Build.VERSION;
import android.util.AttributeSet;
import android.util.Log;
import com.google.android.material.textfield.TextInputEditText;
import fr.free.nrw.commons.R;
public class PasteSensitiveTextInputEditText extends TextInputEditText {
private boolean formattingAllowed = true;
public PasteSensitiveTextInputEditText(final Context context) {
super(context);
}
public PasteSensitiveTextInputEditText(final Context context, final AttributeSet attrs) {
super(context, attrs);
formattingAllowed = extractFormattingAttribute(context, attrs);
}
@Override
public boolean onTextContextMenuItem(int id) {
// if not paste command, or formatting is allowed, return default
if(id != android.R.id.paste || formattingAllowed){
return super.onTextContextMenuItem(id);
}
// if its paste and formatting not allowed
boolean proceeded;
if(VERSION.SDK_INT >= 23) {
proceeded = super.onTextContextMenuItem(android.R.id.pasteAsPlainText);
}else {
proceeded = super.onTextContextMenuItem(id);
if (proceeded && getText() != null) {
// rewrite with plain text so formatting is lost
setText(getText().toString());
setSelection(getText().length());
}
}
return proceeded;
}
private boolean extractFormattingAttribute(Context context, AttributeSet attrs){
boolean formatAllowed = true;
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.PasteSensitiveTextInputEditText, 0, 0);
try {
formatAllowed = a.getBoolean(
R.styleable.PasteSensitiveTextInputEditText_allowFormatting, true);
} finally {
a.recycle();
}
return formatAllowed;
}
public void setFormattingAllowed(boolean formattingAllowed){
this.formattingAllowed = formattingAllowed;
}
}

View file

@ -10,14 +10,12 @@ import android.widget.ImageView;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText;
import fr.free.nrw.commons.utils.AbstractTextWatcher;
import java.util.ArrayList;
import java.util.HashMap;
@ -93,13 +91,13 @@ public class UploadMediaDetailAdapter extends RecyclerView.Adapter<UploadMediaDe
Spinner spinnerDescriptionLanguages;
@BindView(R.id.description_item_edit_text)
TextInputEditText descItemEditText;
PasteSensitiveTextInputEditText descItemEditText;
@BindView(R.id.description_item_edit_text_input_layout)
TextInputLayout descInputLayout;
@BindView(R.id.caption_item_edit_text)
TextInputEditText captionItemEditText;
PasteSensitiveTextInputEditText captionItemEditText;
@BindView(R.id.caption_item_edit_text_input_layout)
TextInputLayout captionInputLayout;

View file

@ -39,13 +39,14 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.textfield.TextInputEditText
<fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText
android:id="@+id/caption_item_edit_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/share_caption_hint"
android:imeOptions="actionNext|flagNoExtractUi"
android:inputType="textMultiLine" />
android:inputType="textMultiLine"
app:allowFormatting="false" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
@ -56,13 +57,14 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.textfield.TextInputEditText
<fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText
android:id="@+id/description_item_edit_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/share_description_hint"
android:imeOptions="actionNext|flagNoExtractUi"
android:inputType="textMultiLine" />
android:inputType="textMultiLine"
app:allowFormatting="false" />
</com.google.android.material.textfield.TextInputLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -57,4 +57,8 @@
<attr name="camera" format="color"/>
<attr name="centerRegion" format="color"/>
</declare-styleable>
<declare-styleable name="PasteSensitiveTextInputEditText">
<attr name="allowFormatting" format="boolean"/>
</declare-styleable>
</resources>