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