diff options
Diffstat (limited to 'android/sdl_android/src/main/java/com/smartdevicelink/managers')
18 files changed, 226 insertions, 861 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/ProxyBridge.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/ProxyBridge.java deleted file mode 100644 index 69180d255..000000000 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/ProxyBridge.java +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Copyright (c) 2019 Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -package com.smartdevicelink.managers; - -import android.util.SparseArray; - -import com.smartdevicelink.protocol.enums.FunctionID; -import com.smartdevicelink.proxy.IProxyListener; -import com.smartdevicelink.proxy.RPCMessage; -import com.smartdevicelink.proxy.callbacks.OnServiceEnded; -import com.smartdevicelink.proxy.callbacks.OnServiceNACKed; -import com.smartdevicelink.proxy.rpc.AddCommandResponse; -import com.smartdevicelink.proxy.rpc.AddSubMenuResponse; -import com.smartdevicelink.proxy.rpc.AlertManeuverResponse; -import com.smartdevicelink.proxy.rpc.AlertResponse; -import com.smartdevicelink.proxy.rpc.ButtonPressResponse; -import com.smartdevicelink.proxy.rpc.CancelInteractionResponse; -import com.smartdevicelink.proxy.rpc.ChangeRegistrationResponse; -import com.smartdevicelink.proxy.rpc.CloseApplicationResponse; -import com.smartdevicelink.proxy.rpc.CreateInteractionChoiceSetResponse; -import com.smartdevicelink.proxy.rpc.CreateWindowResponse; -import com.smartdevicelink.proxy.rpc.DeleteCommandResponse; -import com.smartdevicelink.proxy.rpc.DeleteFileResponse; -import com.smartdevicelink.proxy.rpc.DeleteInteractionChoiceSetResponse; -import com.smartdevicelink.proxy.rpc.DeleteSubMenuResponse; -import com.smartdevicelink.proxy.rpc.DeleteWindowResponse; -import com.smartdevicelink.proxy.rpc.DiagnosticMessageResponse; -import com.smartdevicelink.proxy.rpc.DialNumberResponse; -import com.smartdevicelink.proxy.rpc.EndAudioPassThruResponse; -import com.smartdevicelink.proxy.rpc.GenericResponse; -import com.smartdevicelink.proxy.rpc.GetAppServiceDataResponse; -import com.smartdevicelink.proxy.rpc.GetCloudAppPropertiesResponse; -import com.smartdevicelink.proxy.rpc.GetDTCsResponse; -import com.smartdevicelink.proxy.rpc.GetFileResponse; -import com.smartdevicelink.proxy.rpc.GetInteriorVehicleDataConsentResponse; -import com.smartdevicelink.proxy.rpc.GetInteriorVehicleDataResponse; -import com.smartdevicelink.proxy.rpc.GetSystemCapabilityResponse; -import com.smartdevicelink.proxy.rpc.GetVehicleDataResponse; -import com.smartdevicelink.proxy.rpc.GetWayPointsResponse; -import com.smartdevicelink.proxy.rpc.ListFilesResponse; -import com.smartdevicelink.proxy.rpc.OnAppInterfaceUnregistered; -import com.smartdevicelink.proxy.rpc.OnAppServiceData; -import com.smartdevicelink.proxy.rpc.OnAudioPassThru; -import com.smartdevicelink.proxy.rpc.OnButtonEvent; -import com.smartdevicelink.proxy.rpc.OnButtonPress; -import com.smartdevicelink.proxy.rpc.OnCommand; -import com.smartdevicelink.proxy.rpc.OnDriverDistraction; -import com.smartdevicelink.proxy.rpc.OnHMIStatus; -import com.smartdevicelink.proxy.rpc.OnHashChange; -import com.smartdevicelink.proxy.rpc.OnInteriorVehicleData; -import com.smartdevicelink.proxy.rpc.OnKeyboardInput; -import com.smartdevicelink.proxy.rpc.OnLanguageChange; -import com.smartdevicelink.proxy.rpc.OnPermissionsChange; -import com.smartdevicelink.proxy.rpc.OnRCStatus; -import com.smartdevicelink.proxy.rpc.OnSystemCapabilityUpdated; -import com.smartdevicelink.proxy.rpc.OnSystemRequest; -import com.smartdevicelink.proxy.rpc.OnTBTClientState; -import com.smartdevicelink.proxy.rpc.OnTouchEvent; -import com.smartdevicelink.proxy.rpc.OnVehicleData; -import com.smartdevicelink.proxy.rpc.OnWayPointChange; -import com.smartdevicelink.proxy.rpc.PerformAppServiceInteractionResponse; -import com.smartdevicelink.proxy.rpc.PerformAudioPassThruResponse; -import com.smartdevicelink.proxy.rpc.PerformInteractionResponse; -import com.smartdevicelink.proxy.rpc.PublishAppServiceResponse; -import com.smartdevicelink.proxy.rpc.PutFileResponse; -import com.smartdevicelink.proxy.rpc.ReadDIDResponse; -import com.smartdevicelink.proxy.rpc.RegisterAppInterfaceResponse; -import com.smartdevicelink.proxy.rpc.ReleaseInteriorVehicleDataModuleResponse; -import com.smartdevicelink.proxy.rpc.ResetGlobalPropertiesResponse; -import com.smartdevicelink.proxy.rpc.ScrollableMessageResponse; -import com.smartdevicelink.proxy.rpc.SendHapticDataResponse; -import com.smartdevicelink.proxy.rpc.SendLocationResponse; -import com.smartdevicelink.proxy.rpc.SetAppIconResponse; -import com.smartdevicelink.proxy.rpc.SetCloudAppPropertiesResponse; -import com.smartdevicelink.proxy.rpc.SetDisplayLayoutResponse; -import com.smartdevicelink.proxy.rpc.SetGlobalPropertiesResponse; -import com.smartdevicelink.proxy.rpc.SetInteriorVehicleDataResponse; -import com.smartdevicelink.proxy.rpc.SetMediaClockTimerResponse; -import com.smartdevicelink.proxy.rpc.ShowAppMenuResponse; -import com.smartdevicelink.proxy.rpc.ShowConstantTbtResponse; -import com.smartdevicelink.proxy.rpc.ShowResponse; -import com.smartdevicelink.proxy.rpc.SliderResponse; -import com.smartdevicelink.proxy.rpc.SpeakResponse; -import com.smartdevicelink.proxy.rpc.SubscribeButtonResponse; -import com.smartdevicelink.proxy.rpc.SubscribeVehicleDataResponse; -import com.smartdevicelink.proxy.rpc.SubscribeWayPointsResponse; -import com.smartdevicelink.proxy.rpc.SystemRequestResponse; -import com.smartdevicelink.proxy.rpc.UnpublishAppServiceResponse; -import com.smartdevicelink.proxy.rpc.UnregisterAppInterfaceResponse; -import com.smartdevicelink.proxy.rpc.UnsubscribeButtonResponse; -import com.smartdevicelink.proxy.rpc.UnsubscribeVehicleDataResponse; -import com.smartdevicelink.proxy.rpc.UnsubscribeWayPointsResponse; -import com.smartdevicelink.proxy.rpc.UpdateTurnListResponse; -import com.smartdevicelink.proxy.rpc.enums.SdlDisconnectedReason; -import com.smartdevicelink.proxy.rpc.listeners.OnRPCListener; - -import java.util.concurrent.CopyOnWriteArrayList; - -@Deprecated -public class ProxyBridge implements IProxyListener{ - private final Object RPC_LISTENER_LOCK = new Object(); - private SparseArray<CopyOnWriteArrayList<OnRPCListener>> rpcListeners = null; - private final LifecycleListener lifecycleListener; - - @Override - public void onProxyOpened() {} - - @Override - public void onRegisterAppInterfaceResponse(RegisterAppInterfaceResponse response) { - onRPCReceived(response); - if(response.getSuccess()){ - lifecycleListener.onProxyConnected(); - } - } - - @Override - public void onOnAppInterfaceUnregistered(OnAppInterfaceUnregistered notification) { - onRPCReceived(notification); - } - - @Override - public void onUnregisterAppInterfaceResponse(UnregisterAppInterfaceResponse response) { - onRPCReceived(response); - } - - protected interface LifecycleListener{ - void onProxyConnected(); - void onProxyClosed(String info, Exception e, SdlDisconnectedReason reason); - void onServiceEnded(OnServiceEnded serviceEnded); - void onServiceNACKed(OnServiceNACKed serviceNACKed); - void onError(String info, Exception e); - } - - public ProxyBridge( LifecycleListener lifecycleListener){ - this.lifecycleListener = lifecycleListener; - rpcListeners = new SparseArray<>(); - } - - public boolean onRPCReceived(final RPCMessage message){ - synchronized(RPC_LISTENER_LOCK){ - final int id = FunctionID.getFunctionId(message.getFunctionName()); - CopyOnWriteArrayList<OnRPCListener> listeners = rpcListeners.get(id); - if(listeners!=null && listeners.size()>0) { - for (OnRPCListener listener : listeners) { - listener.onReceived(message); - } - return true; - } - return false; - } - } - - protected void addRpcListener(FunctionID id, OnRPCListener listener){ - synchronized(RPC_LISTENER_LOCK){ - if (id != null && listener != null) { - if (rpcListeners.indexOfKey(id.getId()) < 0) { - rpcListeners.put(id.getId(), new CopyOnWriteArrayList<OnRPCListener>()); - } - rpcListeners.get(id.getId()).add(listener); - } - } - } - - public boolean removeOnRPCListener(FunctionID id, OnRPCListener listener){ - synchronized(RPC_LISTENER_LOCK){ - if(rpcListeners!= null - && id != null - && listener != null - && rpcListeners.indexOfKey(id.getId()) >= 0){ - return rpcListeners.get(id.getId()).remove(listener); - } - } - return false; - } - - @Override - public void onProxyClosed(String info, Exception e, SdlDisconnectedReason reason) { - lifecycleListener.onProxyClosed(info,e,reason); - } - - @Override - public void onServiceEnded(OnServiceEnded serviceEnded) { - lifecycleListener.onServiceEnded(serviceEnded); - - } - - @Override - public void onServiceNACKed(OnServiceNACKed serviceNACKed) { - lifecycleListener.onServiceNACKed(serviceNACKed); - - } - @Override - public void onError(String info, Exception e) { - lifecycleListener.onError(info, e); - } - -// @Override -// public void onOnStreamRPC(OnStreamRPC notification) { -// onRPCReceived(notification); -// -// } -// -// @Override -// public void onStreamRPCResponse(StreamRPCResponse response) { -// onRPCReceived(response); -// } - - @Override - public void onOnHMIStatus(OnHMIStatus notification) { - onRPCReceived(notification); - } - - @Override - public void onGenericResponse(GenericResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnCommand(OnCommand notification) { - onRPCReceived(notification); - } - - @Override - public void onAddCommandResponse(AddCommandResponse response) { - onRPCReceived(response); - } - - @Override - public void onAddSubMenuResponse(AddSubMenuResponse response) { - onRPCReceived(response); - - } - - @Override - public void onCreateInteractionChoiceSetResponse(CreateInteractionChoiceSetResponse response) { - onRPCReceived(response); - - } - - @Override - public void onAlertResponse(AlertResponse response) { - onRPCReceived(response); - - } - - @Override - public void onDeleteCommandResponse(DeleteCommandResponse response) { - onRPCReceived(response); - - } - - @Override - public void onDeleteInteractionChoiceSetResponse(DeleteInteractionChoiceSetResponse response) { - onRPCReceived(response); - - } - - @Override - public void onDeleteSubMenuResponse(DeleteSubMenuResponse response) { - onRPCReceived(response); - - } - - @Override - public void onPerformInteractionResponse(PerformInteractionResponse response) { - onRPCReceived(response); - - } - - @Override - public void onResetGlobalPropertiesResponse(ResetGlobalPropertiesResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSetGlobalPropertiesResponse(SetGlobalPropertiesResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSetMediaClockTimerResponse(SetMediaClockTimerResponse response) { - onRPCReceived(response); - - } - - @Override - public void onShowResponse(ShowResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSpeakResponse(SpeakResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnButtonEvent(OnButtonEvent notification) { - onRPCReceived(notification); - } - - @Override - public void onOnButtonPress(OnButtonPress notification) { - onRPCReceived(notification); - } - - @Override - public void onSubscribeButtonResponse(SubscribeButtonResponse response) { - onRPCReceived(response); - - } - - @Override - public void onUnsubscribeButtonResponse(UnsubscribeButtonResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnPermissionsChange(OnPermissionsChange notification) { - onRPCReceived(notification); - } - - @Override - public void onSubscribeVehicleDataResponse(SubscribeVehicleDataResponse response) { - onRPCReceived(response); - - } - - @Override - public void onUnsubscribeVehicleDataResponse(UnsubscribeVehicleDataResponse response) { - onRPCReceived(response); - - } - - @Override - public void onGetVehicleDataResponse(GetVehicleDataResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnVehicleData(OnVehicleData notification) { - onRPCReceived(notification); - } - - @Override - public void onPerformAudioPassThruResponse(PerformAudioPassThruResponse response) { - onRPCReceived(response); - - } - - @Override - public void onEndAudioPassThruResponse(EndAudioPassThruResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnAudioPassThru(OnAudioPassThru notification) { - onRPCReceived(notification); - } - - @Override - public void onPutFileResponse(PutFileResponse response) { - onRPCReceived(response); - - } - - @Override - public void onDeleteFileResponse(DeleteFileResponse response) { - onRPCReceived(response); - - } - - @Override - public void onListFilesResponse(ListFilesResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSetAppIconResponse(SetAppIconResponse response) { - onRPCReceived(response); - - } - - @Override - public void onScrollableMessageResponse(ScrollableMessageResponse response) { - onRPCReceived(response); - - } - - @Override - public void onChangeRegistrationResponse(ChangeRegistrationResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSetDisplayLayoutResponse(SetDisplayLayoutResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnLanguageChange(OnLanguageChange notification) { - onRPCReceived(notification); - } - - @Override - public void onOnHashChange(OnHashChange notification) { - onRPCReceived(notification); - } - - @Override - public void onSliderResponse(SliderResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnDriverDistraction(OnDriverDistraction notification) { - onRPCReceived(notification); - } - - @Override - public void onOnTBTClientState(OnTBTClientState notification) { - onRPCReceived(notification); - } - - @Override - public void onOnSystemRequest(OnSystemRequest notification) { - onRPCReceived(notification); - } - - @Override - public void onSystemRequestResponse(SystemRequestResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnKeyboardInput(OnKeyboardInput notification) { - onRPCReceived(notification); - } - - @Override - public void onOnTouchEvent(OnTouchEvent notification) { - onRPCReceived(notification); - } - - @Override - public void onDiagnosticMessageResponse(DiagnosticMessageResponse response) { - onRPCReceived(response); - - } - - @Override - public void onReadDIDResponse(ReadDIDResponse response) { - onRPCReceived(response); - - } - - @Override - public void onGetDTCsResponse(GetDTCsResponse response) { - onRPCReceived(response); - - } - -// @Override -// public void onOnLockScreenNotification(OnLockScreenStatus notification) { -// onRPCReceived(notification); -// } - - @Override - public void onDialNumberResponse(DialNumberResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSendLocationResponse(SendLocationResponse response) { - onRPCReceived(response); - - } - - @Override - public void onShowConstantTbtResponse(ShowConstantTbtResponse response) { - onRPCReceived(response); - - } - - @Override - public void onAlertManeuverResponse(AlertManeuverResponse response) { - onRPCReceived(response); - - } - - @Override - public void onUpdateTurnListResponse(UpdateTurnListResponse response) { - onRPCReceived(response); - - } - - @Override - public void onServiceDataACK(int dataSize) { - - } - - @Override - public void onGetWayPointsResponse(GetWayPointsResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSubscribeWayPointsResponse(SubscribeWayPointsResponse response) { - onRPCReceived(response); - - } - - @Override - public void onUnsubscribeWayPointsResponse(UnsubscribeWayPointsResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnWayPointChange(OnWayPointChange notification) { - onRPCReceived(notification); - } - - @Override - public void onGetSystemCapabilityResponse(GetSystemCapabilityResponse response) { - onRPCReceived(response); - - } - - @Override - public void onGetInteriorVehicleDataResponse(GetInteriorVehicleDataResponse response) { - onRPCReceived(response); - - } - - @Override - public void onCreateWindowResponse(CreateWindowResponse response) { - onRPCReceived(response); - } - - @Override - public void onDeleteWindowResponse(DeleteWindowResponse response) { - onRPCReceived(response); - } - - @Override - public void onButtonPressResponse(ButtonPressResponse response) { - onRPCReceived(response); - - } - - @Override - public void onSetInteriorVehicleDataResponse(SetInteriorVehicleDataResponse response) { - onRPCReceived(response); - - } - - @Override - public void onOnInteriorVehicleData(OnInteriorVehicleData notification) { - onRPCReceived(notification); - } - - @Override - public void onSendHapticDataResponse(SendHapticDataResponse response) { - onRPCReceived(response); - } - - @Override - public void onOnRCStatus(OnRCStatus notification) { - onRPCReceived(notification); - } - - @Override - public void onSetCloudAppProperties(SetCloudAppPropertiesResponse response) { - onRPCReceived(response); - } - - @Override - public void onGetCloudAppProperties(GetCloudAppPropertiesResponse response) { - onRPCReceived(response); - } - - @Override - public void onPublishAppServiceResponse(PublishAppServiceResponse response){ - onRPCReceived(response); - } - - @Override - public void onGetAppServiceDataResponse(GetAppServiceDataResponse response){ - onRPCReceived(response); - } - - @Override - public void onGetFileResponse(GetFileResponse response){ - onRPCReceived(response); - } - - @Override - public void onPerformAppServiceInteractionResponse(PerformAppServiceInteractionResponse response){ - onRPCReceived(response); - } - - @Override - public void onOnAppServiceData(OnAppServiceData notification){ - onRPCReceived(notification); - } - - @Override - public void onGetInteriorVehicleDataConsentResponse(GetInteriorVehicleDataConsentResponse response) { - onRPCReceived(response); - } - - @Override - public void onReleaseInteriorVehicleDataModuleResponse(ReleaseInteriorVehicleDataModuleResponse response) { - onRPCReceived(response); - } - - @Override - public void onOnSystemCapabilityUpdated(OnSystemCapabilityUpdated notification){ - onRPCReceived(notification); - } - - @Override - public void onCloseApplicationResponse(CloseApplicationResponse response) { - onRPCReceived(response); - } - - @Override - public void onCancelInteractionResponse(CancelInteractionResponse response) { - onRPCReceived(response); - } - - @Override - public void onShowAppMenuResponse(ShowAppMenuResponse response) { - onRPCReceived(response); - } - - @Override - public void onUnpublishAppServiceResponse(UnpublishAppServiceResponse response) { - onRPCReceived(response); - } -} diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 42dc6a165..f109cbe85 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -124,7 +124,7 @@ public class SdlManager extends BaseSdlManager { // Instantiate sub managers this.permissionManager = new PermissionManager(_internalInterface); this.fileManager = new FileManager(_internalInterface, context, fileManagerConfig); - if (lockScreenConfig.isEnabled()) { + if (lockScreenConfig.getDisplayMode() != LockScreenConfig.DISPLAY_MODE_NEVER) { this.lockScreenManager = new LockScreenManager(lockScreenConfig, context, _internalInterface); } this.screenManager = new ScreenManager(_internalInterface, this.fileManager); @@ -142,7 +142,7 @@ public class SdlManager extends BaseSdlManager { // Start sub managers this.permissionManager.start(subManagerListener); this.fileManager.start(subManagerListener); - if (lockScreenConfig.isEnabled()) { + if (lockScreenConfig.getDisplayMode() != LockScreenConfig.DISPLAY_MODE_NEVER) { this.lockScreenManager.start(subManagerListener); } this.screenManager.start(subManagerListener); @@ -150,19 +150,19 @@ public class SdlManager extends BaseSdlManager { @Override void checkState() { - if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)) { - if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)) { + if (permissionManager != null && fileManager != null && screenManager != null && (lockScreenConfig.getDisplayMode() == LockScreenConfig.DISPLAY_MODE_NEVER || lockScreenManager != null)) { + if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (lockScreenConfig.getDisplayMode() == LockScreenConfig.DISPLAY_MODE_NEVER || lockScreenManager.getState() == BaseSubManager.READY)) { DebugTool.logInfo(TAG, "Starting sdl manager, all sub managers are in ready state"); transitionToState(BaseSubManager.READY); handleQueuedNotifications(); notifyDevListener(null); onReady(); - } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)) { + } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (lockScreenConfig.getDisplayMode() == LockScreenConfig.DISPLAY_MODE_NEVER || lockScreenManager.getState() == BaseSubManager.ERROR)) { String info = "ERROR starting sdl manager, all sub managers are in error state"; DebugTool.logError(TAG, info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); - } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)) { + } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.getDisplayMode() != LockScreenConfig.DISPLAY_MODE_NEVER && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)) { DebugTool.logInfo(TAG, "SETTING UP sdl manager, some sub managers are still setting up"); transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManagerListener.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManagerListener.java index aa0e4f84a..8bd1f6259 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManagerListener.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManagerListener.java @@ -61,21 +61,6 @@ public interface SdlManagerListener extends BaseSdlManagerListener{ * of LifecycleConfigurationUpdate, otherwise it should return null to indicate that the language * is not supported. * - * @param language The language of the connected head unit the manager is trying to update the configuration. - * @return An object of LifecycleConfigurationUpdate if the head unit language is supported, - * otherwise null to indicate that the language is not supported. - * @deprecated use {@link #managerShouldUpdateLifecycle(Language language, Language hmiLanguage)} instead - */ - @Deprecated - LifecycleConfigurationUpdate managerShouldUpdateLifecycle(Language language); - - /** - * Called when the SDL manager detected a language mismatch. In case of a language mismatch the - * manager should change the apps registration by updating the lifecycle configuration to the - * specified language. If the app can support the specified language it should return an Object - * of LifecycleConfigurationUpdate, otherwise it should return null to indicate that the language - * is not supported. - * * @param language The VR+TTS language of the connected head unit the manager is trying to update the configuration. * @param hmiLanguage The HMI display language of the connected head unit the manager is trying to update the configuration. * @return An object of LifecycleConfigurationUpdate if the head unit language is supported, diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index 38bc357b6..52b4db580 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -40,11 +40,13 @@ import android.os.Handler; import android.os.Looper;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.managers.CompletionListener;
import com.smartdevicelink.managers.StreamingStateMachine;
import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener;
+import com.smartdevicelink.protocol.ProtocolMessage;
import com.smartdevicelink.protocol.enums.FunctionID;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.proxy.RPCNotification;
@@ -57,10 +59,13 @@ import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
+import com.smartdevicelink.streaming.IStreamListener;
+import com.smartdevicelink.streaming.StreamPacketizer;
import com.smartdevicelink.transport.utl.TransportRecord;
import com.smartdevicelink.util.DebugTool;
import com.smartdevicelink.util.Version;
+import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -91,6 +96,9 @@ public class AudioStreamManager extends BaseAudioStreamManager { private CompletionListener serviceCompletionListener;
// As the internal interface does not provide timeout we need to use a future task
private final Handler serviceCompletionHandler;
+ private StreamPacketizer audioPacketizer;
+ private SdlSession sdlSession = null;
+ private SessionType sessionType = null;
private final Runnable serviceCompletionTimeoutCallback = new Runnable() {
@Override
@@ -106,10 +114,12 @@ public class AudioStreamManager extends BaseAudioStreamManager { private final ISdlServiceListener serviceListener = new ISdlServiceListener() {
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
+ sdlSession = session;
+ sessionType = type;
if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- sdlAudioStream = session.startAudioStream();
+ sdlAudioStream = startAudioStream(session);
streamingStateMachine.transitionToState(StreamingStateMachine.STARTED);
if (serviceCompletionListener != null) {
@@ -125,7 +135,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- session.stopAudioStream();
+ stopAudioStream();
sdlAudioStream = null;
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -142,6 +152,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
+ stopAudioStream();
streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
DebugTool.logError(TAG, "OnServiceError: " + reason);
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -175,6 +186,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { * Creates a new object of AudioStreamManager
* @param internalInterface The internal interface to the connected device.
*/
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
public AudioStreamManager(@NonNull ISdl internalInterface, @NonNull Context context) {
super(internalInterface);
this.queue = new LinkedList<>();
@@ -208,25 +220,28 @@ public class AudioStreamManager extends BaseAudioStreamManager { }
private void getAudioStreamingCapabilities(){
- internalInterface.getCapability(SystemCapabilityType.PCM_STREAMING, new OnSystemCapabilityListener() {
- @Override
- public void onCapabilityRetrieved(Object capability) {
- if(capability != null && capability instanceof AudioPassThruCapabilities){
- audioStreamingCapabilities = (AudioPassThruCapabilities) capability;
- checkState();
+ if (internalInterface.getSystemCapabilityManager() != null) {
+ internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.PCM_STREAMING, new OnSystemCapabilityListener() {
+ @Override
+ public void onCapabilityRetrieved(Object capability) {
+ if (capability != null && capability instanceof AudioPassThruCapabilities) {
+ audioStreamingCapabilities = (AudioPassThruCapabilities) capability;
+ checkState();
+ }
}
- }
- @Override
- public void onError(String info) {
- DebugTool.logError(TAG, "Error retrieving audio streaming capability: " + info);
- streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
- transitionToState(ERROR);
- }
- });
+ @Override
+ public void onError(String info) {
+ DebugTool.logError(TAG, "Error retrieving audio streaming capability: " + info);
+ streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
+ transitionToState(ERROR);
+ }
+ }, false);
+ }
}
@Override
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
public void dispose() {
stopAudioStream(new CompletionListener() {
@Override
@@ -258,7 +273,10 @@ public class AudioStreamManager extends BaseAudioStreamManager { return;
}
- AudioPassThruCapabilities capabilities = (AudioPassThruCapabilities) internalInterface.getCapability(SystemCapabilityType.PCM_STREAMING);
+ AudioPassThruCapabilities capabilities = null;
+ if (internalInterface.getSystemCapabilityManager() != null) {
+ capabilities = (AudioPassThruCapabilities) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.PCM_STREAMING, null, false);
+ }
if (capabilities != null) {
switch (capabilities.getSamplingRate()) {
@@ -338,7 +356,8 @@ public class AudioStreamManager extends BaseAudioStreamManager { streamingStateMachine.transitionToState(StreamingStateMachine.STOPPED);
serviceCompletionListener = completionListener;
serviceCompletionHandler.postDelayed(serviceCompletionTimeoutCallback, COMPLETION_TIMEOUT);
- internalInterface.stopAudioService();
+ stopAudioStream();
+ serviceListener.onServiceEnded(sdlSession, sessionType);
}
/**
@@ -490,4 +509,30 @@ public class AudioStreamManager extends BaseAudioStreamManager { // range of ENCODING_PCM_FLOAT audio data is [-1.0, 1.0].
int FLOAT = Float.SIZE >> 3;
}
+
+ protected IAudioStreamListener startAudioStream(final SdlSession session) {
+
+ IStreamListener streamListener = new IStreamListener() {
+ @Override
+ public void sendStreamPacket(ProtocolMessage pm) {
+ session.sendMessage(pm);
+ }
+ };
+
+ try {
+ audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) session.getSessionId(), session);
+ audioPacketizer.start();
+ return audioPacketizer;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ protected boolean stopAudioStream() {
+ if (audioPacketizer != null) {
+ audioPacketizer.stop();
+ return true;
+ }
+ return false;
+ }
}
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/FileManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/FileManager.java index bdd21ba45..0efc3b6ff 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/FileManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/FileManager.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.res.Resources; import android.net.Uri; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.managers.file.filetypes.SdlFile; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -65,20 +66,13 @@ public class FileManager extends BaseFileManager { private final WeakReference<Context> context; - @Deprecated - public FileManager(ISdl internalInterface, Context context) { - - // setup - super(internalInterface); - this.context = new WeakReference<>(context); - } - /** * Constructor for FileManager * @param internalInterface an instance of the ISdl interface that can be used for common SDL operations (sendRpc, addRpcListener, etc) * @param context an instances of Context interface to global information for application * @param fileManagerConfig an instance of the FileManagerConfig gives access to artworkRetryCount and fileRetryCount to let us if those file types can be re-upload if they fail */ + @RestrictTo(RestrictTo.Scope.LIBRARY) public FileManager(ISdl internalInterface, Context context, FileManagerConfig fileManagerConfig) { // setup super(internalInterface, fileManagerConfig); diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java index 73757292b..78233dc0f 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java @@ -48,7 +48,6 @@ import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.BaseTransportConfig; import com.smartdevicelink.transport.MultiplexTransportConfig; import com.smartdevicelink.transport.TCPTransportConfig; -import com.smartdevicelink.transport.USBTransportConfig; import com.smartdevicelink.transport.enums.TransportType; import com.smartdevicelink.util.DebugTool; @@ -76,22 +75,6 @@ public class LifecycleManager extends BaseLifecycleManager { void initialize() { super.initialize(); - //Handle legacy USB connections - if (_transportConfig != null && TransportType.USB.equals(_transportConfig.getTransportType())) { - //A USB transport config was provided - USBTransportConfig usbTransportConfig = (USBTransportConfig) _transportConfig; - if (usbTransportConfig.getUsbAccessory() == null) { - DebugTool.logInfo(TAG,"Legacy USB transport config was used, but received null for accessory. Attempting to connect with router service"); - //The accessory was null which means it came from a router service - MultiplexTransportConfig multiplexTransportConfig = new MultiplexTransportConfig(usbTransportConfig.getUSBContext(), appConfig.getAppID()); - multiplexTransportConfig.setRequiresHighBandwidth(true); - multiplexTransportConfig.setSecurityLevel(MultiplexTransportConfig.FLAG_MULTI_SECURITY_OFF); - multiplexTransportConfig.setPrimaryTransports(Collections.singletonList(TransportType.USB)); - multiplexTransportConfig.setSecondaryTransports(new ArrayList<TransportType>()); - _transportConfig = multiplexTransportConfig; - } - } - if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) { this.session = new SdlSession(sdlSessionListener, (MultiplexTransportConfig) _transportConfig); } else if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.TCP)) { @@ -128,15 +111,9 @@ public class LifecycleManager extends BaseLifecycleManager { super.setSdlSecurityStaticVars(); Context context = null; - Service service = null; - if(this.contextWeakReference != null){ context = contextWeakReference.get(); } - if (context != null && context instanceof Service) { - service = (Service) context; - } - SdlSecurityBase.setAppService(service); SdlSecurityBase.setContext(context); } @@ -242,25 +219,6 @@ public class LifecycleManager extends BaseLifecycleManager { } } - /** - * Closes the opened video service (serviceType 11) - * - * @return true if the video service is closed successfully, return false otherwise - */ - @Override - void endVideoStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopVideoStream(); - } - @Override void startAudioService(boolean isEncrypted) { if (session == null) { @@ -273,23 +231,4 @@ public class LifecycleManager extends BaseLifecycleManager { } session.startService(SessionType.PCM, isEncrypted); } - - /** - * Closes the opened audio service (serviceType 10) - * - * @return true if the audio service is closed successfully, return false otherwise - */ - @Override - void endAudioStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopAudioStream(); - } } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenConfig.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenConfig.java index 8fe3286ba..8d1e9a6c8 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenConfig.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenConfig.java @@ -88,30 +88,6 @@ public class LockScreenConfig { } /** - * If set to true, SDL will manage the showing and dismissing of the lock screen for you. <br> - * - * If false, you must manage the lock screen - * @param enable boolean - * - * @deprecated to disable the lockscreen, use setDisplayMode with DISPLAY_MODE_NEVER instead - */ - @Deprecated - public void setEnabled(boolean enable){ - this.enable = enable; - } - - /** - * Gets whether the lock screen is being managed for you - * @return boolean - * - * @deprecated to disable the lockscreen, use setDisplayMode with DISPLAY_MODE_NEVER instead - */ - @Deprecated - public boolean isEnabled() { - return enable; - } - - /** * Set the resource int of the background color. Colors should define colors in your Colors.xml file * @param resourceColor resource int of the color */ diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java index c5d567e56..06f992875 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java @@ -38,6 +38,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; +import androidx.annotation.RestrictTo; + import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.protocol.enums.FunctionID; @@ -64,6 +66,7 @@ import java.lang.ref.WeakReference; * The LockscreenManager handles the logic of showing and hiding the lock screen. <br> * */ +@RestrictTo(RestrictTo.Scope.LIBRARY) public class LockScreenManager extends BaseSubManager { private static final String TAG = "LockScreenManager"; @@ -96,7 +99,7 @@ public class LockScreenManager extends BaseSubManager { lockScreenIcon = lockScreenConfig.getAppIcon(); lockScreenColor = lockScreenConfig.getBackgroundColor(); customView = lockScreenConfig.getCustomView(); - lockScreenEnabled = lockScreenConfig.isEnabled(); + lockScreenEnabled = lockScreenConfig.getDisplayMode() != LockScreenConfig.DISPLAY_MODE_NEVER; deviceLogoEnabled = lockScreenConfig.isDeviceLogoEnabled(); displayMode = lockScreenConfig.getDisplayMode(); enableDismissGesture = lockScreenConfig.enableDismissGesture(); diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java index e3a85bb1b..7430c3143 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java @@ -33,6 +33,7 @@ package com.smartdevicelink.managers.permission; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -51,6 +52,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * * @param internalInterface */ + @RestrictTo(RestrictTo.Scope.LIBRARY) public PermissionManager(@NonNull ISdl internalInterface) { super(internalInterface); } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java index 5065294a9..31c6da0b1 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java @@ -33,6 +33,7 @@ package com.smartdevicelink.managers.screen; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.managers.file.FileManager; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -44,6 +45,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; */ public class ScreenManager extends BaseScreenManager { + @RestrictTo(RestrictTo.Scope.LIBRARY) public ScreenManager(@NonNull ISdl internalInterface, @NonNull FileManager fileManager) { super(internalInterface, fileManager); } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java index b7a2e2958..5499d3a5a 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java @@ -33,6 +33,7 @@ package com.smartdevicelink.managers.screen; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.managers.file.FileManager; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -42,6 +43,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * SoftButtonManager gives the developer the ability to control how soft buttons are displayed on the head unit.<br> * Note: This class must be accessed through the SdlManager->ScreenManager. Do not instantiate it by itself.<br> */ +@RestrictTo(RestrictTo.Scope.LIBRARY) class SoftButtonManager extends BaseSoftButtonManager { /** diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java index b5dafa5fd..9f08bef36 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SubscribeButtonManager.java @@ -1,6 +1,8 @@ package com.smartdevicelink.managers.screen; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; + import com.smartdevicelink.proxy.interfaces.ISdl; /** @@ -9,6 +11,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * Note: This class must be accessed through the SdlManager. Do not instantiate it by itself. <br> * */ +@RestrictTo(RestrictTo.Scope.LIBRARY) class SubscribeButtonManager extends BaseSubscribeButtonManager { SubscribeButtonManager(@NonNull ISdl internalInterface) { diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/TextAndGraphicManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/TextAndGraphicManager.java index 82e9a5e01..fe216ea5f 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/TextAndGraphicManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/TextAndGraphicManager.java @@ -33,6 +33,7 @@ package com.smartdevicelink.managers.screen; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.R; import com.smartdevicelink.managers.file.FileManager; @@ -46,6 +47,7 @@ import com.smartdevicelink.proxy.rpc.enums.FileType; * Note: This class must be accessed through the SdlManager. Do not instantiate it by itself. <br> * */ +@RestrictTo(RestrictTo.Scope.LIBRARY) class TextAndGraphicManager extends BaseTextAndGraphicManager { TextAndGraphicManager(@NonNull ISdl internalInterface, @NonNull FileManager fileManager, @NonNull SoftButtonManager softButtonManager) { @@ -53,8 +55,8 @@ class TextAndGraphicManager extends BaseTextAndGraphicManager { } @Override - SdlArtwork getBlankArtwork(){ - if (blankArtwork == null){ + SdlArtwork getBlankArtwork() { + if (blankArtwork == null) { blankArtwork = new SdlArtwork(); blankArtwork.setType(FileType.GRAPHIC_PNG); blankArtwork.setName("blankArtwork"); diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/choiceset/ChoiceSetManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/choiceset/ChoiceSetManager.java index 32ff8c0eb..f0895fe22 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/choiceset/ChoiceSetManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/choiceset/ChoiceSetManager.java @@ -33,6 +33,7 @@ package com.smartdevicelink.managers.screen.choiceset; import androidx.annotation.NonNull; +import androidx.annotation.RestrictTo; import com.smartdevicelink.managers.file.FileManager; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -42,6 +43,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * ChoiceSetManager gives the developer the ability to control how soft choice sets are displayed on the head unit.<br> * Note: This class must be accessed through the SdlManager->ScreenManager. Do not instantiate it by itself.<br> */ +@RestrictTo(RestrictTo.Scope.LIBRARY) public class ChoiceSetManager extends BaseChoiceSetManager { /** diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/MenuManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/MenuManager.java index 4a28a2792..d29312cdf 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/MenuManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/MenuManager.java @@ -32,6 +32,8 @@ package com.smartdevicelink.managers.screen.menu; +import androidx.annotation.RestrictTo; + import com.smartdevicelink.managers.file.FileManager; import com.smartdevicelink.proxy.interfaces.ISdl; @@ -42,6 +44,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * * The MenuManager takes MenuCell objects and creates and sends all necessary RPCs to build out a menu */ +@RestrictTo(RestrictTo.Scope.LIBRARY) public class MenuManager extends BaseMenuManager { public MenuManager(ISdl internalInterface, FileManager fileManager) { diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/VoiceCommandManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/VoiceCommandManager.java index a892d3a2c..afde7404d 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/VoiceCommandManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/screen/menu/VoiceCommandManager.java @@ -32,6 +32,8 @@ package com.smartdevicelink.managers.screen.menu; +import androidx.annotation.RestrictTo; + import com.smartdevicelink.proxy.interfaces.ISdl; /** @@ -41,6 +43,7 @@ import com.smartdevicelink.proxy.interfaces.ISdl; * * The VoiceCommandManager takes a List of VoiceCommand objects and sets them on the Head unit for you. */ +@RestrictTo(RestrictTo.Scope.LIBRARY) public class VoiceCommandManager extends BaseVoiceCommandManager { public VoiceCommandManager(ISdl internalInterface) { diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/HapticInterfaceManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/HapticInterfaceManager.java index f1b9fd4f3..78b6bb03b 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/HapticInterfaceManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/HapticInterfaceManager.java @@ -65,7 +65,7 @@ class HapticInterfaceManager extends BaseHapticInterfaceManager { ISdl proxy = proxyHolder.get(); SendHapticData msg = new SendHapticData(); msg.setHapticRectData(userHapticData); - proxy.sendRPCRequest(msg); + proxy.sendRPC(msg); } } @@ -99,8 +99,10 @@ class HapticInterfaceManager extends BaseHapticInterfaceManager { if (proxyHolder.get() != null) { ISdl proxy = proxyHolder.get(); - VideoStreamingCapability videoStreamingCapability = (VideoStreamingCapability) - proxy.getCapability(SystemCapabilityType.VIDEO_STREAMING); + VideoStreamingCapability videoStreamingCapability = null; + if (proxy.getSystemCapabilityManager() != null) { + videoStreamingCapability = (VideoStreamingCapability) proxy.getSystemCapabilityManager().getCapability(SystemCapabilityType.VIDEO_STREAMING, null, false); + } if (videoStreamingCapability != null && videoStreamingCapability.getScale() != null) { scale = videoStreamingCapability.getScale(); } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java index 81db89049..77467f429 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java @@ -40,12 +40,15 @@ import android.view.Display; import android.view.InputDevice; import android.view.MotionEvent; +import androidx.annotation.RestrictTo; + import com.smartdevicelink.SdlConnection.SdlSession; import com.smartdevicelink.encoder.VirtualDisplayEncoder; import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.managers.StreamingStateMachine; import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener; +import com.smartdevicelink.protocol.ProtocolMessage; import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.RPCNotification; @@ -59,18 +62,25 @@ import com.smartdevicelink.proxy.rpc.OnTouchEvent; import com.smartdevicelink.proxy.rpc.TouchCoord; import com.smartdevicelink.proxy.rpc.TouchEvent; import com.smartdevicelink.proxy.rpc.VideoStreamingCapability; +import com.smartdevicelink.proxy.rpc.VideoStreamingFormat; import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows; import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType; import com.smartdevicelink.proxy.rpc.enums.TouchType; +import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol; import com.smartdevicelink.proxy.rpc.enums.VideoStreamingState; import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener; +import com.smartdevicelink.streaming.AbstractPacketizer; +import com.smartdevicelink.streaming.IStreamListener; +import com.smartdevicelink.streaming.StreamPacketizer; +import com.smartdevicelink.streaming.video.RTPH264Packetizer; import com.smartdevicelink.streaming.video.SdlRemoteDisplay; import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.utl.TransportRecord; import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.Version; +import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -95,6 +105,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { private boolean isTransportAvailable = false; private boolean hasStarted; private String vehicleMake = null; + private AbstractPacketizer videoPacketizer; // INTERNAL INTERFACES @@ -104,7 +115,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { if(SessionType.NAV.equals(type)){ if (session != null && session.getAcceptedVideoParams() != null) { parameters = session.getAcceptedVideoParams(); - VideoStreamManager.this.streamListener = session.startVideoStream(); + VideoStreamManager.this.streamListener = startVideoStream(session.getAcceptedVideoParams(), session); } if (VideoStreamManager.this.streamListener == null) { @@ -112,7 +123,10 @@ public class VideoStreamManager extends BaseVideoStreamManager { stateMachine.transitionToState(StreamingStateMachine.ERROR); return; } - VideoStreamingCapability capability = (VideoStreamingCapability) internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING); + VideoStreamingCapability capability = null; + if (internalInterface.getSystemCapabilityManager() != null) { + capability = (VideoStreamingCapability) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.VIDEO_STREAMING, null, false); + } if(capability != null && Boolean.TRUE.equals(capability.getIsHapticSpatialDataSupported())){ hapticManager = new HapticInterfaceManager(internalInterface); } @@ -125,6 +139,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceEnded(SdlSession session, SessionType type) { if(SessionType.NAV.equals(type)){ + stopVideoStream(); if(remoteDisplay!=null){ stopStreaming(); } @@ -136,6 +151,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceError(SdlSession session, SessionType type, String reason) { DebugTool.logError(TAG, "Unable to start video service: " + reason); + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.ERROR); transitionToState(BaseSubManager.ERROR); } @@ -156,7 +172,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { } checkState(); if (hasStarted && (isHMIStateVideoStreamCapable(prevOnHMIStatus)) && (!isHMIStateVideoStreamCapable(currentOnHMIStatus))) { - internalInterface.stopVideoService(); + stopVideoStream(); } } } @@ -177,6 +193,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { }; // MANAGER APIs + @RestrictTo(RestrictTo.Scope.LIBRARY) public VideoStreamManager(ISdl internalInterface){ super(internalInterface); @@ -221,28 +238,33 @@ public class VideoStreamManager extends BaseVideoStreamManager { private void getVideoStreamingParams(){ if(internalInterface.getProtocolVersion().getMajor() >= 5) { - internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() { - @Override - public void onCapabilityRetrieved(Object capability) { - VideoStreamingParameters params = new VideoStreamingParameters(); - params.update((VideoStreamingCapability)capability, vehicleMake); //Streaming parameters are ready time to stream - VideoStreamManager.this.parameters = params; + if (internalInterface.getSystemCapabilityManager() != null) { + internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() { + @Override + public void onCapabilityRetrieved(Object capability) { + VideoStreamingParameters params = new VideoStreamingParameters(); + params.update((VideoStreamingCapability) capability, vehicleMake); //Streaming parameters are ready time to stream + VideoStreamManager.this.parameters = params; - checkState(); + checkState(); - } + } - @Override - public void onError(String info) { - DebugTool.logError(TAG, "Error retrieving video streaming capability: " + info); - stateMachine.transitionToState(StreamingStateMachine.ERROR); - transitionToState(ERROR); - } - }); + @Override + public void onError(String info) { + DebugTool.logError(TAG, "Error retrieving video streaming capability: " + info); + stateMachine.transitionToState(StreamingStateMachine.ERROR); + transitionToState(ERROR); + } + }, false); + } }else{ //We just use default video streaming params VideoStreamingParameters params = new VideoStreamingParameters(); - DisplayCapabilities dispCap = (DisplayCapabilities)internalInterface.getCapability(SystemCapabilityType.DISPLAY); + DisplayCapabilities dispCap = null; + if (internalInterface.getSystemCapabilityManager() != null) { + dispCap = (DisplayCapabilities) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.DISPLAY, null, false); + } if(dispCap !=null){ params.setResolution(dispCap.getScreenParams().getImageResolution()); } @@ -266,31 +288,37 @@ public class VideoStreamManager extends BaseVideoStreamManager { this.context = new WeakReference<>(context); this.remoteDisplayClass = remoteDisplayClass; int majorProtocolVersion = internalInterface.getProtocolVersion().getMajor(); - if(majorProtocolVersion >= 5 && !internalInterface.isCapabilitySupported(SystemCapabilityType.VIDEO_STREAMING)){ + boolean isCapabilitySupported = internalInterface.getSystemCapabilityManager() != null && internalInterface.getSystemCapabilityManager().isCapabilitySupported(SystemCapabilityType.VIDEO_STREAMING); + if(majorProtocolVersion >= 5 && !isCapabilitySupported){ DebugTool.logError(TAG, "Video streaming not supported on this module"); stateMachine.transitionToState(StreamingStateMachine.ERROR); return; } if(parameters == null){ if(majorProtocolVersion >= 5) { - internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() { - @Override - public void onCapabilityRetrieved(Object capability) { - VideoStreamingParameters params = new VideoStreamingParameters(); - params.update((VideoStreamingCapability)capability, vehicleMake); //Streaming parameters are ready time to stream - startStreaming(params, encrypted); - } + if (internalInterface.getSystemCapabilityManager() != null) { + internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() { + @Override + public void onCapabilityRetrieved(Object capability) { + VideoStreamingParameters params = new VideoStreamingParameters(); + params.update((VideoStreamingCapability) capability, vehicleMake); //Streaming parameters are ready time to stream + startStreaming(params, encrypted); + } - @Override - public void onError(String info) { - stateMachine.transitionToState(StreamingStateMachine.ERROR); - DebugTool.logError(TAG, "Error retrieving video streaming capability: " + info); - } - }); + @Override + public void onError(String info) { + stateMachine.transitionToState(StreamingStateMachine.ERROR); + DebugTool.logError(TAG, "Error retrieving video streaming capability: " + info); + } + }, false); + } }else{ //We just use default video streaming params VideoStreamingParameters params = new VideoStreamingParameters(); - DisplayCapabilities dispCap = (DisplayCapabilities)internalInterface.getCapability(SystemCapabilityType.DISPLAY); + DisplayCapabilities dispCap = null; + if (internalInterface.getSystemCapabilityManager() != null) { + dispCap = (DisplayCapabilities) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.DISPLAY, null, false); + } if(dispCap !=null){ params.setResolution(dispCap.getScreenParams().getImageResolution()); } @@ -367,6 +395,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { * Stops streaming, ends video streaming service and removes service listeners. */ @Override + @RestrictTo(RestrictTo.Scope.LIBRARY) public void dispose(){ stopStreaming(); @@ -375,13 +404,13 @@ public class VideoStreamManager extends BaseVideoStreamManager { parameters = null; virtualDisplayEncoder = null; if (internalInterface != null) { - internalInterface.stopVideoService(); // Remove listeners internalInterface.removeServiceListener(SessionType.NAV, serviceListener); internalInterface.removeOnRPCNotificationListener(FunctionID.ON_TOUCH_EVENT, touchListener); internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener); } + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.NONE); @@ -454,14 +483,20 @@ public class VideoStreamManager extends BaseVideoStreamManager { //Get touch scalars ImageResolution resolution = null; if(internalInterface.getProtocolVersion().getMajor() >= 5){ //At this point we should already have the capability - VideoStreamingCapability capability = (VideoStreamingCapability) internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING); + VideoStreamingCapability capability = null; + if (internalInterface.getSystemCapabilityManager() != null) { + capability = (VideoStreamingCapability) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.VIDEO_STREAMING, null, false); + } if(capability != null){ resolution = capability.getPreferredResolution(); } } if(resolution == null){ //Either the protocol version is too low to access video streaming caps, or they were null - DisplayCapabilities dispCap = (DisplayCapabilities) internalInterface.getCapability(SystemCapabilityType.DISPLAY); + DisplayCapabilities dispCap = null; + if (internalInterface.getSystemCapabilityManager() != null) { + dispCap = (DisplayCapabilities) internalInterface.getSystemCapabilityManager().getCapability(SystemCapabilityType.DISPLAY, null, false); + } if (dispCap != null) { resolution = (dispCap.getScreenParams().getImageResolution()); } @@ -704,4 +739,57 @@ public class VideoStreamManager extends BaseVideoStreamManager { } } + private VideoStreamingProtocol getAcceptedProtocol(VideoStreamingParameters params) { + if (params != null) { + VideoStreamingFormat format = params.getFormat(); + if (format != null && format.getProtocol() != null) { + return format.getProtocol(); + } + } + //Returns default protocol if none are found + return new VideoStreamingParameters().getFormat().getProtocol(); + + } + + protected IVideoStreamListener startVideoStream(VideoStreamingParameters params, final SdlSession session) { + VideoStreamingProtocol protocol = getAcceptedProtocol(params); + + IStreamListener iStreamListener = new IStreamListener() { + @Override + public void sendStreamPacket(ProtocolMessage pm) { + session.sendMessage(pm); + } + }; + + try { + switch (protocol) { + case RAW: { + videoPacketizer = new StreamPacketizer(iStreamListener, null, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + case RTP: { + //FIXME why is this not an extension of StreamPacketizer? + videoPacketizer = new RTPH264Packetizer(iStreamListener, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + default: + DebugTool.logError(TAG, "Protocol " + protocol + " is not supported."); + return null; + } + } catch (IOException e) { + return null; + } + + } + + protected boolean stopVideoStream() { + if (videoPacketizer != null) { + videoPacketizer.stop(); + return true; + } + return false; + } + } |