diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index adb96a5a4e..d63465a300 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -1,7 +1,24 @@ + + + + + + + + + + + + + + @@ -39,6 +56,7 @@ android:clearTaskOnLaunch="${ACTIVITY_ROOT}" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize" android:enabled="true" + android:hardwareAccelerated="true" android:launchMode="singleTop" android:resizeableActivity="false" android:resumeWhilePausing="true" @@ -119,6 +137,16 @@ + + + + + + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 9ecca9d6e0..28f464b10f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -11,7 +11,9 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.main.AppListActivity import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_version_name.view.* @@ -44,6 +46,12 @@ class VersionNameView @JvmOverloads constructor( showCurrentPadVersion() showCurrentMapVersion() } + + // 调试入口,应对M1、M2没有安装Launcher的情况 + setOnLongClickListener { + ActivityUtils.startActivity(AppListActivity::class.java) + true + } } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt new file mode 100644 index 0000000000..5a3c439d36 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt @@ -0,0 +1,40 @@ +package com.mogo.eagle.core.function.main + +import android.os.Bundle +import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.GridLayoutManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.main.adapter.AppListAdapter +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.activity_app_list.* + + +/** + * 系统应用列表,调试使用,暂不对外显示开放,只通过隐藏后门进入 + */ +class AppListActivity : AppCompatActivity(), AppListAdapter.OnItemClickedListener { + override fun onCreate(savedInstanceState: Bundle?) { + BarUtils.hideStatusBarAndSticky(this.window) + window.setFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + ) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_app_list) + + val linearLayoutManager = GridLayoutManager(this, 6) //第二个参数为网格的列数 + recyclerViewAppList.layoutManager = linearLayoutManager + + recyclerViewAppList.itemAnimator = DefaultItemAnimator() + val appListAdapter = + AppListAdapter(this) + recyclerViewAppList.adapter = appListAdapter + } + + override fun onItemClicked(appListAdapter: AppListAdapter, position: Int) { + ActivityUtils.startLauncherActivity(appListAdapter.getItem(position).packageName) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index a7c962f6e9..a80465d6a3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -31,6 +31,7 @@ import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.util.ActivityUtils; import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -91,6 +92,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis @Override protected void onResume() { super.onResume(); + ActivityUtils.setDefaultL(this); } @Override diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java new file mode 100644 index 0000000000..43db1fc7e3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java @@ -0,0 +1,92 @@ +package com.mogo.eagle.core.function.main.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.function.hmi.R; +import com.mogo.eagle.core.utilcode.util.AppUtils; + +import java.util.ArrayList; +import java.util.List; + + +public class AppListAdapter extends RecyclerView.Adapter { + private OnItemClickedListener mOnItemClickedListener; + + public interface OnItemClickedListener { + void onItemClicked(AppListAdapter appListAdapter, int position); + } + + public static class AppViewHolder extends RecyclerView.ViewHolder { + public ImageView iconIv; + public TextView nameTv; + + public AppViewHolder(View itemView) { + super(itemView); + iconIv = (ImageView) itemView.findViewById(R.id.list_item_app_icon_iv); + nameTv = (TextView) itemView.findViewById(R.id.list_item_app_name_tv); + } + } + + private ArrayList showApps = new ArrayList<>(); + + public AppListAdapter(OnItemClickedListener onItemClickedListener) { + // 设置被允许展示的APP + showApps.add("com.android.settings"); + + mOnItemClickedListener = onItemClickedListener; + mApps = new ArrayList<>(); + for (AppUtils.AppInfo appInfo : AppUtils.getAppsInfo()) { + if (!appInfo.isSystem()) { + mApps.add(appInfo); + } else { + if (showApps.contains(appInfo.getPackageName())) { + mApps.add(appInfo); + } + } + } + } + + private List mApps; + + public AppUtils.AppInfo getItem(int position) { + return mApps.get(position); + } + + @Override + public int getItemCount() { + return mApps.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_list, parent, false); + return new AppViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + AppViewHolder itemViewHolder = (AppViewHolder) holder; + itemViewHolder.iconIv.setImageDrawable(mApps.get(position).getIcon()); + itemViewHolder.nameTv.setText(mApps.get(position).getName()); + itemViewHolder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnItemClickedListener != null) { + mOnItemClickedListener.onItemClicked(AppListAdapter.this, position); + } + } + }); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml new file mode 100644 index 0000000000..7919759222 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml new file mode 100644 index 0000000000..05b6631dc0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java index 6796a153a6..f49fd31192 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java @@ -5,20 +5,18 @@ import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; -import java.lang.ref.WeakReference; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - import androidx.annotation.AnimRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -26,6 +24,13 @@ import androidx.core.app.ActivityOptionsCompat; import androidx.core.util.Pair; import androidx.fragment.app.Fragment; +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + /** *
  *     author: Blankj
@@ -2136,4 +2141,65 @@ public final class ActivityUtils {
             return Utils.getApp();
         }
     }
+
+    public static void setDefaultL(Context context) {
+        if (AppUtils.isDefaultHome(context)) {
+            return;
+        }
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory("android.intent.category.HOME");
+        intent.addCategory("android.intent.category.DEFAULT");
+        try {
+            intent.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
+            startActivity(intent);
+        } catch (Exception e) {//还不行,就只能应用程序设置了
+            intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
+            startActivity(intent);
+        }
+    }
+
+    /**
+     * @param context
+     * @param componentName
+     */
+    public static void setDefaultLauncherApp(Context context, ComponentName componentName) {
+        PackageManager packageManager = context.getPackageManager();
+        Class refPackageManager = packageManager.getClass();
+        Method[] methods = refPackageManager.getDeclaredMethods();
+        Method mReplacePreferredActivity = null;
+        Method mGetHomeActivities = null;
+        for (Method method : methods) {
+            if (method.getName().equals("replacePreferredActivity")) {
+                mReplacePreferredActivity = method;
+            }
+            if (method.getName().equals("getHomeActivities")) {
+                mGetHomeActivities = method;
+            }
+        }
+        mReplacePreferredActivity.setAccessible(true);
+        mGetHomeActivities.setAccessible(true);
+
+        IntentFilter HOME_FILTER = new IntentFilter(Intent.ACTION_MAIN);
+        HOME_FILTER.addCategory(Intent.CATEGORY_HOME);
+        HOME_FILTER.addCategory(Intent.CATEGORY_DEFAULT);
+        final List allComponents = new ArrayList<>();
+        final List homeActivities = new ArrayList<>();
+        try {
+            mGetHomeActivities.invoke(packageManager, homeActivities);
+            for (ResolveInfo info : homeActivities) {
+                final ActivityInfo appInfo = info.activityInfo;
+                ComponentName activityName = new ComponentName(appInfo.packageName, appInfo.name);
+                allComponents.add(activityName);
+            }
+            mReplacePreferredActivity.invoke(
+                    packageManager,
+                    HOME_FILTER,
+                    IntentFilter.MATCH_CATEGORY_EMPTY,
+                    allComponents.toArray(new ComponentName[0]),
+                    componentName);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+
 }
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
index 003aabf9b0..4ac13c5cc4 100644
--- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
@@ -10,6 +10,7 @@ import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
 import android.content.pm.SigningInfo;
 import android.graphics.drawable.Drawable;
@@ -18,15 +19,15 @@ import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 
  *     author: Blankj
@@ -1017,4 +1018,18 @@ public final class AppUtils {
                     "\n}";
         }
     }
+
+    /**
+     * 判断自己是否为默认桌面
+     */
+    public static boolean isDefaultHome(Context context) {
+        Intent intent = new Intent(Intent.ACTION_MAIN);//Intent.ACTION_VIEW
+        intent.addCategory("android.intent.category.HOME");
+        intent.addCategory("android.intent.category.DEFAULT");
+        PackageManager pm = context.getPackageManager();
+        ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        boolean isDefault = context.getPackageName().equals(info.activityInfo.packageName);
+        return isDefault;
+    }
+
 }
diff --git a/gradle.properties b/gradle.properties
index c6cf15d32d..8764d7688e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -10,7 +10,7 @@
 org.gradle.daemon=true
 org.gradle.configureondemand=true
 org.gradle.parallel=true
-org.gradle.jvmargs=-Xmx2048m
+org.gradle.jvmargs=-Xmx3048m
 #开启gradle缓存
 org.gradle.caching=true
 android.enableBuildCache=true