17ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh/* 27ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * Copyright (C) 2018 The Android Open Source Project 37ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * 47ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * Licensed under the Apache License, Version 2.0 (the "License"); 57ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * you may not use this file except in compliance with the License. 67ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * You may obtain a copy of the License at 77ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * 87ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * http://www.apache.org/licenses/LICENSE-2.0 97ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * 107ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * Unless required by applicable law or agreed to in writing, software 117ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * distributed under the License is distributed on an "AS IS" BASIS, 127ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * See the License for the specific language governing permissions and 147ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh * limitations under the License 157ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh */ 167ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 177ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachhpackage com.android.dialer.metrics; 187ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 19dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport android.os.SystemClock; 20dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport com.android.dialer.common.Assert; 21dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport com.android.dialer.common.LogUtil; 22dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport java.util.concurrent.ConcurrentHashMap; 23dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport java.util.concurrent.ConcurrentMap; 24dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport javax.annotation.concurrent.ThreadSafe; 257ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachhimport javax.inject.Inject; 26dfded3aac2c4628f74cafdd2eb096f553d0d48adzachhimport javax.inject.Singleton; 277ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 28dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh/** Stub {@link Metrics} which simply logs debug messages to logcat. */ 29dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh@ThreadSafe 30dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh@Singleton 317ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachhpublic final class StubMetrics implements Metrics { 327ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 33dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh private final ConcurrentMap<String, StubTimerEvent> namedEvents = new ConcurrentHashMap<>(); 34dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh private final ConcurrentMap<Integer, StubTimerEvent> unnamedEvents = new ConcurrentHashMap<>(); 35dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 367ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh @Inject 377ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh StubMetrics() {} 387ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 397ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh @Override 40dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void startTimer(String timerEventName) { 41dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh namedEvents.put(timerEventName, new StubTimerEvent()); 42dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 437ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 447ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh @Override 45dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public Integer startUnnamedTimer() { 46dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh StubTimerEvent stubTimerEvent = new StubTimerEvent(); 47dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh int id = stubTimerEvent.hashCode(); 48dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d("StubMetrics.startUnnamedTimer", "started timer for id: %d", id); 49dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh unnamedEvents.put(id, stubTimerEvent); 50dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh return id; 51dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 527ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh 537ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh @Override 54dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void stopTimer(String timerEventName) { 55dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh StubTimerEvent stubTimerEvent = namedEvents.remove(timerEventName); 56dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh if (stubTimerEvent == null) { 57dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh return; 58dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 59dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 60dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d( 61dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh "StubMetrics.stopTimer", 62dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh "%s took %dms", 63dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh timerEventName, 64dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh SystemClock.elapsedRealtime() - stubTimerEvent.startTime); 65dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 66dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 67dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh @Override 68dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void stopUnnamedTimer(int timerId, String timerEventName) { 69dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh long startTime = 70dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh Assert.isNotNull( 71dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh unnamedEvents.remove(timerId), 72dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh "no timer found for id: %d (%s)", 73dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh timerId, 74dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh timerEventName) 75dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh .startTime; 76dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 77dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d( 78dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh "StubMetrics.stopUnnamedTimer", 79dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh "%s took %dms", 80dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh timerEventName, 81dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh SystemClock.elapsedRealtime() - startTime); 82dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 832905f6f492c34db684d53bac6e438c1d81fc0314zachh 842905f6f492c34db684d53bac6e438c1d81fc0314zachh @Override 85dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void startJankRecorder(String eventName) { 86dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d("StubMetrics.startJankRecorder", "started jank recorder for %s", eventName); 87dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 882905f6f492c34db684d53bac6e438c1d81fc0314zachh 892905f6f492c34db684d53bac6e438c1d81fc0314zachh @Override 90dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void stopJankRecorder(String eventName) { 91dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d("StubMetrics.startJankRecorder", "stopped jank recorder for %s", eventName); 92dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 93dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 94dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh @Override 95dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh public void recordMemory(String memoryEventName) { 96dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh LogUtil.d("StubMetrics.startJankRecorder", "recorded memory for %s", memoryEventName); 97dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 98dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 99dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh private static class StubTimerEvent { 100dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh final long startTime; 101dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh 102dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh StubTimerEvent() { 103dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh this.startTime = SystemClock.elapsedRealtime(); 104dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 105dfded3aac2c4628f74cafdd2eb096f553d0d48adzachh } 1067ca3851cdd7d87822b4615d58e1cb61dc232ddb8zachh} 107