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}