Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@
/app/build/
/local.properties
/app/schemas/
/.project
/.settings/org.eclipse.buildship.core.prefs
248 changes: 152 additions & 96 deletions app/src/main/java/codes/nh/streambrowser/screens/browser/Browser.java
Original file line number Diff line number Diff line change
@@ -1,125 +1,181 @@
package codes.nh.streambrowser.screens.browser;

package codes.nh.streambrowser.screens.browser;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.DisplayMetrics;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Map;

import codes.nh.streambrowser.screens.stream.Stream;
import codes.nh.streambrowser.utils.AppUtils;

import android.os.Message;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Map;

import codes.nh.streambrowser.screens.stream.Stream;
import codes.nh.streambrowser.utils.AppUtils;

public class Browser extends WebView {

public Browser(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
private static final float PULL_TO_REFRESH_THRESHOLD_DP = 180f;

initializeBrowser();
}
private float pullToRefreshThresholdPx;

private void initializeBrowser() {
WebSettings settings = getSettings();
private float pullStartY = Float.NaN;

settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
private boolean pullEligible;

private boolean pullTriggered;

public Browser(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);

initializeBrowser();
}

private void initializeBrowser() {
WebSettings settings = getSettings();

settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);

settings.setJavaScriptEnabled(true);
settings.setSupportMultipleWindows(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setMediaPlaybackRequiresUserGesture(false);
settings.setDomStorageEnabled(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);

BrowserClient browserClient = new BrowserClient();
setWebViewClient(browserClient);

settings.setDomStorageEnabled(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
BrowserClient browserClient = new BrowserClient();
setWebViewClient(browserClient);
BrowserChromeClient browserChromeClient = new BrowserChromeClient();
setWebChromeClient(browserChromeClient);

//CookieManager.getInstance().setAcceptThirdPartyCookies(this, true);
}

private boolean desktopMode = false;

public boolean getDesktopMode() {
return desktopMode;
}

public void setDesktopMode(boolean enabled) {
desktopMode = enabled;

String userAgent = getSettings().getUserAgentString();
if (enabled) {
userAgent = userAgent
.replace(" Mobile ", " Dummy1 ")
.replace(" Android ", " Dummy2 ");
} else {
userAgent = userAgent
.replace(" Dummy1 ", " Mobile ")
.replace(" Dummy2 ", " Android ");
}
getSettings().setUserAgentString(userAgent);
AppUtils.log("new user agent = " + userAgent);

//getSettings().setUseWideViewPort(enabled);
}

@Override
public void loadUrl(@NonNull String url) {
super.loadUrl(url);
getListener().onRequestPage(url);
}

@Override
public void loadUrl(@NonNull String url, @NonNull Map<String, String> additionalHttpHeaders) {
super.loadUrl(url, additionalHttpHeaders);
getListener().onRequestPage(url);
}

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
pullToRefreshThresholdPx = PULL_TO_REFRESH_THRESHOLD_DP * displayMetrics.density;

//CookieManager.getInstance().setAcceptThirdPartyCookies(this, true);
}

private boolean desktopMode = false;

public boolean getDesktopMode() {
return desktopMode;
}

public void setDesktopMode(boolean enabled) {
desktopMode = enabled;

String userAgent = getSettings().getUserAgentString();
if (enabled) {
userAgent = userAgent
.replace(" Mobile ", " Dummy1 ")
.replace(" Android ", " Dummy2 ");
} else {
userAgent = userAgent
.replace(" Dummy1 ", " Mobile ")
.replace(" Dummy2 ", " Android ");
}
getSettings().setUserAgentString(userAgent);
AppUtils.log("new user agent = " + userAgent);

//getSettings().setUseWideViewPort(enabled);
}

@Override
public void loadUrl(@NonNull String url) {
super.loadUrl(url);
getListener().onRequestPage(url);
}

@Override
public void loadUrl(@NonNull String url, @NonNull Map<String, String> additionalHttpHeaders) {
super.loadUrl(url, additionalHttpHeaders);
getListener().onRequestPage(url);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
pullStartY = event.getY();
pullTriggered = false;
pullEligible = !canScrollVertically(-1);
break;
case MotionEvent.ACTION_MOVE:
if (!pullEligible || pullTriggered) {
break;
}
if (canScrollVertically(-1)) {
pullEligible = false;
break;
}
float dragDistance = event.getY() - pullStartY;
if (dragDistance >= pullToRefreshThresholdPx) {
pullTriggered = true;
getListener().onPullToRefresh();
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
resetPullGestureState();
break;
default:
break;
}
getListener().onTouch();
return super.onTouchEvent(event);
}

//listener

private Listener listener;

public Listener getListener() {
return listener;
}

public void setListener(Listener listener) {
this.listener = listener;
private void resetPullGestureState() {
pullStartY = Float.NaN;
pullEligible = false;
pullTriggered = false;
}

//listener

private Listener listener;

public Listener getListener() {
return listener;
}

public void setListener(Listener listener) {
this.listener = listener;
}

interface Listener {

void onRequestPage(String url);

void onStartLoadPage(String url);

void onFinishLoadPage(String url);

void onUpdateUrl(String url);

void onUpdateTitle(String title);

void onUpdateFavicon(Bitmap favicon);

void onUpdateProgress(int progress);

boolean onRedirect(String oldUrl, String newUrl);

void onFindStream(Stream stream);

void onTouch();

interface Listener {

void onRequestPage(String url);

void onStartLoadPage(String url);

void onFinishLoadPage(String url);

void onUpdateUrl(String url);

void onUpdateTitle(String title);

void onUpdateFavicon(Bitmap favicon);

void onUpdateProgress(int progress);

boolean onRedirect(String oldUrl, String newUrl);
void onPullToRefresh();

void onFindStream(Stream stream);
boolean onCreateWindow(Browser parentBrowser, Message resultMsg);

void onTouch();
void onCloseWindow(Browser browser);
}
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,49 @@
package codes.nh.streambrowser.screens.browser;

package codes.nh.streambrowser.screens.browser;
import android.graphics.Bitmap;
import android.os.Message;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

public class BrowserChromeClient extends WebChromeClient {

@Override
public void onReceivedTitle(WebView webView, String title) {
super.onReceivedTitle(webView, title);


public class BrowserChromeClient extends WebChromeClient {

@Override
public void onReceivedTitle(WebView webView, String title) {
super.onReceivedTitle(webView, title);

Browser browser = (Browser) webView;
browser.getListener().onUpdateTitle(title);
}

@Override
public void onReceivedIcon(WebView webView, Bitmap favicon) {
super.onReceivedIcon(webView, favicon);

Browser browser = (Browser) webView;
browser.getListener().onUpdateFavicon(favicon);
}

@Override
public void onProgressChanged(WebView webView, int progress) {
super.onProgressChanged(webView, progress);

Browser browser = (Browser) webView;
browser.getListener().onUpdateTitle(title);
browser.getListener().onUpdateProgress(progress);
}

@Override
public void onReceivedIcon(WebView webView, Bitmap favicon) {
super.onReceivedIcon(webView, favicon);

public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) {
Browser browser = (Browser) webView;
browser.getListener().onUpdateFavicon(favicon);
return browser.getListener().onCreateWindow(browser, resultMsg);
}

@Override
public void onProgressChanged(WebView webView, int progress) {
super.onProgressChanged(webView, progress);

Browser browser = (Browser) webView;
browser.getListener().onUpdateProgress(progress);
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
if (window instanceof Browser) {
Browser browser = (Browser) window;
browser.getListener().onCloseWindow(browser);
}
}

}
}
Loading