197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk/* 297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Copyright 2018 The Android Open Source Project 397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * you may not use this file except in compliance with the License. 697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * You may obtain a copy of the License at 797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 1097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Unless required by applicable law or agreed to in writing, software 1197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 1297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * See the License for the specific language governing permissions and 1497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * limitations under the License. 1597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk */ 1697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 1797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkpackage androidx.core.app; 1897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 1997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.app.Activity; 2097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.app.AppComponentFactory; 2197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.app.Application; 2297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.app.Service; 2397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.content.BroadcastReceiver; 2497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.content.ContentProvider; 2597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport android.content.Intent; 2697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 2797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport androidx.annotation.RequiresApi; 2897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkimport androidx.annotation.RestrictTo; 2997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 3097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk/** 3197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Instance of AppComponentFactory for support libraries. 3297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * @see CompatWrapped 3397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * @hide 3497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk */ 3597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk@RequiresApi(api = 28) 3697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 3797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monkpublic class CoreComponentFactory extends AppComponentFactory { 3897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk private static final String TAG = "CoreComponentFactory"; 3997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 4097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @Override 4197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) 4297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk throws InstantiationException, IllegalAccessException, ClassNotFoundException { 4397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return checkCompatWrapper(super.instantiateActivity(cl, className, intent)); 4497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 4597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 4697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @Override 4797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk public Application instantiateApplication(ClassLoader cl, String className) 4897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk throws InstantiationException, IllegalAccessException, ClassNotFoundException { 4997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return checkCompatWrapper(super.instantiateApplication(cl, className)); 5097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 5197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 5297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @Override 53c286ff286c0920cd92035a8243134535a6403b4dJason Monk public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, 54c286ff286c0920cd92035a8243134535a6403b4dJason Monk Intent intent) 5597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk throws InstantiationException, IllegalAccessException, ClassNotFoundException { 5697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return checkCompatWrapper(super.instantiateReceiver(cl, className, intent)); 5797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 5897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 5997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @Override 6097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk public ContentProvider instantiateProvider(ClassLoader cl, String className) 6197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk throws InstantiationException, IllegalAccessException, ClassNotFoundException { 6297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return checkCompatWrapper(super.instantiateProvider(cl, className)); 6397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 6497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 6597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @Override 6697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk public Service instantiateService(ClassLoader cl, String className, Intent intent) 6797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk throws InstantiationException, IllegalAccessException, ClassNotFoundException { 6897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return checkCompatWrapper(super.instantiateService(cl, className, intent)); 6997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 7097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 71c286ff286c0920cd92035a8243134535a6403b4dJason Monk static <T> T checkCompatWrapper(T obj) { 7297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk if (obj instanceof CompatWrapped) { 7397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk T wrapper = (T) ((CompatWrapped) obj).getWrapper(); 7497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk if (wrapper != null) { 7597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return wrapper; 7697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 7797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 7897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk return obj; 7997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 8097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 8197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk /** 8297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Implement this interface to allow a different class to be returned when instantiating 8397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * on certain API levels. 8497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * @hide 8597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk */ 8697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 8797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk public interface CompatWrapped { 8897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk /** 8997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Called while this class is being instantiated by the OS. 9097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 9197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * If an object is returned then it will be used in place of the class. 9297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Note: this will not be called on API <= 27. 9397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 9497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * Example: 9597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * <pre class="prettyprint"> 9697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * {@literal 9797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * public AndroidXContentProvider extends ContentProvider implements CompatWrapped { 9897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * ... 9997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * 10097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * public Object getWrapper() { 10197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * if (SDK_INT >= 29) { 10297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * return new AndroidXContentProviderV29(this); 10397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * } 10497d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * return null; 10597d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * } 10697d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * } 10797d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * } 10897d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk * </pre> 10997d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk */ 11097d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk Object getWrapper(); 11197d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk } 11297d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk 11397d87927db5b5af8a1ee036bdcc6a0c8a5d5d3a3Jason Monk} 114