不好的方法,修改frameworks/base/core/java/com/android/internal/app/ResolverActivity.java ,修改这个地方,有个问题,会弹窗然后在消失,用户体验不好。
好的方法,修改Provision,然后在用roleManager.addRoleHolderAsUser(roleName, packageName, flags, user, executor, callback);的方法去处理默认值
不好的方法
diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
old mode 100644
new mode 100755
index fadc15912d..65da591017
--- a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
@@ -100,7 +100,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
-
+import android.os.SystemProperties;
/**
* This activity is displayed when the system attempts to start an Intent for
@@ -129,6 +129,8 @@ public class ResolverActivity extends Activity implements
private String mReferrerPackage;
private CharSequence mTitle;
private int mDefaultTitleResId;
+
+
// Whether or not this activity supports choosing a default handler for the intent.
@VisibleForTesting
@@ -343,7 +345,8 @@ public class ResolverActivity extends Activity implements
List<ResolveInfo> rList, boolean supportsAlwaysUseOption) {
setTheme(appliedThemeResId());
super.onCreate(savedInstanceState);
-
+
+
// Determine whether we should show that intent is forwarded
// from managed profile to owner or other way around.
setProfileSwitchMessageId(intent.getContentUserHint());
@@ -425,6 +428,7 @@ public class ResolverActivity extends Activity implements
mProfileView.setOnClickListener(this::onProfileClick);
updateProfileViewButton();
}
+
final Set<String> categories = intent.getCategories();
MetricsLogger.action(this, mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()
@@ -432,8 +436,46 @@ public class ResolverActivity extends Activity implements
: MetricsProto.MetricsEvent.ACTION_SHOW_APP_DISAMBIG_NONE_FEATURED,
intent.getAction() + ":" + intent.getType() + ":"
+ (categories != null ? Arrays.toString(categories.toArray()) : ""));
- }
-
+ boolean isSetDefLauncher= (Settings.System.getInt(getContentResolver(), "set_def_launcher", 0) == 0);
+ if(isSetDefLauncher){
+ Settings.System.putInt(getContentResolver(), "set_def_launcher", 1);
+ new Thread() {
+ @Override
+ public void run() {
+ super.run();
+ try {
+ Thread.sleep(1000);//休眠3秒
+ }catch( Exception e){
+
+ }
+ Log.d("sssssssss","Thread 896 = " );
+ /* if(setupDefaultLauncher("com.teslacoilsw.launcher")){
+ Log.d("sssssssss","Thread = 899" );
+ onStop();
+ finish();
+ return;
+ }
+ */
+
+ }
+ }.start();
+ }
+ }
+ //用于记录默认home app是否设置过
+ private boolean setupDefaultLauncher(String packageName) {
+ int position = mMultiProfilePagerAdapter.getActiveListAdapter().getDefaultHomePosition(packageName);
+ Log.w(TAG,"1640 sssss error get DEFAULT_HOME position = "+position);
+ if (position == -1) {
+ Log.w(TAG, "not find default Home");
+ return false;
+ }
+ ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter().resolveInfoForPosition(position, true);
+ TargetInfo intent = mMultiProfilePagerAdapter.getActiveListAdapter().targetInfoForPosition(position, true);
+ onTargetSelected(intent, false);
+ startSelected(position, true, true);
+ dismiss();
+ return true;
+ }
private boolean isIntentPicker() {
return getClass().equals(ResolverActivity.class);
}
@@ -828,6 +870,7 @@ public class ResolverActivity extends Activity implements
mWorkProfileHasBeenEnabled = isWorkProfileEnabled();
}
+
}
private boolean isWorkProfileEnabled() {
@@ -994,16 +1037,19 @@ public class ResolverActivity extends Activity implements
}
ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter()
.resolveInfoForPosition(which, hasIndexBeenFiltered);
+ Log.d(TAG, "1098 ri.activityInfo.packageName = " +ri); // ri.activityInfo.packageName
if (mResolvingHome && hasManagedProfile() && !supportsManagedProfiles(ri)) {
Toast.makeText(this, String.format(getResources().getString(
com.android.internal.R.string.activity_resolver_work_profiles_support),
ri.activityInfo.loadLabel(getPackageManager()).toString()),
Toast.LENGTH_LONG).show();
+ Log.d(TAG, "1098 ri.activityInfo.mResolvingHome = " +mResolvingHome);
return;
}
TargetInfo target = mMultiProfilePagerAdapter.getActiveListAdapter()
.targetInfoForPosition(which, hasIndexBeenFiltered);
+ // Log.d(TAG, "1009 ri.activityInfo.packageName =" +ri.activityInfo.packageName);
if (target == null) {
return;
}
@@ -1078,7 +1124,7 @@ public class ResolverActivity extends Activity implements
protected boolean onTargetSelected(TargetInfo target, boolean alwaysCheck) {
final ResolveInfo ri = target.getResolveInfo();
final Intent intent = target != null ? target.getResolvedIntent() : null;
-
+ Log.d(TAG, "Error calling onTargetSelected target =" + target);
if (intent != null && (mSupportsAlwaysUseOption
|| mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem())
&& mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredResolveList() != null) {
@@ -1213,6 +1259,7 @@ public class ResolverActivity extends Activity implements
}
} else {
try {
+ Log.d(TAG, "Nice calling setLastChosenActivity\n bestMatch =");
mMultiProfilePagerAdapter.getActiveListAdapter()
.mResolverListController.setLastChosen(intent, filter, bestMatch);
} catch (RemoteException re) {
@@ -1604,7 +1651,10 @@ public class ResolverActivity extends Activity implements
private boolean isAutolaunching() {
return !mRegistered && isFinishing();
}
+
+
+
private void setupProfileTabs() {
maybeHideDivider();
TabHost tabHost = findViewById(R.id.profile_tabhost);
diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java b/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
old mode 100644
new mode 100755
index eef722e32b..57f974ca51
--- a/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
@@ -377,7 +377,32 @@ public class ResolverListAdapter extends BaseAdapter {
mContext.getMainThreadHandler().post(mPostListReadyRunnable);
}
}
-
+ /*
+ public int getDefaultHomePosition(String packageName){
+ for (int i = 0; i < mDisplayList.size(); i++) {
+ ResolveInfo info =resolveInfoForPosition(i, true);;
+ // if (DEBUG)
+ Log.w(TAG,"getDefaultHomePosition " + info.activityInfo.packageName);
+ if (info.activityInfo.packageName.equals(packageName)) {
+ return i;
+ }
+ }
+ return -1;
+ }*/
+ public int getDefaultHomePosition(String packageName){
+ for (int i = 0; i < mDisplayList.size(); i++) {
+ Log.w(TAG," 395 ... mDisplayList.size() " + mDisplayList.size());
+ ResolveInfo info2 = mDisplayList.get(i).getResolveInfo();
+ Log.w(TAG," 39888 ... getDefaultHomePosition " + info2.activityInfo.packageName);
+ if (info2.activityInfo.packageName.equals(packageName)) {
+ Log.w(TAG," 397 getDefaultHomePosition i = " + i);
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
private void addResolveInfoWithAlternates(ResolvedComponentInfo rci) {
final int count = rci.getCount();
final Intent intent = rci.getIntentAt(0);
@@ -393,6 +418,7 @@ public class ResolverListAdapter extends BaseAdapter {
if (rci.isPinned()) {
Log.i(TAG, "Pinned item: " + rci.name);
}
+ Log.i(TAG, "Pinned item: " + rci.name);
addResolveInfo(dri);
if (replaceIntent == intent) {
// Only add alternates if we didn't get a specific replacement from
@@ -427,6 +453,7 @@ public class ResolverListAdapter extends BaseAdapter {
mDisplayList.add(dri);
Log.i(TAG, "Add DisplayResolveInfo component: " + dri.getResolvedComponentName()
+ ", intent component: " + dri.getResolvedIntent().getComponent());
+ getDefaultHomePosition("ssss");
}
}
}
diff --git a/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java b/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
old mode 100644
new mode 100755
index fe0e7d0122..966dd352d6
--- a/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
+++ b/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
@@ -45,7 +45,7 @@ public class DisplayResolveInfo implements TargetInfo {
// b/157272342 is one example but this issue has been reported many times
private static final boolean ENABLE_CHOOSER_DELEGATE = false;
- private final ResolveInfo mResolveInfo;
+ public final ResolveInfo mResolveInfo;
private CharSequence mDisplayLabel;
private Drawable mDisplayIcon;
private CharSequence mExtendedInfo;
好用的方法:
packages/apps/Provision/AndroidManifest.xml | 14 ++-
.../android/provision/DefaultActivity.java | 57 +++++++++-
.../provision/TemporaryFileManager.java | 106 ++++++++++++++++++
3 files changed, 172 insertions(+), 5 deletions(-)
mode change 100644 => 100755 packages/apps/Provision/AndroidManifest.xml
mode change 100644 => 100755 packages/apps/Provision/src/com/android/provision/DefaultActivity.java
create mode 100755 packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java
diff --git a/packages/apps/Provision/AndroidManifest.xml b/packages/apps/Provision/AndroidManifest.xml
old mode 100644
new mode 100755
index 8360578710..fa1c813c31
--- a/packages/apps/Provision/AndroidManifest.xml
+++ b/packages/apps/Provision/AndroidManifest.xml
@@ -15,14 +15,17 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.provision">
+ package="com.android.provision"
+ android:sharedUserId="android.uid.system">
<original-package android:name="com.android.provision" />
<!-- For miscellaneous settings -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
-
+ <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
+ <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
+ <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS" />
<application>
<activity android:name="DefaultActivity"
android:excludeFromRecents="true">
@@ -33,6 +36,13 @@
<category android:name="android.intent.category.SETUP_WIZARD" />
</intent-filter>
</activity>
+ <!-- <receiver android:name=".TemporaryFileManager"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="com.chengwei.BOOT_COMPLETED" />
+ </intent-filter>
+ </receiver>-->
</application>
</manifest>
diff --git a/packages/apps/Provision/src/com/android/provision/DefaultActivity.java b/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
old mode 100644
new mode 100755
index 031f3b1603..449604d2f7
--- a/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
+++ b/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
@@ -21,7 +21,15 @@ import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
-
+import android.util.Log;
+import android.os.SystemProperties;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ResolveInfo;
+import java.util.List;
/**
* Application that sets the provisioned bit, like SetupWizard does.
*/
@@ -30,11 +38,11 @@ public class DefaultActivity extends Activity {
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
-
+ Log.i("provision","DefaultActivity onCreate 41");
// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
-
+ // initLauncher ();
// remove this activity from the package manager.
PackageManager pm = getPackageManager();
ComponentName name = new ComponentName(this, DefaultActivity.class);
@@ -44,5 +52,48 @@ public class DefaultActivity extends Activity {
// terminate the activity.
finish();
}
+
+
+ public void initLauncher (){
+
+ String ORIGINAL_LAUNCHER_PACKAGENAME = "com.teslacoilsw.launcher";//鍖呭悕 com.teslacoilsw.launcher/com.teslacoilsw.launcher.NovaLauncher
+ String ORIGINAL_LAUNCHER_CLASSNAME = "com.teslacoilsw.launcher.NovaLauncher"; //绫诲悕
+ Intent queryIntent = new Intent();
+ final PackageManager mPm = this.getPackageManager();
+ queryIntent.addCategory(Intent.CATEGORY_HOME);
+ queryIntent.setAction(Intent.ACTION_MAIN);
+
+ List<ResolveInfo> homeActivities = mPm.queryIntentActivities(queryIntent, 0);
+ if(homeActivities == null) {
+ return ;
+ }
+
+ ComponentName defaultLauncher = new ComponentName(ORIGINAL_LAUNCHER_PACKAGENAME,
+ ORIGINAL_LAUNCHER_CLASSNAME);
+ int activityNum = homeActivities.size();
+ ComponentName[] set = new ComponentName[activityNum];
+ int defaultMatch = -1;
+ for(int i = 0; i < activityNum; i++){
+ ResolveInfo info = homeActivities.get(i);
+ set[i] = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
+ if(ORIGINAL_LAUNCHER_CLASSNAME.equals(info.activityInfo.name)
+ && ORIGINAL_LAUNCHER_PACKAGENAME.equals(info.activityInfo.packageName)){
+ defaultMatch = info.match;
+ }
+ }
+
+ //if Launcher is not found, do not set anything
+ if(defaultMatch == -1){
+ return ;
+ }
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_MAIN);
+ filter.addCategory(Intent.CATEGORY_HOME);
+ filter.addCategory(Intent.CATEGORY_DEFAULT);
+
+ mPm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
+ // SystemProperties.set("persist.sys.defualt.launcher",String.valueOf(1));
+ }
+
}
diff --git a/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java b/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java
new file mode 100755
index 0000000000..18a989020f
--- /dev/null
+++ b/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java
@@ -0,0 +1,106 @@
+package com.android.provision;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.util.Log;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+//import com.android.permissioncontroller.permission.model.AppPermissionGroup;
+//import com.android.permissioncontroller.permission.model.AppPermissions;
+//import com.android.permissioncontroller.permission.model.Permission;
+//import com.android.permissioncontroller.permission.utils.ArrayUtils;
+//import com.android.permissioncontroller.permission.utils.Utils;
+import java.util.List;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.app.role.RoleManager;
+import android.os.UserHandle;
+import android.os.Process;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+
+/**
+ * Manages files of the package installer and resets state during boot.
+ */
+public class TemporaryFileManager extends BroadcastReceiver {
+ private static final String LOG_TAG = TemporaryFileManager.class.getSimpleName();
+
+ private void setBootFlag(Context context, int flag){
+ SharedPreferences sharedPreferences = context.getSharedPreferences("boot_CONFIG",
+ Context.MODE_PRIVATE);
+ Editor editor = sharedPreferences.edit();
+ editor.putInt("boot_flag", flag).commit();
+ }
+
+ private boolean isFirstBoot(Context context){
+ SharedPreferences sharedPreferences = context.getSharedPreferences("boot_CONFIG",
+ Context.MODE_PRIVATE);
+ return sharedPreferences.getInt("boot_flag", 0) == 0;
+ }
+
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.e("settingssssssstemf", "action==="+ intent.getAction());
+
+ if (isFirstBoot(context)) {
+ Log.e("settingssssssstemf", "is first onReceive action==="+ intent.getAction());
+ setRoleHolderAsUser(context, "com.teslacoilsw.launcher");
+ setBootFlag(context, 1);
+ }
+
+ long systemBootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
+
+ File[] filesOnBoot = context.getNoBackupFilesDir().listFiles();
+
+ if (filesOnBoot == null) {
+ return;
+ }
+
+ for (int i = 0; i < filesOnBoot.length; i++) {
+ File fileOnBoot = filesOnBoot[i];
+
+ if (systemBootTime > fileOnBoot.lastModified()) {
+ boolean wasDeleted = fileOnBoot.delete();
+ if (!wasDeleted) {
+ Log.w(LOG_TAG, "Could not delete " + fileOnBoot.getName() + " onBoot");
+ }
+ } else {
+ Log.w(LOG_TAG, fileOnBoot.getName() + " was created before onBoot broadcast was "
+ + "received");
+ }
+ }
+ }
+
+ public void setRoleHolderAsUser(Context context, String packageName) {
+ String roleName = "android.app.role.HOME";
+ boolean add = true;
+ int flags = 0;
+ UserHandle user = Process.myUserHandle();
+
+ Log.i("settingssssssstemf", (add ? "Adding" : "Removing") + " package as role holder, role: "
+ + roleName + ", package: " + packageName);
+
+ RoleManager roleManager = context.getSystemService(RoleManager.class);
+ Executor executor = context.getMainExecutor();
+ Consumer<Boolean> callback = successful -> {
+ if (successful) {
+ Log.d("settingssssssstemf", "Package " + (add ? "added" : "removed")
+ + " as role holder, role: " + roleName + ", package: " + packageName);
+ } else {
+ Log.d("settingssssssstemf", "Failed to " + (add ? "add" : "remove")
+ + " package as role holder, role: " + roleName + ", package: "
+ + packageName);
+ }
+ };
+
+ roleManager.addRoleHolderAsUser(roleName, packageName, flags, user, executor, callback);
+ Log.i("settingssssssstemf", "addRoleHolderAsUser done");
+ }
+}