Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd6b1157 authored by Zimuzo's avatar Zimuzo Committed by Zimuzo Ezeozue
Browse files

Add supported PackageInfo to ExplicitHealthCheckService API

With the change in I4f13638598037acaeb30d61c8d5178f45882fcba
to separate the PackageWatchdog package expiry deadline from the explicit
health check deadline. It would be cleaner for ExtServices to supply
this deadline per-package. We now do that as a field in
PackageInfo.

Bug: 120598832
Test: Builds

Change-Id: I29e2d619a5296716c29893ab3aa2f35f69bfb4d7
parent 960c4f06
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -319,6 +319,7 @@ java_defaults {
        "core/java/android/service/vr/IVrManager.aidl",
        "core/java/android/service/vr/IVrStateCallbacks.aidl",
        "core/java/android/service/watchdog/IExplicitHealthCheckService.aidl",
        "core/java/android/service/watchdog/PackageInfo.aidl",
        "core/java/android/print/ILayoutResultCallback.aidl",
        "core/java/android/print/IPrinterDiscoveryObserver.aidl",
        "core/java/android/print/IPrintDocumentAdapter.aidl",
+10 −1
Original line number Diff line number Diff line
@@ -6895,12 +6895,21 @@ package android.service.watchdog {
    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method public abstract void onCancelHealthCheck(@NonNull String);
    method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages();
    method @NonNull public abstract java.util.List<java.lang.String> onGetSupportedPackages();
    method @NonNull public abstract java.util.List<android.service.watchdog.PackageInfo> onGetSupportedPackages();
    method public abstract void onRequestHealthCheck(@NonNull String);
    field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE";
    field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService";
  }
  public final class PackageInfo implements android.os.Parcelable {
    ctor public PackageInfo(@NonNull String, long);
    method public int describeContents();
    method public long getHealthCheckTimeoutMillis();
    method @NonNull public String getPackageName();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.PackageInfo> CREATOR;
  }
}
package android.telecom {
+18 −14
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ public abstract class ExplicitHealthCheckService extends Service {
    private static final String TAG = "ExplicitHealthCheckService";

    /**
     * {@link Bundle} key for a {@link List} of {@link String} value.
     * {@link Bundle} key for a {@link List} of {@link PackageInfo} value.
     *
     * {@hide}
     */
@@ -130,7 +130,7 @@ public abstract class ExplicitHealthCheckService extends Service {
     *
     * @return all packages supporting explicit health checks
     */
    @NonNull public abstract List<String> onGetSupportedPackages();
    @NonNull public abstract List<PackageInfo> onGetSupportedPackages();

    /**
     * Called when the system requests for all the packages that it has currently requested
@@ -187,22 +187,26 @@ public abstract class ExplicitHealthCheckService extends Service {

        @Override
        public void getSupportedPackages(RemoteCallback callback) throws RemoteException {
            mHandler.post(() -> sendPackages(callback, EXTRA_SUPPORTED_PACKAGES,
                    ExplicitHealthCheckService.this.onGetSupportedPackages()));
            mHandler.post(() -> {
                List<PackageInfo> packages =
                        ExplicitHealthCheckService.this.onGetSupportedPackages();
                Objects.requireNonNull(packages, "Supported package list must be non-null");
                Bundle bundle = new Bundle();
                bundle.putParcelableArrayList(EXTRA_SUPPORTED_PACKAGES, new ArrayList<>(packages));
                callback.sendResult(bundle);
            });
        }

        @Override
        public void getRequestedPackages(RemoteCallback callback) throws RemoteException {
            mHandler.post(() -> sendPackages(callback, EXTRA_REQUESTED_PACKAGES,
                    ExplicitHealthCheckService.this.onGetRequestedPackages()));
        }

        private void sendPackages(RemoteCallback callback, String key, List<String> packages) {
            Objects.requireNonNull(packages,
                    "Supported and requested package list must be non-null");
            mHandler.post(() -> {
                List<String> packages =
                        ExplicitHealthCheckService.this.onGetRequestedPackages();
                Objects.requireNonNull(packages, "Requested  package list must be non-null");
                Bundle bundle = new Bundle();
            bundle.putStringArrayList(key, new ArrayList<>(packages));
                bundle.putStringArrayList(EXTRA_REQUESTED_PACKAGES, new ArrayList<>(packages));
                callback.sendResult(bundle);
            });
        }
    }
}
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 android.service.watchdog;

/**
 * @hide
 */
parcelable PackageInfo;
+130 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 android.service.watchdog;

import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.util.Preconditions;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * A PackageInfo contains a package supporting explicit health checks and the
 * timeout in {@link System#uptimeMillis} across reboots after which health
 * check requests from clients are failed.
 *
 * @hide
 */
@SystemApi
public final class PackageInfo implements Parcelable {
    // TODO: Receive from DeviceConfig flag
    private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1);

    private final String mPackageName;
    private final long mHealthCheckTimeoutMillis;

    /**
     * Creates a new instance.
     *
     * @param packageName the package name
     * @param durationMillis the duration in milliseconds, must be greater than or
     * equal to 0. If it is 0, it will use a system default value.
     */
    public PackageInfo(@NonNull String packageName, long healthCheckTimeoutMillis) {
        mPackageName = Preconditions.checkNotNull(packageName);
        if (healthCheckTimeoutMillis == 0) {
            mHealthCheckTimeoutMillis = DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS;
        } else {
            mHealthCheckTimeoutMillis = Preconditions.checkArgumentNonnegative(
                    healthCheckTimeoutMillis);
        }
    }

    private PackageInfo(Parcel parcel) {
        mPackageName = parcel.readString();
        mHealthCheckTimeoutMillis = parcel.readLong();
    }

    /**
     * Gets the package name.
     *
     * @return the package name
     */
    public @NonNull String getPackageName() {
        return mPackageName;
    }

    /**
     * Gets the timeout in milliseconds to evaluate an explicit health check result after a request.
     *
     * @return the duration in {@link System#uptimeMillis} across reboots
     */
    public long getHealthCheckTimeoutMillis() {
        return mHealthCheckTimeoutMillis;
    }

    @Override
    public String toString() {
        return "PackageInfo{" + mPackageName + ", " + mHealthCheckTimeoutMillis + "}";
    }

    @Override
    public boolean equals(Object other) {
        if (other == this) {
            return true;
        }
        if (!(other instanceof PackageInfo)) {
            return false;
        }

        PackageInfo otherInfo = (PackageInfo) other;
        return Objects.equals(otherInfo.getHealthCheckTimeoutMillis(), mHealthCheckTimeoutMillis)
                && Objects.equals(otherInfo.getPackageName(), mPackageName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mPackageName, mHealthCheckTimeoutMillis);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(mPackageName);
        parcel.writeLong(mHealthCheckTimeoutMillis);
    }

    public static final @NonNull Creator<PackageInfo> CREATOR = new Creator<PackageInfo>() {
            @Override
            public PackageInfo createFromParcel(Parcel source) {
                return new PackageInfo(source);
            }

            @Override
            public PackageInfo[] newArray(int size) {
                return new PackageInfo[size];
            }
        };
}
Loading