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