package com.dappervision.wearscript;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.os.Build;
import android.os.Handler;
import android.view.SurfaceHolder;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import com.dappervision.wearscript.events.LiveCardEvent;
import com.dappervision.wearscript.events.SendEvent;
import com.dappervision.wearscript.ui.MenuActivity;
import com.google.android.glass.timeline.DirectRenderingCallback;
import com.google.android.glass.timeline.LiveCard;
public class ScriptView extends WebView implements SurfaceHolder.Callback, DirectRenderingCallback {
private static final String TAG = "ScriptView";
private final BackgroundService context;
private final Handler handler;
private LiveCard liveCard;
private SurfaceHolder holder;
private long drawFrequency;
private boolean paused;
ScriptView(final BackgroundService context) {
super(context);
paused = false;
// NOTE(brandyn): Fix for KK error: http://stackoverflow.com/questions/20675554/webview-rendering-issue-in-android-kitkat
//setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// Enable localStorage in webview
getSettings().setAllowUniversalAccessFromFileURLs(true);
getSettings().setDomStorageEnabled(true);
Utils.getEventBus().register(this);
this.context = context;
clearCache(true);
setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
String msg = cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId();
Log.w("WearScriptWebView", msg);
Utils.eventBusPost(new SendEvent("log", "WebView: " + msg));
return true;
}
});
setOverScrollMode(View.OVER_SCROLL_IF_CONTENT_SCROLLS);
//Do new Chromium WebView stuff here
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setWebContentsDebuggingEnabled(true);
}
handler = new Handler();
}
public void onEvent(LiveCardEvent e) {
if (e.getPeriod() > 0) {
liveCardPublish(e.isNonSilent(), Math.round(e.getPeriod() * 1000.));
} else {
liveCardUnpublish();
}
}
public void liveCardPublish(boolean nonSilent, long drawFrequency) {
if (liveCard != null)
return;
this.drawFrequency = drawFrequency;
liveCard = new LiveCard(context, "myid");
Log.d(TAG, "Publishing LiveCard");
liveCard.setDirectRenderingEnabled(true).getSurfaceHolder().addCallback(this);
Intent intent = new Intent(context, MenuActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
liveCard.setAction(PendingIntent.getActivity(context, 0, intent, 0));
if (nonSilent)
liveCard.publish(LiveCard.PublishMode.REVEAL);
else
liveCard.publish(LiveCard.PublishMode.SILENT);
Log.d(TAG, "Done publishing LiveCard");
}
public void liveCardUnpublish() {
if (liveCard != null) {
liveCard.getSurfaceHolder().removeCallback(this);
liveCard.unpublish();
}
liveCard = null;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Nothing to do here.
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "Surface created");
this.holder = holder;
update();
}
public void update() {
if (drawFrequency < 0 || liveCard == null)
return;
handler.postDelayed(new Runnable() {
public void run() {
if (drawFrequency < 0 || liveCard == null)
return;
if (!paused)
draw2();
update();
}
}, drawFrequency);
}
public void onDestroy() {
Utils.getEventBus().unregister(this);
if (liveCard != null && liveCard.isPublished()) {
Log.d(TAG, "Unpublishing LiveCard");
liveCardUnpublish();
}
}
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(TAG, "Surface destroyed");
this.holder = null;
}
public void draw2() {
if (liveCard == null)
return;
Log.d(TAG, "Drawing");
Canvas canvas;
try {
canvas = holder.lockCanvas();
} catch (Exception e) {
return;
}
if (canvas != null) {
// Tell the view where to draw.
View v = context.getActivityView();
int measuredWidth = View.MeasureSpec.makeMeasureSpec(
canvas.getWidth(), View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(
canvas.getHeight(), View.MeasureSpec.EXACTLY);
v.measure(measuredWidth, measuredHeight);
v.layout(0, 0, getMeasuredWidth(), getMeasuredHeight());
v.draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
@Override
public void renderingPaused(SurfaceHolder surfaceHolder, boolean b) {
this.paused = b;
}
}