summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorWinson Chung <winsonc@google.com>2014-05-14 14:15:20 -0700
committerAdam Cohen <adamcohen@google.com>2014-05-16 17:26:09 +0000
commit667e4d395ca17de2b5bb0ec74202ee8f0673d894 (patch)
treeedb9efdfeded487bc2b84e381ce1d6ead41b054c /src/com
parent244637b59c328b918c6b2e1aef33ba448728207d (diff)
downloadandroid_packages_apps_Trebuchet-667e4d395ca17de2b5bb0ec74202ee8f0673d894.tar.gz
android_packages_apps_Trebuchet-667e4d395ca17de2b5bb0ec74202ee8f0673d894.tar.bz2
android_packages_apps_Trebuchet-667e4d395ca17de2b5bb0ec74202ee8f0673d894.zip
Adding support for dynamically resolved default layouts.
issue 14159482 Change-Id: Ic24c5e425cf3e427b82dd13a4a78dd9108174599
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/launcher3/DeviceProfile.java86
-rw-r--r--src/com/android/launcher3/DynamicGrid.java39
-rw-r--r--src/com/android/launcher3/LauncherProvider.java6
3 files changed, 83 insertions, 48 deletions
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index e67ec197a..8470b39a3 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -43,16 +43,18 @@ import java.util.Comparator;
class DeviceProfileQuery {
+ DeviceProfile profile;
float widthDps;
float heightDps;
float value;
PointF dimens;
- DeviceProfileQuery(float w, float h, float v) {
- widthDps = w;
- heightDps = h;
+ DeviceProfileQuery(DeviceProfile p, float v) {
+ widthDps = p.minWidthDps;
+ heightDps = p.minHeightDps;
value = v;
- dimens = new PointF(w, h);
+ dimens = new PointF(widthDps, heightDps);
+ profile = p;
}
}
@@ -72,6 +74,9 @@ public class DeviceProfile {
private int iconDrawablePaddingOriginalPx;
private float hotseatIconSize;
+ int defaultLayoutId;
+ int defaultNoAllAppsLayoutId;
+
boolean isLandscape;
boolean isTablet;
boolean isLargeTablet;
@@ -127,7 +132,7 @@ public class DeviceProfile {
private ArrayList<DeviceProfileCallbacks> mCallbacks = new ArrayList<DeviceProfileCallbacks>();
DeviceProfile(String n, float w, float h, float r, float c,
- float is, float its, float hs, float his) {
+ float is, float its, float hs, float his, int dlId, int dnalId) {
// Ensure that we have an odd number of hotseat items (since we need to place all apps)
if (!LauncherAppState.isDisableAllApps() && hs % 2 == 0) {
throw new RuntimeException("All Device Profiles must have an odd number of hotseat spaces");
@@ -142,6 +147,8 @@ public class DeviceProfile {
iconTextSize = its;
numHotseatIcons = hs;
hotseatIconSize = his;
+ defaultLayoutId = dlId;
+ defaultNoAllAppsLayoutId = dnalId;
}
DeviceProfile(Context context,
@@ -182,29 +189,32 @@ public class DeviceProfile {
overviewModeScaleFactor =
res.getInteger(R.integer.config_dynamic_grid_overview_scale_percentage) / 100f;
- // Interpolate the rows
- for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numRows));
- }
- numRows = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
- // Interpolate the columns
- points.clear();
+ // Find the closes profile given the width/height
for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numColumns));
+ points.add(new DeviceProfileQuery(p, 0f));
}
- numColumns = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
- // Interpolate the hotseat length
- points.clear();
- for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numHotseatIcons));
- }
- numHotseatIcons = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
+ DeviceProfile closestProfile = findClosestDeviceProfile(minWidth, minHeight, points);
+
+ // Snap to the closest row count
+ numRows = closestProfile.numRows;
+
+ // Snap to the closest column count
+ numColumns = closestProfile.numColumns;
+
+ // Snap to the closest hotseat size
+ numHotseatIcons = closestProfile.numHotseatIcons;
hotseatAllAppsRank = (int) (numHotseatIcons / 2);
+ // Snap to the closest default layout id
+ defaultLayoutId = closestProfile.defaultLayoutId;
+
+ // Snap to the closest default no all-apps layout id
+ defaultNoAllAppsLayoutId = closestProfile.defaultNoAllAppsLayoutId;
+
// Interpolate the icon size
points.clear();
for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.iconSize));
+ points.add(new DeviceProfileQuery(p, p.iconSize));
}
iconSize = invDistWeightedInterpolate(minWidth, minHeight, points);
// AllApps uses the original non-scaled icon size
@@ -213,7 +223,7 @@ public class DeviceProfile {
// Interpolate the icon text size
points.clear();
for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.iconTextSize));
+ points.add(new DeviceProfileQuery(p, p.iconTextSize));
}
iconTextSize = invDistWeightedInterpolate(minWidth, minHeight, points);
iconDrawablePaddingOriginalPx =
@@ -224,7 +234,7 @@ public class DeviceProfile {
// Interpolate the hotseat icon size
points.clear();
for (DeviceProfile p : profiles) {
- points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.hotseatIconSize));
+ points.add(new DeviceProfileQuery(p, p.hotseatIconSize));
}
// Hotseat
hotseatIconSize = invDistWeightedInterpolate(minWidth, minHeight, points);
@@ -398,14 +408,18 @@ public class DeviceProfile {
return (float) (1f / Math.pow(d, pow));
}
- private float invDistWeightedInterpolate(float width, float height,
- ArrayList<DeviceProfileQuery> points) {
- float sum = 0;
- float weights = 0;
- float pow = 5;
- float kNearestNeighbors = 3;
+ /** Returns the closest device profile given the width and height and a list of profiles */
+ private DeviceProfile findClosestDeviceProfile(float width, float height,
+ ArrayList<DeviceProfileQuery> points) {
+ return findClosestDeviceProfiles(width, height, points).get(0).profile;
+ }
+
+ /** Returns the closest device profiles ordered by closeness to the specified width and height */
+ private ArrayList<DeviceProfileQuery> findClosestDeviceProfiles(float width, float height,
+ ArrayList<DeviceProfileQuery> points) {
final PointF xy = new PointF(width, height);
+ // Sort the profiles by their closeness to the dimensions
ArrayList<DeviceProfileQuery> pointsByNearness = points;
Collections.sort(pointsByNearness, new Comparator<DeviceProfileQuery>() {
public int compare(DeviceProfileQuery a, DeviceProfileQuery b) {
@@ -413,6 +427,20 @@ public class DeviceProfile {
}
});
+ return pointsByNearness;
+ }
+
+ private float invDistWeightedInterpolate(float width, float height,
+ ArrayList<DeviceProfileQuery> points) {
+ float sum = 0;
+ float weights = 0;
+ float pow = 5;
+ float kNearestNeighbors = 3;
+ final PointF xy = new PointF(width, height);
+
+ ArrayList<DeviceProfileQuery> pointsByNearness = findClosestDeviceProfiles(width, height,
+ points);
+
for (int i = 0; i < pointsByNearness.size(); ++i) {
DeviceProfileQuery p = pointsByNearness.get(i);
if (i < kNearestNeighbors) {
diff --git a/src/com/android/launcher3/DynamicGrid.java b/src/com/android/launcher3/DynamicGrid.java
index 447bb1cd8..94a07d706 100644
--- a/src/com/android/launcher3/DynamicGrid.java
+++ b/src/com/android/launcher3/DynamicGrid.java
@@ -60,36 +60,41 @@ public class DynamicGrid {
DEFAULT_ICON_SIZE_PX = pxFromDp(DEFAULT_ICON_SIZE_DP, dm);
// Our phone profiles include the bar sizes in each orientation
deviceProfiles.add(new DeviceProfile("Super Short Stubby",
- 255, 300, 2, 3, 48, 13, (hasAA ? 5 : 5), 48));
+ 255, 300, 2, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Shorter Stubby",
- 255, 400, 3, 3, 48, 13, (hasAA ? 5 : 5), 48));
+ 255, 400, 3, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Short Stubby",
- 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48));
+ 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Stubby",
- 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48));
+ 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Nexus S",
- 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48));
+ 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Nexus 4",
- 335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56));
+ 335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Nexus 5",
- 359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56));
+ 359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
deviceProfiles.add(new DeviceProfile("Large Phone",
- 406, 694, 5, 5, 64, 14.4f, 5, 56));
+ 406, 694, 5, 5, 64, 14.4f, 5, 56, R.xml.default_workspace_5x5,
+ R.xml.default_workspace_5x5_no_all_apps));
// The tablet profile is odd in that the landscape orientation
// also includes the nav bar on the side
deviceProfiles.add(new DeviceProfile("Nexus 7",
- 575, 904, 5, 6, 72, 14.4f, 7, 60));
+ 575, 904, 5, 6, 72, 14.4f, 7, 60, R.xml.default_workspace_5x6,
+ R.xml.default_workspace_5x6_no_all_apps));
// Larger tablet profiles always have system bars on the top & bottom
deviceProfiles.add(new DeviceProfile("Nexus 10",
- 727, 1207, 5, 6, 76, 14.4f, 7, 64));
- /*
- deviceProfiles.add(new DeviceProfile("Nexus 7",
- 600, 960, 5, 5, 72, 14.4f, 5, 60));
- deviceProfiles.add(new DeviceProfile("Nexus 10",
- 800, 1280, 5, 5, 80, 14.4f, (hasAA ? 7 : 6), 64));
- */
+ 727, 1207, 5, 6, 76, 14.4f, 7, 64, R.xml.default_workspace_5x6,
+ R.xml.default_workspace_5x6_no_all_apps));
deviceProfiles.add(new DeviceProfile("20-inch Tablet",
- 1527, 2527, 7, 7, 100, 20, 7, 72));
+ 1527, 2527, 7, 7, 100, 20, 7, 72, R.xml.default_workspace_4x4,
+ R.xml.default_workspace_4x4_no_all_apps));
mMinWidth = dpiFromPx(minWidthPx, dm);
mMinHeight = dpiFromPx(minHeightPx, dm);
mProfile = new DeviceProfile(context, deviceProfiles,
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 437c2ad96..93708b5ed 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -336,10 +336,12 @@ public class LauncherProvider extends ContentProvider {
}
private static int getDefaultWorkspaceResourceId() {
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
if (LauncherAppState.isDisableAllApps()) {
- return R.xml.default_workspace_no_all_apps;
+ return grid.defaultNoAllAppsLayoutId;
} else {
- return R.xml.default_workspace;
+ return grid.defaultLayoutId;
}
}