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

Commit 4de0b2c9 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Change CoreStartable @Dependencies to Injected Map

Using it as an annotation wasn't working - the compiler was stripping
it away for unknown reasons.

Replace it with a injected Map<Class, Set<Class>> where each
startable can simply provide a set of the other startables it cares
about.

One advantage of this is that the dependencies can not be provided
in the same module where the startable is bound. This means that
different impls of a given startable can list different dependencies.
Before, the dependencies were tied to the key, which could be an
interface shared across multiple different impls.

The reason this was done this way instead of a method on
CoreStartable is because we want to be able to get the list of
dependencies before constructing the startable - many of our
classes do work in the constructor. We could have tried to
reflectively call a static method on the key, but this would look like
an ugly hack; it would also prevent the advantage of specifying the
dependencies on a per-impl basis.

Bug: 333758389
Flag: NA
Test: locally run
Change-Id: If729483c4661428d4a1041f84f39cdc50f6f5645
parent 24caa927
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -33,12 +33,23 @@ import java.io.PrintWriter;
 *  abstract fun bind(impl: FoobarStartable): CoreStartable
 *  </pre>
 *
 * If your CoreStartable depends on different CoreStartables starting before it, use a
 * {@link com.android.systemui.startable.Dependencies} annotation to list out those dependencies.
 * If your CoreStartable depends on different CoreStartables starting before it, you can specify
 * another map binding listing out its dependencies:
 *  <pre>
 *  &#64;Provides
 *  &#64;IntoMap
 *  &#64;Dependencies  // Important! com.android.systemui.startable.Dependencies.
 *  &#64;ClassKey(FoobarStartable::class)
 *  fun providesDeps(): Set&lt;Class&lt;out CoreStartable&gt;&gt; {
 *      return setOf(OtherStartable::class.java)
 *  }
 *  </pre>
 *
 *
 * @see SystemUIApplication#startSystemUserServicesIfNeeded()
 */
public interface CoreStartable extends Dumpable {
    String STARTABLE_DEPENDENCIES = "startable_dependencies";

    /** Main entry point for implementations. Called shortly after SysUI startup. */
    void start();
+9 −10
Original line number Diff line number Diff line
@@ -44,16 +44,15 @@ import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.res.R;
import com.android.systemui.startable.Dependencies;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.util.NotificationChannels;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
import java.util.TreeMap;

@@ -299,9 +298,9 @@ public class SystemUIApplication extends Application implements
                Map.Entry<Class<?>, Provider<CoreStartable>> entry = queue.removeFirst();

                Class<?> cls = entry.getKey();
                Dependencies dep = cls.getAnnotation(Dependencies.class);
                Class<?>[] deps = (dep == null ? null : dep.value());
                if (deps == null || startedStartables.containsAll(Arrays.asList(deps))) {
                Set<Class<? extends CoreStartable>> deps =
                        mSysUIComponent.getStartableDependencies().get(cls);
                if (deps == null || startedStartables.containsAll(deps)) {
                    String clsName = cls.getName();
                    int i = serviceIndex;  // Copied to make lambda happy.
                    timeInitialization(
@@ -323,12 +322,12 @@ public class SystemUIApplication extends Application implements
            while (!nextQueue.isEmpty()) {
                Map.Entry<Class<?>, Provider<CoreStartable>> entry = nextQueue.removeFirst();
                Class<?> cls = entry.getKey();
                Dependencies dep = cls.getAnnotation(Dependencies.class);
                Class<?>[] deps = (dep == null ? null : dep.value());
                Set<Class<? extends CoreStartable>> deps =
                        mSysUIComponent.getStartableDependencies().get(cls);
                StringJoiner stringJoiner = new StringJoiner(", ");
                for (int i = 0; deps != null && i < deps.length; i++) {
                    if (!startedStartables.contains(deps[i])) {
                        stringJoiner.add(deps[i].getName());
                for (Class<? extends CoreStartable> c : deps) {
                    if (!startedStartables.contains(c)) {
                        stringJoiner.add(c.getName());
                    }
                }
                Log.e(TAG, "Failed to start " + cls.getName()
+7 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.systemui.dagger.qualifiers.PerUser;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.people.PeopleProvider;
import com.android.systemui.startable.Dependencies;
import com.android.systemui.statusbar.NotificationInsetsModule;
import com.android.systemui.statusbar.QsFrameTranslateModule;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -47,6 +48,7 @@ import dagger.Subcomponent;

import java.util.Map;
import java.util.Optional;
import java.util.Set;

import javax.inject.Provider;

@@ -159,6 +161,11 @@ public interface SysUIComponent {
     */
    @PerUser Map<Class<?>, Provider<CoreStartable>> getPerUserStartables();

    /**
     * Returns {@link CoreStartable} dependencies if there are any.
     */
    @Dependencies Map<Class<?>, Set<Class<? extends CoreStartable>>> getStartableDependencies();

    /**
     * Member injection into the supplied argument.
     */
+3 −5
Original line number Diff line number Diff line
@@ -16,7 +16,8 @@
package com.android.systemui.startable

import com.android.systemui.CoreStartable
import kotlin.reflect.KClass
import java.lang.annotation.Documented
import javax.inject.Qualifier

/**
 * Allows a [CoreStartable] to declare that it must be started after its dependencies.
@@ -24,7 +25,4 @@ import kotlin.reflect.KClass
 * This creates a partial, topological ordering. See [com.android.systemui.SystemUIApplication] for
 * how this ordering is enforced at runtime.
 */
@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Dependencies(vararg val value: KClass<*> = [])
@Qualifier @Documented @Retention(AnnotationRetention.RUNTIME) annotation class Dependencies()
+0 −2
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.view.View;

import com.android.systemui.CoreStartable;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.startable.Dependencies;
import com.android.systemui.statusbar.phone.CentralSurfaces;

import java.lang.annotation.Retention;
@@ -31,7 +30,6 @@ import java.lang.annotation.Retention;
/**
 * Sends updates to {@link StateListener}s about changes to the status bar state and dozing state
 */
@Dependencies(CentralSurfaces.class)
public interface SysuiStatusBarStateController extends StatusBarStateController, CoreStartable {

    // TODO: b/115739177 (remove this explicit ordering if we can)
Loading