12bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout/*
22bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * Copyright (C) 2016 The Android Open Source Project
32bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout *
42bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * Licensed under the Apache License, Version 2.0 (the "License");
52bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * you may not use this file except in compliance with the License.
62bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * You may obtain a copy of the License at
72bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout *
82bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout *      http://www.apache.org/licenses/LICENSE-2.0
92bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout *
102bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * Unless required by applicable law or agreed to in writing, software
112bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * distributed under the License is distributed on an "AS IS" BASIS,
122bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * See the License for the specific language governing permissions and
142bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout * limitations under the License.
152bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout */
162bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
172bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stoutpackage com.android.deskclock.controller;
182bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
19bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieuximport android.app.Activity;
202bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stoutimport android.content.Context;
21541022fcda760343fd5aef758a5c292485476a6dJames Lemieuximport android.support.annotation.StringRes;
222bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
232bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stoutimport com.android.deskclock.Utils;
24541022fcda760343fd5aef758a5c292485476a6dJames Lemieuximport com.android.deskclock.events.EventTracker;
252bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
26bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieuximport static com.android.deskclock.Utils.enforceMainLooper;
27bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
28bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux/**
29bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux * Interactions with Android framework components responsible for part of the user experience are
30bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux * handled via this singleton.
31bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux */
3284dc3cd5823e75ba4e422b1f72b03c5cca9a2fc7James Lemieuxpublic final class Controller {
332bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
342bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    private static final Controller sController = new Controller();
352bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
362bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    private Context mContext;
372bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
38541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    /** The controller that dispatches app events to event trackers. */
39541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    private EventController mEventController;
40541022fcda760343fd5aef758a5c292485476a6dJames Lemieux
41bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    /** The controller that interacts with voice interaction sessions on M+. */
42bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    private VoiceController mVoiceController;
43bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
44bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    /** The controller that creates and updates launcher shortcuts on N MR1+ */
452bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    private ShortcutController mShortcutController;
462bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
472bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    private Controller() {}
482bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
492bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    public static Controller getController() {
502bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout        return sController;
512bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    }
522bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
532bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    public void setContext(Context context) {
54310f96ed002219067d2e652e27d64d256e315832James Lemieux        if (mContext != context) {
55310f96ed002219067d2e652e27d64d256e315832James Lemieux            mContext = context.getApplicationContext();
56541022fcda760343fd5aef758a5c292485476a6dJames Lemieux            mEventController = new EventController();
5784dc3cd5823e75ba4e422b1f72b03c5cca9a2fc7James Lemieux            mVoiceController = new VoiceController();
58310f96ed002219067d2e652e27d64d256e315832James Lemieux            if (Utils.isNMR1OrLater()) {
59310f96ed002219067d2e652e27d64d256e315832James Lemieux                mShortcutController = new ShortcutController(mContext);
60310f96ed002219067d2e652e27d64d256e315832James Lemieux            }
612bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout        }
622bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    }
632bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout
64bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    //
65541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    // Event Tracking
66541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    //
67541022fcda760343fd5aef758a5c292485476a6dJames Lemieux
68541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    /**
69541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * @param eventTracker to be registered for tracking application events
70541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     */
71541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    public void addEventTracker(EventTracker eventTracker) {
72541022fcda760343fd5aef758a5c292485476a6dJames Lemieux        enforceMainLooper();
73541022fcda760343fd5aef758a5c292485476a6dJames Lemieux        mEventController.addEventTracker(eventTracker);
74541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    }
75541022fcda760343fd5aef758a5c292485476a6dJames Lemieux
76541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    /**
77541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * @param eventTracker to be unregistered from tracking application events
78541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     */
79541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    public void removeEventTracker(EventTracker eventTracker) {
80541022fcda760343fd5aef758a5c292485476a6dJames Lemieux        enforceMainLooper();
81541022fcda760343fd5aef758a5c292485476a6dJames Lemieux        mEventController.removeEventTracker(eventTracker);
82541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    }
83541022fcda760343fd5aef758a5c292485476a6dJames Lemieux
84541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    /**
85541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * Tracks an event. Events have a category, action and label. This method can be used to track
86541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * events such as button presses or other user interactions with your application.
87541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     *
88541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * @param category resource id of event category
89541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * @param action resource id of event action
90541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     * @param label resource id of event label
91541022fcda760343fd5aef758a5c292485476a6dJames Lemieux     */
92541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    public void sendEvent(@StringRes int category, @StringRes int action, @StringRes int label) {
93541022fcda760343fd5aef758a5c292485476a6dJames Lemieux        mEventController.sendEvent(category, action, label);
94541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    }
95541022fcda760343fd5aef758a5c292485476a6dJames Lemieux
96541022fcda760343fd5aef758a5c292485476a6dJames Lemieux    //
97bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    // Voice Interaction
98bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    //
99bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
100bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    public void notifyVoiceSuccess(Activity activity, String message) {
10184dc3cd5823e75ba4e422b1f72b03c5cca9a2fc7James Lemieux        mVoiceController.notifyVoiceSuccess(activity, message);
102bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    }
103bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
104bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    public void notifyVoiceFailure(Activity activity, String message) {
10584dc3cd5823e75ba4e422b1f72b03c5cca9a2fc7James Lemieux        mVoiceController.notifyVoiceFailure(activity, message);
106bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    }
107bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
108bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    //
109bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    // Shortcuts
110bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux    //
111bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux
1122bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    public void updateShortcuts() {
113bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux        enforceMainLooper();
1142bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout        if (mShortcutController != null) {
1152bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout            mShortcutController.updateShortcuts();
1162bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout        }
1172bd7fb4d346a1a116f0f1a58f17722f2286cdcdcSean Stout    }
118bd250dfa5bdcd618c5dfd7f48b662cf4b51c31a2James Lemieux}