// Copyright 2013 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.content.app; import android.os.Looper; import android.os.MessageQueue; import org.chromium.base.BaseChromiumApplication; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.content.browser.TracingControllerAndroid; /** * Basic application functionality that should be shared among all browser applications * based on the content layer. */ public class ContentApplication extends BaseChromiumApplication { private TracingControllerAndroid mTracingController; TracingControllerAndroid getTracingController() { if (mTracingController == null) { mTracingController = new TracingControllerAndroid(this); } return mTracingController; } @Override public void onCreate() { super.onCreate(); // Delay TracingControllerAndroid.registerReceiver() until the main loop is idle. Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { // Will retry if the native library has not been initialized. if (!LibraryLoader.isInitialized()) return true; try { getTracingController().registerReceiver(ContentApplication.this); } catch (SecurityException e) { // Happens if the process is isolated. Ignore. } // Remove the idle handler. return false; } }); } /** * For emulated process environment only. On a production device, the application process is * simply killed without calling this method. We don't need to unregister the broadcast * receiver in the latter case. */ @Override public void onTerminate() { try { getTracingController().unregisterReceiver(this); } catch (SecurityException e) { // Happens if the process is isolated. Ignore. } super.onTerminate(); } }