Skip to content

Commit

Permalink
Adding in new logging methods, a new callback function for injection …
Browse files Browse the repository at this point in the history
…failures, and some minor bugfixes
  • Loading branch information
PGMacDesign committed Apr 17, 2020
1 parent e22cecd commit b5e529b
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 28 deletions.
6 changes: 5 additions & 1 deletion turbolinks/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,16 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
api 'androidx.appcompat:appcompat:1.0.2'
api 'com.google.code.gson:gson:2.8.2'
api 'com.google.code.gson:gson:2.8.6'
api 'org.apache.commons:commons-lang3:3.4'
// api 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
testImplementation 'org.assertj:assertj-core:1.7.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
*/
public interface TurbolinksAdapter {

/**
* Called whenever the page both does not support turbolinks and the bridge injection failed.
* This specifically runs after the `onPageSupportsTurbolinks(false)` runs and runs on the Main
* Thread
*/
void bridgeInjectionFailed();

/**
* Called whenever the page is reloaded via a pull to refresh
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ static void injectTurbolinksBridge(final TurbolinksSession turbolinksSession, Co
WebView webView, TurbolinksDebugCallback debugCallback) {
try {
String jsCall = String.format(scriptInjectionFormat, TurbolinksHelper.getContentFromAssetFile(context, "js/turbolinks_bridge.js"));
runJavascriptRaw(context, webView, jsCall);
runJavascriptRaw(context, webView, jsCall, debugCallback);
} catch (IOException e) {
TurbolinksLog.e("Error injecting script file into webview: " + e.toString(), debugCallback);
}
Expand All @@ -103,7 +103,8 @@ static void injectTurbolinksBridge(final TurbolinksSession turbolinksSession, Co
* @param functionName The Javascript function name only (no parenthesis or parameters).
* @param params A comma delimited list of parameter values.
*/
static void runJavascript(Context context, final WebView webView, String functionName, Object... params) {
static void runJavascript(Context context, final WebView webView, String functionName,
final TurbolinksDebugCallback debugCallback, Object... params) {
final String fullJs;

if (params != null) {
Expand All @@ -120,6 +121,9 @@ static void runJavascript(Context context, final WebView webView, String functio
runOnMainThread(context, new Runnable() {
@Override
public void run() {
if(debugCallback != null) {
TurbolinksLog.d("Attempting to runJavascript: " + fullJs, debugCallback);
}
webView.loadUrl(fullJs);
}
});
Expand All @@ -134,9 +138,25 @@ public void run() {
* @param javascript The raw Javascript to be executed, fully escaped/encoded in advance.
*/
static void runJavascriptRaw(Context context, final WebView webView, final String javascript) {
runJavascriptRaw(context, webView, javascript, null);
}

/**
* <p>Runs raw Javascript that's passed in. You are responsible for encoding/escaping the
* function call.</p>
*
* @param context An activity context.
* @param webView The shared webView.
* @param javascript The raw Javascript to be executed, fully escaped/encoded in advance.
* @param debugCallback The callback to send error messages on
*/
static void runJavascriptRaw(Context context, final WebView webView, final String javascript, final TurbolinksDebugCallback debugCallback) {
runOnMainThread(context, new Runnable() {
@Override
public void run() {
if(debugCallback != null){
TurbolinksLog.d("Running Javascript: " + javascript, debugCallback);
}
webView.loadUrl("javascript:" + javascript);
}
});
Expand All @@ -149,6 +169,7 @@ public void run() {
* @param runnable A runnable to execute on the main thread.
*/
static void runOnMainThread(Context context, Runnable runnable) {
// TODO: 4/17/20 May need callback method for invalid or no longer valid context
Handler handler = new Handler(context.getMainLooper());
handler.post(runnable);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.HashMap;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

/**
Expand Down Expand Up @@ -482,13 +483,11 @@ public void run() {
@SuppressWarnings("unused")
@android.webkit.JavascriptInterface
public void visitStarted(String visitIdentifier, boolean visitHasCachedSnapshot) {
TurbolinksLog.d("visitStarted called", TurbolinksSession.this.debugCallback);

currentVisitIdentifier = visitIdentifier;

runJavascript("webView.changeHistoryForVisitWithIdentifier", visitIdentifier);
runJavascript("webView.issueRequestForVisitWithIdentifier", visitIdentifier);
runJavascript("webView.loadCachedSnapshotForVisitWithIdentifier", visitIdentifier);
TurbolinksLog.d(("visitStarted called. Identifier == " + visitIdentifier), TurbolinksSession.this.debugCallback);
this.currentVisitIdentifier = visitIdentifier;
runJavascript("webView.changeHistoryForVisitWithIdentifier", this.debugCallback, visitIdentifier);
runJavascript("webView.issueRequestForVisitWithIdentifier", this.debugCallback, visitIdentifier);
runJavascript("webView.loadCachedSnapshotForVisitWithIdentifier", this.debugCallback, visitIdentifier);
}

/**
Expand All @@ -503,10 +502,10 @@ public void visitStarted(String visitIdentifier, boolean visitHasCachedSnapshot)
@SuppressWarnings("unused")
@android.webkit.JavascriptInterface
public void visitRequestCompleted(String visitIdentifier) {
TurbolinksLog.d("visitRequestCompleted called", TurbolinksSession.this.debugCallback);
TurbolinksLog.d(("visitRequestCompleted called. Identifier == " + visitIdentifier), TurbolinksSession.this.debugCallback);

if (TextUtils.equals(visitIdentifier, currentVisitIdentifier)) {
runJavascript("webView.loadResponseForVisitWithIdentifier", visitIdentifier);
runJavascript("webView.loadResponseForVisitWithIdentifier", this.debugCallback, visitIdentifier);
}
}

Expand Down Expand Up @@ -692,16 +691,17 @@ public void run() {
public void turbolinksDoesNotExist() {
TurbolinksLog.d("turbolinksDoesNotExist on this page, going to cold boot",
TurbolinksSession.this.debugCallback);
turbolinksAdapter.onPageSupportsTurbolinks(false);
TurbolinksHelper.runOnMainThread(applicationContext, new Runnable() {
TurbolinksHelper.runOnMainThread(this.applicationContext, new Runnable() {
@Override
public void run() {
TurbolinksLog.d("Error instantiating turbolinks_bridge.js - resetting to cold boot.",
TurbolinksSession.this.debugCallback);
resetToColdBoot();
turbolinksView.hideProgress();
TurbolinksSession.this.turbolinksView.hideProgress();
TurbolinksSession.this.turbolinksAdapter.bridgeInjectionFailed();
}
});
this.turbolinksAdapter.onPageSupportsTurbolinks(false);
}

//endregion
Expand Down Expand Up @@ -858,8 +858,10 @@ public void resetToColdBoot() {
* @param functionName The name of the function, without any parenthesis or params
* @param params A comma delimited list of params. Params will be automatically JSONified.
*/
public void runJavascript(final String functionName, final Object... params) {
TurbolinksHelper.runJavascript(applicationContext, webView, functionName, params);
public void runJavascript(final String functionName, final TurbolinksDebugCallback debugCallback,
final Object... params) {
TurbolinksHelper.runJavascript(this.applicationContext, this.webView,
functionName, debugCallback, params);
}

/**
Expand Down Expand Up @@ -910,8 +912,8 @@ public void visitLocationWithAction(String location, String action) {
TurbolinksLog.d("call to visitLocationWithAction: loc = " + location + ", action = " + action,
TurbolinksSession.this.debugCallback);
this.location = location;
runJavascript("webView.visitLocationWithActionAndRestorationIdentifier",
TurbolinksHelper.encodeUrl(location), action, getRestorationIdentifierFromMap());
runJavascript("webView.visitLocationWithActionAndRestorationIdentifier", this.debugCallback,
TurbolinksHelper.encodeUrl(location), action, getRestorationIdentifierFromMap());
}

//endregion
Expand Down Expand Up @@ -1061,21 +1063,24 @@ public void onPageFinished(WebView view, final String location) {
webView.evaluateJavascript(jsCall, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
if (Boolean.parseBoolean(s) && !bridgeInjectionInProgress) {
TurbolinksLog.d(("webView.evaluateJavascript from " + jsCall + ", response == "
+ s), TurbolinksSession.this.debugCallback);
TurbolinksLog.d(("Attempting to inject bridge into Turbolinks Session. Is bridgeInjectionInProgress? "
+ bridgeInjectionInProgress), TurbolinksSession.this.debugCallback);
if (parseBoolSafe(s) && !bridgeInjectionInProgress) {
bridgeInjectionInProgress = true;
TurbolinksHelper.injectTurbolinksBridge(TurbolinksSession.this, applicationContext, webView, debugCallback);
TurbolinksLog.d("Bridge injected", TurbolinksSession.this.debugCallback);

turbolinksAdapter.onPageFinished();
TurbolinksHelper.injectTurbolinksBridge(TurbolinksSession.this,
applicationContext, webView, debugCallback);
TurbolinksLog.d("Bridge inject attempted", TurbolinksSession.this.debugCallback);

TurbolinksSession.this.turbolinksAdapter.onPageFinished();
} else {
turbolinksAdapter.onPageFinished();
TurbolinksSession.this.turbolinksAdapter.onPageFinished();
}
}
});
try {
// view.loadUrl(JAVASCRIPT_GET_WEB_PAGE_HEIGHT);
// TurbolinksHelper.runJavascript(applicationContext, webView, functionName, params);
webView.evaluateJavascript(JAVASCRIPT_GET_WEB_PAGE_HEIGHT, new ValueCallback<String>() {
TurbolinksSession.this.webView.evaluateJavascript(JAVASCRIPT_GET_WEB_PAGE_HEIGHT, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
try {
Expand Down Expand Up @@ -1199,4 +1204,16 @@ public void onScrollChanged() {
}

//endregion

//region Misc Utils

private static boolean parseBoolSafe(@Nullable String bool){
try {
return Boolean.parseBoolean(bool);
} catch (Exception e){
return false;
}
}

//endregion
}

0 comments on commit b5e529b

Please sign in to comment.