diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml
index da1679f7fb..50fb2d768d 100644
--- a/AndroidManifest-common.xml
+++ b/AndroidManifest-common.xml
@@ -58,12 +58,21 @@
+ android:permission="com.android.launcher.permission.INSTALL_SHORTCUT"
+ android:enabled="@bool/enable_install_shortcut_api" >
+
+
+
+
+
+
+
diff --git a/res/values-v26/bools.xml b/res/values-v26/bools.xml
index 1093f78440..30537fe122 100644
--- a/res/values-v26/bools.xml
+++ b/res/values-v26/bools.xml
@@ -18,4 +18,6 @@
true
+
+ false
\ No newline at end of file
diff --git a/res/values/bools.xml b/res/values/bools.xml
index cc4a7ba449..53c67e2f1b 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -18,4 +18,6 @@
false
+
+ true
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 58bfb49950..423a77299f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -179,6 +179,11 @@
Current Display setting doesn\'t permit rotation
+
+ Add icon to Home screen
+
+ For new apps
+
Unknown
diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml
index 624d9eb2c3..a16583d2cd 100644
--- a/res/xml/launcher_preferences.xml
+++ b/res/xml/launcher_preferences.xml
@@ -23,4 +23,11 @@
android:persistent="true"
/>
+
diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java
index 1bab774495..80dec16700 100644
--- a/src/com/android/launcher3/InstallShortcutReceiver.java
+++ b/src/com/android/launcher3/InstallShortcutReceiver.java
@@ -218,6 +218,10 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
queuePendingShortcutInfo(new PendingInstallShortcutInfo(info, widgetId, context), context);
}
+ public static void queueActivityInfo(LauncherActivityInfo activity, Context context) {
+ queuePendingShortcutInfo(new PendingInstallShortcutInfo(activity, context), context);
+ }
+
public static HashSet getPendingShortcuts(Context context) {
HashSet result = new HashSet<>();
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index f9e6f4b902..5e08c2ab3f 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1152,9 +1152,10 @@ public class Launcher extends BaseActivity
if (mLauncherCallbacks != null) {
return mLauncherCallbacks.hasSettings();
} else {
- // On devices with a locked orientation, we will at least have the allow rotation
- // setting.
- return !getResources().getBoolean(R.bool.allow_rotation);
+ // On O and above we there is always some setting present settings (add icon to
+ // home screen or icon badging). On earlier APIs we will have the allow rotation
+ // setting, on devices with a locked orientation,
+ return Utilities.isAtLeastO() || !getResources().getBoolean(R.bool.allow_rotation);
}
}
diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java
new file mode 100644
index 0000000000..e8bf0a5c36
--- /dev/null
+++ b/src/com/android/launcher3/SessionCommitReceiver.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.LauncherActivityInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageInstaller.SessionInfo;
+import android.os.Process;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import com.android.launcher3.compat.LauncherAppsCompat;
+
+import java.util.List;
+
+/**
+ * BroadcastReceiver to handle session commit intent.
+ */
+public class SessionCommitReceiver extends BroadcastReceiver {
+
+ // Preference key for automatically adding icon to homescreen.
+ public static final String ADD_ICON_PREFERENCE_KEY = "pref_add_icon_to_home";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!isEnabled(context)) {
+ // User has decided to not add icons on homescreen.
+ return;
+ }
+
+ SessionInfo info = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION);
+ UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER);
+ // TODO: Verify install reason
+ if (TextUtils.isEmpty(info.getAppPackageName())) {
+ return;
+ }
+
+ if (!Process.myUserHandle().equals(user)) {
+ // Managed profile is handled using ManagedProfileHeuristic
+ return;
+ }
+
+ List activities = LauncherAppsCompat.getInstance(context)
+ .getActivityList(info.getAppPackageName(), user);
+ if (activities == null || activities.isEmpty()) {
+ // no activity found
+ return;
+ }
+ InstallShortcutReceiver.queueActivityInfo(activities.get(0), context);
+ }
+
+ public static boolean isEnabled(Context context) {
+ return Utilities.getPrefs(context).getBoolean(ADD_ICON_PREFERENCE_KEY, true);
+ }
+}
diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java
index cedeb39670..552e24ae4b 100644
--- a/src/com/android/launcher3/SettingsActivity.java
+++ b/src/com/android/launcher3/SettingsActivity.java
@@ -25,6 +25,7 @@ import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.provider.Settings;
import android.provider.Settings.System;
+import android.support.v4.os.BuildCompat;
/**
* Settings activity for Launcher. Currently implements the following setting: Allow rotation
@@ -72,6 +73,11 @@ public class SettingsActivity extends Activity {
mRotationLockObserver.onChange(true);
rotationPref.setDefaultValue(Utilities.getAllowRotationDefaultValue(getActivity()));
}
+
+ if (!BuildCompat.isAtLeastO()) {
+ getPreferenceScreen().removePreference(
+ findPreference(SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY));
+ }
}
@Override
diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java
index 189c690769..85a000cd82 100644
--- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java
+++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java
@@ -21,6 +21,7 @@ import android.content.SharedPreferences;
import android.content.pm.LauncherActivityInfo;
import android.os.Process;
import android.os.UserHandle;
+import android.support.v4.os.BuildCompat;
import com.android.launcher3.AppInfo;
import com.android.launcher3.FolderInfo;
@@ -31,6 +32,7 @@ import com.android.launcher3.LauncherFiles;
import com.android.launcher3.LauncherModel;
import com.android.launcher3.MainThreadExecutor;
import com.android.launcher3.R;
+import com.android.launcher3.SessionCommitReceiver;
import com.android.launcher3.ShortcutInfo;
import com.android.launcher3.compat.UserManagerCompat;
import com.android.launcher3.shortcuts.ShortcutInfoCompat;
@@ -68,12 +70,15 @@ public class ManagedProfileHeuristic {
private final LauncherModel mModel;
private final UserHandle mUser;
private final IconCache mIconCache;
+ private final boolean mAddIconsToHomescreen;
private ManagedProfileHeuristic(Context context, UserHandle user) {
mContext = context;
mUser = user;
mModel = LauncherAppState.getInstance(context).getModel();
mIconCache = LauncherAppState.getInstance(context).getIconCache();
+ mAddIconsToHomescreen =
+ !BuildCompat.isAtLeastO() || SessionCommitReceiver.isEnabled(context);
}
public void processPackageRemoved(String[] packages) {
@@ -127,7 +132,7 @@ public class ManagedProfileHeuristic {
// Do not add shortcuts on the homescreen for the first time. This prevents the launcher
// getting filled with the managed user apps, when it start with a fresh DB (or after
// a very long time).
- if (userAppsExisted && !homescreenApps.isEmpty()) {
+ if (userAppsExisted && !homescreenApps.isEmpty() && mAddIconsToHomescreen) {
mModel.addAndBindAddedWorkspaceItems(new ArrayList(homescreenApps));
}
}
@@ -147,6 +152,13 @@ public class ManagedProfileHeuristic {
}
// Try to get a work folder.
String folderIdKey = USER_FOLDER_ID_PREFIX + mUserManager.getSerialNumberForUser(user);
+ if (!mAddIconsToHomescreen) {
+ if (!mPrefs.contains(folderIdKey)) {
+ // Just mark the folder id preference to avoid new folder creation later.
+ mPrefs.edit().putLong(folderIdKey, -1).apply();
+ }
+ return;
+ }
if (mPrefs.contains(folderIdKey)) {
long folderId = mPrefs.getLong(folderIdKey, 0);
final FolderInfo workFolder = mModel.findFolderById(folderId);