Skip to content

Commit

Permalink
move all scrolling-flinging logic into DiaryWebView
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaned1as committed Dec 7, 2015
1 parent 3cc00fd commit f4ce0ba
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 107 deletions.
60 changes: 0 additions & 60 deletions src/main/java/adonai/diary_browser/DiaryListActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,36 +113,12 @@ public class DiaryListActivity extends DiaryActivity implements OnClickListener,
ImageButton mExitButton;
ImageButton mQuotesButton;
ImageButton mUmailButton;
ImageButton mScrollButton;
LinearLayout mTabs;
Handler mUiHandler;

SwipeRefreshLayout swipeDiscussions;
ArrowDrawable mActionBarToggle;

// Часть кода относится к кнопке быстрой промотки
private Runnable fadeAnimation = new Runnable() {
@Override
public void run() {
Animation animation = AnimationUtils.loadAnimation(mScrollButton.getContext(), android.R.anim.fade_out);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}

@Override
public void onAnimationEnd(Animation animation) {
mScrollButton.setVisibility(View.INVISIBLE);
}

@Override
public void onAnimationRepeat(Animation animation) {
}
});
mScrollButton.startAnimation(animation);
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand Down Expand Up @@ -206,8 +182,6 @@ public void onRefresh() {
mQuotesButton.setOnClickListener(this);
mUmailButton = (ImageButton) main.findViewById(R.id.umail_button);
mUmailButton.setOnClickListener(this);
mScrollButton = (ImageButton) main.findViewById(R.id.updown_button);
mScrollButton.setOnClickListener(this);

mDiaryBrowser = (ListView) main.findViewById(R.id.diary_browser);
mDiaryBrowser.setOnItemLongClickListener(this);
Expand Down Expand Up @@ -321,16 +295,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

if (v.getId() == R.id.page_browser) {
Message msg = Message.obtain(mUiHandler, Utils.HANDLE_IMAGE_CLICK);
mPageBrowser.requestImageRef(msg);
}
}

@Override
protected void onResume() {
super.onResume();
Expand Down Expand Up @@ -667,23 +631,6 @@ private void handleTabChange(String url) {
mTabs.getChildAt(mCurrentTab).getBackground().setAlpha(150);
}

// Часть кода относится к кнопке быстрой промотки
void handleScroll(int direction) {
mScrollButton.setVisibility(View.VISIBLE);
mScrollButton.removeCallbacks(fadeAnimation);
mScrollButton.clearAnimation();
mScrollButton.postDelayed(fadeAnimation, 2000);
switch (direction) {
case Utils.VIEW_SCROLL_DOWN:
mScrollButton.setImageResource(R.drawable.overscroll_button_down);
break;
case Utils.VIEW_SCROLL_UP:
mScrollButton.setImageResource(R.drawable.overscroll_button_up);
break;
}

}

public void onClick(View view) {
if (view == mExitButton) {
AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(mPageBrowser.getContext());
Expand Down Expand Up @@ -714,13 +661,6 @@ public void onClick(DialogInterface dialog, int item) {
} else if (view == mUmailButton) {
Intent postIntent = new Intent(getApplicationContext(), UmailListActivity.class);
startActivity(postIntent);
} else if (view == mScrollButton) {
// Офигительная штука, документации по которой нет.
// Устанавливает начальную скорость скролла даже если в данный момент уже происходит скроллинг
if (mPageBrowser.scrolling == Utils.VIEW_SCROLL_DOWN)
mPageBrowser.flingScroll(0, 100000);
else
mPageBrowser.flingScroll(0, -100000);
} else if (view == mUmailNum) {
Intent postIntent = new Intent(getApplicationContext(), UmailListActivity.class);
postIntent.putExtra("url", getUser().getNewUmailLink());
Expand Down
165 changes: 133 additions & 32 deletions src/main/java/adonai/diary_browser/DiaryWebView.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.os.Message;
Expand All @@ -15,38 +14,54 @@
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.Toast;

import com.afollestad.materialdialogs.AlertDialogWrapper;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import adonai.diary_browser.entities.Umail;

@SuppressLint("SetJavaScriptEnabled")
public class DiaryWebView extends WebView {
public static final int MILLIS_TO_FAST_SCROLL = 200;
public class DiaryWebView extends FrameLayout implements View.OnClickListener {

private static final int VIEW_SCROLL_DOWN = 2;
private static final int VIEW_SCROLL_UP = 1;
private static final int MIN_TRIGGER_DISTANCE = 90;
private static final int MILLIS_TO_FAST_SCROLL = 200;

// текущий контекст
public static final int IMAGE_SAVE = 0;
public static final int IMAGE_COPY_URL = 1;
public static final int IMAGE_OPEN_HERE = 2;
public static final int IMAGE_OPEN_EXTERNAL = 3;
public static final int IMAGE_SAVE = 0;
public static final int IMAGE_COPY_URL = 1;
public static final int IMAGE_OPEN_HERE = 2;
public static final int IMAGE_OPEN_EXTERNAL = 3;

private DiaryActivity mActivity;
private WebView mWebContent;
private ImageButton mScrollButton;

private int mScrollDirection = 0;
private GestureDetector mGestureDetector = new GestureDetector(getContext(), new ClickScrollDetector());

DiaryActivity mActivity;
int scrolling = 0;
private GestureDetector mGestureDetector = new GestureDetector(getContext(), new webGestureDetector());

/**
* Стандартные конструкторы
*/

public DiaryWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
Expand All @@ -62,59 +77,105 @@ public DiaryWebView(Context context) {
init();
}

public void init() {
if (getContext() instanceof DiaryActivity)
mActivity = (DiaryActivity) getContext();
/**
* Делегируем наверх методы WebView
*/

public void loadUrl(String url) {
mWebContent.loadUrl(url);
}

public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) {
mWebContent.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
}

public WebSettings getSettings() {
return mWebContent.getSettings();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
public boolean canScrollVertically(int direction) {
return mWebContent.canScrollVertically(direction);
}

/**
* Далее наша логика
*/

public void init() {
final View layout = LayoutInflater.from(getContext()).inflate(R.layout.diary_web_view, this, true);
mWebContent = (WebView) layout.findViewById(R.id.web_content);
mScrollButton = (ImageButton) layout.findViewById(R.id.updown_button);
mActivity = (DiaryActivity) getContext();

mWebContent.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
});
mScrollButton.setOnClickListener(this);
}

public void setDefaultSettings() {
WebSettings settings = getSettings();
WebSettings settings = mWebContent.getSettings();
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setJavaScriptEnabled(true);
settings.setUserAgentString(DiaryHttpClient.FIXED_USER_AGENT);
settings.setDefaultTextEncodingName("windows-1251");
settings.setJavaScriptCanOpenWindowsAutomatically(false);
setWebViewClient(new DiaryWebClient());
setWebChromeClient(new WebChromeClient());
mWebContent.setWebViewClient(new DiaryWebClient());
mWebContent.setWebChromeClient(new WebChromeClient());

// Lollipop blocks mixed content but we should load CSS from filesystem
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
}

private class webGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public void onClick(View v) {
if (v == mScrollButton) {
// Офигительная штука, документации по которой нет.
// Устанавливает начальную скорость скролла даже если в данный момент уже происходит скроллинг
if (mScrollDirection == VIEW_SCROLL_DOWN)
mWebContent.flingScroll(0, 100000);
else
mWebContent.flingScroll(0, -100000);
}
}

private class ClickScrollDetector extends GestureDetector.SimpleOnGestureListener {

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (mActivity instanceof DiaryListActivity)
if (e1 != null && e2 != null && e2.getEventTime() - e1.getEventTime() < MILLIS_TO_FAST_SCROLL) {
if (distanceY > 90) {
scrolling = Utils.VIEW_SCROLL_DOWN;
((DiaryListActivity) mActivity).handleScroll(Utils.VIEW_SCROLL_DOWN);
} else if (distanceY < -90) {
scrolling = Utils.VIEW_SCROLL_UP;
((DiaryListActivity) mActivity).handleScroll(Utils.VIEW_SCROLL_UP);
}
if (e1 != null && e2 != null && e2.getEventTime() - e1.getEventTime() < MILLIS_TO_FAST_SCROLL) {
if (distanceY > MIN_TRIGGER_DISTANCE) {
mScrollDirection = VIEW_SCROLL_DOWN;
handleScroll();
} else if (distanceY < -MIN_TRIGGER_DISTANCE) {
mScrollDirection = VIEW_SCROLL_UP;
handleScroll();
}

}

return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Message msg = Message.obtain(mActivity.mUiHandler, Utils.HANDLE_NAME_CLICK);
mActivity.mPageBrowser.requestFocusNodeHref(msg);
mWebContent.requestFocusNodeHref(msg);

return super.onSingleTapConfirmed(e);
}

@Override
public void onLongPress(MotionEvent e) {
Message msg = Message.obtain(mActivity.mUiHandler, Utils.HANDLE_IMAGE_CLICK);
mWebContent.requestImageRef(msg);
}
}

@Override
Expand Down Expand Up @@ -319,4 +380,44 @@ public void onClick(DialogInterface dialog, int which) {
return true;
}
}

// Часть кода относится к кнопке быстрой промотки
private void handleScroll() {
mScrollButton.setVisibility(View.VISIBLE);
mScrollButton.removeCallbacks(fadeAnimation);
mScrollButton.clearAnimation();
mScrollButton.postDelayed(fadeAnimation, 2000);
switch (mScrollDirection) {
case VIEW_SCROLL_DOWN:
mScrollButton.setImageResource(R.drawable.overscroll_button_down);
break;
case VIEW_SCROLL_UP:
mScrollButton.setImageResource(R.drawable.overscroll_button_up);
break;
}

}

// Часть кода относится к кнопке быстрой промотки
private Runnable fadeAnimation = new Runnable() {
@Override
public void run() {
Animation animation = AnimationUtils.loadAnimation(mScrollButton.getContext(), android.R.anim.fade_out);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}

@Override
public void onAnimationEnd(Animation animation) {
mScrollButton.setVisibility(View.INVISIBLE);
}

@Override
public void onAnimationRepeat(Animation animation) {
}
});
mScrollButton.startAnimation(animation);
}
};
}
3 changes: 0 additions & 3 deletions src/main/java/adonai/diary_browser/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ public class Utils {
public static final String CLOSING_PANE_BROADCAST = "CLOSING_PANE";
public static final String OPENING_PANE_BROADCAST = "OPENING_PANE";

static final int VIEW_SCROLL_UP = 1;
static final int VIEW_SCROLL_DOWN = 2;

// Команды хэндлерам
static final int HANDLE_AUTHORIZATION_ERROR = 1;
static final int HANDLE_AUTHORIZE = 2;
Expand Down
24 changes: 24 additions & 0 deletions src/main/res/layout/diary_web_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<WebView
android:id="@+id/web_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/updown_button"
android:layout_gravity="end|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/overscroll_button_down"
android:visibility="invisible"
android:scaleType="fitXY"
android:contentDescription="@string/overscroll_button"
android:padding="5dp" />

</FrameLayout>
Loading

0 comments on commit f4ce0ba

Please sign in to comment.