blob: 19c08866e348c3c26cb87f1d5f4f88187c321d80 [file] [log] [blame]
/*
* Copyright (C) 2020 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.pm.pkg;
import static java.util.Collections.emptyList;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.text.TextUtils;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
import com.android.server.pm.PackageSetting;
import java.util.ArrayList;
import java.util.List;
/**
* For use by {@link PackageSetting} to maintain functionality that used to exist in PackageParser.
*
* It is assumed that anything inside the package was not cached or written to disk, so none of
* these fields are either. They must be set on every boot from other state on the device.
*
* These fields are also not copied into any cloned PackageSetting, to preserve the old behavior
* where they would be lost implicitly by re-generating the package object.
* @hide
*/
@DataClass(genSetters = true, genConstructor = false, genBuilder = false)
@DataClass.Suppress({"setLastPackageUsageTimeInMills", "setPackageSetting", "setUsesLibraryInfos"})
public class PackageStateUnserialized {
private boolean hiddenUntilInstalled;
@NonNull
private List<SharedLibraryWrapper> usesLibraryInfos = emptyList();
@NonNull
private List<String> usesLibraryFiles = emptyList();
private boolean updatedSystemApp;
private boolean apkInUpdatedApex;
@NonNull
private volatile long[] lastPackageUsageTimeInMills;
@Nullable
private String overrideSeInfo;
@NonNull
private String seInfo;
// TODO: Remove in favor of finer grained change notification
@NonNull
private final PackageSetting mPackageSetting;
@Nullable
private String mApexModuleName;
public PackageStateUnserialized(@NonNull PackageSetting packageSetting) {
mPackageSetting = packageSetting;
}
@NonNull
public PackageStateUnserialized addUsesLibraryInfo(@NonNull SharedLibraryWrapper value) {
usesLibraryInfos = CollectionUtils.add(usesLibraryInfos, value);
return this;
}
@NonNull
public PackageStateUnserialized addUsesLibraryFile(@NonNull String value) {
usesLibraryFiles = CollectionUtils.add(usesLibraryFiles, value);
return this;
}
private long[] lazyInitLastPackageUsageTimeInMills() {
return new long[PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT];
}
public PackageStateUnserialized setLastPackageUsageTimeInMills(int reason, long time) {
if (reason < 0) {
return this;
}
if (reason >= PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT) {
return this;
}
getLastPackageUsageTimeInMills()[reason] = time;
// TODO(b/236180425): This method does not notify snapshot changes because it's called too
// frequently, causing too many re-takes. This should be moved to a separate data structure
// or merged with the general UsageStats to avoid tracking heavily mutated data in the
// package data snapshot.
return this;
}
public long getLatestPackageUseTimeInMills() {
long latestUse = 0L;
for (long use : getLastPackageUsageTimeInMills()) {
latestUse = Math.max(latestUse, use);
}
return latestUse;
}
public long getLatestForegroundPackageUseTimeInMills() {
int[] foregroundReasons = {
PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY,
PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE
};
long latestUse = 0L;
for (int reason : foregroundReasons) {
latestUse = Math.max(latestUse, getLastPackageUsageTimeInMills()[reason]);
}
return latestUse;
}
public void updateFrom(PackageStateUnserialized other) {
this.hiddenUntilInstalled = other.hiddenUntilInstalled;
if (!other.usesLibraryInfos.isEmpty()) {
this.usesLibraryInfos = new ArrayList<>(other.usesLibraryInfos);
}
if (!other.usesLibraryFiles.isEmpty()) {
this.usesLibraryFiles = new ArrayList<>(other.usesLibraryFiles);
}
this.updatedSystemApp = other.updatedSystemApp;
this.apkInUpdatedApex = other.apkInUpdatedApex;
this.lastPackageUsageTimeInMills = other.lastPackageUsageTimeInMills;
this.overrideSeInfo = other.overrideSeInfo;
this.seInfo = other.seInfo;
this.mApexModuleName = other.mApexModuleName;
mPackageSetting.onChanged();
}
public @NonNull List<SharedLibraryInfo> getNonNativeUsesLibraryInfos() {
var list = new ArrayList<SharedLibraryInfo>();
usesLibraryInfos = getUsesLibraryInfos();
for (int index = 0; index < usesLibraryInfos.size(); index++) {
var library = usesLibraryInfos.get(index);
if (!library.isNative()) {
list.add(library.getInfo());
}
}
return list;
}
public PackageStateUnserialized setHiddenUntilInstalled(boolean value) {
hiddenUntilInstalled = value;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setUsesLibraryInfos(@NonNull List<SharedLibraryInfo> value) {
var list = new ArrayList<SharedLibraryWrapper>();
for (int index = 0; index < value.size(); index++) {
list.add(new SharedLibraryWrapper(value.get(index)));
}
usesLibraryInfos = list;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setUsesLibraryFiles(@NonNull List<String> value) {
usesLibraryFiles = value;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setUpdatedSystemApp(boolean value) {
updatedSystemApp = value;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setApkInUpdatedApex(boolean value) {
apkInUpdatedApex = value;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setLastPackageUsageTimeInMills(@NonNull long... value) {
lastPackageUsageTimeInMills = value;
mPackageSetting.onChanged();
return this;
}
public PackageStateUnserialized setOverrideSeInfo(@Nullable String value) {
overrideSeInfo = value;
mPackageSetting.onChanged();
return this;
}
@NonNull
public PackageStateUnserialized setSeInfo(@NonNull String value) {
seInfo = TextUtils.safeIntern(value);
mPackageSetting.onChanged();
return this;
}
@NonNull
public PackageStateUnserialized setApexModuleName(@NonNull String value) {
mApexModuleName = value;
mPackageSetting.onChanged();
return this;
}
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
@DataClass.Generated.Member
public boolean isHiddenUntilInstalled() {
return hiddenUntilInstalled;
}
@DataClass.Generated.Member
public @NonNull List<SharedLibraryWrapper> getUsesLibraryInfos() {
return usesLibraryInfos;
}
@DataClass.Generated.Member
public @NonNull List<String> getUsesLibraryFiles() {
return usesLibraryFiles;
}
@DataClass.Generated.Member
public boolean isUpdatedSystemApp() {
return updatedSystemApp;
}
@DataClass.Generated.Member
public boolean isApkInUpdatedApex() {
return apkInUpdatedApex;
}
@DataClass.Generated.Member
public @NonNull long[] getLastPackageUsageTimeInMills() {
long[] _lastPackageUsageTimeInMills = lastPackageUsageTimeInMills;
if (_lastPackageUsageTimeInMills == null) {
synchronized(this) {
_lastPackageUsageTimeInMills = lastPackageUsageTimeInMills;
if (_lastPackageUsageTimeInMills == null) {
_lastPackageUsageTimeInMills = lastPackageUsageTimeInMills = lazyInitLastPackageUsageTimeInMills();
}
}
}
return _lastPackageUsageTimeInMills;
}
@DataClass.Generated.Member
public @Nullable String getOverrideSeInfo() {
return overrideSeInfo;
}
@DataClass.Generated.Member
public @NonNull String getSeInfo() {
return seInfo;
}
@DataClass.Generated.Member
public @NonNull PackageSetting getPackageSetting() {
return mPackageSetting;
}
@DataClass.Generated.Member
public @Nullable String getApexModuleName() {
return mApexModuleName;
}
@DataClass.Generated(
time = 1671483772254L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java",
inputSignatures = "private boolean hiddenUntilInstalled\nprivate @android.annotation.NonNull java.util.List<com.android.server.pm.pkg.SharedLibraryWrapper> usesLibraryInfos\nprivate @android.annotation.NonNull java.util.List<java.lang.String> usesLibraryFiles\nprivate boolean updatedSystemApp\nprivate boolean apkInUpdatedApex\nprivate volatile @android.annotation.NonNull long[] lastPackageUsageTimeInMills\nprivate @android.annotation.Nullable java.lang.String overrideSeInfo\nprivate @android.annotation.NonNull java.lang.String seInfo\nprivate final @android.annotation.NonNull com.android.server.pm.PackageSetting mPackageSetting\nprivate @android.annotation.Nullable java.lang.String mApexModuleName\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized addUsesLibraryInfo(com.android.server.pm.pkg.SharedLibraryWrapper)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized addUsesLibraryFile(java.lang.String)\nprivate long[] lazyInitLastPackageUsageTimeInMills()\npublic com.android.server.pm.pkg.PackageStateUnserialized setLastPackageUsageTimeInMills(int,long)\npublic long getLatestPackageUseTimeInMills()\npublic long getLatestForegroundPackageUseTimeInMills()\npublic void updateFrom(com.android.server.pm.pkg.PackageStateUnserialized)\npublic @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> getNonNativeUsesLibraryInfos()\npublic com.android.server.pm.pkg.PackageStateUnserialized setHiddenUntilInstalled(boolean)\npublic com.android.server.pm.pkg.PackageStateUnserialized setUsesLibraryInfos(java.util.List<android.content.pm.SharedLibraryInfo>)\npublic com.android.server.pm.pkg.PackageStateUnserialized setUsesLibraryFiles(java.util.List<java.lang.String>)\npublic com.android.server.pm.pkg.PackageStateUnserialized setUpdatedSystemApp(boolean)\npublic com.android.server.pm.pkg.PackageStateUnserialized setApkInUpdatedApex(boolean)\npublic com.android.server.pm.pkg.PackageStateUnserialized setLastPackageUsageTimeInMills(long)\npublic com.android.server.pm.pkg.PackageStateUnserialized setOverrideSeInfo(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized setSeInfo(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized setApexModuleName(java.lang.String)\nclass PackageStateUnserialized extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genSetters=true, genConstructor=false, genBuilder=false)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}