17c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala/*
27c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Copyright (C) 2014 The Android Open Source Project
37c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
47c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
57c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * you may not use this file except in compliance with the License.
67c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * You may obtain a copy of the License at
77c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
87c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
97c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * See the License for the specific language governing permissions and
147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * limitations under the License.
157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala */
167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalapackage com.android.testingcamera2;
187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.ArrayList;
207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.HashSet;
217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.List;
227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.Set;
237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.os.Handler;
257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.os.Looper;
267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
277c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala/**
287c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Tracks currently-available panes of various kinds, for other panes to find targets/etc.
297c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
307c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala */
317c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalapublic class PaneTracker {
327c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
337c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private Set<ControlPane> mActivePanes = new HashSet<ControlPane>();
347c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private Set<PaneSetChangedListener<?>> mActiveListeners = new HashSet<PaneSetChangedListener<?>>();
357c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
367c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /**
377c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * Various events panes might alert other panes about
387c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     */
397c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public enum PaneEvent {
407c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        NEW_CAMERA_SELECTED,
417c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        CAMERA_CONFIGURED
427c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
437c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
447c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public PaneTracker() {
457c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
467c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
477c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void addPane(ControlPane pane) {
487c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        boolean added = mActivePanes.add(pane);
497c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (!added) return;
507c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        for (PaneSetChangedListener<?> listener : mActiveListeners) {
517c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (listener.getFilterType().isInstance(pane)) {
527c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                listener.onPaneAdded(pane);
537c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
547c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
557c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
567c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
577c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void removePane(ControlPane pane) {
587c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        boolean existed = mActivePanes.remove(pane);
597c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (!existed) return;
607c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        for (PaneSetChangedListener<?> listener : mActiveListeners) {
617c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (listener.getFilterType().isInstance(pane)) {
627c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                listener.onPaneRemoved(pane);
637c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
647c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
657c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
667c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
677c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public <T extends ControlPane> List<T> getPanes(Class<T> paneClass) {
687c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        List<T> filteredPanes = new ArrayList<T>();
697c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        for (ControlPane pane : mActivePanes ) {
707c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (paneClass.isInstance(pane)) {
717c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                filteredPanes.add(paneClass.cast(pane));
727c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
737c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
747c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        return filteredPanes;
757c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
767c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
777c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void notifyOtherPanes(final ControlPane sourcePane, final PaneEvent event) {
787c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        Handler mainHandler = new Handler(Looper.getMainLooper());
797c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mainHandler.post(new Runnable() {
807c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            public void run() {
817c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                for (ControlPane pane: mActivePanes ) {
827c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    pane.notifyPaneEvent(sourcePane, event);
837c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                }
847c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
857c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        });
867c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
877c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
880b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala    /**
890b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala     * Notify all panes that the UI orientation has changed
900b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala     *
910b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala     * @param orientation one of the Surface.ROTATION_* constants
920b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala     */
930b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala    public void notifyOrientationChange(int orientation) {
940b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala        for (ControlPane pane: mActivePanes ) {
950b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala            pane.onOrientationChange(orientation);
960b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala        }
970b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala    }
980b631a014c90c9053a8e17be141351abab66d30eEino-Ville Talvala
997c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void addPaneListener(PaneSetChangedListener<?> listener) {
1007c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mActiveListeners.add(listener);
1017c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1027c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1037c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void removePaneListener(PaneSetChangedListener<?> listener) {
1047c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mActiveListeners.remove(listener);
1057c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1067c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1077c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /**
1087c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * Interface for clients to listen to additions and removals of panes
1097c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * of specific types.
1107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     */
1117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public static abstract class PaneSetChangedListener<T extends ControlPane> {
1127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        private Class<T> mFilterType;
1137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public PaneSetChangedListener(Class<T> filterType) {
1157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mFilterType = filterType;
1167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public Class<T> getFilterType() {
1197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            return mFilterType;
1207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public abstract void onPaneAdded(ControlPane pane);
1237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public abstract void onPaneRemoved(ControlPane pane);
1247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala}
127