Remove CustomEditText (#2640)

This commit is contained in:
Adam Jones 2019-03-19 14:42:01 +00:00 committed by neslihanturan
parent 3417d713d2
commit cfb06f3103
4 changed files with 43 additions and 235 deletions

View file

@ -1,194 +0,0 @@
package fr.free.nrw.commons.ui.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;
/**
* Custom edit text with a drawable click listener
* https://stackoverflow.com/questions/13135447/setting-onclicklistener-for-the-drawable-right-of-an-edittext
*/
@SuppressLint("AppCompatCustomView")
public class CustomEditText extends EditText {
private Drawable drawableRight;
private Drawable drawableLeft;
private Drawable drawableTop;
private Drawable drawableBottom;
int actionX, actionY;
private DrawableClickListener clickListener;
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// this Contructure required when you are using this view in xml
}
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setCompoundDrawables(Drawable left, Drawable top,
Drawable right, Drawable bottom) {
if (left != null) {
drawableLeft = left;
}
if (right != null) {
drawableRight = right;
}
if (top != null) {
drawableTop = top;
}
if (bottom != null) {
drawableBottom = bottom;
}
super.setCompoundDrawables(left, top, right, bottom);
}
/**
* Fires the appropriate drawable click listener on touching the icon
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Rect bounds;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
actionX = (int) event.getX();
actionY = (int) event.getY();
if (drawableBottom != null
&& drawableBottom.getBounds().contains(actionX, actionY)) {
clickListener.onClick(DrawableClickListener.DrawablePosition.BOTTOM);
return super.onTouchEvent(event);
}
if (drawableTop != null
&& drawableTop.getBounds().contains(actionX, actionY)) {
clickListener.onClick(DrawableClickListener.DrawablePosition.TOP);
return super.onTouchEvent(event);
}
// this works for left since container shares 0,0 origin with bounds
if (drawableLeft != null) {
bounds = null;
bounds = drawableLeft.getBounds();
int x, y;
int extraTapArea = (int) (13 * getResources().getDisplayMetrics().density + 0.5);
x = actionX;
y = actionY;
if (!bounds.contains(actionX, actionY)) {
// Gives the +20 area for tapping.
x = (int) (actionX - extraTapArea);
y = (int) (actionY - extraTapArea);
if (x <= 0)
x = actionX;
if (y <= 0)
y = actionY;
// Creates square from the smallest value
if (x < y) {
y = x;
}
}
if (bounds.contains(x, y) && clickListener != null) {
clickListener
.onClick(DrawableClickListener.DrawablePosition.LEFT);
event.setAction(MotionEvent.ACTION_CANCEL);
return false;
}
}
if (drawableRight != null) {
bounds = null;
bounds = drawableRight.getBounds();
int x, y;
int extraTapArea = 13;
/*
IF USER CLICKS JUST OUT SIDE THE RECTANGLE OF THE DRAWABLE
THAN ADD X AND SUBTRACT THE Y WITH SOME VALUE SO THAT AFTER
CALCULATING X AND Y CO-ORDINATE LIES INTO THE DRAWBABLE
BOUND. - this process help to increase the tappable area of
the rectangle.
*/
x = (int) (actionX + extraTapArea);
y = (int) (actionY - extraTapArea);
/*
Since this is right drawable subtract the value of x from the width
of view. so that width - tappedarea will result in x co-ordinate in drawable bound.
*/
x = getWidth() - x;
/*x can be negative if user taps at x co-ordinate just near the width.
* e.g views width = 300 and user taps 290. Then as per previous calculation
* 290 + 13 = 303. So subtract X from getWidth() will result in negative value.
* So to avoid this add the value previous added when x goes negative.
*/
if (x <= 0) {
x += extraTapArea;
}
/* If result after calculating for extra tappable area is negative.
* assign the original value so that after subtracting
* extra tapping area value doesn't go into negative value.
*/
if (y <= 0)
y = actionY;
// If drawble bounds contains the x and y points then move ahead.
if (bounds.contains(x, y) && clickListener != null) {
clickListener
.onClick(DrawableClickListener.DrawablePosition.RIGHT);
event.setAction(MotionEvent.ACTION_CANCEL);
return false;
}
return super.onTouchEvent(event);
}
}
return super.onTouchEvent(event);
}
@Override
protected void finalize() throws Throwable {
drawableRight = null;
drawableBottom = null;
drawableLeft = null;
drawableTop = null;
super.finalize();
}
/**
* Attaches the drawable click listener to the custom edit text
* @param listener
*/
public void setDrawableClickListener(DrawableClickListener listener) {
this.clickListener = listener;
}
/**
* Interface for drawable click listener
*/
public interface DrawableClickListener {
enum DrawablePosition {TOP, BOTTOM, LEFT, RIGHT}
void onClick(DrawablePosition target);
}
}

View file

@ -1,25 +1,27 @@
package fr.free.nrw.commons.upload;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.EditText;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.ui.widget.CustomEditText;
import fr.free.nrw.commons.utils.AbstractTextWatcher;
import fr.free.nrw.commons.utils.BiMap;
import fr.free.nrw.commons.utils.ViewUtil;
@ -117,7 +119,7 @@ class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewH
AppCompatSpinner spinnerDescriptionLanguages;
@BindView(R.id.description_item_edit_text)
CustomEditText descItemEditText;
EditText descItemEditText;
private View view;
@ -128,6 +130,7 @@ class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewH
Timber.i("descItemEditText:" + descItemEditText);
}
@SuppressLint("ClickableViewAccessibility")
public void init(int position) {
if (position == 0) {
Timber.d("Title is " + title);
@ -150,16 +153,19 @@ class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewH
}
});
descItemEditText.setDrawableClickListener(target -> {
switch (target) {
case RIGHT:
if (getAdapterPosition() == 0) {
callback.showAlert(R.string.media_detail_title, R.string.title_info);
}
break;
default:
break;
}
descItemEditText.setOnTouchListener((v, event) -> {
// Check this is a touch up event
if(event.getAction() != MotionEvent.ACTION_UP) return false;
// Check we are tapping within 15px of the info icon
int extraTapArea = 15;
Drawable info = descItemEditText.getCompoundDrawables()[2];
int infoHitboxX = descItemEditText.getWidth() - info.getBounds().width();
if (event.getX() + extraTapArea < infoHitboxX) return false;
// If the above are true, show the info dialog
callback.showAlert(R.string.media_detail_title, R.string.title_info);
return true;
});
} else {
@ -170,10 +176,24 @@ class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewH
} else {
descItemEditText.setText("");
}
// Show the info icon for the first description
if (position == 1) {
descItemEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, getInfoIcon(), null);
} else {
descItemEditText.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
descItemEditText.setOnTouchListener((v, event) -> {
// Check this is a touch up event
if(event.getAction() != MotionEvent.ACTION_UP) return false;
// Check we are tapping within 15px of the info icon
int extraTapArea = 15;
Drawable info = descItemEditText.getCompoundDrawables()[2];
int infoHitboxX = descItemEditText.getWidth() - info.getBounds().width();
if (event.getX() + extraTapArea < infoHitboxX) return false;
// If the above are true, show the info dialog
callback.showAlert(R.string.media_detail_description, R.string.description_info);
return true;
});
}
descItemEditText.addTextChangedListener(new AbstractTextWatcher(descriptionText->{
@ -188,20 +208,6 @@ class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewH
}
});
descItemEditText.setDrawableClickListener(target -> {
switch (target) {
case RIGHT:
if (getAdapterPosition() == 1) {
callback.showAlert(R.string.media_detail_description,
R.string.description_info);
}
break;
default:
break;
}
});
initLanguageSpinner(position, description);
}

View file

@ -19,16 +19,12 @@
android:layout_height="wrap_content"
android:layout_weight="8">
<fr.free.nrw.commons.ui.widget.CustomEditText
<EditText
android:id="@+id/description_item_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/share_description_hint"
android:imeOptions="flagNoExtractUi"
android:drawablePadding="4dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:drawableRight="@drawable/mapbox_info_icon_default"
android:imeOptions="actionNext|flagNoExtractUi"
android:inputType="textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>

View file

@ -7,12 +7,12 @@
android:layout_height="wrap_content"
tools:showIn="@layout/activity_upload">
<fr.free.nrw.commons.ui.widget.CustomEditText
<EditText
android:id="@+id/description_item_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/share_title_hint"
android:imeOptions="actionNext"
android:inputType="textMultiLine"
android:imeOptions="actionNext|flagNoExtractUi"
android:inputType="text"
android:nextFocusForward="@+id/image_description" />
</com.google.android.material.textfield.TextInputLayout>