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