14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)package org.chromium.content.app; 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.os.Looper; 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.os.MessageQueue; 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.BaseChromiumApplication; 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.library_loader.LibraryLoader; 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.content.browser.TracingControllerAndroid; 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Basic application functionality that should be shared among all browser applications 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * based on the content layer. 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)public class ContentApplication extends BaseChromiumApplication { 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private TracingControllerAndroid mTracingController; 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TracingControllerAndroid getTracingController() { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (mTracingController == null) { 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTracingController = new TracingControllerAndroid(this); 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mTracingController; 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onCreate() { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) super.onCreate(); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Delay TracingControllerAndroid.registerReceiver() until the main loop is idle. 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean queueIdle() { 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Will retry if the native library has not been initialized. 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!LibraryLoader.isInitialized()) return true; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) try { 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) getTracingController().registerReceiver(ContentApplication.this); 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } catch (SecurityException e) { 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Happens if the process is isolated. Ignore. 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the idle handler. 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * For emulated process environment only. On a production device, the application process is 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * simply killed without calling this method. We don't need to unregister the broadcast 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * receiver in the latter case. 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onTerminate() { 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) try { 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) getTracingController().unregisterReceiver(this); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch getTracingController().destroy(); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } catch (SecurityException e) { 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Happens if the process is isolated. Ignore. 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) super.onTerminate(); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 68