/* * Copyright (c) 2017-2019 Altimit Community Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or imp * See the License for the specific language governing permissions and * limitations under the License. */ package systems.altimit.rpgmakermv; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.net.Uri; import android.os.Build; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; import android.util.Base64; import android.view.View; import java.io.File; import java.nio.charset.Charset; /** * Created by felixjones on 28/04/2017. */ public class WebPlayerActivity extends Activity { private static final String TOUCH_INPUT_ON_CANCEL = "TouchInput._onCancel();"; private Player mPlayer; private AlertDialog mQuitDialog; private int mSystemUiVisibility; @SuppressLint("ObsoleteSdkInt") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (BuildConfig.BACK_BUTTON_QUITS) { createQuitDialog(); } mSystemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { mSystemUiVisibility |= View.SYSTEM_UI_FLAG_FULLSCREEN; mSystemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE; mSystemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; mSystemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { mSystemUiVisibility |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } } mPlayer = PlayerHelper.create(this); mPlayer.setKeepScreenOn(); setContentView(mPlayer.getView()); if (!addBootstrapInterface(mPlayer)) { Uri.Builder projectURIBuilder = Uri.fromFile(new File(getString(R.string.mv_project_index))).buildUpon(); Bootstrapper.appendQuery(projectURIBuilder, getString(R.string.query_noaudio)); if (BuildConfig.SHOW_FPS) { Bootstrapper.appendQuery(projectURIBuilder, getString(R.string.query_showfps)); } mPlayer.loadUrl(projectURIBuilder.build().toString()); } } @Override public void onBackPressed() { if (BuildConfig.BACK_BUTTON_QUITS) { if (mQuitDialog != null) { mQuitDialog.show(); } else { super.onBackPressed(); } } else { mPlayer.evaluateJavascript(TOUCH_INPUT_ON_CANCEL); } } @Override protected void onStart() { super.onStart(); } @Override protected void onStop() { super.onStop(); } @Override protected void onPause() { mPlayer.pauseTimers(); mPlayer.onHide(); super.onPause(); } @Override protected void onResume() { super.onResume(); getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility); if (mPlayer != null) { mPlayer.resumeTimers(); mPlayer.onShow(); } } @Override protected void onDestroy() { super.onDestroy(); mPlayer.onDestroy(); } @Override protected void onRestart() { super.onRestart(); } private void createQuitDialog() { String appName = getString(R.string.app_name); String[] quitLines = getResources().getStringArray(R.array.quit_message); StringBuilder quitMessage = new StringBuilder(); for (int ii = 0; ii < quitLines.length; ii++) { quitMessage.append(quitLines[ii].replace("$1", appName)); if (ii < quitLines.length - 1) { quitMessage.append("\n"); } } if (quitMessage.length() > 0) { mQuitDialog = new AlertDialog.Builder(this) .setPositiveButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility); } }) .setNegativeButton("Quit", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { WebPlayerActivity.super.onBackPressed(); } }) .setMessage(quitMessage.toString()) .create(); } } @SuppressLint("ObsoleteSdkInt") private static boolean addBootstrapInterface(Player player) { if (BuildConfig.BOOTSTRAP_INTERFACE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { new Bootstrapper(player); return true; } return false; } /** * */ private static final class Bootstrapper extends PlayerHelper.Interface implements Runnable { private static Uri.Builder appendQuery(Uri.Builder builder, String query) { Uri current = builder.build(); String oldQuery = current.getEncodedQuery(); if (oldQuery != null && oldQuery.length() > 0) { query = oldQuery + "&" + query; } return builder.encodedQuery(query); } private static final String INTERFACE = "boot"; private static final String PREPARE_FUNC = "prepare( webgl(), webaudio(), false )"; private Player mPlayer; private Uri.Builder mURIBuilder; private Bootstrapper(Player player) { Context context = player.getContext(); player.addJavascriptInterface(this, Bootstrapper.INTERFACE); mPlayer = player; mURIBuilder = Uri.fromFile(new File(context.getString(R.string.mv_project_index))).buildUpon(); mPlayer.loadData(context.getString(R.string.webview_default_page)); } @Override protected void onStart() { Context context = mPlayer.getContext(); final String code = new String(Base64.decode(context.getString(R.string.webview_detection_source), Base64.DEFAULT), Charset.forName("UTF-8")) + INTERFACE + "." + PREPARE_FUNC + ";"; mPlayer.post(new Runnable() { @Override public void run() { mPlayer.evaluateJavascript(code); } }); } @Override protected void onPrepare(boolean webgl, boolean webaudio, boolean showfps) { Context context = mPlayer.getContext(); if (webgl && !BuildConfig.FORCE_CANVAS) { mURIBuilder = appendQuery(mURIBuilder, context.getString(R.string.query_webgl)); } else { mURIBuilder = appendQuery(mURIBuilder, context.getString(R.string.query_canvas)); } if (!webaudio || BuildConfig.FORCE_NO_AUDIO) { mURIBuilder = appendQuery(mURIBuilder, context.getString(R.string.query_noaudio)); } if (showfps || BuildConfig.SHOW_FPS) { mURIBuilder = appendQuery(mURIBuilder, context.getString(R.string.query_showfps)); } mPlayer.post(this); } @Override public void run() { mPlayer.removeJavascriptInterface(INTERFACE); mPlayer.loadUrl(mURIBuilder.build().toString()); } } }