1 /*
2  * Copyright (C) 2016 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 
17 package com.android.settings.overlay;
18 
19 import android.content.Context;
20 import android.text.TextUtils;
21 import android.util.Log;
22 
23 import androidx.annotation.Nullable;
24 
25 import com.android.settings.R;
26 import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
27 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
28 import com.android.settings.accounts.AccountFeatureProvider;
29 import com.android.settings.applications.ApplicationFeatureProvider;
30 import com.android.settings.applications.GameSettingsFeatureProvider;
31 import com.android.settings.applications.appinfo.ExtraAppInfoFeatureProvider;
32 import com.android.settings.aware.AwareFeatureProvider;
33 import com.android.settings.biometrics.face.FaceFeatureProvider;
34 import com.android.settings.bluetooth.BluetoothFeatureProvider;
35 import com.android.settings.dashboard.DashboardFeatureProvider;
36 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
37 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
38 import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
39 import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
40 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
41 import com.android.settings.gestures.AssistGestureFeatureProvider;
42 import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider;
43 import com.android.settings.localepicker.LocaleFeatureProvider;
44 import com.android.settings.panel.PanelFeatureProvider;
45 import com.android.settings.search.SearchFeatureProvider;
46 import com.android.settings.security.SecurityFeatureProvider;
47 import com.android.settings.security.SecuritySettingsFeatureProvider;
48 import com.android.settings.slices.SlicesFeatureProvider;
49 import com.android.settings.users.UserFeatureProvider;
50 import com.android.settings.wifi.WifiTrackerLibProvider;
51 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
52 
53 /**
54  * Abstract class for creating feature controllers. Allows OEM implementations to define their own
55  * factories with their own controllers containing whatever code is needed to implement
56  * the features. To provide a factory implementation, implementors should override
57  * {@link R.string#config_featureFactory} in their override.
58  */
59 public abstract class FeatureFactory {
60     private static final String LOG_TAG = "FeatureFactory";
61     private static final boolean DEBUG = false;
62 
63     protected static FeatureFactory sFactory;
64     protected static Context sAppContext;
65 
66     /**
67      * Returns a factory for creating feature controllers. Creates the factory if it does not
68      * already exist. Uses the value of {@link R.string#config_featureFactory} to instantiate
69      * a factory implementation.
70      */
getFactory(Context context)71     public static FeatureFactory getFactory(Context context) {
72         if (sFactory != null) {
73             return sFactory;
74         }
75         if (sAppContext == null) {
76             sAppContext = context.getApplicationContext();
77         }
78 
79         if (DEBUG) Log.d(LOG_TAG, "getFactory");
80         final String clsName = context.getString(R.string.config_featureFactory);
81         if (TextUtils.isEmpty(clsName)) {
82             throw new UnsupportedOperationException("No feature factory configured");
83         }
84         try {
85             sFactory = (FeatureFactory) context.getClassLoader().loadClass(clsName).newInstance();
86         } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
87             throw new FactoryNotFoundException(e);
88         }
89 
90         if (DEBUG) Log.d(LOG_TAG, "started " + sFactory.getClass().getSimpleName());
91         return sFactory;
92     }
93 
94     /**
95      * Returns an application {@link Context} used to create this {@link FeatureFactory}. If the
96      * factory has not been properly created yet (aka {@link #getFactory} has not been called), this
97      * will return null.
98      */
99     @Nullable
getAppContext()100     public static Context getAppContext() {
101         return sAppContext;
102     }
103 
getAssistGestureFeatureProvider()104     public abstract AssistGestureFeatureProvider getAssistGestureFeatureProvider();
105 
getSuggestionFeatureProvider(Context context)106     public abstract SuggestionFeatureProvider getSuggestionFeatureProvider(Context context);
107 
getSupportFeatureProvider(Context context)108     public abstract SupportFeatureProvider getSupportFeatureProvider(Context context);
109 
getMetricsFeatureProvider()110     public abstract MetricsFeatureProvider getMetricsFeatureProvider();
111 
getPowerUsageFeatureProvider(Context context)112     public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider(Context context);
113 
114     /**
115      * Retrieves implementation for Battery Status feature.
116      */
getBatteryStatusFeatureProvider( Context context)117     public abstract BatteryStatusFeatureProvider getBatteryStatusFeatureProvider(
118             Context context);
119 
120     /**
121      * Gets implementation for Battery Settings provider.
122      */
getBatterySettingsFeatureProvider( Context context)123     public abstract BatterySettingsFeatureProvider getBatterySettingsFeatureProvider(
124             Context context);
125 
getDashboardFeatureProvider(Context context)126     public abstract DashboardFeatureProvider getDashboardFeatureProvider(Context context);
127 
getDockUpdaterFeatureProvider()128     public abstract DockUpdaterFeatureProvider getDockUpdaterFeatureProvider();
129 
getApplicationFeatureProvider(Context context)130     public abstract ApplicationFeatureProvider getApplicationFeatureProvider(Context context);
131 
getLocaleFeatureProvider()132     public abstract LocaleFeatureProvider getLocaleFeatureProvider();
133 
getEnterprisePrivacyFeatureProvider( Context context)134     public abstract EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(
135             Context context);
136 
getSearchFeatureProvider()137     public abstract SearchFeatureProvider getSearchFeatureProvider();
138 
getSurveyFeatureProvider(Context context)139     public abstract SurveyFeatureProvider getSurveyFeatureProvider(Context context);
140 
getSecurityFeatureProvider()141     public abstract SecurityFeatureProvider getSecurityFeatureProvider();
142 
getUserFeatureProvider(Context context)143     public abstract UserFeatureProvider getUserFeatureProvider(Context context);
144 
getSlicesFeatureProvider()145     public abstract SlicesFeatureProvider getSlicesFeatureProvider();
146 
getAccountFeatureProvider()147     public abstract AccountFeatureProvider getAccountFeatureProvider();
148 
getPanelFeatureProvider()149     public abstract PanelFeatureProvider getPanelFeatureProvider();
150 
getContextualCardFeatureProvider(Context context)151     public abstract ContextualCardFeatureProvider getContextualCardFeatureProvider(Context context);
152 
getBluetoothFeatureProvider(Context context)153     public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
154 
getAwareFeatureProvider()155     public abstract AwareFeatureProvider getAwareFeatureProvider();
156 
getFaceFeatureProvider()157     public abstract FaceFeatureProvider getFaceFeatureProvider();
158 
159     /**
160      * Gets implementation for the WifiTrackerLib.
161      */
getWifiTrackerLibProvider()162     public abstract WifiTrackerLibProvider getWifiTrackerLibProvider();
163 
164     /**
165      * Retrieves implementation for Extra App Info feature.
166      */
getExtraAppInfoFeatureProvider()167     public abstract ExtraAppInfoFeatureProvider getExtraAppInfoFeatureProvider();
168 
169     /**
170      * Retrieves implementation for SecuritySettings feature.
171      */
getSecuritySettingsFeatureProvider()172     public abstract SecuritySettingsFeatureProvider getSecuritySettingsFeatureProvider();
173 
174     /**
175      * Retrieves implementation for Game Settings feature.
176      */
getGameSettingsFeatureProvider()177     public abstract GameSettingsFeatureProvider getGameSettingsFeatureProvider();
178 
179     /**
180      * Retrieves implementation for Accessibility search index feature.
181      */
getAccessibilitySearchFeatureProvider()182     public abstract AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider();
183 
184     /**
185      * Retrieves implementation for Accessibility metrics category feature.
186      */
getAccessibilityMetricsFeatureProvider()187     public abstract AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider();
188 
189     public static final class FactoryNotFoundException extends RuntimeException {
FactoryNotFoundException(Throwable throwable)190         public FactoryNotFoundException(Throwable throwable) {
191             super("Unable to create factory. Did you misconfigure Proguard?", throwable);
192         }
193     }
194 }
195