diff options
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/launcher3/DeviceProfile.java | 56 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherProvider.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/Partner.java | 171 |
3 files changed, 222 insertions, 9 deletions
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 8af2a7fbb..daf5556d4 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -69,7 +69,7 @@ public class DeviceProfile { float numRows; float numColumns; float numHotseatIcons; - private float iconSize; + float iconSize; private float iconTextSize; private int iconDrawablePaddingOriginalPx; private float hotseatIconSize; @@ -130,6 +130,9 @@ public class DeviceProfile { float dragViewScale; + int allAppsShortEdgeCount = -1; + int allAppsLongEdgeCount = -1; + private ArrayList<DeviceProfileCallbacks> mCallbacks = new ArrayList<DeviceProfileCallbacks>(); DeviceProfile(String n, float w, float h, float r, float c, @@ -152,6 +155,9 @@ public class DeviceProfile { defaultNoAllAppsLayoutId = dnalId; } + DeviceProfile() { + } + DeviceProfile(Context context, ArrayList<DeviceProfile> profiles, float minWidth, float minHeight, @@ -218,6 +224,7 @@ public class DeviceProfile { points.add(new DeviceProfileQuery(p, p.iconSize)); } iconSize = invDistWeightedInterpolate(minWidth, minHeight, points); + // AllApps uses the original non-scaled icon size allAppsIconSizePx = DynamicGrid.pxFromDp(iconSize, dm); @@ -240,6 +247,9 @@ public class DeviceProfile { // Hotseat hotseatIconSize = invDistWeightedInterpolate(minWidth, minHeight, points); + // If the partner customization apk contains any grid overrides, apply them + applyPartnerDeviceProfileOverrides(context, dm); + // Calculate the remaining vars updateFromConfiguration(context, res, wPx, hPx, awPx, ahPx); updateAvailableDimensions(context); @@ -247,6 +257,33 @@ public class DeviceProfile { } /** + * Apply any Partner customization grid overrides. + * + * Currently we support: all apps row / column count. + */ + private void applyPartnerDeviceProfileOverrides(Context ctx, DisplayMetrics dm) { + Partner p = Partner.get(ctx.getPackageManager()); + if (p != null) { + DeviceProfile partnerDp = p.getDeviceProfileOverride(dm); + if (partnerDp != null) { + if (partnerDp.numRows > 0 && partnerDp.numColumns > 0) { + numRows = partnerDp.numRows; + numColumns = partnerDp.numColumns; + } + if (partnerDp.allAppsShortEdgeCount > 0 && partnerDp.allAppsLongEdgeCount > 0) { + allAppsShortEdgeCount = partnerDp.allAppsShortEdgeCount; + allAppsLongEdgeCount = partnerDp.allAppsLongEdgeCount; + } + if (partnerDp.iconSize > 0) { + iconSize = partnerDp.iconSize; + // AllApps uses the original non-scaled icon size + allAppsIconSizePx = DynamicGrid.pxFromDp(iconSize, dm); + } + } + } + } + + /** * Determine the exact visual footprint of the all apps button, taking into account scaling * and internal padding of the drawable. */ @@ -380,12 +417,17 @@ public class DeviceProfile { int maxRows = (isLandscape ? maxShortEdgeCellCount : maxLongEdgeCellCount); int maxCols = (isLandscape ? maxLongEdgeCellCount : maxShortEdgeCellCount); - allAppsNumRows = (availableHeightPx - pageIndicatorHeightPx) / - (allAppsCellHeightPx + allAppsCellPaddingPx); - allAppsNumRows = Math.max(minEdgeCellCount, Math.min(maxRows, allAppsNumRows)); - allAppsNumCols = (availableWidthPx) / - (allAppsCellWidthPx + allAppsCellPaddingPx); - allAppsNumCols = Math.max(minEdgeCellCount, Math.min(maxCols, allAppsNumCols)); + if (allAppsShortEdgeCount > 0 && allAppsLongEdgeCount > 0) { + allAppsNumRows = isLandscape ? allAppsShortEdgeCount : allAppsLongEdgeCount; + allAppsNumCols = isLandscape ? allAppsLongEdgeCount : allAppsShortEdgeCount; + } else { + allAppsNumRows = (availableHeightPx - pageIndicatorHeightPx) / + (allAppsCellHeightPx + allAppsCellPaddingPx); + allAppsNumRows = Math.max(minEdgeCellCount, Math.min(maxRows, allAppsNumRows)); + allAppsNumCols = (availableWidthPx) / + (allAppsCellWidthPx + allAppsCellPaddingPx); + allAppsNumCols = Math.max(minEdgeCellCount, Math.min(maxCols, allAppsNumCols)); + } } void updateFromConfiguration(Context context, Resources resources, int wPx, int hPx, diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 842e0b0ff..30086ad4c 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -327,7 +327,7 @@ public class LauncherProvider extends ContentProvider { final Partner partner = Partner.get(getContext().getPackageManager()); if (partner != null && partner.hasDefaultLayout()) { final Resources partnerRes = partner.getResources(); - int workspaceResId = partnerRes.getIdentifier(Partner.RESOURCE_DEFAULT_LAYOUT, + int workspaceResId = partnerRes.getIdentifier(Partner.RES_DEFAULT_LAYOUT, "xml", partner.getPackageName()); if (workspaceResId != 0) { loader = new SimpleWorkspaceLoader(mOpenHelper, partnerRes, workspaceResId); @@ -1509,7 +1509,7 @@ public class LauncherProvider extends ContentProvider { final Partner partner = Partner.get(mPackageManager); if (partner != null) { final Resources partnerRes = partner.getResources(); - final int resId = partnerRes.getIdentifier(Partner.RESOURCE_FOLDER, + final int resId = partnerRes.getIdentifier(Partner.RES_FOLDER, "xml", partner.getPackageName()); if (resId != 0) { final XmlResourceParser partnerParser = partnerRes.getXml(resId); diff --git a/src/com/android/launcher3/Partner.java b/src/com/android/launcher3/Partner.java new file mode 100644 index 000000000..e1913193b --- /dev/null +++ b/src/com/android/launcher3/Partner.java @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2014 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.pm.PackageManager; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.Pair; + +import java.io.File; + +/** + * Utilities to discover and interact with partner customizations. There can + * only be one set of customizations on a device, and it must be bundled with + * the system. + */ +public class Partner { + + static final String TAG = "Launcher.Partner"; + + /** Marker action used to discover partner */ + private static final String + ACTION_PARTNER_CUSTOMIZATION = "com.android.launcher3.action.PARTNER_CUSTOMIZATION"; + + public static final String RES_FOLDER = "partner_folder"; + public static final String RES_WALLPAPERS = "partner_wallpapers"; + public static final String RES_DEFAULT_LAYOUT = "partner_default_layout"; + + public static final String RES_DEFAULT_WALLPAPER_HIDDEN = "default_wallpapper_hidden"; + public static final String RES_SYSTEM_WALLPAPER_DIR = "system_wallpaper_directory"; + + public static final String RES_REQUIRE_FIRST_RUN_FLOW = "requires_first_run_flow"; + + /** These resources are used to override the device profile */ + public static final String RES_GRID_AA_SHORT_EDGE_COUNT = "grid_aa_short_edge_count"; + public static final String RES_GRID_AA_LONG_EDGE_COUNT = "grid_aa_long_edge_count"; + public static final String RES_GRID_NUM_ROWS = "grid_num_rows"; + public static final String RES_GRID_NUM_COLUMNS = "grid_num_columns"; + public static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp"; + + private static boolean sSearched = false; + private static Partner sPartner; + + /** + * Find and return partner details, or {@code null} if none exists. + */ + public static synchronized Partner get(PackageManager pm) { + if (!sSearched) { + Pair<String, Resources> apkInfo = Utilities.findSystemApk(ACTION_PARTNER_CUSTOMIZATION, pm); + if (apkInfo != null) { + sPartner = new Partner(apkInfo.first, apkInfo.second); + } + sSearched = true; + } + return sPartner; + } + + private final String mPackageName; + private final Resources mResources; + + private Partner(String packageName, Resources res) { + mPackageName = packageName; + mResources = res; + } + + public String getPackageName() { + return mPackageName; + } + + public Resources getResources() { + return mResources; + } + + public boolean hasDefaultLayout() { + int defaultLayout = getResources().getIdentifier(Partner.RES_DEFAULT_LAYOUT, + "xml", getPackageName()); + return defaultLayout != 0; + } + + public boolean hasFolder() { + int folder = getResources().getIdentifier(Partner.RES_FOLDER, + "xml", getPackageName()); + return folder != 0; + } + + public boolean hideDefaultWallpaper() { + int resId = getResources().getIdentifier(RES_DEFAULT_WALLPAPER_HIDDEN, "bool", + getPackageName()); + return resId != 0 && getResources().getBoolean(resId); + } + + public File getWallpaperDirectory() { + int resId = getResources().getIdentifier(RES_SYSTEM_WALLPAPER_DIR, "string", + getPackageName()); + return (resId != 0) ? new File(getResources().getString(resId)) : null; + } + + public boolean requiresFirstRunFlow() { + int resId = getResources().getIdentifier(RES_REQUIRE_FIRST_RUN_FLOW, "bool", + getPackageName()); + return resId != 0 && getResources().getBoolean(resId); + } + + public DeviceProfile getDeviceProfileOverride(DisplayMetrics dm) { + boolean containsProfileOverrides = false; + + DeviceProfile dp = new DeviceProfile(); + + // We initialize customizable fields to be invalid + dp.numRows = -1; + dp.numColumns = -1; + dp.allAppsShortEdgeCount = -1; + dp.allAppsLongEdgeCount = -1; + + try { + int resId = getResources().getIdentifier(RES_GRID_NUM_ROWS, + "integer", getPackageName()); + if (resId > 0) { + containsProfileOverrides = true; + dp.numRows = getResources().getInteger(resId); + } + + resId = getResources().getIdentifier(RES_GRID_NUM_COLUMNS, + "integer", getPackageName()); + if (resId > 0) { + containsProfileOverrides = true; + dp.numColumns = getResources().getInteger(resId); + } + + resId = getResources().getIdentifier(RES_GRID_AA_SHORT_EDGE_COUNT, + "integer", getPackageName()); + if (resId > 0) { + containsProfileOverrides = true; + dp.allAppsShortEdgeCount = getResources().getInteger(resId); + } + + resId = getResources().getIdentifier(RES_GRID_AA_LONG_EDGE_COUNT, + "integer", getPackageName()); + if (resId > 0) { + containsProfileOverrides = true; + dp.allAppsLongEdgeCount = getResources().getInteger(resId); + } + + resId = getResources().getIdentifier(RES_GRID_ICON_SIZE_DP, + "dimen", getPackageName()); + if (resId > 0) { + containsProfileOverrides = true; + int px = getResources().getDimensionPixelSize(resId); + dp.iconSize = DynamicGrid.dpiFromPx(px, dm); + } + } catch (Resources.NotFoundException ex) { + Log.e(TAG, "Invalid Partner grid resource!", ex); + } + return containsProfileOverrides ? dp : null; + } +} |