1d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde/*
2d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Copyright (C) 2015 The Android Open Source Project
3d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde *
4d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Licensed under the Apache License, Version 2.0 (the "License");
5d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * you may not use this file except in compliance with the License.
6d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * You may obtain a copy of the License at
7d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde *
8d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde *      http://www.apache.org/licenses/LICENSE-2.0
9d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde *
10d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Unless required by applicable law or agreed to in writing, software
11d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * distributed under the License is distributed on an "AS IS" BASIS,
12d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * See the License for the specific language governing permissions and
14d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * limitations under the License.
15d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde */
16d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
17d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdepackage com.android.camera.stats.profiler;
18d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
19d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.debug.Log;
20d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.debug.Log.Tag;
21d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
22d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde/**
23d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * A set of common, easy to use profilers that fill the most
24d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * common use cases when profiling parts of an app.
25d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde */
26d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdepublic class Profilers {
27d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static final Tag TAG = new Tag("Profiler");
28d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
29d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static Writer sErrorWriter = new ErrorWriter();
30d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static Writer sWarningWriter = new WarningWriter();
31d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static Writer sInfoWriter = new InfoWriter();
32d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static Writer sDebugWriter = new DebugWriter();
33d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static Writer sVerboseWriter = new VerboseWriter();
34d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
35d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class Singleton {
36d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        private static final Profilers INSTANCE = new Profilers(
37d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new LoggingProfiler(sErrorWriter),
38d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new LoggingProfiler(sWarningWriter),
39d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new LoggingProfiler(sInfoWriter),
40d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new LoggingProfiler(sDebugWriter),
41d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new LoggingProfiler(sVerboseWriter),
42d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde              new GuardingProfiler(sInfoWriter, sVerboseWriter));
43d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
44d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
45d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    /** get a single shared Profilers instance */
46d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public static Profilers instance() {
47d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return Singleton.INSTANCE;
48d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
49d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
50d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final LoggingProfiler mErrorProfiler;
51d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final LoggingProfiler mWarningProfiler;
52d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final LoggingProfiler mInfoProfiler;
53d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final LoggingProfiler mDebugProfiler;
54d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final LoggingProfiler mVerboseProfiler;
55d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private final GuardingProfiler mGuardingProfiler;
56d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
57d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private Profilers(LoggingProfiler errorProfiler,
58d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde          LoggingProfiler warningProfiler,
59d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde          LoggingProfiler infoProfiler,
60d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde          LoggingProfiler debugProfiler,
61d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde          LoggingProfiler verboseProfiler,
62d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde          GuardingProfiler guardingProfiler) {
63d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mErrorProfiler = errorProfiler;
64d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mWarningProfiler = warningProfiler;
65d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mInfoProfiler = infoProfiler;
66d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mDebugProfiler = debugProfiler;
67d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mVerboseProfiler = verboseProfiler;
68d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        mGuardingProfiler = guardingProfiler;
69d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
70d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
71d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public LoggingProfiler e() {
72d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mErrorProfiler;
73d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
74d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
75d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile e(String name) {
76d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return e().create(name).start();
77d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
78d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
79d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public LoggingProfiler w()  {
80d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mWarningProfiler;
81d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
82d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
83d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile w(String name) {
84d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return w().create(name).start();
85d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
86d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
87d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public LoggingProfiler i() {
88d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mInfoProfiler;
89d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
90d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
91d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile i(String name) {
92d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return i().create(name).start();
93d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
94d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
95d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public LoggingProfiler d() {
96d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mDebugProfiler;
97d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
98d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
99d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile d(String name) {
100d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return d().create(name).start();
101d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
102d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
103d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public LoggingProfiler v()  {
104d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mVerboseProfiler;
105d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
106d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
107d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile v(String name) {
108d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return v().create(name).start();
109d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
110d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
111d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public GuardingProfiler guard() {
112d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return mGuardingProfiler;
113d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
114d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
115d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile guard(String name) {
116d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return guard().create(name).start();
117d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
118d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
119d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    public Profile guard(String name, int durationMillis) {
120d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        return guard().create(name, durationMillis).start();
121d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
122d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
123d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class DebugWriter implements Writer {
124d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        @Override
125d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        public void write(String message) {
126d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde            Log.d(TAG, message);
127d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        }
128d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
129d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
130d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class ErrorWriter implements Writer {
131d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        @Override
132d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        public void write(String message) {
133d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde            Log.e(TAG, message);
134d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        }
135d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
136d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
137d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class InfoWriter implements Writer {
138d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        @Override
139d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        public void write(String message) {
140d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde            Log.i(TAG, message);
141d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        }
142d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
143d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
144d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class VerboseWriter implements Writer {
145d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        @Override
146d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        public void write(String message) {
147d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde            Log.v(TAG, message);
148d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        }
149d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
150d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde
151d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    private static class WarningWriter implements Writer {
152d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        @Override
153d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        public void write(String message) {
154d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde            Log.w(TAG, message);
155d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde        }
156d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde    }
157d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde}
158