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