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