/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.telephony.statslib;
import android.app.StatsManager;
import android.content.Context;
import android.util.Log;
import android.util.StatsEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.Executor;
/**
* StatsLibPulledAtomCallback class
*
*
This class registers to statsd. Called once a day for this class pull stat to send to statsd.
*/
class StatsLibPulledAtomCallback implements StatsManager.StatsPullAtomCallback {
private static final String LOG_TAG = StatsLibPulledAtomCallback.class.getSimpleName();
private static final boolean DBG = true;
private static final StatsManager.PullAtomMetadata POLICY_PULL_DAILY =
new StatsManager.PullAtomMetadata.Builder()
.setCoolDownMillis(5L)
.setTimeoutMillis(2L)
.build();
private final StatsManager mStatsManager;
private final StatsLibStorage mStatsLibStorage;
private final HashMap mRegisteredCallback;
/**
* Constructor of StatsLibPulledAtomCallback
*
* @param context Context
*/
StatsLibPulledAtomCallback(Context context) {
mRegisteredCallback = new HashMap<>();
mStatsLibStorage = new StatsLibStorage(context);
mStatsManager = context.getSystemService(StatsManager.class);
log("created StatsLibPulledAtomCallback.");
}
/** get a StatsLibStorage, which stores pulled atoms */
StatsLibStorage getStatsLibStorage() {
return mStatsLibStorage;
}
private void log(String s) {
if (DBG) Log.d(LOG_TAG, s);
}
/**
* Register a callback
*
* @param atomTag The tag of the atom for this puller callback.
*/
void registerAtom(int atomTag) {
registerAtom(atomTag, new EmptyCallback());
}
/**
* Register a callback
*
* @param atomTag The tag of the atom for this puller callback.
*/
void registerAtom(int atomTag, PulledCallback callback) {
if (!mRegisteredCallback.containsKey(atomTag)) {
mStatsLibStorage.init(atomTag);
mStatsLibStorage.loadFromFile(atomTag);
mStatsManager.setPullAtomCallback(
atomTag, POLICY_PULL_DAILY, new MetricExecutor(), this);
mRegisteredCallback.put(atomTag, callback);
}
}
/**
* is registered a callback
*
* @param atomTag The tag of the atom for this puller callback.
*/
boolean isRegisteredAtom(int atomTag) {
return mRegisteredCallback.containsKey(atomTag);
}
/**
* Register a callback
*
* @param atomTag The tag of the atom for this puller callback.
*/
void unregisterAtom(int atomTag) {
if (mRegisteredCallback.containsKey(atomTag)) {
mStatsManager.clearPullAtomCallback(atomTag);
mRegisteredCallback.remove(atomTag);
mStatsLibStorage.saveToFile(atomTag);
}
}
@Override
public int onPullAtom(int atomTag, List data) {
log("onPullAtom: atomTag:" + atomTag);
AtomsPulled[] arrayPulled = getStatsLibStorage().popPulledAtoms(atomTag);
for (AtomsPulled pulled : arrayPulled) {
final StatsEvent.Builder builder = StatsEvent.newBuilder();
builder.setAtomId(pulled.getStatsId());
pulled.build(builder);
data.add(builder.build());
}
PulledCallback callback = mRegisteredCallback.get(atomTag);
if (callback == null) {
return StatsManager.PULL_SUCCESS;
}
List list = new ArrayList<>();
callback.onPulledCallback(atomTag, list);
for (AtomsPulled pulled : list) {
final StatsEvent.Builder builder = StatsEvent.newBuilder();
builder.setAtomId(pulled.getStatsId());
pulled.build(builder);
data.add(builder.build());
}
return StatsManager.PULL_SUCCESS;
}
private static class MetricExecutor implements Executor {
@Override
public void execute(Runnable command) {
command.run();
}
@Override
public String toString() {
return "METRIC_EXECUTOR";
}
}
static class EmptyCallback implements PulledCallback {
public void onPulledCallback(int atomTag, List data) {}
}
}