mirror of https://github.com/ThmmyNoLife/mTHMMY
Ezerous
5 years ago
7 changed files with 112 additions and 88 deletions
@ -1,78 +0,0 @@ |
|||||
package gr.thmmy.mthmmy.utils.ui; |
|
||||
|
|
||||
import android.annotation.SuppressLint; |
|
||||
import android.app.Dialog; |
|
||||
import android.content.Context; |
|
||||
import android.graphics.drawable.ColorDrawable; |
|
||||
import android.view.MotionEvent; |
|
||||
import android.view.View; |
|
||||
import android.view.ViewGroup; |
|
||||
import android.view.ViewGroup.LayoutParams; |
|
||||
import android.view.Window; |
|
||||
import android.webkit.WebView; |
|
||||
|
|
||||
import com.bumptech.glide.Glide; |
|
||||
import com.github.chrisbanes.photoview.PhotoView; |
|
||||
|
|
||||
import gr.thmmy.mthmmy.base.BaseApplication; |
|
||||
|
|
||||
/** |
|
||||
* Workaround for WebView's inability to send onClick events (sends only onLongClickEvents) |
|
||||
* If an image is find when clicking it will be inflated as a zoomed/zoomable/pinchable PhotoView |
|
||||
*/ |
|
||||
public class WebViewOnTouchClickListener implements View.OnTouchListener { |
|
||||
private final static int screenWidth = BaseApplication.getInstance().getWidthInPixels(); |
|
||||
private final static int screenHeight = BaseApplication.getInstance().getHeightInPixels(); |
|
||||
|
|
||||
private final static long MAX_TOUCH_DURATION = 100; |
|
||||
private final Context context; |
|
||||
private long downTime; |
|
||||
|
|
||||
public WebViewOnTouchClickListener(Context context){ |
|
||||
this.context = context; |
|
||||
} |
|
||||
|
|
||||
@SuppressLint("ClickableViewAccessibility") |
|
||||
@Override |
|
||||
public boolean onTouch(View v, MotionEvent event) { |
|
||||
switch (event.getAction()) { |
|
||||
case MotionEvent.ACTION_DOWN: |
|
||||
downTime = event.getEventTime(); |
|
||||
break; |
|
||||
case MotionEvent.ACTION_UP: |
|
||||
if(event.getEventTime() - downTime <= MAX_TOUCH_DURATION) |
|
||||
onClick((WebView) v); |
|
||||
break; |
|
||||
default: |
|
||||
break; |
|
||||
} |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
private void onClick(WebView webView){ |
|
||||
WebView.HitTestResult result = webView.getHitTestResult(); |
|
||||
if(result.getType() == WebView.HitTestResult.IMAGE_TYPE){ |
|
||||
String imageURL = result.getExtra(); |
|
||||
showImage(imageURL); |
|
||||
} |
|
||||
webView.performClick(); |
|
||||
} |
|
||||
|
|
||||
private void showImage(String url) { |
|
||||
Dialog builder = new Dialog(context); |
|
||||
builder.requestWindowFeature(Window.FEATURE_NO_TITLE); |
|
||||
builder.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); |
|
||||
builder.getWindow().setBackgroundDrawable( |
|
||||
new ColorDrawable(android.graphics.Color.TRANSPARENT)); |
|
||||
|
|
||||
PhotoView photoView = new PhotoView(context); |
|
||||
photoView.setLayoutParams(new LayoutParams(screenWidth, screenHeight)); |
|
||||
|
|
||||
Glide.with(context).load(url).fitCenter().into(photoView); |
|
||||
|
|
||||
builder.addContentView(photoView, new ViewGroup.LayoutParams( |
|
||||
ViewGroup.LayoutParams.MATCH_PARENT, |
|
||||
ViewGroup.LayoutParams.MATCH_PARENT)); |
|
||||
builder.show(); |
|
||||
} |
|
||||
} |
|
@ -0,0 +1,105 @@ |
|||||
|
package gr.thmmy.mthmmy.views; |
||||
|
|
||||
|
import android.app.Dialog; |
||||
|
import android.content.ClipData; |
||||
|
import android.content.ClipboardManager; |
||||
|
import android.content.Context; |
||||
|
import android.graphics.drawable.ColorDrawable; |
||||
|
import android.util.AttributeSet; |
||||
|
import android.view.MotionEvent; |
||||
|
import android.view.ViewGroup; |
||||
|
import android.view.Window; |
||||
|
import android.webkit.WebView; |
||||
|
import android.widget.Toast; |
||||
|
|
||||
|
import com.bumptech.glide.Glide; |
||||
|
import com.github.chrisbanes.photoview.PhotoView; |
||||
|
|
||||
|
import gr.thmmy.mthmmy.base.BaseApplication; |
||||
|
|
||||
|
import static android.content.Context.CLIPBOARD_SERVICE; |
||||
|
|
||||
|
public class ReactiveWebView extends WebView { |
||||
|
private final static int screenWidth = BaseApplication.getInstance().getWidthInPixels(); |
||||
|
private final static int screenHeight = BaseApplication.getInstance().getHeightInPixels(); |
||||
|
|
||||
|
private final static long MAX_TOUCH_DURATION = 100; |
||||
|
private final Context context; |
||||
|
private long downTime; |
||||
|
|
||||
|
|
||||
|
public ReactiveWebView(Context context) { |
||||
|
super(context); |
||||
|
this.context = context; |
||||
|
setOnLongClickListener(); |
||||
|
} |
||||
|
|
||||
|
public ReactiveWebView(Context context, AttributeSet attrs) { |
||||
|
super(context, attrs); |
||||
|
this.context = context; |
||||
|
setOnLongClickListener(); |
||||
|
} |
||||
|
|
||||
|
public ReactiveWebView(Context context, AttributeSet attrs, int defStyleAttr) { |
||||
|
super(context, attrs, defStyleAttr); |
||||
|
this.context = context; |
||||
|
setOnLongClickListener(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean onTouchEvent(MotionEvent event) { |
||||
|
switch (event.getAction()) { |
||||
|
case MotionEvent.ACTION_DOWN: |
||||
|
downTime = event.getEventTime(); |
||||
|
break; |
||||
|
case MotionEvent.ACTION_UP: |
||||
|
if(event.getEventTime() - downTime <= MAX_TOUCH_DURATION) |
||||
|
performClick(); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
return super.onTouchEvent(event); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean performClick() { |
||||
|
WebView.HitTestResult result = this.getHitTestResult(); |
||||
|
if(result.getType() == WebView.HitTestResult.IMAGE_TYPE){ |
||||
|
String imageURL = result.getExtra(); |
||||
|
showImage(imageURL); |
||||
|
} |
||||
|
return super.performClick(); |
||||
|
} |
||||
|
|
||||
|
private void showImage(String url) { |
||||
|
Dialog builder = new Dialog(context); |
||||
|
builder.requestWindowFeature(Window.FEATURE_NO_TITLE); |
||||
|
builder.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); |
||||
|
builder.getWindow().setBackgroundDrawable( |
||||
|
new ColorDrawable(android.graphics.Color.TRANSPARENT)); |
||||
|
|
||||
|
PhotoView photoView = new PhotoView(context); |
||||
|
photoView.setLayoutParams(new ViewGroup.LayoutParams(screenWidth, screenHeight)); |
||||
|
|
||||
|
Glide.with(context).load(url).fitCenter().into(photoView); |
||||
|
|
||||
|
builder.addContentView(photoView, new ViewGroup.LayoutParams( |
||||
|
ViewGroup.LayoutParams.MATCH_PARENT, |
||||
|
ViewGroup.LayoutParams.MATCH_PARENT)); |
||||
|
builder.show(); |
||||
|
} |
||||
|
|
||||
|
private void setOnLongClickListener(){ |
||||
|
this.setOnLongClickListener(v -> { |
||||
|
HitTestResult result = ReactiveWebView.this.getHitTestResult(); |
||||
|
if(result.getType() == HitTestResult.SRC_ANCHOR_TYPE){ |
||||
|
ClipboardManager clipboard = (ClipboardManager) BaseApplication.getInstance().getSystemService(CLIPBOARD_SERVICE); |
||||
|
ClipData clip = ClipData.newPlainText("ReactiveWebViewCopiedText", result.getExtra()); |
||||
|
clipboard.setPrimaryClip(clip); |
||||
|
Toast.makeText(BaseApplication.getInstance().getApplicationContext(),"Link copied",Toast.LENGTH_SHORT).show(); |
||||
|
} |
||||
|
return false; |
||||
|
}); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue