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