1b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy/*
2b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * Copyright (C) 2015 The Android Open Source Project
3b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy *
4b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * Licensed under the Apache License, Version 2.0 (the "License");
5b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * you may not use this file except in compliance with the License.
6b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * You may obtain a copy of the License at
7b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy *
8b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy *      http://www.apache.org/licenses/LICENSE-2.0
9b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy *
10b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * Unless required by applicable law or agreed to in writing, software
11b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * distributed under the License is distributed on an "AS IS" BASIS,
12b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * See the License for the specific language governing permissions and
14b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * limitations under the License.
15b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy */
16b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
1731b95e0265fecb60ba29baba6a5ea4de3d4a3367Todd Kennedypackage android.app;
18b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
197440f177c3e70da0b883f8abffd6c8fc1d507bb8Todd Kennedyimport android.annotation.SystemApi;
20b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.app.Service;
211fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedyimport android.app.InstantAppResolverService.InstantAppResolutionCallback;
22b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.content.Context;
23b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.content.Intent;
247440f177c3e70da0b883f8abffd6c8fc1d507bb8Todd Kennedyimport android.content.pm.EphemeralResolveInfo;
251fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedyimport android.content.pm.InstantAppResolveInfo;
26d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedyimport android.os.Build;
27b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.Bundle;
28b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.Handler;
29b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.IBinder;
30b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.IRemoteCallback;
31b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.Looper;
32b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.Message;
33b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport android.os.RemoteException;
34d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedyimport android.util.Log;
35b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
361fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedyimport java.util.ArrayList;
37d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedyimport java.util.Arrays;
38b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedyimport java.util.List;
39b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
40b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy/**
41b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * Base class for implementing the resolver service.
42b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy * @hide
431fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy * @deprecated use InstantAppResolverService instead
44b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy */
451fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy@Deprecated
467440f177c3e70da0b883f8abffd6c8fc1d507bb8Todd Kennedy@SystemApi
471fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedypublic abstract class EphemeralResolverService extends InstantAppResolverService {
48d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy    private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE;
49d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy    private static final String TAG = "PackageManager";
50d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy
51b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy    /**
52b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy     * Called to retrieve resolve info for ephemeral applications.
53b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy     *
54b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy     * @param digestPrefix The hash prefix of the ephemeral's domain.
55a97045b2456b63a9c699a8cc8af66b0e8e95c519Todd Kennedy     * @param prefixMask A mask that was applied to each digest prefix. This should
56a97045b2456b63a9c699a8cc8af66b0e8e95c519Todd Kennedy     *      be used when comparing against the digest prefixes as all bits might
57a97045b2456b63a9c699a8cc8af66b0e8e95c519Todd Kennedy     *      not be set.
58e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     * @deprecated use {@link #onGetEphemeralResolveInfo(int[])} instead
59b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy     */
60e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    @Deprecated
6131b95e0265fecb60ba29baba6a5ea4de3d4a3367Todd Kennedy    public abstract List<EphemeralResolveInfo> onEphemeralResolveInfoList(
62e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy            int digestPrefix[], int prefix);
63e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy
64e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    /**
65e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     * Called to retrieve resolve info for ephemeral applications.
66e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     *
67e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     * @param digestPrefix The hash prefix of the ephemeral's domain.
68e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     */
69e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    public List<EphemeralResolveInfo> onGetEphemeralResolveInfo(int digestPrefix[]) {
70e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy        return onEphemeralResolveInfoList(digestPrefix, 0xFFFFF000);
71e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    }
72e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy
73e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    /**
74e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     * Called to retrieve intent filters for ephemeral applications.
75e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     *
76194e4eeb0e9b77802c381d94f43b5e3b938c59e5Todd Kennedy     * @param hostName The name of the host to get intent filters for.
77e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy     */
78194e4eeb0e9b77802c381d94f43b5e3b938c59e5Todd Kennedy    public EphemeralResolveInfo onGetEphemeralIntentFilter(String hostName) {
79e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy        throw new IllegalStateException("Must define");
80e5195dd17c5e1d8538049a5282c0d988988f63c8Todd Kennedy    }
81b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
821fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy    @Override
8363d7a9dd6a1a803241aa42fa8af8c387cbbbce19Todd Kennedy    public Looper getLooper() {
841fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        return super.getLooper();
8563d7a9dd6a1a803241aa42fa8af8c387cbbbce19Todd Kennedy    }
8663d7a9dd6a1a803241aa42fa8af8c387cbbbce19Todd Kennedy
87b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy    @Override
88d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy    void _onGetInstantAppResolveInfo(int[] digestPrefix, String token,
89d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy            InstantAppResolutionCallback callback) {
90d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy        if (DEBUG_EPHEMERAL) {
91d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy            Log.d(TAG, "Legacy resolver; getInstantAppResolveInfo;"
92d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy                    + " prefix: " + Arrays.toString(digestPrefix));
93d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy        }
941fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        final List<EphemeralResolveInfo> response = onGetEphemeralResolveInfo(digestPrefix);
951fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        final int responseSize = response == null ? 0 : response.size();
961fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        final List<InstantAppResolveInfo> resultList = new ArrayList<>(responseSize);
971fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        for (int i = 0; i < responseSize; i++) {
981fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy            resultList.add(response.get(i).getInstantAppResolveInfo());
991fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        }
1001fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        callback.onInstantAppResolveInfo(resultList);
101b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy    }
102b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy
103b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy    @Override
104d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy    void _onGetInstantAppIntentFilter(int[] digestPrefix, String token,
105d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy            String hostName, InstantAppResolutionCallback callback) {
106d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy        if (DEBUG_EPHEMERAL) {
107d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy            Log.d(TAG, "Legacy resolver; getInstantAppIntentFilter;"
108d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy                    + " prefix: " + Arrays.toString(digestPrefix));
109d3c5106940838f2867afbbbfe251aaad38ab24b5Todd Kennedy        }
1101fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        final EphemeralResolveInfo response = onGetEphemeralIntentFilter(hostName);
1111fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        final List<InstantAppResolveInfo> resultList = new ArrayList<>(1);
1121fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        resultList.add(response.getInstantAppResolveInfo());
1131fb3404b2ba69a823e961bec2d9ed61622107052Todd Kennedy        callback.onInstantAppResolveInfo(resultList);
114b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy    }
115b8a279ee838c309a64211a3caa5e5e204250163dTodd Kennedy}
116