1c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling/* 2c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Copyright (C) 2014 The Android Open Source Project 3c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 4c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 5c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * you may not use this file except in compliance with the License. 6c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * You may obtain a copy of the License at 7c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 8c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 9c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 10c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Unless required by applicable law or agreed to in writing, software 11c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 12c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * See the License for the specific language governing permissions and 14c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * limitations under the License. 15c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 16c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 17c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberlingpackage com.android.camera.ui; 18c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 19c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberlingimport android.view.LayoutInflater; 20c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberlingimport android.view.View; 21c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberlingimport android.view.ViewGroup; 22c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 231e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberlingimport com.android.camera2.R; 241e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling 25c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling/** 26c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Abstract class that is the foundation for a tutorial overlay modules can show 27c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * to explain their functionality. 28c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 29c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberlingpublic abstract class AbstractTutorialOverlay { 30c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 31c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Use this interface to get informed when the tutorial was closed. 32c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 33c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling public interface CloseListener { 34c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 35c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Called when the tutorial is being closed. 36c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 37c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling public void onTutorialClosed(); 38c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 39c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 40c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling private final int mLayoutResId; 41c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling protected final CloseListener mCloseListener; 421e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling private ViewGroup mPlaceholderWrapper; 43c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 44c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 45c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Create a new overlay. 46c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 47c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * @param layoutResId the resource ID of the tutorial layout. 48c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * @param inflater The inflater used to inflate the tutorial view. 49c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * @param closeListener Called when the user has seen the whole tutorial and 50c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * closed it. 51c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 52c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling public AbstractTutorialOverlay(int layoutResId, CloseListener closeListener) { 53c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling mLayoutResId = layoutResId; 54c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling mCloseListener = closeListener; 55c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 56c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 57c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 58c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Shows the tutorial on the screen. 59c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 601e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling * @param placeHolderWrapper the view group in which the tutorial will be 611e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling * embedded. 62c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 631e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling public final void show(ViewGroup placeHolderWrapper, LayoutInflater inflater) { 641e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling mPlaceholderWrapper = placeHolderWrapper; 658ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling if (mPlaceholderWrapper != null) { 668ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling mPlaceholderWrapper.removeAllViews(); 678ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling } 688ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling 69de7633bbcfb08865175126713d97132086bff340Sascha Haeberling mPlaceholderWrapper.setVisibility(View.VISIBLE); 701e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling ViewGroup placeHolder = (ViewGroup) inflater.inflate(R.layout.tutorials_placeholder, 711e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling mPlaceholderWrapper).findViewById(R.id.tutorials_placeholder); 721e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling onInflated(inflater.inflate(mLayoutResId, placeHolder)); 73c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 74c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 75c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 76c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Called when the view was inflated. 77c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * 78c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * @param view the inflated tutorial view. 79c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 80c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling protected abstract void onInflated(View view); 81c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 82c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 838ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling * Removes all views from the place holder wrapper (including the place 848ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling * holder itself) and sets the visibility of the wrapper to GONE, so that it 858ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling * doesn't catch any touch events. 86c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 878ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling public void removeOverlayAndHideWrapper() { 881e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling if (mPlaceholderWrapper != null) { 891e0810c88e791d0f658eb5a6f95d771ee03a7631Sascha Haeberling mPlaceholderWrapper.removeAllViews(); 90c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 918ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling mPlaceholderWrapper.setVisibility(View.GONE); 92c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 93c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling 94c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling /** 95c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling * Removes the UI and calls the close listener. 96c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling */ 97de7633bbcfb08865175126713d97132086bff340Sascha Haeberling public void close() { 988ec052bad062927e767e24010db22aa55fdfb5ffSascha Haeberling removeOverlayAndHideWrapper(); 99c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling if (mCloseListener != null) { 100c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling mCloseListener.onTutorialClosed(); 101c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 102c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling } 103c813ce181810a444b6fea4a399e6685aef4103e2Sascha Haeberling} 104