| Index: chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastShellActivity.java
|
| diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastShellActivity.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastShellActivity.java
|
| deleted file mode 100644
|
| index 311fc4e993f7a6285b569c1af7c522024eb41d56..0000000000000000000000000000000000000000
|
| --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastShellActivity.java
|
| +++ /dev/null
|
| @@ -1,328 +0,0 @@
|
| -// Copyright 2014 The Chromium 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 org.chromium.chromecast.shell;
|
| -
|
| -import android.app.Activity;
|
| -import android.content.BroadcastReceiver;
|
| -import android.content.Context;
|
| -import android.content.Intent;
|
| -import android.content.IntentFilter;
|
| -import android.media.AudioManager;
|
| -import android.net.Uri;
|
| -import android.os.Build;
|
| -import android.os.Bundle;
|
| -import android.support.v4.content.LocalBroadcastManager;
|
| -import android.view.KeyEvent;
|
| -import android.view.MotionEvent;
|
| -import android.view.WindowManager;
|
| -import android.widget.Toast;
|
| -
|
| -import org.chromium.base.Log;
|
| -import org.chromium.content.browser.ContentViewCore;
|
| -import org.chromium.ui.base.WindowAndroid;
|
| -
|
| -/**
|
| - * Activity for managing the Cast shell.
|
| - */
|
| -public class CastShellActivity extends Activity {
|
| - private static final String TAG = "cr_CastShellActivity";
|
| - private static final boolean DEBUG = false;
|
| -
|
| - private static final String ACTIVE_SHELL_URL_KEY = "activeUrl";
|
| -
|
| - private CastWindowManager mCastWindowManager;
|
| - private AudioManager mAudioManager;
|
| - private BroadcastReceiver mBroadcastReceiver;
|
| - private boolean mReceivedUserLeave = false;
|
| -
|
| - // Native window instance.
|
| - // TODO(byungchul, gunsch): CastShellActivity, CastWindowAndroid, and native CastWindowAndroid
|
| - // have a one-to-one relationship. Consider instantiating CastWindow here and CastWindow having
|
| - // this native shell instance.
|
| - private long mNativeCastWindow;
|
| -
|
| - /**
|
| - * Returns whether or not CastShellActivity should launch the browser startup sequence.
|
| - * Intended to be overridden.
|
| - */
|
| - protected boolean shouldLaunchBrowser() {
|
| - return true;
|
| - }
|
| -
|
| - /**
|
| - * Intended to be called from "onStop" to determine if this is a "legitimate" stop or not.
|
| - * When starting CastShellActivity from the TV in sleep mode, an extra onPause/onStop will be
|
| - * fired.
|
| - * Details: http://stackoverflow.com/questions/25369909/
|
| - * We use onUserLeaveHint to determine if the onPause/onStop called because of user intent.
|
| - */
|
| - protected boolean isStopping() {
|
| - return mReceivedUserLeave;
|
| - }
|
| -
|
| - @Override
|
| - protected void onCreate(final Bundle savedInstanceState) {
|
| - if (DEBUG) Log.d(TAG, "onCreate");
|
| - super.onCreate(savedInstanceState);
|
| - exitIfUrlMissing();
|
| -
|
| - if (shouldLaunchBrowser()) {
|
| - if (!CastBrowserHelper.initializeBrowser(getApplicationContext())) {
|
| - Toast.makeText(this,
|
| - R.string.browser_process_initialization_failed,
|
| - Toast.LENGTH_SHORT).show();
|
| - finish();
|
| - }
|
| - }
|
| -
|
| - // Whenever our app is visible, volume controls should modify the music stream.
|
| - // For more information read:
|
| - // http://developer.android.com/training/managing-audio/volume-playback.html
|
| - setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
| -
|
| - // Set flags to both exit sleep mode when this activity starts and
|
| - // avoid entering sleep mode while playing media. We cannot distinguish
|
| - // between video and audio so this applies to both.
|
| - getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
| - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
| -
|
| - mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
|
| -
|
| - setContentView(R.layout.cast_shell_activity);
|
| - mCastWindowManager = (CastWindowManager) findViewById(R.id.shell_container);
|
| - mCastWindowManager.setDelegate(new CastWindowManager.Delegate() {
|
| - @Override
|
| - public void onCreated() {
|
| - }
|
| -
|
| - @Override
|
| - public void onClosed() {
|
| - mNativeCastWindow = 0;
|
| - mCastWindowManager.setDelegate(null);
|
| - finish();
|
| - }
|
| - });
|
| - mCastWindowManager.setWindow(new WindowAndroid(this));
|
| -
|
| - registerBroadcastReceiver();
|
| -
|
| - String url = getIntent().getDataString();
|
| - Log.d(TAG, "onCreate startupUrl: %s", url);
|
| - mNativeCastWindow = mCastWindowManager.launchCastWindow(url);
|
| - }
|
| -
|
| - @Override
|
| - protected void onDestroy() {
|
| - if (DEBUG) Log.d(TAG, "onDestroy");
|
| -
|
| - unregisterBroadcastReceiver();
|
| -
|
| - if (mNativeCastWindow != 0) {
|
| - mCastWindowManager.stopCastWindow(mNativeCastWindow, false /* gracefully */);
|
| - mNativeCastWindow = 0;
|
| - }
|
| -
|
| - super.onDestroy();
|
| - }
|
| -
|
| - @Override
|
| - protected void onNewIntent(Intent intent) {
|
| - if (DEBUG) Log.d(TAG, "onNewIntent");
|
| - // Only handle direct intents (e.g. "fling") if this activity is also managing
|
| - // the browser process.
|
| - if (!shouldLaunchBrowser()) return;
|
| -
|
| - String url = intent.getDataString();
|
| - Log.d(TAG, "onNewIntent: %s", url);
|
| -
|
| - // Reset broadcast intent uri and receiver.
|
| - setIntent(intent);
|
| - exitIfUrlMissing();
|
| - getActiveCastWindow().loadUrl(url);
|
| - }
|
| -
|
| - @Override
|
| - protected void onStart() {
|
| - if (DEBUG) Log.d(TAG, "onStart");
|
| - super.onStart();
|
| - }
|
| -
|
| - @Override
|
| - protected void onStop() {
|
| - if (DEBUG) Log.d(TAG, "onStop, window focus = %d", hasWindowFocus());
|
| -
|
| - if (isStopping()) {
|
| - // As soon as the cast app is no longer in the foreground, we ought to immediately tear
|
| - // everything down.
|
| - finishGracefully();
|
| -
|
| - // On pre-M devices, the device should be "unmuted" at the end of a Cast application
|
| - // session, signaled by the activity exiting. See b/19964892.
|
| - if (Build.VERSION.SDK_INT < 23) {
|
| - releaseStreamMuteIfNecessary();
|
| - }
|
| - }
|
| -
|
| - super.onStop();
|
| - }
|
| -
|
| - @Override
|
| - protected void onResume() {
|
| - if (DEBUG) Log.d(TAG, "onResume");
|
| - super.onResume();
|
| -
|
| - // Inform ContentView that this activity is being shown.
|
| - ContentViewCore view = getActiveContentViewCore();
|
| - if (view != null) view.onShow();
|
| -
|
| - // Request audio focus so any other audio playback doesn't continue in the background.
|
| - if (mAudioManager.requestAudioFocus(
|
| - null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)
|
| - != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
|
| - Log.e(TAG, "Failed to obtain audio focus");
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - protected void onPause() {
|
| - if (DEBUG) Log.d(TAG, "onPause");
|
| -
|
| - // Release the audio focus. Note that releasing audio focus does not stop audio playback,
|
| - // it just notifies the framework that this activity has stopped playing audio.
|
| - if (mAudioManager.abandonAudioFocus(null) != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
|
| - Log.e(TAG, "Failed to abandon audio focus");
|
| - }
|
| -
|
| - ContentViewCore view = getActiveContentViewCore();
|
| - if (view != null) view.onHide();
|
| -
|
| - super.onPause();
|
| - }
|
| -
|
| - @Override
|
| - protected void onUserLeaveHint() {
|
| - if (DEBUG) Log.d(TAG, "onUserLeaveHint");
|
| - mReceivedUserLeave = true;
|
| - }
|
| -
|
| - protected void finishGracefully() {
|
| - if (mNativeCastWindow != 0) {
|
| - mCastWindowManager.stopCastWindow(mNativeCastWindow, true /* gracefully */);
|
| - mNativeCastWindow = 0;
|
| - }
|
| - }
|
| -
|
| - @SuppressWarnings("deprecation")
|
| - private void releaseStreamMuteIfNecessary() {
|
| - AudioManager audioManager = CastAudioManager.getAudioManager(this);
|
| - boolean isMuted = false;
|
| - try {
|
| - isMuted = (Boolean) audioManager.getClass().getMethod("isStreamMute", int.class)
|
| - .invoke(audioManager, AudioManager.STREAM_MUSIC);
|
| - } catch (Exception e) {
|
| - Log.e(TAG, "Cannot call AudioManager.isStreamMute().", e);
|
| - }
|
| -
|
| - if (isMuted) {
|
| - // Note: this is a no-op on fixed-volume devices.
|
| - audioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);
|
| - }
|
| - }
|
| -
|
| - private void registerBroadcastReceiver() {
|
| - if (mBroadcastReceiver == null) {
|
| - mBroadcastReceiver = new BroadcastReceiver() {
|
| - @Override
|
| - public void onReceive(Context context, Intent intent) {
|
| - Log.d(TAG, "Received intent: action=%s", intent.getAction());
|
| - if (CastWindowAndroid.ACTION_ENABLE_DEV_TOOLS.equals(intent.getAction())) {
|
| - mCastWindowManager.nativeEnableDevTools(true);
|
| - } else if (CastWindowAndroid.ACTION_DISABLE_DEV_TOOLS.equals(
|
| - intent.getAction())) {
|
| - mCastWindowManager.nativeEnableDevTools(false);
|
| - }
|
| - }
|
| - };
|
| - }
|
| -
|
| - IntentFilter devtoolsBroadcastIntentFilter = new IntentFilter();
|
| - devtoolsBroadcastIntentFilter.addAction(CastWindowAndroid.ACTION_ENABLE_DEV_TOOLS);
|
| - devtoolsBroadcastIntentFilter.addAction(CastWindowAndroid.ACTION_DISABLE_DEV_TOOLS);
|
| - LocalBroadcastManager.getInstance(this)
|
| - .registerReceiver(mBroadcastReceiver, devtoolsBroadcastIntentFilter);
|
| - }
|
| -
|
| - private void unregisterBroadcastReceiver() {
|
| - LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
|
| - broadcastManager.unregisterReceiver(mBroadcastReceiver);
|
| - }
|
| -
|
| - private void exitIfUrlMissing() {
|
| - Intent intent = getIntent();
|
| - if (intent != null && intent.getData() != null && !intent.getData().equals(Uri.EMPTY)) {
|
| - return;
|
| - }
|
| - // Log an exception so that the exit cause is obvious when reading the logs.
|
| - Log.e(TAG, "Activity will not start",
|
| - new IllegalArgumentException("Intent did not contain a valid url"));
|
| - System.exit(-1);
|
| - }
|
| -
|
| - /**
|
| - * @return The currently visible {@link CastWindowAndroid} or null if one is not showing.
|
| - */
|
| - public CastWindowAndroid getActiveCastWindow() {
|
| - return mCastWindowManager.getActiveCastWindow();
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link ContentViewCore} owned by the currently visible {@link CastWindowAndroid},
|
| - * or null if one is not showing.
|
| - */
|
| - public ContentViewCore getActiveContentViewCore() {
|
| - CastWindowAndroid shell = getActiveCastWindow();
|
| - return shell != null ? shell.getContentViewCore() : null;
|
| - }
|
| -
|
| - @Override
|
| - public boolean onKeyUp(int keyCode, KeyEvent event) {
|
| - if (keyCode != KeyEvent.KEYCODE_BACK) {
|
| - return super.onKeyUp(keyCode, event);
|
| - }
|
| -
|
| - // Just finish this activity to go back to the previous activity or launcher.
|
| - finishGracefully();
|
| - return true;
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchKeyEvent(KeyEvent event) {
|
| - int keyCode = event.getKeyCode();
|
| - if (keyCode == KeyEvent.KEYCODE_BACK) {
|
| - return super.dispatchKeyEvent(event);
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchGenericMotionEvent(MotionEvent ev) {
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchKeyShortcutEvent(KeyEvent event) {
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchTouchEvent(MotionEvent ev) {
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchTrackballEvent(MotionEvent ev) {
|
| - return false;
|
| - }
|
| -}
|
|
|