1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.net.impl; 6 7 import android.content.ComponentName; 8 import android.content.Context; 9 import android.content.ContextWrapper; 10 import android.content.pm.PackageManager; 11 import android.content.pm.ServiceInfo; 12 import android.os.Bundle; 13 14 import org.chromium.base.test.util.PackageManagerWrapper; 15 import org.chromium.net.ContextInterceptor; 16 17 /** 18 * A {@link ContextInterceptor} that makes the intercepted Context advertise a specific set of 19 * Cronet manifest meta-data. 20 * 21 * @see org.chromium.net.impl.CronetManifest 22 */ 23 public final class CronetManifestInterceptor implements ContextInterceptor { 24 private final Bundle mMetaData; 25 26 /** 27 * @param metaData the meta-data to return in Cronet manifest meta-data queries on intercepted 28 * Contexts. 29 */ CronetManifestInterceptor(Bundle metaData)30 public CronetManifestInterceptor(Bundle metaData) { 31 mMetaData = metaData; 32 } 33 34 @Override interceptContext(Context context)35 public Context interceptContext(Context context) { 36 return new ContextWrapper(context) { 37 @Override 38 public PackageManager getPackageManager() { 39 return new PackageManagerWrapper(super.getPackageManager()) { 40 @Override 41 public ServiceInfo getServiceInfo(ComponentName componentName, int flags) 42 throws NameNotFoundException { 43 if (!componentName.equals( 44 new ComponentName( 45 getBaseContext(), 46 CronetManifest.META_DATA_HOLDER_SERVICE_NAME))) { 47 return super.getServiceInfo(componentName, flags); 48 } 49 50 ServiceInfo serviceInfo = new ServiceInfo(); 51 serviceInfo.metaData = mMetaData; 52 return serviceInfo; 53 } 54 }; 55 } 56 }; 57 } 58 } 59