blob: 837dd9cf039ebbc44e950a56d1f96748e9f92ab7 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.car;
/**
* CarAppContextManager allows applications to set and listen for the current application context
* like active navigation or active voice command. Usually only one instance of such application
* should run in the system, and other app setting the flag for the matching app should
* lead into other app to stop.
* @hide
*/
public abstract class CarAppContextManager implements CarManagerBase {
/**
* Listener to get notification for app getting information on app context change.
*/
public interface AppContextChangeListener {
/**
* Application context has changed. Note that {@link CarAppContextManager} instance
* causing the change will not get this notification.
* @param activeContexts
*/
void onAppContextChange(int activeContexts);
}
/**
* Listener to get notification for app getting information on app context ownership loss.
*/
public interface AppContextOwnershipChangeListener {
/**
* Lost ownership for the context, which happens when other app has set the context.
* The app losing context should stop the action associated with the context.
* For example, navigaiton app currently running active navigation should stop navigation
* upon getting this for {@link CarAppContextManager#APP_CONTEXT_NAVIGATION}.
* @param context
*/
void onAppContextOwnershipLoss(int context);
}
/** @hide */
public static final int APP_CONTEXT_START_FLAG = 0x1;
/**
* Flag for active navigation.
*/
public static final int APP_CONTEXT_NAVIGATION = 0x1;
/**
* Flag for active voice command.
*/
public static final int APP_CONTEXT_VOICE_COMMAND = 0x2;
/**
* Update this after adding a new flag.
* @hide
*/
public static final int APP_CONTEXT_END_FLAG = 0x2;
/**
* Register listener to monitor app context change. Only one listener can be registered and
* registering multiple times will lead into only the last listener to be active.
* @param listener
* @param contextFilter Flags of contexts to get notification.
* @throws CarNotConnectedException
*/
public abstract void registerContextListener(AppContextChangeListener listener,
int contextFilter) throws CarNotConnectedException;
/**
* Unregister listener and stop listening context change events. If app has owned a context
* by {@link #setActiveContext(int)}, it will be reset to inactive state.
* @throws CarNotConnectedException
*/
public abstract void unregisterContextListener() throws CarNotConnectedException;
/**
* Retrieve currently active contexts.
* @return
* @throws CarNotConnectedException
*/
public abstract int getActiveAppContexts() throws CarNotConnectedException;
/**
* Check if the current process is owning the given context.
* @param context
* @return
* @throws CarNotConnectedException
*/
public abstract boolean isOwningContext(int context) throws CarNotConnectedException;
/**
* Set the given contexts as active. By setting this, the application is becoming owner
* of the context, and will get {@link AppContextChangeListener#onAppContextOwnershipLoss(int)}
* if ownership is given to other app by calling this. Fore-ground app will have higher priority
* and other app cannot set the same context while owner is in fore-ground.
* Before calling this, {@link #registerContextListener(AppContextChangeListener, int)} should
* be called first. Otherwise, it will throw IllegalStateException
* @param contexts
* @throws IllegalStateException If listener was not registered.
* @throws SecurityException If owner cannot be changed.
* @throws CarNotConnectedException
*/
public abstract void setActiveContexts(AppContextOwnershipChangeListener ownershipListener,
int contexts) throws IllegalStateException, SecurityException, CarNotConnectedException;
/**
* Reset the given contexts, i.e. mark them as inactive. This also involves releasing ownership
* for the context.
* @param contexts
* @throws CarNotConnectedException
*/
public abstract void resetActiveContexts(int contexts) throws CarNotConnectedException;
}