Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d577200 authored by Jason Monk's avatar Jason Monk
Browse files

Switch QS tile creation to use injection

This will make it easy to remove dependency usages from tiles.

Test: existing tests
Change-Id: I943f3098c4e7cf2feaa6ebe190f3ddec557c3850
parent 978ce92a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.power.PowerNotificationWarnings;
import com.android.systemui.power.PowerUI;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl;
import com.android.systemui.statusbar.phone.ManagedProfileController;
@@ -224,4 +226,9 @@ public abstract class DependencyBinder {
     */
    @Binds
    public abstract PowerUI.WarningsUI provideWarningsUi(PowerNotificationWarnings controllerImpl);

    /**
     */
    @Binds
    public abstract QSHost provideQsHost(QSTileHost controllerImpl);
}
+0 −7
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import com.android.systemui.fragments.FragmentService;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.power.EnhancedEstimates;
import com.android.systemui.power.EnhancedEstimatesImpl;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
@@ -52,7 +51,6 @@ import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ScrimState;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.util.InjectionInflationController;
@@ -145,11 +143,6 @@ public class SystemUIFactory {
        return new KeyguardIndicationController(context, indicationArea, lockIcon);
    }

    public QSTileHost createQSTileHost(Context context, StatusBar statusBar,
            StatusBarIconController iconController) {
        return new QSTileHost(context, statusBar, iconController);
    }

    public VolumeDialogComponent createVolumeDialogComponent(SystemUI systemUi, Context context) {
        return new VolumeDialogComponent(systemUi, context);
    }
+5 −1
Original line number Diff line number Diff line
@@ -79,15 +79,18 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
    private final InjectionInflationController mInjectionInflater;
    private final QSTileHost mHost;

    @Inject
    public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
            InjectionInflationController injectionInflater,
            Context context) {
            Context context,
            QSTileHost qsTileHost) {
        mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
        mInjectionInflater = injectionInflater;
        SysUiServiceProvider.getComponent(context, CommandQueue.class)
                .observe(getLifecycle(), this);
        mHost = qsTileHost;
    }

    @Override
@@ -122,6 +125,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
                mQSPanel.getTileLayout().restoreInstanceState(savedInstanceState);
            }
        }
        setHost(mHost);
    }

    @Override
+29 −6
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.util.Log;

import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSTile;
@@ -52,7 +53,12 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Predicate;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

/** Platform implementation of the quick settings tile host **/
@Singleton
public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory> {
    private static final String TAG = "QSTileHost";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -60,7 +66,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory> {
    public static final String TILES_SETTING = Secure.QS_TILES;

    private final Context mContext;
    private final StatusBar mStatusBar;
    private final LinkedHashMap<String, QSTile> mTiles = new LinkedHashMap<>();
    protected final ArrayList<String> mTileSpecs = new ArrayList<>();
    private final TileServices mServices;
@@ -70,19 +75,28 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory> {
    private final StatusBarIconController mIconController;
    private final ArrayList<QSFactory> mQsFactories = new ArrayList<>();
    private int mCurrentUser;
    private StatusBar mStatusBar;

    public QSTileHost(Context context, StatusBar statusBar,
            StatusBarIconController iconController) {
    @Inject
    public QSTileHost(Context context,
            StatusBarIconController iconController,
            QSFactoryImpl defaultFactory,
            @Named(Dependency.MAIN_HANDLER_NAME) Handler mainHandler) {
        mIconController = iconController;
        mContext = context;
        mStatusBar = statusBar;

        mServices = new TileServices(this, Dependency.get(Dependency.BG_LOOPER));

        mQsFactories.add(new QSFactoryImpl(this));
        defaultFactory.setHost(this);
        mQsFactories.add(defaultFactory);
        Dependency.get(PluginManager.class).addPluginListener(this, QSFactory.class, true);

        mainHandler.post(() -> {
            // This is technically a hack to avoid circular dependency of
            // QSTileHost -> XXXTile -> QSTileHost. Posting ensures creation
            // finishes before creating any tiles.
            Dependency.get(TunerService.class).addTunable(this, TILES_SETTING);
        });
        // AutoTileManager can modify mTiles so make sure mTiles has already been initialized.
        mAutoTiles = new AutoTileManager(context, this);
    }
@@ -140,16 +154,25 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory> {

    @Override
    public void collapsePanels() {
        if (mStatusBar == null) {
            mStatusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
        }
        mStatusBar.postAnimateCollapsePanels();
    }

    @Override
    public void forceCollapsePanels() {
        if (mStatusBar == null) {
            mStatusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
        }
        mStatusBar.postAnimateForceCollapsePanels();
    }

    @Override
    public void openPanels() {
        if (mStatusBar == null) {
            mStatusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
        }
        mStatusBar.postAnimateOpenPanels();
    }

+88 −21
Original line number Diff line number Diff line
@@ -47,12 +47,79 @@ import com.android.systemui.qs.tiles.WifiTile;
import com.android.systemui.qs.tiles.WorkModeTile;
import com.android.systemui.util.leak.GarbageMonitor;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;

@Singleton
public class QSFactoryImpl implements QSFactory {

    private static final String TAG = "QSFactory";
    private final QSTileHost mHost;

    public QSFactoryImpl(QSTileHost host) {
    private final Provider<WifiTile> mWifiTileProvider;
    private final Provider<BluetoothTile> mBluetoothTileProvider;
    private final Provider<CellularTile> mCellularTileProvider;
    private final Provider<DndTile> mDndTileProvider;
    private final Provider<ColorInversionTile> mColorInversionTileProvider;
    private final Provider<AirplaneModeTile> mAirplaneModeTileProvider;
    private final Provider<WorkModeTile> mWorkModeTileProvider;
    private final Provider<RotationLockTile> mRotationLockTileProvider;
    private final Provider<FlashlightTile> mFlashlightTileProvider;
    private final Provider<LocationTile> mLocationTileProvider;
    private final Provider<CastTile> mCastTileProvider;
    private final Provider<HotspotTile> mHotspotTileProvider;
    private final Provider<UserTile> mUserTileProvider;
    private final Provider<BatterySaverTile> mBatterySaverTileProvider;
    private final Provider<DataSaverTile> mDataSaverTileProvider;
    private final Provider<NightDisplayTile> mNightDisplayTileProvider;
    private final Provider<NfcTile> mNfcTileProvider;
    private final Provider<SensorPrivacyTile> mSensorPrivacyTileProvider;
    private final Provider<GarbageMonitor.MemoryTile> mMemoryTileProvider;

    private QSTileHost mHost;

    @Inject
    public QSFactoryImpl(Provider<WifiTile> wifiTileProvider,
            Provider<BluetoothTile> bluetoothTileProvider,
            Provider<CellularTile> cellularTileProvider,
            Provider<DndTile> dndTileProvider,
            Provider<ColorInversionTile> colorInversionTileProvider,
            Provider<AirplaneModeTile> airplaneModeTileProvider,
            Provider<WorkModeTile> workModeTileProvider,
            Provider<RotationLockTile> rotationLockTileProvider,
            Provider<FlashlightTile> flashlightTileProvider,
            Provider<LocationTile> locationTileProvider,
            Provider<CastTile> castTileProvider,
            Provider<HotspotTile> hotspotTileProvider,
            Provider<UserTile> userTileProvider,
            Provider<BatterySaverTile> batterySaverTileProvider,
            Provider<DataSaverTile> dataSaverTileProvider,
            Provider<NightDisplayTile> nightDisplayTileProvider,
            Provider<NfcTile> nfcTileProvider,
            Provider<SensorPrivacyTile> sensorPrivacyTileProvider,
            Provider<GarbageMonitor.MemoryTile> memoryTileProvider) {
        mWifiTileProvider = wifiTileProvider;
        mBluetoothTileProvider = bluetoothTileProvider;
        mCellularTileProvider = cellularTileProvider;
        mDndTileProvider = dndTileProvider;
        mColorInversionTileProvider = colorInversionTileProvider;
        mAirplaneModeTileProvider = airplaneModeTileProvider;
        mWorkModeTileProvider = workModeTileProvider;
        mRotationLockTileProvider = rotationLockTileProvider;
        mFlashlightTileProvider = flashlightTileProvider;
        mLocationTileProvider = locationTileProvider;
        mCastTileProvider = castTileProvider;
        mHotspotTileProvider = hotspotTileProvider;
        mUserTileProvider = userTileProvider;
        mBatterySaverTileProvider = batterySaverTileProvider;
        mDataSaverTileProvider = dataSaverTileProvider;
        mNightDisplayTileProvider = nightDisplayTileProvider;
        mNfcTileProvider = nfcTileProvider;
        mSensorPrivacyTileProvider = sensorPrivacyTileProvider;
        mMemoryTileProvider = memoryTileProvider;
    }

    public void setHost(QSTileHost host) {
        mHost = host;
    }

@@ -68,41 +135,41 @@ public class QSFactoryImpl implements QSFactory {
        // Stock tiles.
        switch (tileSpec) {
            case "wifi":
                return new WifiTile(mHost);
                return mWifiTileProvider.get();
            case "bt":
                return new BluetoothTile(mHost);
                return mBluetoothTileProvider.get();
            case "cell":
                return new CellularTile(mHost);
                return mCellularTileProvider.get();
            case "dnd":
                return new DndTile(mHost);
                return mDndTileProvider.get();
            case "inversion":
                return new ColorInversionTile(mHost);
                return mColorInversionTileProvider.get();
            case "airplane":
                return new AirplaneModeTile(mHost);
                return mAirplaneModeTileProvider.get();
            case "work":
                return new WorkModeTile(mHost);
                return mWorkModeTileProvider.get();
            case "rotation":
                return new RotationLockTile(mHost);
                return mRotationLockTileProvider.get();
            case "flashlight":
                return new FlashlightTile(mHost);
                return mFlashlightTileProvider.get();
            case "location":
                return new LocationTile(mHost);
                return mLocationTileProvider.get();
            case "cast":
                return new CastTile(mHost);
                return mCastTileProvider.get();
            case "hotspot":
                return new HotspotTile(mHost);
                return mHotspotTileProvider.get();
            case "user":
                return new UserTile(mHost);
                return mUserTileProvider.get();
            case "battery":
                return new BatterySaverTile(mHost);
                return mBatterySaverTileProvider.get();
            case "saver":
                return new DataSaverTile(mHost);
                return mDataSaverTileProvider.get();
            case "night":
                return new NightDisplayTile(mHost);
                return mNightDisplayTileProvider.get();
            case "nfc":
                return new NfcTile(mHost);
                return mNfcTileProvider.get();
            case "sensorprivacy":
                return new SensorPrivacyTile(mHost);
                return mSensorPrivacyTileProvider.get();
        }

        // Intent tiles.
@@ -112,7 +179,7 @@ public class QSFactoryImpl implements QSFactory {
        // Debug tiles.
        if (Build.IS_DEBUGGABLE) {
            if (tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC)) {
                return new GarbageMonitor.MemoryTile(mHost);
                return mMemoryTileProvider.get();
            }
        }

Loading