| // Copyright 2016 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package io.baku.examples.distro; |
| |
| import android.app.Activity; |
| import android.os.Bundle; |
| import android.util.Log; |
| |
| import com.google.common.util.concurrent.FutureCallback; |
| import com.google.common.util.concurrent.Futures; |
| |
| import org.chromium.base.PathUtils; |
| import org.json.JSONObject; |
| |
| import java.io.File; |
| |
| import io.flutter.view.FlutterMain; |
| import io.flutter.view.FlutterView; |
| import io.v.v23.verror.CanceledException; |
| import io.v.v23.verror.EndOfFileException; |
| |
| public class HostActivity extends Activity { |
| public static final String SESSION_EXTRA = "Session"; |
| |
| private static final String TAG = HostActivity.class.getSimpleName(); |
| private static final long POLL_INTERVAL = 750; |
| |
| private FlutterView flutterView; |
| private DistroAndroidService.Session session; |
| |
| private final FutureCallback<State> render = new FutureCallback<State>() { |
| @Override |
| public void onSuccess(final State state) { |
| Log.i(TAG, "Received state update: " + JSONObject.quote(state.toString())); |
| flutterView.sendToFlutter("updateCast", state.getValue()); |
| Futures.addCallback(session.stream.recv(), render); |
| } |
| |
| @Override |
| public void onFailure(final Throwable t) { |
| if (!(t instanceof EndOfFileException || |
| t instanceof CanceledException)) { |
| Log.e(TAG, "Unexpected error while hosting cast", t); |
| } else { |
| Log.i(TAG, "Terminated cast", t); |
| } |
| finish(); |
| } |
| }; |
| |
| @Override |
| public void onCreate(final Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| FlutterMain.ensureInitializationComplete(getApplicationContext(), null); |
| setContentView(R.layout.flutter_layout); |
| |
| flutterView = (FlutterView) findViewById(R.id.flutter_view); |
| File appBundle = new File(PathUtils.getDataDirectory(this), |
| FlutterMain.APP_BUNDLE); |
| flutterView.runFromBundle(appBundle.getPath(), null); |
| |
| flutterView.sendToFlutter("runHost", "", r -> { |
| Futures.addCallback(session.stream.recv(), render); |
| }); |
| |
| session = DistroAndroidService.getSession(getIntent().getStringExtra(SESSION_EXTRA)); |
| } |
| |
| @Override |
| protected void onPause() { |
| super.onPause(); |
| flutterView.onPause(); |
| |
| finish(); |
| } |
| |
| @Override |
| protected void onResume() { |
| super.onResume(); |
| flutterView.onResume(); |
| } |
| |
| @Override |
| protected void onDestroy() { |
| session.completion.set(null); |
| session = null; |
| |
| if (flutterView != null) { |
| flutterView.destroy(); |
| } |
| |
| Log.i(TAG, "Locally terminated cast"); |
| |
| super.onDestroy(); |
| } |
| } |