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