blob: dbc959928a3b0227b1a066430e5243a410fe7083 [file] [log] [blame]
/*
* Copyright (C) 2022 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.server.uri;
import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import android.app.StatsManager;
import android.content.Context;
import android.util.SparseArray;
import android.util.StatsEvent;
import com.android.internal.util.FrameworkStatsLog;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
final class UriMetricsHelper {
private static final StatsManager.PullAtomMetadata DAILY_PULL_METADATA =
new StatsManager.PullAtomMetadata.Builder()
.setCoolDownMillis(TimeUnit.DAYS.toMillis(1))
.build();
private final Context mContext;
private final PersistentUriGrantsProvider mPersistentUriGrantsProvider;
UriMetricsHelper(Context context, PersistentUriGrantsProvider provider) {
mContext = context;
mPersistentUriGrantsProvider = provider;
}
void registerPuller() {
final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
statsManager.setPullAtomCallback(
FrameworkStatsLog.PERSISTENT_URI_PERMISSIONS_AMOUNT_PER_PACKAGE,
DAILY_PULL_METADATA,
DIRECT_EXECUTOR,
(atomTag, data) -> {
reportPersistentUriPermissionsPerPackage(data);
return StatsManager.PULL_SUCCESS;
});
}
void reportPersistentUriFlushed(int amount) {
FrameworkStatsLog.write(
FrameworkStatsLog.PERSISTENT_URI_PERMISSIONS_FLUSHED,
amount
);
}
private void reportPersistentUriPermissionsPerPackage(List<StatsEvent> data) {
final ArrayList<UriPermission> persistentUriGrants =
mPersistentUriGrantsProvider.providePersistentUriGrants();
final SparseArray<Integer> perUidCount = new SparseArray<>();
final int persistentUriGrantsSize = persistentUriGrants.size();
for (int i = 0; i < persistentUriGrantsSize; i++) {
final UriPermission uriPermission = persistentUriGrants.get(i);
perUidCount.put(
uriPermission.targetUid,
perUidCount.get(uriPermission.targetUid, 0) + 1
);
}
final int perUidCountSize = perUidCount.size();
for (int i = 0; i < perUidCountSize; i++) {
final int uid = perUidCount.keyAt(i);
final int amount = perUidCount.valueAt(i);
data.add(
FrameworkStatsLog.buildStatsEvent(
FrameworkStatsLog.PERSISTENT_URI_PERMISSIONS_AMOUNT_PER_PACKAGE,
uid,
amount
)
);
}
}
interface PersistentUriGrantsProvider {
ArrayList<UriPermission> providePersistentUriGrants();
}
}