11d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk/*
21d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * Copyright (C) 2017 The Android Open Source Project
31d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk *
41d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
51d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * except in compliance with the License. You may obtain a copy of the License at
61d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk *
71d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
81d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk *
91d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
101d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
111d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * KIND, either express or implied. See the License for the specific language governing
121d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * permissions and limitations under the License.
131d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk */
141d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
151d9632df97bdd4879cff0328a46a8fab6fde441aJason Monkpackage com.android.systemui.statusbar.policy;
161d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
170b80c4e518110ba385a1b83d1e29325f164dc90dJason Monkimport android.content.Context;
181d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
191d9632df97bdd4879cff0328a46a8fab6fde441aJason Monkimport java.util.Map;
201d9632df97bdd4879cff0328a46a8fab6fde441aJason Monkimport java.util.function.Consumer;
211d9632df97bdd4879cff0328a46a8fab6fde441aJason Monkimport java.util.function.Supplier;
221d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
231d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk/**
241d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * Utility class used to select between a plugin, tuner settings, and a default implementation
251d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk * of an interface.
261d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk */
271d9632df97bdd4879cff0328a46a8fab6fde441aJason Monkpublic interface ExtensionController {
281d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
291d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    <T> ExtensionBuilder<T> newExtension(Class<T> cls);
301d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
311d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    interface Extension<T> {
321d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        T get();
330b80c4e518110ba385a1b83d1e29325f164dc90dJason Monk        Context getContext();
341d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        void destroy();
350b80c4e518110ba385a1b83d1e29325f164dc90dJason Monk        void addCallback(Consumer<T> callback);
36a29528979cdd6a885869b7651f3b0f93f75843bbJason Monk        /**
37a29528979cdd6a885869b7651f3b0f93f75843bbJason Monk         * Triggers the extension to cycle through each of the sources again because something
38a29528979cdd6a885869b7651f3b0f93f75843bbJason Monk         * (like configuration) may have changed.
39a29528979cdd6a885869b7651f3b0f93f75843bbJason Monk         */
40a29528979cdd6a885869b7651f3b0f93f75843bbJason Monk        T reload();
413b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
423b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        /**
433b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk         * Null out the cached item for the purpose of memory saving, should only be done
443b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk         * when any other references are already gotten.
453b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk         * @param isDestroyed
463b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk         */
473b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        void clearItem(boolean isDestroyed);
481d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    }
491d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
501d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    interface ExtensionBuilder<T> {
511d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        ExtensionBuilder<T> withTunerFactory(TunerFactory<T> factory);
521d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls);
531d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls, String action);
541d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        <P> ExtensionBuilder<T> withPlugin(Class<P> cls, String action,
551d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk                PluginConverter<T, P> converter);
561d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        ExtensionBuilder<T> withDefault(Supplier<T> def);
571d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        ExtensionBuilder<T> withCallback(Consumer<T> callback);
580b80c4e518110ba385a1b83d1e29325f164dc90dJason Monk        ExtensionBuilder<T> withUiMode(int mode, Supplier<T> def);
59bac4b7d1b1f3b2b43136914c6f86702eb24d956fLujiang Xue        ExtensionBuilder<T> withFeature(String feature, Supplier<T> def);
601d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        Extension build();
611d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    }
621d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
631d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    public interface PluginConverter<T, P> {
641d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        T getInterfaceFromPlugin(P plugin);
651d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    }
661d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk
671d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    public interface TunerFactory<T> {
681d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        String[] keys();
691d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk        T create(Map<String, String> settings);
701d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk    }
711d9632df97bdd4879cff0328a46a8fab6fde441aJason Monk}
72