package com.ptrprograms.fordapplinkaudio.Service;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.IBinder;
import com.ford.syncV4.exception.SyncException;
import com.ford.syncV4.exception.SyncExceptionCause;
import com.ford.syncV4.proxy.SyncProxyALM;
import com.ford.syncV4.proxy.interfaces.IProxyListenerALM;
import com.ford.syncV4.proxy.rpc.AddCommandResponse;
import com.ford.syncV4.proxy.rpc.AddSubMenuResponse;
import com.ford.syncV4.proxy.rpc.AlertResponse;
import com.ford.syncV4.proxy.rpc.ChangeRegistrationResponse;
import com.ford.syncV4.proxy.rpc.CreateInteractionChoiceSetResponse;
import com.ford.syncV4.proxy.rpc.DeleteCommandResponse;
import com.ford.syncV4.proxy.rpc.DeleteFileResponse;
import com.ford.syncV4.proxy.rpc.DeleteInteractionChoiceSetResponse;
import com.ford.syncV4.proxy.rpc.DeleteSubMenuResponse;
import com.ford.syncV4.proxy.rpc.EncodedSyncPDataResponse;
import com.ford.syncV4.proxy.rpc.EndAudioPassThruResponse;
import com.ford.syncV4.proxy.rpc.GenericResponse;
import com.ford.syncV4.proxy.rpc.GetDTCsResponse;
import com.ford.syncV4.proxy.rpc.GetVehicleDataResponse;
import com.ford.syncV4.proxy.rpc.ListFilesResponse;
import com.ford.syncV4.proxy.rpc.OnAudioPassThru;
import com.ford.syncV4.proxy.rpc.OnButtonEvent;
import com.ford.syncV4.proxy.rpc.OnButtonPress;
import com.ford.syncV4.proxy.rpc.OnCommand;
import com.ford.syncV4.proxy.rpc.OnDriverDistraction;
import com.ford.syncV4.proxy.rpc.OnEncodedSyncPData;
import com.ford.syncV4.proxy.rpc.OnHMIStatus;
import com.ford.syncV4.proxy.rpc.OnLanguageChange;
import com.ford.syncV4.proxy.rpc.OnPermissionsChange;
import com.ford.syncV4.proxy.rpc.OnSyncPData;
import com.ford.syncV4.proxy.rpc.OnTBTClientState;
import com.ford.syncV4.proxy.rpc.OnVehicleData;
import com.ford.syncV4.proxy.rpc.PerformAudioPassThruResponse;
import com.ford.syncV4.proxy.rpc.PerformInteractionResponse;
import com.ford.syncV4.proxy.rpc.PutFileResponse;
import com.ford.syncV4.proxy.rpc.ReadDIDResponse;
import com.ford.syncV4.proxy.rpc.ResetGlobalPropertiesResponse;
import com.ford.syncV4.proxy.rpc.ScrollableMessageResponse;
import com.ford.syncV4.proxy.rpc.SetAppIconResponse;
import com.ford.syncV4.proxy.rpc.SetDisplayLayoutResponse;
import com.ford.syncV4.proxy.rpc.SetGlobalPropertiesResponse;
import com.ford.syncV4.proxy.rpc.SetMediaClockTimerResponse;
import com.ford.syncV4.proxy.rpc.ShowResponse;
import com.ford.syncV4.proxy.rpc.SliderResponse;
import com.ford.syncV4.proxy.rpc.SpeakResponse;
import com.ford.syncV4.proxy.rpc.SubscribeButtonResponse;
import com.ford.syncV4.proxy.rpc.SubscribeVehicleDataResponse;
import com.ford.syncV4.proxy.rpc.SyncPDataResponse;
import com.ford.syncV4.proxy.rpc.UnsubscribeButtonResponse;
import com.ford.syncV4.proxy.rpc.UnsubscribeVehicleDataResponse;
import com.ford.syncV4.proxy.rpc.enums.ButtonName;
import com.ford.syncV4.proxy.rpc.enums.HMILevel;
import com.ford.syncV4.proxy.rpc.enums.TextAlignment;
import com.ptrprograms.fordapplinkaudio.R;
import java.io.IOException;
/**
* Created by PaulTR on 5/31/14.
*/
public class AppLinkService extends Service implements IProxyListenerALM {
private static AppLinkService mInstance = null;
private MediaPlayer mPlayer = null;
private SyncProxyALM mProxy = null;
private int mCorrelationId = 0;
public static AppLinkService getInstance() {
return mInstance;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if( intent != null &&
BluetoothAdapter.getDefaultAdapter() != null &&
BluetoothAdapter.getDefaultAdapter().isEnabled() ) {
startProxy();
}
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
@Override
public void onDestroy() {
removeSyncProxy();
mInstance = null;
super.onDestroy();
}
private void removeSyncProxy() {
if( mProxy == null )
return;
try {
mProxy.dispose();
} catch( SyncException e ) {}
mProxy = null;
}
public void startProxy() {
if( mProxy == null ) {
try {
mProxy = new SyncProxyALM( this, getString( R.string.display_title ), true, getString( R.string.app_link_id ) );
} catch( SyncException e ) {
if( mProxy == null ) {
stopSelf();
}
}
}
}
public SyncProxyALM getProxy() {
return mProxy;
}
public void reset() {
if( mProxy != null ) {
try {
mProxy.resetProxy();
} catch( SyncException e ) {
if( mProxy == null )
stopSelf();
}
} else {
startProxy();
}
}
@Override
public void onOnHMIStatus(OnHMIStatus onHMIStatus) {
switch( onHMIStatus.getSystemContext() ) {
case SYSCTXT_MAIN:
case SYSCTXT_VRSESSION:
case SYSCTXT_MENU:
break;
default:
return;
}
switch( onHMIStatus.getAudioStreamingState() ) {
case AUDIBLE: {
playAudio();
break;
}
case NOT_AUDIBLE: {
stopAudio();
break;
}
}
if( mProxy == null )
return;
if( onHMIStatus.getHmiLevel().equals( HMILevel.HMI_FULL ) && onHMIStatus.getFirstRun() ) {
//setup app with SYNC
try {
mProxy.show( "Welcome to Paul's", "Ford AppLink Demo", TextAlignment.CENTERED, mCorrelationId++ );
} catch( SyncException e ) {}
subscribeToButtons();
}
}
private void playAudio() {
String url = "http://173.231.136.91:8060/";
if( mPlayer == null )
mPlayer = new MediaPlayer();
try {
mProxy.show("Loading...", "", TextAlignment.CENTERED, mCorrelationId++);
} catch( SyncException e ) {}
mPlayer.reset();
mPlayer.setAudioStreamType( AudioManager.STREAM_MUSIC );
try {
mPlayer.setDataSource(url);
mPlayer.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared( MediaPlayer mediaPlayer ) {
mediaPlayer.start();
try {
mProxy.show("Playing online audio", "", TextAlignment.CENTERED, mCorrelationId++);
} catch( SyncException e ) {}
}
});
mPlayer.prepare();
} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
}
private void stopAudio() {
if( mPlayer == null )
return;
mPlayer.pause();
try {
mProxy.show("Press OK", "to play audio", TextAlignment.CENTERED, mCorrelationId++);
} catch( SyncException e ) {}
}
private void subscribeToButtons() {
if( mProxy == null )
return;
try {
mProxy.subscribeButton( ButtonName.OK, mCorrelationId++ );
} catch( SyncException e ) {}
}
@Override
public void onOnButtonPress(OnButtonPress notification) {
if( ButtonName.OK == notification.getButtonName() ) {
if( mPlayer != null ) {
if( mPlayer.isPlaying() ) {
stopAudio();
} else {
playAudio();
}
}
}
}
@Override
public void onProxyClosed(String s, Exception e) {
SyncException syncException = (SyncException) e;
if( syncException.getSyncExceptionCause() != SyncExceptionCause.SYNC_PROXY_CYCLED &&
syncException.getSyncExceptionCause() != SyncExceptionCause.BLUETOOTH_DISABLED ) {
reset();
}
}
@Override
public void onError(String s, Exception e) {
}
@Override
public void onGenericResponse(GenericResponse genericResponse) {
}
@Override
public void onOnCommand(OnCommand onCommand) {
}
@Override
public void onAddCommandResponse(AddCommandResponse addCommandResponse) {
}
@Override
public void onAddSubMenuResponse(AddSubMenuResponse addSubMenuResponse) {
}
@Override
public void onCreateInteractionChoiceSetResponse(CreateInteractionChoiceSetResponse createInteractionChoiceSetResponse) {
}
@Override
public void onAlertResponse(AlertResponse alertResponse) {
}
@Override
public void onDeleteCommandResponse(DeleteCommandResponse deleteCommandResponse) {
}
@Override
public void onDeleteInteractionChoiceSetResponse(DeleteInteractionChoiceSetResponse deleteInteractionChoiceSetResponse) {
}
@Override
public void onDeleteSubMenuResponse(DeleteSubMenuResponse deleteSubMenuResponse) {
}
@Override
public void onPerformInteractionResponse(PerformInteractionResponse performInteractionResponse) {
}
@Override
public void onResetGlobalPropertiesResponse(ResetGlobalPropertiesResponse resetGlobalPropertiesResponse) {
}
@Override
public void onSetGlobalPropertiesResponse(SetGlobalPropertiesResponse setGlobalPropertiesResponse) {
}
@Override
public void onSetMediaClockTimerResponse(SetMediaClockTimerResponse setMediaClockTimerResponse) {
}
@Override
public void onShowResponse(ShowResponse showResponse) {
}
@Override
public void onSpeakResponse(SpeakResponse speakResponse) {
}
@Override
public void onOnButtonEvent(OnButtonEvent onButtonEvent) {
}
@Override
public void onSubscribeButtonResponse(SubscribeButtonResponse subscribeButtonResponse) {
}
@Override
public void onUnsubscribeButtonResponse(UnsubscribeButtonResponse unsubscribeButtonResponse) {
}
@Override
public void onOnPermissionsChange(OnPermissionsChange onPermissionsChange) {
}
@Override
public void onSubscribeVehicleDataResponse(SubscribeVehicleDataResponse subscribeVehicleDataResponse) {
}
@Override
public void onUnsubscribeVehicleDataResponse(UnsubscribeVehicleDataResponse unsubscribeVehicleDataResponse) {
}
@Override
public void onGetVehicleDataResponse(GetVehicleDataResponse getVehicleDataResponse) {
}
@Override
public void onReadDIDResponse(ReadDIDResponse readDIDResponse) {
}
@Override
public void onGetDTCsResponse(GetDTCsResponse getDTCsResponse) {
}
@Override
public void onOnVehicleData(OnVehicleData onVehicleData) {
}
@Override
public void onPerformAudioPassThruResponse(PerformAudioPassThruResponse performAudioPassThruResponse) {
}
@Override
public void onEndAudioPassThruResponse(EndAudioPassThruResponse endAudioPassThruResponse) {
}
@Override
public void onOnAudioPassThru(OnAudioPassThru onAudioPassThru) {
}
@Override
public void onPutFileResponse(PutFileResponse putFileResponse) {
}
@Override
public void onDeleteFileResponse(DeleteFileResponse deleteFileResponse) {
}
@Override
public void onListFilesResponse(ListFilesResponse listFilesResponse) {
}
@Override
public void onSetAppIconResponse(SetAppIconResponse setAppIconResponse) {
}
@Override
public void onScrollableMessageResponse(ScrollableMessageResponse scrollableMessageResponse) {
}
@Override
public void onChangeRegistrationResponse(ChangeRegistrationResponse changeRegistrationResponse) {
}
@Override
public void onSetDisplayLayoutResponse(SetDisplayLayoutResponse setDisplayLayoutResponse) {
}
@Override
public void onOnLanguageChange(OnLanguageChange onLanguageChange) {
}
@Override
public void onSliderResponse(SliderResponse sliderResponse) {
}
@Override
public void onOnDriverDistraction(OnDriverDistraction onDriverDistraction) {
}
@Override
public void onEncodedSyncPDataResponse(EncodedSyncPDataResponse encodedSyncPDataResponse) {
}
@Override
public void onSyncPDataResponse(SyncPDataResponse syncPDataResponse) {
}
@Override
public void onOnEncodedSyncPData(OnEncodedSyncPData onEncodedSyncPData) {
}
@Override
public void onOnSyncPData(OnSyncPData onSyncPData) {
}
@Override
public void onOnTBTClientState(OnTBTClientState onTBTClientState) {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}