This commit is contained in:
wangcongtao
2020-05-15 10:45:11 +08:00
parent 4a59ebb301
commit 9e11eecc2e
49 changed files with 430 additions and 1433 deletions

View File

@@ -1,37 +1,20 @@
package com.mogo.module.apps;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.module.apps.adapter.AppIndicatorAdapter;
import com.mogo.module.apps.adapter.base.RecycleViewHolder;
import com.mogo.module.apps.model.NavigatorApp;
import com.mogo.module.apps.applaunch.AppLauncher;
import com.mogo.module.apps.applaunch.BaseAppLauncher;
import com.mogo.module.apps.applaunch.InternalFunctionLauncher;
import com.mogo.module.apps.model.NavigatorApps;
import com.mogo.module.apps.utils.CardScaleTransformer;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.cardmanager.IMogoCardChangedListener;
import com.mogo.service.fragmentmanager.FragmentDescriptor;
import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.logger.Logger;
import com.yarolegovich.discretescrollview.DiscreteScrollLayoutManager;
import com.yarolegovich.discretescrollview.DiscreteScrollView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -40,27 +23,14 @@ import java.util.Map;
* <p>
* 描述
*/
public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavigatorPresenter>
implements AppNavigatorView, DiscreteScrollView.OnItemChangedListener<RecycleViewHolder>,
DiscreteScrollView.ScrollStateChangeListener<RecycleViewHolder>,
IMogoCardChangedListener {
public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavigatorPresenter > implements AppNavigatorView {
private static final String TAG = "AppNavigatorFragment";
private View mApps;
private IMogoFragmentManager mMogoFragmentManager;
List<NavigatorApp> apps;
private RecyclerView mNavigatorAppsList;
private AppIndicatorAdapter mAppIndicatorAdapter;
/**
* 搜索莫模块
*/
private IMogoModuleProvider mSearchProvider;
private IMogoAnalytics mMogoAnalytics;
// private DiscreteScrollView scroller;
private static int CARD_SIZE = 6;
private AppIndicatorAdapter appIndicatorAdapter;
private BaseAppLauncher mLauncher;
@Override
protected int getLayoutId() {
@@ -69,228 +39,49 @@ public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavig
@Override
protected void initViews() {
// mApps.setOnClickListener( view -> {
// openAppsPanel();
// trackNavigatorClickEvent( 4 );
// } );
mLauncher = new InternalFunctionLauncher( getActivity() );
mLauncher.setNext( new AppLauncher() );
mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
.build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
.navigation();
mApps = findViewById(R.id.module_apps_id_apps);
// scroller = findViewById(R.id.module_apps_id_scroller);
//
// scroller.setRatio(330 / 523F);
// //scroller.setRatio(176/279F);
// scroller.setSlideOnFling(true);
// scroller.addOnItemChangedListener(this);
// scroller.addScrollStateChangeListener(this);
// //scroller.setItemTransitionTimeMillis(DiscreteScrollViewOptions.getTransitionTime());
// apps = NavigatorApps.getApps();
// CARD_SIZE = apps.size();
// scroller.setItemTransformer(new CardScaleTransformer.Builder()
// .setMinScale(0.84f)
// .build());
appIndicatorAdapter = new AppIndicatorAdapter(getContext(), apps);
appIndicatorAdapter.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
NavigatorApp item = (NavigatorApp) v.getTag();
AppServiceHandler.getMogoCardManager().switch2(item.mModuleType);
}
});
// scroller.setAdapter(appIndicatorAdapter);
// scroller.scrollToPosition(Integer.MAX_VALUE / 2 - 1);
//mNavigation.setOnClickListener( view -> {
// openSearchPanel();
// trackNavigatorClickEvent( 1 );
//} );
//mMediaCenter.setOnClickListener( view -> {
// try {
// LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC );
// trackNavigatorClickEvent( 2 );
// } catch ( Exception e ) {
// TipToast.shortTip( R.string.module_apps_str_no_app );
// }
//} );
//mCarSettings.setOnClickListener( view -> {
// try {
// LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS );
// trackNavigatorClickEvent( 3 );
// } catch ( Exception e ) {
// TipToast.shortTip( R.string.module_apps_str_no_app );
// }
//} );
mApps.setOnClickListener(view -> {
openAppsPanel();
//AppServiceHandler.getMogoCardManager()
// .switch2(apps.get((int) (Math.random() * 6)).mModuleType);
trackNavigatorClickEvent(4);
});
AppServiceHandler.init(getContext());
AppServiceHandler.getMogoCardManager().registerCardChangedListener(TAG, this);
}
private void scrollToCenter(int index) {
mNavigatorAppsList = findViewById( R.id.module_apps_id_apps_list );
mNavigatorAppsList.setLayoutManager( new LinearLayoutManager( getActivity(), RecyclerView.VERTICAL, false ) );
mAppIndicatorAdapter = new AppIndicatorAdapter( getContext(), NavigatorApps.getApps() );
mAppIndicatorAdapter.setOnItemClickedListener( ( data, position ) -> {
mLauncher.launch( getContext(), data );
} );
mNavigatorAppsList.setAdapter( mAppIndicatorAdapter );
}
@NonNull
@Override
protected AppNavigatorPresenter createPresenter() {
return new AppNavigatorPresenter(this);
return new AppNavigatorPresenter( this );
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
.build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
.navigation(getContext());
mMogoAnalytics = (IMogoAnalytics) ARouter.getInstance()
.build(MogoServicePaths.PATH_UTILS_ANALYTICS)
.navigation(getContext());
public void onActivityCreated( @Nullable Bundle savedInstanceState ) {
super.onActivityCreated( savedInstanceState );
}
@Override
public void openAppsPanel() {
AppsListActivity.start(getActivity());
AppsListActivity.start( getActivity() );
}
private void trackNavigatorClickEvent(int type) {
final Map<String, Object> properties = new HashMap<>();
properties.put("type", type);
mMogoAnalytics.track("Launcher_APP_Icon", properties);
private void trackNavigatorClickEvent( int type ) {
final Map< String, Object > properties = new HashMap<>();
properties.put( "type", type );
AppServiceHandler.getMogoAnalytics().track( "Launcher_APP_Icon", properties );
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mPresenter != null) {
mPresenter.onDestroy(getViewLifecycleOwner());
if ( mPresenter != null ) {
mPresenter.onDestroy( getViewLifecycleOwner() );
}
}
@Override
public void onCurrentItemChanged(@Nullable RecycleViewHolder viewHolder, int i) {
Logger.d(TAG, "onCurrentItemChanged--position--" + i % CARD_SIZE);
int currentPosition = (i - 2) % CARD_SIZE;
//if (!scroller.isComputingLayout()) {
// appIndicatorAdapter.setCurrentPos(i);
//}
//this.currentPosition=currentPosition;
AppServiceHandler.getMogoCardManager().switch2(apps.get(i % CARD_SIZE).mModuleType, true);
//holder.showText();
//ImageView view = viewHolder.getView(R.id.module_apps_id_app_icon);
//view.setImageResource(apps.get(currentPosition).getmIconId());
//
//TextView tvTitle = viewHolder.getView(R.id.module_apps_id_app_name);
//tvTitle.setTextColor(getResources().getColor(R.color.white));
}
@Override public void onScrollStart(@NonNull RecycleViewHolder viewHolder, int i) {
int currentPosition = i % CARD_SIZE - 2;
//
//ImageView view = viewHolder.getView(R.id.module_apps_id_app_icon);
//
//
//view.setImageResource(apps.get(currentPosition).mUncheckedIconId);
//TextView tvTitle = viewHolder.getView(R.id.module_apps_id_app_name);
//tvTitle.setTextColor(getResources().getColor(R.color.white_80));
}
@Override public void onScrollEnd(@NonNull RecycleViewHolder viewHolder, int i) {
}
@Override
public void onScroll(float v, int i, int i1, @Nullable RecycleViewHolder viewHolder,
@Nullable RecycleViewHolder t1) {
}
//private int currentPosition = 0;
@Override public void onSwitched(int position, String moduleName) {
//int index = (position - scroller.getCurrentItem() % CARD_SIZE + 2) % CARD_SIZE;
//int i = scroller.getCurrentItem() + index;
// DiscreteScrollLayoutManager layoutManager =
// (DiscreteScrollLayoutManager) scroller.getLayoutManager();
//
// int currentPosition = (scroller.getCurrentItem() - 2) % CARD_SIZE;
//
// int index = position - currentPosition;
//
// if (index == 0) {
// return;
// }
// if (index <= -3) {
// index += CARD_SIZE;
// } else if (index >= 3) {
// index = index - CARD_SIZE;
// }
// //RecyclerView 的特性,如果是否在屏幕内
// //if (index < 0) {
// // index -= 2;
// //}
//
// Logger.d(TAG, "position--"
// + position
// + "index--"
// + index
// + "scroll-->"
// + scroller.getCurrentItem()
// + index);
//
// //scroller.setPendingScroll(getResources().getDimensionPixelSize(R.dimen.dp_137)*index);
// //layoutManager.scrollToPositionWithOffset(scroller.getCurrentItem() + index,0);
// //scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137)*index,0);
//
// if (Math.abs(index) == 1) {
// scroller.smoothScrollBy(getResources().getDimensionPixelSize(R.dimen.dp_137) * index,
// 0, null, 10);
// } else {
// layoutManager.startSmoothPendingScroll(layoutManager.getCurrentPosition() + index);
// }
//layoutManager.smoothScrollToPosition(scroller.getCurrentItem() + index);
//currentPosition = position;
}
private void printIds(View view) {
System.out.println(view.getId());
if (view instanceof ViewGroup) {
int childCount = ((ViewGroup) view).getChildCount();
for (int i = 0; i < childCount; i++) {
printIds(((ViewGroup) view).getChildAt(i));
}
}
}
private void print(View view) {
ArrayList<View> views = new ArrayList<>();
views.add(view);
while (views.size() > 0) {
System.out.println(view.getId());
View remove = views.remove(0);
if (remove instanceof ViewGroup) {
int childCount = ((ViewGroup) view).getChildCount();
for (int i = 0; i < childCount; i++) {
views.add(((ViewGroup) view).getChildAt(i));
}
}
}
}
}

View File

@@ -40,8 +40,8 @@ public class AppNavigatorPresenter extends Presenter< AppNavigatorView > impleme
@Override
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
mIntentManager = ( IMogoIntentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_INTENT_MANAGER ).navigation( getContext() );
mMogoStatusManager = ( IMogoStatusManager ) ARouter.getInstance().build( MogoServicePaths.PATH_STATUS_MANAGER ).navigation( getContext() );
mIntentManager = AppServiceHandler.getApis().getIntentManagerApi();
mMogoStatusManager = AppServiceHandler.getApis().getStatusManagerApi();
// 预加载应用列表,空间换时间
AppsModel.getInstance( getContext() ).load( null );
}
@@ -68,6 +68,7 @@ public class AppNavigatorPresenter extends Presenter< AppNavigatorView > impleme
return;
}
try {
AppServiceHandler.getApis().getAdasControllerApi().closeADAS();
JSONObject object = new JSONObject( intent.getStringExtra( "data" ) );
String app = object.optString( "object" );
String operation = object.optString( "operation" );

View File

@@ -1,7 +1,9 @@
package com.mogo.module.apps;
import android.content.Context;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.navi.IMogoNavi;
@@ -27,6 +29,7 @@ import com.mogo.service.statusmanager.IMogoStatusManager;
* version: 1.0
*/
public class AppServiceHandler {
private static final String TAG = "AppServiceHandler";
private static IMogoServiceApis mApis;
@@ -34,17 +37,18 @@ public class AppServiceHandler {
private static IMogoAnalytics mMogoAnalytics;
private static IGuideShowProvider mMogoGuideShow;
public static void init( final Context context ) {
mApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( context );
mMogoCardManager = mApis.getCardManagerApi();
mMogoAnalytics = mApis.getAnalyticsApi();
mMogoGuideShow = (IGuideShowProvider) ARouter.getInstance().build(GuideShowProviderConstant.GUIDE_SHOW_PROVIDER).navigation(context);
mMogoGuideShow = ( IGuideShowProvider ) ARouter.getInstance().build( GuideShowProviderConstant.GUIDE_SHOW_PROVIDER ).navigation( context );
}
public static IMogoCardManager getMogoCardManager() {
return mMogoCardManager;
}
public static IMogoAnalytics getMogoAnalytics() {
return mMogoAnalytics;
}
@@ -52,4 +56,11 @@ public class AppServiceHandler {
public static IGuideShowProvider getMogoGuideShow() {
return mMogoGuideShow;
}
public static IMogoServiceApis getApis() {
if ( mApis == null ) {
mApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( AbsMogoApplication.getApp() );
}
return mApis;
}
}

View File

@@ -74,7 +74,7 @@ public class AppsFragmentProvider implements IMogoModuleProvider {
@Override
public void init( Context context ) {
AppServiceHandler.init( context );
}
@Override

View File

@@ -6,6 +6,7 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.mvp.Presenter;
import com.mogo.module.apps.applaunch.AppLaunchFilter;
import com.mogo.module.apps.applaunch.AppLauncher;
@@ -36,7 +37,7 @@ import java.util.Set;
* <p>
* 描述
*/
public class AppsPresenter extends Presenter<AppsView> {
public class AppsPresenter extends Presenter< AppsView > {
private static final String TAG = "AppsPresenter";
@@ -48,61 +49,62 @@ public class AppsPresenter extends Presenter<AppsView> {
private IMogoCardManager mCardManager;
private IMogoStatusManager mMogoStatusManager;
public AppsPresenter(AppsView view) {
super(view);
mApis = (IMogoServiceApis)ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation(getContext());
public AppsPresenter( AppsView view ) {
super( view );
mApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( getContext() );
mCardManager = mApis.getCardManagerApi();
CardAppLauncher cardAppLauncher = new CardAppLauncher(this, mCardManager);
GuideShowLauncher guideShowLauncher = new GuideShowLauncher(mApis.getMapServiceApi().getNavi( getContext() ));
cardAppLauncher.setNext(guideShowLauncher);
guideShowLauncher.setNext(new AppLauncher());
CardAppLauncher cardAppLauncher = new CardAppLauncher( this, mCardManager );
GuideShowLauncher guideShowLauncher = new GuideShowLauncher( mApis.getMapServiceApi().getNavi( getContext() ) );
cardAppLauncher.setNext( guideShowLauncher );
guideShowLauncher.setNext( new AppLauncher() );
mLauncher = cardAppLauncher;
}
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
renderAppsList();
AppsListChangedLiveData.getInstance().observeForever(bool -> {
if (mView != null) {
AppsListChangedLiveData.getInstance().observeForever( bool -> {
if ( mView != null ) {
renderAppsList();
}
});
} );
mAnalytics = mApis.getAnalyticsApi();
mMogoStatusManager = mApis.getStatusManagerApi();
mMogoStatusManager.setAppListUIShow(TAG, true);
mMogoStatusManager.setAppListUIShow( TAG, true );
}
private void renderAppsList() {
ThreadPoolService.execute(() -> {
AppsModel.getInstance(getContext()).load(appInfoList -> {
ThreadPoolService.execute( () -> {
AppsModel.getInstance( getContext() ).load( appInfoList -> {
Logger.d(TAG, "apps: %s", appInfoList);
final Map<Integer, List<AppInfo>> result = addOthersEntrances( appInfoList );
UiThreadHandler.post(() -> {
if (mView != null) {
Logger.d( TAG, "apps: %s", appInfoList );
final Map< Integer, List< AppInfo > > result = addOthersEntrances( appInfoList );
UiThreadHandler.post( () -> {
if ( mView != null ) {
mView.renderApps( result );
}
});
});
} );
} );
});
} );
}
/**
* 新增入口
*
* @param appInfoMap
* @return
*/
private Map<Integer, List<AppInfo>> addOthersEntrances( Map<Integer, List<AppInfo>> appInfoMap) {
Map<Integer, List<AppInfo>> result = new HashMap<>();
private Map< Integer, List< AppInfo > > addOthersEntrances( Map< Integer, List< AppInfo > > appInfoMap ) {
Map< Integer, List< AppInfo > > result = new HashMap<>();
if ( appInfoMap != null && !appInfoMap.isEmpty() ) {
// val deep copy
Set<Integer> keys = appInfoMap.keySet();
Set< Integer > keys = appInfoMap.keySet();
for ( Integer key : keys ) {
List<AppInfo> val = appInfoMap.get( key );
List< AppInfo > val = appInfoMap.get( key );
try {
result.put( key, new ArrayList<>( val ) );
} catch ( Exception e ) {
@@ -112,16 +114,16 @@ public class AppsPresenter extends Presenter<AppsView> {
}
// 手动添加无法识别到的app
List<AppInfo> apps = UnScannedApps.getUnScannedApps();
List< AppInfo > apps = UnScannedApps.getUnScannedApps();
if ( apps != null && !apps.isEmpty() ) {
for ( AppInfo app : apps ) {
if ( app == null ) {
continue;
}
Set<Integer> keys = result.keySet();
Set< Integer > keys = result.keySet();
boolean addFlag = true;
for ( Integer key : keys ) {
List<AppInfo> val = result.get( key );
List< AppInfo > val = result.get( key );
// 无法扫描到蓝牙电话app这里手动添加
for ( AppInfo appInfo : val ) {
if ( appInfo == null ) {
@@ -137,71 +139,77 @@ public class AppsPresenter extends Presenter<AppsView> {
}
}
if ( addFlag ) {
growthCapacity(result);
result.get(result.size() - 1).add(app);
growthCapacity( result );
result.get( result.size() - 1 ).add( app );
}
}
}
growthCapacity(result);
growthCapacity( result );
// 添加介绍入口
result.get(result.size() - 1).add(new AppInfo(GuideShowLauncher.APP_INFO_NAME_GUIDE_SHOW, getContext().getPackageName(), null, 0, null, R.drawable.module_apps_ic_guide_show));
result.get( result.size() - 1 ).add( new AppInfo( GuideShowLauncher.APP_INFO_NAME_GUIDE_SHOW, getContext().getPackageName(), null, 0, null, R.drawable.module_apps_ic_guide_show ) );
if ( DebugConfig.isDebug() ) {
// 添加测试入口
growthCapacity( result );
result.get( result.size() - 1 ).add( new AppInfo( "包管理程序", "com.mogo.packages.manager", null, 0, null, -1 ) );
}
return result;
}
/**
* 扩容
*
* @param target
*/
private void growthCapacity( Map<Integer, List<AppInfo>> target ){
private void growthCapacity( Map< Integer, List< AppInfo > > target ) {
if ( target == null ) {
return;
}
if (target.isEmpty()) {
target.put(0, new ArrayList<>());
} else if (target.get(target.size() - 1) == null) {
target.put(target.size() - 1, new ArrayList<>());
} else if (target.get(target.size() - 1).size() == AppsConst.TOTAL_SIZE_EACH_PAGE) {
target.put(target.size(), new ArrayList<>());
if ( target.isEmpty() ) {
target.put( 0, new ArrayList<>() );
} else if ( target.get( target.size() - 1 ) == null ) {
target.put( target.size() - 1, new ArrayList<>() );
} else if ( target.get( target.size() - 1 ).size() == AppsConst.TOTAL_SIZE_EACH_PAGE ) {
target.put( target.size(), new ArrayList<>() );
}
}
public void launch(AppInfo appInfo) {
if (appInfo == null) {
public void launch( AppInfo appInfo ) {
if ( appInfo == null ) {
return;
}
trackAppClicked(appInfo);
trackAppClicked( appInfo );
try {
mLauncher.launch(getContext(), appInfo);
} catch (Exception e) {
mLauncher.launch( getContext(), appInfo );
} catch ( Exception e ) {
}
}
private void trackAppClicked(AppInfo appInfo) {
if (appInfo == null) {
private void trackAppClicked( AppInfo appInfo ) {
if ( appInfo == null ) {
return;
}
Map<String, Object> properties = new HashMap<>();
properties.put("appname", appInfo.getName());
properties.put("packagename", appInfo.getPackageName());
properties.put("appversion", appInfo.getVersionName());
properties.put("from", 1);
mAnalytics.track("appenterfront", properties);
Map< String, Object > properties = new HashMap<>();
properties.put( "appname", appInfo.getName() );
properties.put( "packagename", appInfo.getPackageName() );
properties.put( "appversion", appInfo.getVersionName() );
properties.put( "from", 1 );
mAnalytics.track( "appenterfront", properties );
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
mMogoStatusManager.setAppListUIShow(TAG, false);
public void onDestroy( @NonNull LifecycleOwner owner ) {
super.onDestroy( owner );
mMogoStatusManager.setAppListUIShow( TAG, false );
AppsListChangedLiveData.getInstance().release();
mView = null;
mLauncher.destroy();
}
public void exit() {
if (mView != null) {
if ( mView != null ) {
mView.exit();
}
}

View File

@@ -1,62 +1,34 @@
package com.mogo.module.apps.adapter;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.mogo.module.apps.R;
import com.mogo.module.apps.adapter.base.RecycleBaseAdapter;
import com.mogo.module.apps.adapter.base.RecycleViewHolder;
import com.mogo.module.apps.model.AppInfo;
import com.mogo.module.apps.model.NavigatorApp;
import java.util.List;
/**
* @author zyz
* 2020-03-09.
*/
public class AppIndicatorAdapter extends RecycleBaseAdapter<NavigatorApp> {
public class AppIndicatorAdapter extends RecycleBaseAdapter< AppInfo > {
private int currentPos;
private View.OnClickListener onClickListener;
/**
*
*/
public AppIndicatorAdapter(Context context, List<NavigatorApp> list
) {
super(context, list, R.layout.module_apps_item_app_indicator);
public AppIndicatorAdapter( Context context, List< AppInfo > list ) {
super( context, list, R.layout.module_apps_item_app_indicator );
}
@Override public int getItemCount() {
return Integer.MAX_VALUE;
}
@Override public void onBindViewHolder(RecycleViewHolder holder, NavigatorApp integer) {
ImageView ivIndicator = holder.getView(R.id.module_apps_id_app_icon);
ivIndicator.setImageResource(integer.getmIconId());
holder.setText(R.id.module_apps_id_app_name,integer.getmName() );
TextView tvTitle = holder.getView(R.id.module_apps_id_app_name);
if (currentPos==holder.getLayoutPosition()) {
ivIndicator.setImageResource(integer.getmIconId());
tvTitle.setTextColor(ContextCompat.getColor(context,R.color.white));
}else {
tvTitle.setTextColor(ContextCompat.getColor(context,R.color.white_80));
ivIndicator.setImageResource(integer.getmUncheckedIconId());
}
holder.itemView.setTag(integer);
holder.itemView.setOnClickListener(onClickListener);
}
public void setOnClickListener(View.OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public void setCurrentPos(int currentPos){
this.currentPos=currentPos;
notifyDataSetChanged();
@Override
public void onBindViewHolder( RecycleViewHolder holder, AppInfo app, int position ) {
ImageView ivIndicator = holder.getView( R.id.module_apps_id_app_icon );
ivIndicator.setImageResource( app.getIconResId() );
holder.itemView.setOnClickListener( view -> {
if ( getOnItemClickedListener() != null ) {
getOnItemClickedListener().onItemClicked( app, position );
}
} );
}
}

View File

@@ -5,7 +5,9 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/**
@@ -21,20 +23,19 @@ import java.util.List;
* <p>
* </p>
*/
public abstract class RecycleBaseAdapter<T> extends
RecyclerView.Adapter<RecycleViewHolder>
{
public abstract class RecycleBaseAdapter< T > extends
RecyclerView.Adapter< RecycleViewHolder > {
protected Context context;
protected List<T> list;
protected List< T > list;
private int resourceID;
private Toast toast;
protected OnItemClickListener<T> mOnItemClickedListener;
/**
* @param context
*/
public RecycleBaseAdapter(Context context, List<T> list, int resourceID)
{
public RecycleBaseAdapter( Context context, List< T > list, int resourceID ) {
super();
this.context = context;
this.list = list;
@@ -42,81 +43,75 @@ public abstract class RecycleBaseAdapter<T> extends
}
@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
{
View v = LayoutInflater.from(context).inflate(resourceID, viewGroup,
false);
public RecycleViewHolder onCreateViewHolder( ViewGroup viewGroup, int viewType ) {
View v = LayoutInflater.from( context ).inflate( resourceID, viewGroup,
false );
RecycleViewHolder holder = RecycleViewHolder
.get(v);
.get( v );
initHolder(holder);
initHolder( holder );
return holder;
}
@Override
public void onBindViewHolder(
RecycleViewHolder viewHolder, int position)
{
onBindViewHolder(viewHolder, list.get(position % list.size()));
public void onBindViewHolder( RecycleViewHolder viewHolder, int position ) {
onBindViewHolder( viewHolder, list.get( position % list.size()), position );
}
@Override
public int getItemCount()
{
public int getItemCount() {
return list == null ? 0 : list.size();
}
public abstract void onBindViewHolder(
RecycleViewHolder holder, T t);
public abstract void onBindViewHolder( RecycleViewHolder holder, T t, int position );
public void initHolder(RecycleViewHolder holder)
{
public void initHolder( RecycleViewHolder holder ) {
}
public void setDatas(List<T> list)
{
setDatas(list, false);
public void setDatas( List< T > list ) {
setDatas( list, false );
}
public void setDatas(List<T> list, boolean add)
{
if (add)
{
this.list.addAll(list);
}
else
{
public void setDatas( List< T > list, boolean add ) {
if ( add ) {
this.list.addAll( list );
} else {
this.list = list;
}
notifyDataSetChanged();
}
public void clear(){
if (list != null) {
public void clear() {
if ( list != null ) {
list.clear();
notifyDataSetChanged();
}
}
public void messageShow(String mes)
{
if (toast==null){
toast= Toast.makeText(context,mes, Toast.LENGTH_LONG);
}
else{
toast.setText(mes);
}
toast.show();
}
public T getItem(int position){
if (list==null||list.size()==0){
public T getItem( int position ) {
if ( list == null || list.size() == 0 ) {
return null;
}
return list.get(position);
return list.get( position );
}
public List<T> getList() {
public List< T > getList() {
return list;
}
public interface OnItemClickListener< T > {
void onItemClicked( T data, int position );
}
public RecycleBaseAdapter< T > setOnItemClickedListener( OnItemClickListener< T > onItemClickedListener ) {
this.mOnItemClickedListener = onItemClickedListener;
return this;
}
public OnItemClickListener< T > getOnItemClickedListener() {
return mOnItemClickedListener;
}
}

View File

@@ -2,6 +2,7 @@ package com.mogo.module.apps.applaunch;
import android.content.Context;
import com.mogo.module.apps.AppServiceHandler;
import com.mogo.module.apps.R;
import com.mogo.module.apps.model.AppInfo;
import com.mogo.module.apps.utils.LaunchUtils;
@@ -21,6 +22,7 @@ public class AppLauncher extends BaseAppLauncher {
@Override
public void launch( Context context, AppInfo appInfo ) {
try {
AppServiceHandler.getApis().getAdasControllerApi().closeADAS();
LaunchUtils.launchByPkg( context, appInfo.getPackageName() );
} catch ( Exception e ) {
Logger.e( TAG, e, "error." );

View File

@@ -0,0 +1,47 @@
package com.mogo.module.apps.applaunch;
import android.app.Activity;
import android.content.Context;
import com.mogo.module.apps.AppServiceHandler;
import com.mogo.module.apps.AppsListActivity;
import com.mogo.module.apps.model.AppInfo;
/**
* @author congtaowang
* @since 2020-05-14
* <p>
* 描述
*/
public class InternalFunctionLauncher extends BaseAppLauncher {
private Activity mActivity;
public InternalFunctionLauncher( Activity activity ) {
this.mActivity = activity;
}
@Override
public void launch( Context context, AppInfo appInfo ) {
switch ( appInfo.getPackageName() ) {
case "com.mogo.launcher.navi.search":
AppServiceHandler.getApis().getSearchManagerApi().showSearch();
break;
case "com.mogo.launcher.applist":
AppServiceHandler.getApis().getAdasControllerApi().closeADAS();
AppsListActivity.start( mActivity );
break;
default:
if ( getNext() != null ) {
getNext().launch( context, appInfo );
}
}
}
@Override
public void destroy() {
if ( getNext() != null ) {
getNext().destroy();
}
}
}

View File

@@ -15,44 +15,18 @@ public class NavigatorApp {
@DrawableRes
public int mUncheckedIconId;
public String mName;
public String mModuleType;
public NavigatorApp( int mIconId,int mUncheckedIconId, String mName, String mModuleType ) {
public NavigatorApp( int mIconId, int mUncheckedIconId, String mName ) {
this.mIconId = mIconId;
this.mUncheckedIconId = mUncheckedIconId;
this.mName = mName;
this.mModuleType = mModuleType;
}
public int getmIconId() {
public int getIconId() {
return mIconId;
}
public void setmIconId(int mIconId) {
this.mIconId = mIconId;
}
public int getmUncheckedIconId() {
return mUncheckedIconId;
}
public void setmUncheckedIconId(int mUncheckedIconId) {
this.mUncheckedIconId = mUncheckedIconId;
}
public String getmName() {
public String getName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public String getmModuleType() {
return mModuleType;
}
public void setmModuleType(String mModuleType) {
this.mModuleType = mModuleType;
}
}

View File

@@ -1,9 +1,6 @@
package com.mogo.module.apps.model;
import com.mogo.module.apps.R;
import com.mogo.module.common.ModuleNames;
import com.mogo.module.common.MogoModule;
import com.mogo.module.common.MogoModulePaths;
import java.util.ArrayList;
import java.util.List;
@@ -16,48 +13,15 @@ import java.util.List;
*/
public class NavigatorApps {
public static List< NavigatorApp > getApps() {
List< NavigatorApp > apps = new ArrayList<>();
apps.add( new NavigatorApp( R.drawable.module_apps_ic_online_car,R.drawable.module_apps_ic_online_car_unchecked, "在线车辆", ModuleNames.CARD_TYPE_USER_DATA ) );
apps.add( new NavigatorApp( R.drawable.module_apps_ic_interest, R.drawable.module_apps_ic_interest_unchecked,"新鲜事", ModuleNames.CARD_TYPE_NOVELTY ) );
apps.add( new NavigatorApp( R.drawable.module_apps_ic_news,R.drawable.module_apps_ic_news_unchecked, "首页", ModuleNames.CARD_TYPE_BUSINESS_OPERATION ) );
apps.add( new NavigatorApp( R.drawable.module_apps_ic_media_center, R.drawable.module_apps_ic_media_center_checked, "媒体中心", ModuleNames.CARD_TYPE_SHARE_MUSIC ) );
apps.add( new NavigatorApp( R.drawable.module_apps_ic_chat_icon, R.drawable.module_apps_ic_chat_unchecked,"车聊聊", ModuleNames.CARD_TYPE_CARS_CHATTING ) );
apps.add( new NavigatorApp( R.drawable.module_apps_ic_tanlu, R.drawable.module_apps_ic_tanlu_unchecked,"探路", ModuleNames.CARD_TYPE_ROAD_CONDITION ) );
return apps;
}
private static List< AppInfo > sApps = new ArrayList<>();
// public static List< NavigatorApp > getApps() {
// List< NavigatorApp > apps = new ArrayList<>();
// List< MogoModule > modules = MogoModulePaths.getModules();
// for ( MogoModule module : modules ) {
// NavigatorApp app = getApp( module );
// if ( app == null ) {
// continue;
// }
// apps.add( app );
// }
// return apps;
// }
//
// private static NavigatorApp getApp( MogoModule module ) {
// if ( module == null ) {
// return null;
// }
// switch ( module.getName() ) {
// case ModuleNames.CARD_TYPE_USER_DATA:
// return new NavigatorApp( R.drawable.module_apps_ic_online_car, R.drawable.module_apps_ic_online_car_unchecked, "在线车辆", ModuleNames.CARD_TYPE_USER_DATA );
// case ModuleNames.CARD_TYPE_NOVELTY:
// return new NavigatorApp( R.drawable.module_apps_ic_interest, R.drawable.module_apps_ic_interest_unchecked, "新鲜事", ModuleNames.CARD_TYPE_NOVELTY );
// case ModuleNames.CARD_TYPE_BUSINESS_OPERATION:
// return new NavigatorApp( R.drawable.module_apps_ic_news, R.drawable.module_apps_ic_news_unchecked, "首页", ModuleNames.CARD_TYPE_BUSINESS_OPERATION );
// case ModuleNames.CARD_TYPE_SHARE_MUSIC:
// return new NavigatorApp( R.drawable.module_apps_ic_media_center, R.drawable.module_apps_ic_media_center_checked, "媒体中心", ModuleNames.CARD_TYPE_SHARE_MUSIC );
// case ModuleNames.CARD_TYPE_CARS_CHATTING:
// return new NavigatorApp( R.drawable.module_apps_ic_chat_icon, R.drawable.module_apps_ic_chat_unchecked, "车聊聊", ModuleNames.CARD_TYPE_CARS_CHATTING );
// case ModuleNames.CARD_TYPE_ROAD_CONDITION:
// return new NavigatorApp( R.drawable.module_apps_ic_tanlu, R.drawable.module_apps_ic_tanlu_unchecked, "探路", ModuleNames.CARD_TYPE_ROAD_CONDITION );
// }
// return null;
// }
public static List< AppInfo > getApps() {
if ( sApps.isEmpty() ) {
sApps.add( new AppInfo( "导航", "com.mogo.launcher.navi.search", "", 0, null, R.drawable.module_apps_ic_apps ) );
sApps.add( new AppInfo( "音乐", "com.pvetec.musics", "", 0, null, R.drawable.module_apps_ic_apps ) );
sApps.add( new AppInfo( "个人中心", "com.zhidao.auto.personal", "", 0, null, R.drawable.module_apps_ic_apps ) );
sApps.add( new AppInfo( "全部应用", "com.mogo.launcher.applist", "", 0, null, R.drawable.module_apps_ic_apps ) );
}
return sApps;
}
}

View File

@@ -1,122 +0,0 @@
package com.mogo.module.apps.utils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.FloatRange;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.module.apps.R;
import com.mogo.module.apps.model.NavigatorApp;
import com.yarolegovich.discretescrollview.transform.DiscreteScrollItemTransformer;
import com.yarolegovich.discretescrollview.transform.Pivot;
import com.yarolegovich.discretescrollview.transform.ScaleTransformer;
import java.util.List;
/**
* @author zyz
* 2020-03-11.
*/
public class CardScaleTransformer implements DiscreteScrollItemTransformer {
private Pivot pivotX;
private Pivot pivotY;
private float minScale;
private float maxMinDiff;
private static final int CARD_SIZE = 6;
List<NavigatorApp> apps;
public CardScaleTransformer() {
pivotX = Pivot.X.CENTER.create();
pivotY = Pivot.Y.BOTTOM.create();
minScale = 0.8f;
maxMinDiff = 0.2f;
}
public void setApps(List<NavigatorApp> apps) {
this.apps = apps;
}
@Override
public void transformItem(View item, RecyclerView.ViewHolder childViewHolder, float position) {
ImageView ivItem = item.findViewById(R.id.module_apps_id_app_icon);
TextView tvTitle = item.findViewById(R.id.module_apps_id_app_name);
NavigatorApp tag = (NavigatorApp) item.getTag();
pivotX.setOn(ivItem);
pivotY.setOn(ivItem);
float closenessToCenter = 1f - Math.abs(position);
float scale = minScale + maxMinDiff * closenessToCenter;
ivItem.setScaleX(scale);
ivItem.setScaleY(scale);
if (tag != null) {
if (scale == 1) {
ivItem.setImageResource(tag.getmIconId());
tvTitle.setTextColor(ContextCompat.getColor(item.getContext(),R.color.white));
} else {
ivItem.setImageResource(tag.getmUncheckedIconId());
tvTitle.setTextColor(ContextCompat.getColor(item.getContext(),R.color.white_80));
}
}
//int currentPosition = (position - 2) % CARD_SIZE;
}
public static class Builder {
private CardScaleTransformer transformer;
private float maxScale;
public Builder() {
transformer = new CardScaleTransformer();
maxScale = 1f;
}
public Builder setMinScale(@FloatRange(from = 0.01) float scale) {
transformer.minScale = scale;
return this;
}
public Builder setMaxScale(@FloatRange(from = 0.01) float scale) {
maxScale = scale;
return this;
}
public Builder setPivotX(Pivot.X pivotX) {
return setPivotX(pivotX.create());
}
public Builder setPivotX(Pivot pivot) {
assertAxis(pivot, Pivot.AXIS_X);
transformer.pivotX = pivot;
return this;
}
public Builder setPivotY(Pivot.Y pivotY) {
return setPivotY(pivotY.create());
}
public Builder setPivotY(Pivot pivot) {
assertAxis(pivot, Pivot.AXIS_Y);
transformer.pivotY = pivot;
return this;
}
public CardScaleTransformer build() {
transformer.maxMinDiff = maxScale - transformer.minScale;
return transformer;
}
private void assertAxis(Pivot pivot, @Pivot.Axis int axis) {
if (pivot.getAxis() != axis) {
throw new IllegalArgumentException("You passed a Pivot for wrong axis.");
}
}
}
}