• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package android.app;
17 
18 import android.annotation.NonNull;
19 import android.annotation.Nullable;
20 import android.content.BroadcastReceiver;
21 import android.content.ContentProvider;
22 import android.content.Intent;
23 
24 /**
25  * Interface used to control the instantiation of manifest elements.
26  *
27  * @see #instantiateApplication
28  * @see #instantiateActivity
29  * @see #instantiateService
30  * @see #instantiateReceiver
31  * @see #instantiateProvider
32  */
33 public class AppComponentFactory {
34 
35     /**
36      * Allows application to override the creation of the application object. This can be used to
37      * perform things such as dependency injection or class loader changes to these
38      * classes.
39      * <p>
40      * This method is only intended to provide a hook for instantiation. It does not provide
41      * earlier access to the Application object. The returned object will not be initialized
42      * as a Context yet and should not be used to interact with other android APIs.
43      *
44      * @param cl        The default classloader to use for instantiation.
45      * @param className The class to be instantiated.
46      */
instantiateApplication(@onNull ClassLoader cl, @NonNull String className)47     public @NonNull Application instantiateApplication(@NonNull ClassLoader cl,
48             @NonNull String className)
49             throws InstantiationException, IllegalAccessException, ClassNotFoundException {
50         return (Application) cl.loadClass(className).newInstance();
51     }
52 
53     /**
54      * Allows application to override the creation of activities. This can be used to
55      * perform things such as dependency injection or class loader changes to these
56      * classes.
57      * <p>
58      * This method is only intended to provide a hook for instantiation. It does not provide
59      * earlier access to the Activity object. The returned object will not be initialized
60      * as a Context yet and should not be used to interact with other android APIs.
61      *
62      * @param cl        The default classloader to use for instantiation.
63      * @param className The class to be instantiated.
64      * @param intent    Intent creating the class.
65      */
instantiateActivity(@onNull ClassLoader cl, @NonNull String className, @Nullable Intent intent)66     public @NonNull Activity instantiateActivity(@NonNull ClassLoader cl, @NonNull String className,
67             @Nullable Intent intent)
68             throws InstantiationException, IllegalAccessException, ClassNotFoundException {
69         return (Activity) cl.loadClass(className).newInstance();
70     }
71 
72     /**
73      * Allows application to override the creation of receivers. This can be used to
74      * perform things such as dependency injection or class loader changes to these
75      * classes.
76      *
77      * @param cl        The default classloader to use for instantiation.
78      * @param className The class to be instantiated.
79      * @param intent    Intent creating the class.
80      */
instantiateReceiver(@onNull ClassLoader cl, @NonNull String className, @Nullable Intent intent)81     public @NonNull BroadcastReceiver instantiateReceiver(@NonNull ClassLoader cl,
82             @NonNull String className, @Nullable Intent intent)
83             throws InstantiationException, IllegalAccessException, ClassNotFoundException {
84         return (BroadcastReceiver) cl.loadClass(className).newInstance();
85     }
86 
87     /**
88      * Allows application to override the creation of services. This can be used to
89      * perform things such as dependency injection or class loader changes to these
90      * classes.
91      * <p>
92      * This method is only intended to provide a hook for instantiation. It does not provide
93      * earlier access to the Service object. The returned object will not be initialized
94      * as a Context yet and should not be used to interact with other android APIs.
95      *
96      * @param cl        The default classloader to use for instantiation.
97      * @param className The class to be instantiated.
98      * @param intent    Intent creating the class.
99      */
instantiateService(@onNull ClassLoader cl, @NonNull String className, @Nullable Intent intent)100     public @NonNull Service instantiateService(@NonNull ClassLoader cl,
101             @NonNull String className, @Nullable Intent intent)
102             throws InstantiationException, IllegalAccessException, ClassNotFoundException {
103         return (Service) cl.loadClass(className).newInstance();
104     }
105 
106     /**
107      * Allows application to override the creation of providers. This can be used to
108      * perform things such as dependency injection or class loader changes to these
109      * classes.
110      * <p>
111      * This method is only intended to provide a hook for instantiation. It does not provide
112      * earlier access to the ContentProvider object. The returned object will not be initialized
113      * with a Context yet and should not be used to interact with other android APIs.
114      *
115      * @param cl        The default classloader to use for instantiation.
116      * @param className The class to be instantiated.
117      */
instantiateProvider(@onNull ClassLoader cl, @NonNull String className)118     public @NonNull ContentProvider instantiateProvider(@NonNull ClassLoader cl,
119             @NonNull String className)
120             throws InstantiationException, IllegalAccessException, ClassNotFoundException {
121         return (ContentProvider) cl.loadClass(className).newInstance();
122     }
123 
124     /**
125      * @hide
126      */
127     public static final AppComponentFactory DEFAULT = new AppComponentFactory();
128 }
129