diff options
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | res/layout/search_container_all_apps.xml | 5 | ||||
-rw-r--r-- | res/values/attrs.xml | 1 | ||||
-rw-r--r-- | src/com/android/launcher3/AppInfo.java | 15 | ||||
-rw-r--r-- | src/com/android/launcher3/InvariantDeviceProfile.java | 11 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 7 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherAppWidgetHostView.java | 3 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherProvider.java | 9 | ||||
-rw-r--r-- | src/com/android/launcher3/PendingAppWidgetHostView.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/UninstallDropTarget.java | 18 | ||||
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/logging/LoggerUtils.java | 8 | ||||
-rw-r--r-- | src/com/android/launcher3/qsb/QsbContainerView.java | 8 | ||||
-rw-r--r-- | src/com/android/launcher3/qsb/QsbWidgetHostView.java | 4 |
14 files changed, 74 insertions, 21 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7d65bdc0e..23bddf62f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -70,7 +70,7 @@ android:launchMode="singleTask" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" - android:windowSoftInputMode="adjustPan|stateUnchanged" + android:windowSoftInputMode="adjustPan" android:screenOrientation="nosensor" android:configChanges="keyboard|keyboardHidden|navigation" android:resizeableActivity="true" diff --git a/res/layout/search_container_all_apps.xml b/res/layout/search_container_all_apps.xml index c4305214d..fc07002cb 100644 --- a/res/layout/search_container_all_apps.xml +++ b/res/layout/search_container_all_apps.xml @@ -19,11 +19,11 @@ android:layout_width="match_parent" android:layout_height="@dimen/all_apps_search_bar_height" android:layout_gravity="center|top" + android:layout_marginBottom="-8dp" android:gravity="center|bottom" - android:saveEnabled="false" android:paddingLeft="@dimen/dynamic_grid_edge_margin" android:paddingRight="@dimen/dynamic_grid_edge_margin" - android:layout_marginBottom="-8dp" > + android:saveEnabled="false" > <!-- Note: The following relation should always be true so that the shadows are aligned properly @@ -45,6 +45,7 @@ android:imeOptions="actionSearch|flagNoExtractUi" android:inputType="text|textNoSuggestions|textCapWords" android:maxLines="1" + android:saveEnabled="false" android:scrollHorizontally="true" android:singleLine="true" android:textColor="?android:attr/textColorSecondary" diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 68b628fb7..5aee715b6 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -123,6 +123,7 @@ <attr name="iconTextSize" format="float" /> <attr name="defaultLayoutId" format="reference" /> + <attr name="demoModeLayoutId" format="reference" /> </declare-styleable> <declare-styleable name="CellLayout"> diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 3da199635..7d2f75385 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -19,6 +19,7 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.os.UserHandle; @@ -31,6 +32,10 @@ import com.android.launcher3.util.PackageManagerHelper; */ public class AppInfo extends ItemInfoWithIcon { + public static final int FLAG_SYSTEM_UNKNOWN = 0; + public static final int FLAG_SYSTEM_YES = 1 << 0; + public static final int FLAG_SYSTEM_NO = 1 << 1; + /** * The intent used to start the application. */ @@ -43,6 +48,11 @@ public class AppInfo extends ItemInfoWithIcon { */ public int isDisabled = ShortcutInfo.DEFAULT; + /** + * Stores if the app is a system app or not. + */ + public int isSystemApp; + public AppInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; } @@ -71,6 +81,10 @@ public class AppInfo extends ItemInfoWithIcon { } intent = makeLaunchIntent(info); + + isSystemApp = (info.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0 + ? FLAG_SYSTEM_NO : FLAG_SYSTEM_YES; + } public AppInfo(AppInfo info) { @@ -79,6 +93,7 @@ public class AppInfo extends ItemInfoWithIcon { title = Utilities.trim(info.title); intent = new Intent(info.intent); isDisabled = info.isDisabled; + isSystemApp = info.isSystemApp; } @Override diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index d7bebd1b1..7a431986d 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -85,7 +85,9 @@ public class InvariantDeviceProfile { * Number of icons inside the hotseat area. */ public int numHotseatIcons; + int defaultLayoutId; + int demoModeLayoutId; public DeviceProfile landscapeProfile; public DeviceProfile portraitProfile; @@ -99,11 +101,11 @@ public class InvariantDeviceProfile { this(p.name, p.minWidthDps, p.minHeightDps, p.numRows, p.numColumns, p.numFolderRows, p.numFolderColumns, p.minAllAppsPredictionColumns, p.iconSize, p.landscapeIconSize, p.iconTextSize, p.numHotseatIcons, - p.defaultLayoutId); + p.defaultLayoutId, p.demoModeLayoutId); } InvariantDeviceProfile(String n, float w, float h, int r, int c, int fr, int fc, int maapc, - float is, float lis, float its, int hs, int dlId) { + float is, float lis, float its, int hs, int dlId, int dmlId) { name = n; minWidthDps = w; minHeightDps = h; @@ -117,6 +119,7 @@ public class InvariantDeviceProfile { iconTextSize = its; numHotseatIcons = hs; defaultLayoutId = dlId; + demoModeLayoutId = dmlId; } @TargetApi(23) @@ -144,6 +147,7 @@ public class InvariantDeviceProfile { numColumns = closestProfile.numColumns; numHotseatIcons = closestProfile.numHotseatIcons; defaultLayoutId = closestProfile.defaultLayoutId; + demoModeLayoutId = closestProfile.demoModeLayoutId; numFolderRows = closestProfile.numFolderRows; numFolderColumns = closestProfile.numFolderColumns; minAllAppsPredictionColumns = closestProfile.minAllAppsPredictionColumns; @@ -208,7 +212,8 @@ public class InvariantDeviceProfile { a.getFloat(R.styleable.InvariantDeviceProfile_landscapeIconSize, iconSize), a.getFloat(R.styleable.InvariantDeviceProfile_iconTextSize, 0), a.getInt(R.styleable.InvariantDeviceProfile_numHotseatIcons, numColumns), - a.getResourceId(R.styleable.InvariantDeviceProfile_defaultLayoutId, 0))); + a.getResourceId(R.styleable.InvariantDeviceProfile_defaultLayoutId, 0), + a.getResourceId(R.styleable.InvariantDeviceProfile_demoModeLayoutId, 0))); a.recycle(); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 1e12b423f..522e96a12 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -251,6 +251,10 @@ public class Launcher extends BaseActivity // Main container view and the model for the widget tray screen. @Thunk WidgetsContainerView mWidgetsView; + // We need to store the orientation Launcher was created with, due to a bug (b/64916689) + // that results in widgets being inflated in the wrong orientation. + private int mOrientation; + // We set the state in both onCreate and then onNewIntent in some cases, which causes both // scroll issues (because the workspace may not have been measured yet) and extra work. // Instead, just save the state that we need to restore Launcher to, and commit it in onResume. @@ -383,6 +387,7 @@ public class Launcher extends BaseActivity mDeviceProfile = mDeviceProfile.getMultiWindowProfile(this, mwSize); } + mOrientation = getResources().getConfiguration().orientation; mSharedPrefs = Utilities.getPrefs(this); mIsSafeModeEnabled = getPackageManager().isSafeMode(); mModel = app.setLauncher(this); @@ -1669,6 +1674,8 @@ public class Launcher extends BaseActivity return mSharedPrefs; } + public int getOrientation() { return mOrientation; } + @Override protected void onNewIntent(Intent intent) { long startTime = 0; diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index b65b74ea0..7fe130876 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -142,9 +142,8 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView return false; } - public boolean isReinflateRequired() { + public boolean isReinflateRequired(int orientation) { // Re-inflate is required if the orientation has changed since last inflated. - int orientation = mContext.getResources().getConfiguration().orientation; if (mPreviousOrientation != orientation) { return true; } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index dc83f36ad..b31df9894 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -552,7 +552,14 @@ public class LauncherProvider extends ContentProvider { } private DefaultLayoutParser getDefaultLayoutParser(AppWidgetHost widgetHost) { - int defaultLayout = LauncherAppState.getIDP(getContext()).defaultLayoutId; + InvariantDeviceProfile idp = LauncherAppState.getIDP(getContext()); + int defaultLayout = idp.defaultLayoutId; + + UserManagerCompat um = UserManagerCompat.getInstance(getContext()); + if (um.isDemoUser() && idp.demoModeLayoutId != 0) { + defaultLayout = idp.demoModeLayoutId; + } + return new DefaultLayoutParser(getContext(), widgetHost, mOpenHelper, getContext().getResources(), defaultLayout); } diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java index de424aba1..c2d550169 100644 --- a/src/com/android/launcher3/PendingAppWidgetHostView.java +++ b/src/com/android/launcher3/PendingAppWidgetHostView.java @@ -111,7 +111,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView } @Override - public boolean isReinflateRequired() { + public boolean isReinflateRequired(int orientation) { // Re inflate is required any time the widget restore status changes return mStartState != mInfo.restoreStatus; } diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index 84d6a9b34..902fd3439 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -21,6 +21,7 @@ import java.net.URISyntaxException; public class UninstallDropTarget extends ButtonDropTarget { private static final String TAG = "UninstallDropTarget"; + private static Boolean sUninstallDisabled; public UninstallDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -48,13 +49,22 @@ public class UninstallDropTarget extends ButtonDropTarget { } public static boolean supportsDrop(Context context, ItemInfo info) { - UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - Bundle restrictions = userManager.getUserRestrictions(); - if (restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false) - || restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false)) { + if (sUninstallDisabled == null) { + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + Bundle restrictions = userManager.getUserRestrictions(); + sUninstallDisabled = restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false) + || restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false); + } + if (sUninstallDisabled) { return false; } + if (info instanceof AppInfo) { + AppInfo appInfo = (AppInfo) info; + if (appInfo.isSystemApp != AppInfo.FLAG_SYSTEM_UNKNOWN) { + return (appInfo.isSystemApp & AppInfo.FLAG_SYSTEM_NO) != 0; + } + } return getUninstallTarget(context, info) != null; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f8d64984e..37ee6d751 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1213,7 +1213,7 @@ public class Workspace extends PagedView && v.getTag() instanceof LauncherAppWidgetInfo) { LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) v.getTag(); LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) v; - if (lahv.isReinflateRequired()) { + if (lahv.isReinflateRequired(mLauncher.getOrientation())) { // Remove and rebind the current widget (which was inflated in the wrong // orientation), but don't delete it from the database mLauncher.removeItem(lahv, info, false /* deleteFromDb */); diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index ebb69c43b..81333b1a2 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -105,13 +105,13 @@ public class LoggerUtils { private static String getItemStr(Target t) { String typeStr = getFieldName(t.itemType, ItemType.class); if (t.packageNameHash != 0) { - typeStr += ", packageHash=" + t.packageNameHash; + typeStr += ", packageHash=" + t.packageNameHash + ", predictiveRank=" + t.predictedRank; } if (t.componentHash != 0) { - typeStr += ", componentHash=" + t.componentHash; + typeStr += ", componentHash=" + t.componentHash + ", predictiveRank=" + t.predictedRank; } if (t.intentHash != 0) { - typeStr += ", intentHash=" + t.intentHash; + typeStr += ", intentHash=" + t.intentHash + ", predictiveRank=" + t.predictedRank; } return typeStr + ", grid(" + t.gridX + "," + t.gridY + "), span(" + t.spanX + "," + t.spanY + "), pageIdx=" + t.pageIndex; @@ -125,9 +125,11 @@ public class LoggerUtils { public static Target newItemTarget(ItemInfo info) { Target t = newTarget(Target.Type.ITEM); + switch (info.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: t.itemType = ItemType.APP_ICON; + t.predictedRank = -100; // Never assigned break; case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: t.itemType = ItemType.SHORTCUT; diff --git a/src/com/android/launcher3/qsb/QsbContainerView.java b/src/com/android/launcher3/qsb/QsbContainerView.java index d26f9f646..65acaa973 100644 --- a/src/com/android/launcher3/qsb/QsbContainerView.java +++ b/src/com/android/launcher3/qsb/QsbContainerView.java @@ -36,6 +36,7 @@ import android.widget.FrameLayout; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -79,10 +80,15 @@ public class QsbContainerView extends FrameLayout { private AppWidgetProviderInfo mWidgetInfo; private QsbWidgetHostView mQsb; + // We need to store the orientation here, due to a bug (b/64916689) that results in widgets + // being inflated in the wrong orientation. + private int mOrientation; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mQsbWidgetHost = new QsbWidgetHost(getActivity()); + mOrientation = getContext().getResources().getConfiguration().orientation; } private FrameLayout mWrapper; @@ -193,7 +199,7 @@ public class QsbContainerView extends FrameLayout { @Override public void onResume() { super.onResume(); - if (mQsb != null && mQsb.isReinflateRequired()) { + if (mQsb != null && mQsb.isReinflateRequired(mOrientation)) { rebindFragment(); } } diff --git a/src/com/android/launcher3/qsb/QsbWidgetHostView.java b/src/com/android/launcher3/qsb/QsbWidgetHostView.java index 8b6fa1651..a8a41f664 100644 --- a/src/com/android/launcher3/qsb/QsbWidgetHostView.java +++ b/src/com/android/launcher3/qsb/QsbWidgetHostView.java @@ -47,9 +47,9 @@ public class QsbWidgetHostView extends AppWidgetHostView { } - public boolean isReinflateRequired() { + public boolean isReinflateRequired(int orientation) { // Re-inflate is required if the orientation has changed since last inflation. - return mPreviousOrientation != getResources().getConfiguration().orientation; + return mPreviousOrientation != orientation; } |