1eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling/*
2eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * Copyright (C) 2013 The Android Open Source Project
3eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling *
4eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License");
5eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * you may not use this file except in compliance with the License.
6eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * You may obtain a copy of the License at
7eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling *
8eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling *      http://www.apache.org/licenses/LICENSE-2.0
9eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling *
10eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * Unless required by applicable law or agreed to in writing, software
11eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS,
12eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * See the License for the specific language governing permissions and
14eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling * limitations under the License.
15eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling */
16eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling
178e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingpackage com.android.camera.app;
188e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling
198e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport android.app.Application;
202f845b851439b3500727742278876ae017a8f4c5Sascha Haeberlingimport android.app.NotificationManager;
21a63dbb6231f06031204fe20b19a87d0440bd1661Sascha Haeberlingimport android.content.Context;
2251163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberlingimport android.os.Debug;
238e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling
248f51086c8177056345de996963515c4bd3415254Sascha Haeberlingimport com.android.camera.stats.UsageStatistics;
25d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.stats.profiler.Profile;
26d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.stats.profiler.Profilers;
278be316c7a8caf962cf3fcf5e49d332fb2718319fPaul Rohdeimport com.android.camera.util.AndroidContext;
288be316c7a8caf962cf3fcf5e49d332fb2718319fPaul Rohdeimport com.android.camera.util.AndroidServices;
29eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling
30d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
31280fd3edae1dc35ac1015bcc9532477169fad3aaSascha Haeberling/**
32280fd3edae1dc35ac1015bcc9532477169fad3aaSascha Haeberling * The Camera application class containing important services and functionality
33280fd3edae1dc35ac1015bcc9532477169fad3aaSascha Haeberling * to be used across modules.
34280fd3edae1dc35ac1015bcc9532477169fad3aaSascha Haeberling */
355c1db74d807c64e7917d927b532cd109c697ce35Paul Rohdepublic class CameraApp extends Application {
3651163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling    /**
3751163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     * This is for debugging only: If set to true, application will not start
3851163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     * until a debugger is attached.
3951163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     * <p>
4051163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     * Use this if you need to debug code that is executed while the app starts
4151163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     * up and it would be too late to attach a debugger afterwards.
4251163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling     */
4351163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling    private static final boolean WAIT_FOR_DEBUGGER_ON_START = false;
4451163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling
45eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling    @Override
46eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling    public void onCreate() {
47eee0d4e9b1c65f86ecbb303b759868ccbf9de597Sascha Haeberling        super.onCreate();
482f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling
4951163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling        if (WAIT_FOR_DEBUGGER_ON_START) {
5051163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling            Debug.waitForDebugger();
5151163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling        }
5251163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling
53d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        // Android context must be the first item initialized.
54c00f209e861dba093eb3c267ddc5078b23928d05Alan Newberger        Context context = getApplicationContext();
558be316c7a8caf962cf3fcf5e49d332fb2718319fPaul Rohde        AndroidContext.initialize(context);
56c00f209e861dba093eb3c267ddc5078b23928d05Alan Newberger
57d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        // This will measure and write to the exception handler if
58d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        // the time between any two calls or the total time from
59d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        // start to stop is over 10ms.
60d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        Profile guard = Profilers.instance().guard("CameraApp onCreate()");
61d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
6251163540604bcb1deabfde4d83c54a86114cefd0Sascha Haeberling        // It is important that this gets called early in execution before the
63d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        // app has had the opportunity to touch shared preferences.
6467063a294955285efd6b3f038aafecc92293f803Paul Rohde        FirstRunDetector.instance().initializeTimeOfFirstRun(context);
65d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        guard.mark("initializeTimeOfFirstRun");
6667063a294955285efd6b3f038aafecc92293f803Paul Rohde
67a83ec8a3acb174e2688f0d31f2094e1aa72a06eeSascha Haeberling        UsageStatistics.instance().initialize(this);
68d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        guard.mark("UsageStatistics.initialize");
692f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling
702f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling        clearNotifications();
71d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        guard.stop("clearNotifications");
7239529585aee23703553c551eadceca78742cf52bAlan Newberger    }
7339529585aee23703553c551eadceca78742cf52bAlan Newberger
742f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling    /**
752f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling     * Clears all notifications. This cleans up notifications that we might have
762f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling     * created earlier but remained after a crash.
772f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling     */
782f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling    private void clearNotifications() {
798be316c7a8caf962cf3fcf5e49d332fb2718319fPaul Rohde        NotificationManager manager = AndroidServices.instance().provideNotificationManager();
802f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling        if (manager != null) {
812f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling            manager.cancelAll();
822f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling        }
832f845b851439b3500727742278876ae017a8f4c5Sascha Haeberling    }
84280fd3edae1dc35ac1015bcc9532477169fad3aaSascha Haeberling}
85