diff --git a/.idea/misc.xml b/.idea/misc.xml
index 707ee6e613..2dc54c489f 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
+ * 描述 + */ +@Route( path = MogoServicePaths.PATH_LAUNCHER_API ) +public class MogoLauncher implements IMogoLauncher { + + @Override + public void backToLauncher( Context context ) { + BackToMainHomeManager.backToLauncher(); + } + + @Override + public void init( Context context ) { + + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index d3fff9286e..05002b2998 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -1,6 +1,7 @@ package com.mogo.module.service; +import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -8,8 +9,10 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; +import android.os.Process; import android.os.Trace; import android.text.TextUtils; +import android.util.Log; import android.view.MotionEvent; import androidx.annotation.NonNull; @@ -23,6 +26,7 @@ import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.location.MogoLocation; import com.mogo.map.model.MogoPoi; import com.mogo.map.navi.IMogoAimlessModeListener; +import com.mogo.map.navi.IMogoNavi; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.map.navi.MogoCongestionInfo; import com.mogo.map.navi.MogoNaviInfo; @@ -31,6 +35,7 @@ import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; +import com.mogo.module.service.carinfo.CarStateInfo; import com.mogo.module.service.marker.MapMarkerManager; import com.mogo.module.service.network.RefreshCallback; import com.mogo.module.service.network.RefreshModel; @@ -40,9 +45,12 @@ import com.mogo.module.service.refresh.CustomRefreshStrategy; import com.mogo.module.service.refresh.RefreshObject; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; +import com.mogo.service.adas.IMogoADASController; import com.mogo.service.cardmanager.IMogoCardManager; +import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.intent.IMogoIntentManager; +import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoRegisterCenter; @@ -50,7 +58,9 @@ import com.mogo.service.module.MogoAction; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.statusmanager.StatusDescriptor; +import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.utils.GsonUtil; import org.json.JSONException; import org.json.JSONObject; @@ -133,6 +143,10 @@ public class MogoServices implements IMogoMapListener, private IMogoStatusManager mStatusManager; private IMogoIntentManager mIntentManager; private IMogoActionManager mActionManager; + private IMogoADASController mADASController; + private IMogoLauncher mLauncher; + private IMogoFragmentManager mFragmentManager; + private IMogoNavi mNavi; /** * 地图视图初始化 @@ -258,6 +272,7 @@ public class MogoServices implements IMogoMapListener, IMogoServiceApis apis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation(); mMogoMapService = apis.getMapServiceApi(); mUiController = mMogoMapService.getMapUIController(); + mNavi = mMogoMapService.getNavi( context ); mStatusManager = apis.getStatusManagerApi(); mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, this ); mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, this ); @@ -285,7 +300,13 @@ public class MogoServices implements IMogoMapListener, mIntentManager.registerIntentListener( ServiceConst.COMMAND_NEXT, this ); mIntentManager.registerIntentListener( ServiceConst.COMMAND_PREVIOUS, this ); mIntentManager.registerIntentListener( ServiceConst.COMMAND_SWITCH_CARD, this ); + mIntentManager.registerIntentListener( MogoReceiver.ACTION_ADAS_STATUS, this ); + mIntentManager.registerIntentListener( ServiceConst.COMMAND_OPERATION, this ); + mADASController = apis.getAdasControllerApi(); + mLauncher = apis.getLauncherApi(); + mFragmentManager = apis.getFragmentManagerApi(); + mCardManager = apis.getCardManagerApi(); initWorkThread(); } @@ -341,6 +362,7 @@ public class MogoServices implements IMogoMapListener, filter.addAction( Intent.ACTION_POWER_DISCONNECTED ); // 小智语音 filter.addAction( MogoReceiver.ACTION_VOICE_UI ); + filter.addAction( MogoReceiver.ACTION_ADAS_STATUS ); try { context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter ); Logger.i( TAG, "register voice receiver." ); @@ -642,7 +664,7 @@ public class MogoServices implements IMogoMapListener, stopAutoRefreshStrategy(); mRefreshRemainingTime = time; long delay = ServiceConst.DECREASE_INTERVAL; - if( mRefreshRemainingTime < ServiceConst.DECREASE_INTERVAL ){ + if ( mRefreshRemainingTime < ServiceConst.DECREASE_INTERVAL ) { delay = mRefreshRemainingTime; } mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, delay ); @@ -733,11 +755,33 @@ public class MogoServices implements IMogoMapListener, JSONObject jsonObject = new JSONObject( data ); String card = jsonObject.getString( "card" ); if ( TextUtils.equals( "多媒体", card ) ) { - mCardManager.switch2( ServiceConst.CARD_TYPE_SHARE_MUSIC, true ); + switchCard2( ServiceConst.CARD_TYPE_SHARE_MUSIC ); } else if ( TextUtils.equals( "探路", card ) ) { - mCardManager.switch2( ServiceConst.CARD_TYPE_ROAD_CONDITION, true ); + switchCard2( ServiceConst.CARD_TYPE_ROAD_CONDITION ); } else if ( TextUtils.equals( "在线车辆", card ) ) { - mCardManager.switch2( ServiceConst.CARD_TYPE_USER_DATA, true ); + switchCard2( ServiceConst.CARD_TYPE_USER_DATA ); + } + } catch ( JSONException e ) { + e.printStackTrace(); + } + } else if ( MogoReceiver.ACTION_ADAS_STATUS.equals( command ) ) { + String msg = intent.getStringExtra( "adasMsg" ); + if ( TextUtils.isEmpty( msg ) ) { + return; + } + CarStateInfo stateInfo = GsonUtil.objectFromJson( msg, CarStateInfo.class ); + if ( stateInfo != null ) { + changeCarHeadstockDirection( stateInfo.getValues().getHeading() ); + } + } else if ( ServiceConst.COMMAND_OPERATION.equals( command ) ) { + try { + JSONObject object = new JSONObject( intent.getStringExtra( "data" ) ); + String app = object.optString( "object" ); + String operation = object.optString( "operation" ); + if ( TextUtils.equals( app, "车聊聊" ) ) { + if ( TextUtils.equals( "打开", operation ) ) { + switchCard2( ServiceConst.CARD_TYPE_CARS_CHATTING ); + } } } catch ( JSONException e ) { e.printStackTrace(); @@ -745,6 +789,63 @@ public class MogoServices implements IMogoMapListener, } } + /** + * 切换卡片 + * + * @param card + */ + private void switchCard2( String card ) { + if ( isBackground( mContext ) ) { + mLauncher.backToLauncher( mContext ); + UiThreadHandler.postDelayed( () -> { + if ( mStatusManager.isADASShow() ) { + mADASController.closeADAS(); + } + mCardManager.switch2( card, true ); + }, 2000L ); + } else { + mFragmentManager.clearAll(); + if ( mStatusManager.isADASShow() ) { + mADASController.closeADAS(); + } + mCardManager.switch2( card, true ); + } + } + + private boolean isBackground( Context context ) { + ActivityManager activityManager = ( ActivityManager ) context.getSystemService( Context.ACTIVITY_SERVICE ); + List< ActivityManager.RunningAppProcessInfo > appProcesses = activityManager.getRunningAppProcesses(); + for ( ActivityManager.RunningAppProcessInfo appProcess : appProcesses ) { + if ( appProcess.processName.equals( context.getPackageName() ) ) { + if ( appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND ) { + return true; + } else { + return false; + } + } + } + return false; + } + + private void changeCarHeadstockDirection( double degree ) { + if ( mNavi.isNaviing() ) { + return; + } + if ( mStatusManager.isSearchUIShow() ) { + return; + } + if ( !mStatusManager.isMainPageOnResume() ) { + return; + } + if ( mUiController.getCurrentUiMode() != EnumMapUI.NorthUP_2D ) { + return; + } + mUiController.showMyLocation( ( ( float ) degree ) ); + } + + /** + * 注册桌面免唤醒指令 + */ private void registerInternalUnWakeupWords() { if ( mInternalUnWakeupRegisterStatus ) { return; @@ -754,6 +855,9 @@ public class MogoServices implements IMogoMapListener, AIAssist.getInstance( mContext ).registerUnWakeupCommand( ServiceConst.CMD_UN_WAKE_NEXT, ServiceConst.CMD_UN_WAKE_NEXT_UN_WAKE_WORDS, this ); } + /** + * 注销桌面免唤醒指令 + */ private void unregisterInternalUnWakeupWords() { if ( !mInternalUnWakeupRegisterStatus ) { return; diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java index 060644273d..dab396648e 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java @@ -132,5 +132,10 @@ public class ServiceConst { */ public static final String COMMAND_SWITCH_CARD = "com.zhidao.desk.switchCard"; + /** + * 打开/关闭车聊聊 + */ + public static final String COMMAND_OPERATION = "system.application.operation"; + } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/carinfo/CarStateInfo.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/carinfo/CarStateInfo.java new file mode 100644 index 0000000000..1e2d9efe45 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/carinfo/CarStateInfo.java @@ -0,0 +1,122 @@ +package com.mogo.module.service.carinfo; + +import java.io.Serializable; + +/** + * @author nie yunlong + * @des 车辆状态 + * @date 2020/3/12 + */ +public class CarStateInfo implements Serializable { + + + /** + * action : “state” + * values : {"lon":116.8,"lat":39.4,"alt":22.3,"heading":87.5,"acceleration":0.5,"yaw_rate":0.3} + */ + + private String action; + private ValuesBean values; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public ValuesBean getValues() { + return values; + } + + public void setValues(ValuesBean values) { + this.values = values; + } + + public static class ValuesBean { + /** + * lon : 116.8 + * lat : 39.4 + * alt : 22.3 + * heading : 87.5 + * acceleration : 0.5 + * yaw_rate : 0.3 + */ + + private double lon; + private double lat; + private double alt; + private double heading; + private double acceleration; + private double yaw_rate; + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getAlt() { + return alt; + } + + public void setAlt(double alt) { + this.alt = alt; + } + + public double getHeading() { + return heading; + } + + public void setHeading(double heading) { + this.heading = heading; + } + + public double getAcceleration() { + return acceleration; + } + + public void setAcceleration(double acceleration) { + this.acceleration = acceleration; + } + + public double getYaw_rate() { + return yaw_rate; + } + + public void setYaw_rate(double yaw_rate) { + this.yaw_rate = yaw_rate; + } + + @Override + public String toString() { + return "ValuesBean{" + + "lon=" + lon + + ", lat=" + lat + + ", alt=" + alt + + ", heading=" + heading + + ", acceleration=" + acceleration + + ", yaw_rate=" + yaw_rate + + '}'; + } + } + + @Override + public String toString() { + return "CarStateInfo{" + + "action='" + action + '\'' + + ", values=" + values + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataHandler.java index 7421c475fe..5df430623a 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataHandler.java @@ -1,9 +1,9 @@ package com.mogo.module.service.datamanager; +import android.content.Context; import android.text.TextUtils; -import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.service.MogoServicePaths; +import com.mogo.service.datamanager.IMogoDataChanged2Listener; import com.mogo.service.datamanager.IMogoDataChangedListener; import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.utils.logger.Logger; @@ -20,7 +20,7 @@ import java.util.Map; *
* 描述 */ -public class MogoDataHandler { +public class MogoDataHandler implements IMogoDataManager { private static final String TAG = "MogoDataHandler"; @@ -43,7 +43,7 @@ public class MogoDataHandler { return; } if ( !mListeners.containsKey( tag ) || mListeners.get( tag ) == null ) { - mListeners.put( tag, new ArrayList< IMogoDataChangedListener >() ); + mListeners.put( tag, new ArrayList<>() ); } mListeners.get( tag ).add( listener ); } @@ -57,6 +57,47 @@ public class MogoDataHandler { } } + @Override + public void removeDataFrom( String module, Object object ) { + if ( module == null || mListeners.get( module ) == null ) { + return; + } + try { + Iterator< IMogoDataChangedListener > iterator = mListeners.get( module ).iterator(); + while ( iterator.hasNext() ) { + IMogoDataChangedListener listener = iterator.next(); + if ( listener instanceof IMogoDataChanged2Listener ) { + ( ( IMogoDataChanged2Listener ) listener ).onDataRemoved( module, object ); + } + } + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + } + + @Override + public void addData2( String module, Object object ) { + if ( module == null || mListeners.get( module ) == null ) { + return; + } + try { + Iterator< IMogoDataChangedListener > iterator = mListeners.get( module ).iterator(); + while ( iterator.hasNext() ) { + IMogoDataChangedListener listener = iterator.next(); + if ( listener instanceof IMogoDataChanged2Listener ) { + ( ( IMogoDataChanged2Listener ) listener ).onDataAdded( module, object ); + } + } + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + } + + @Override + public void init( Context context ) { + + } + public void invoke( String tag, Object data ) { if ( tag == null || mListeners.get( tag ) == null ) { return; @@ -69,8 +110,8 @@ public class MogoDataHandler { listener.onDataSetChanged( data ); } } - } catch( Exception e ){ - Logger.e(TAG, e, "error."); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataManager.java index e94071aeb2..5466194947 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/datamanager/MogoDataManager.java @@ -27,7 +27,17 @@ public class MogoDataManager implements IMogoDataManager { } @Override - public void init( Context context ) { + public void addData2( String module, Object object ) { + MogoDataHandler.getInstance().addData2( module, object ); + } + @Override + public void removeDataFrom( String module, Object object ) { + MogoDataHandler.getInstance().removeDataFrom( module, object ); + } + + @Override + public void init( Context context ) { + MogoDataHandler.getInstance().init( context ); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/MogoReceiver.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/MogoReceiver.java index 74020aaa14..b608024bbb 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/MogoReceiver.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/MogoReceiver.java @@ -45,6 +45,11 @@ public class MogoReceiver extends BroadcastReceiver { public static final String VALUE_DISMISS = "dismiss"; public static final String VALUE_SHOW = "show"; + /** + * 从 adas 同步过来的信息 + */ + public static final String ACTION_ADAS_STATUS = "com.zhidao.autopilot.adas.msg"; + private IMogoIntentManager mMogoIntentManager; public MogoReceiver( Context context ) { diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index c113db6fa8..829f3c866b 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -11,6 +11,7 @@ import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.imageloader.IMogoImageloader; import com.mogo.service.intent.IMogoIntentManager; +import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -158,7 +159,15 @@ public interface IMogoServiceApis extends IProvider { /** * 地址操作 + * * @return */ IMogoAddressManager getAddressManagerApi(); + + /** + * 桌面控制接口 + * + * @return + */ + IMogoLauncher getLauncherApi(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java index d27abc5ce7..c422f05b1a 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java @@ -153,5 +153,11 @@ public class MogoServicePaths { * 刷新策略控制 */ @Deprecated - public static final String PATH_REFRESH_STRATEGY_API = "refreshstrategy/api"; + public static final String PATH_REFRESH_STRATEGY_API = "/refreshstrategy/api"; + + /** + * 刷新策略控制 + */ + @Deprecated + public static final String PATH_LAUNCHER_API = "/launcher/api"; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataChanged2Listener.java b/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataChanged2Listener.java new file mode 100644 index 0000000000..eaa7f4cb5a --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataChanged2Listener.java @@ -0,0 +1,26 @@ +package com.mogo.service.datamanager; + +/** + * @author congtaowang + * @since 2020-02-11 + *
+ * 描述 + */ +public interface IMogoDataChanged2Listener extends IMogoDataChangedListener { + + /** + * 添加数据到指定类型 + * + * @param module + * @param object + */ + void onDataAdded( String module, Object object ); + + /** + * 从数据从指定类型中移除 + * + * @param module + * @param object + */ + void onDataRemoved( String module, Object object ); +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataManager.java index ce42987763..b6fd635ccf 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/datamanager/IMogoDataManager.java @@ -13,15 +13,31 @@ public interface IMogoDataManager extends IProvider { /** * 注册大而全数据变化监听 * - * @param tag 监听模块 + * @param module 监听模块 * @param listener */ - void registerDataListener( String tag, IMogoDataChangedListener listener ); + void registerDataListener( String module, IMogoDataChangedListener listener ); /** * 注销大而全数据变换监听 * - * @param tag + * @param module */ - void unregisterListener( String tag , IMogoDataChangedListener listener); + void unregisterListener( String module, IMogoDataChangedListener listener ); + + /** + * 发送数据到指定模块 + * + * @param module 模块 + * @param object 数据 + */ + void addData2( String module, Object object ); + + /** + * 自定模块删除数据 + * + * @param module 模块 + * @param object 数据 + */ + void removeDataFrom( String module, Object object ); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/launcher/IMogoLauncher.java b/services/mogo-service-api/src/main/java/com/mogo/service/launcher/IMogoLauncher.java new file mode 100644 index 0000000000..a5a03ae9b5 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/launcher/IMogoLauncher.java @@ -0,0 +1,21 @@ +package com.mogo.service.launcher; + +import android.content.Context; + +import com.alibaba.android.arouter.facade.template.IProvider; + +/** + * @author congtaowang + * @since 2020-03-16 + *
+ * 桌面控制器 + */ +public interface IMogoLauncher extends IProvider { + + /** + * 返回桌面主页 + * + * @param context + */ + void backToLauncher( Context context ); +} diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index 8edffef86e..b23dddd85a 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -20,6 +20,7 @@ import com.mogo.service.impl.imageloader.glide.GlideImageLoader; import com.mogo.service.impl.intent.IntentManager; import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.intent.IMogoIntentManager; +import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -147,6 +148,11 @@ public class MogoServiceApis implements IMogoServiceApis { return getApiInstance( IMogoAddressManager.class, MogoServicePaths.PATH_ADDRESS_MANAGER ); } + @Override + public IMogoLauncher getLauncherApi() { + return getApiInstance( IMogoLauncher.class, MogoServicePaths.PATH_LAUNCHER_API ); + } + private static < T extends IProvider > T getApiInstance( Class< T > clazz, String path ) { T inst = SingletonsHolder.get( clazz ); if ( inst == null ) {