diff options
author | Andrei Kapishnikov <kapishnikov@google.com> | 2015-03-23 18:43:55 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-23 18:43:56 +0000 |
commit | 33cbdfa46a2a221f002441d8382cf01a9ec23e5b (patch) | |
tree | 3b75721c8907e29afc8e08c6d3620bdffa3f7e72 | |
parent | b168ad716492d8e3f7f0e188d87a34d8e25b8ab7 (diff) | |
parent | 2a27d9f709282ec298440b010575c5950985c591 (diff) | |
download | android_packages_apps_Trebuchet-33cbdfa46a2a221f002441d8382cf01a9ec23e5b.tar.gz android_packages_apps_Trebuchet-33cbdfa46a2a221f002441d8382cf01a9ec23e5b.tar.bz2 android_packages_apps_Trebuchet-33cbdfa46a2a221f002441d8382cf01a9ec23e5b.zip |
Merge "Configuration of workspace through app restrictions"
-rw-r--r-- | src/com/android/launcher3/AutoInstallsLayout.java | 22 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherProvider.java | 59 |
2 files changed, 76 insertions, 5 deletions
diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index a5d22286d..3f7322c1f 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -77,6 +77,28 @@ public class AutoInstallsLayout { TAG_WORKSPACE); } + static AutoInstallsLayout get(String packageName, int xmlResourceId, Context context, + AppWidgetHost appWidgetHost, LayoutParserCallback callback) { + + Resources resources; + try { + resources = context.getPackageManager().getResourcesForApplication(packageName); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Package not found: " + packageName); + return null; + } + + // Verify that the XML resource exists + String resourceName = resources.getResourceName(xmlResourceId); + if (resourceName == null || !resourceName.startsWith(packageName)) { + Log.e(TAG, "Cannot find resource id:" + xmlResourceId + " in package " + packageName); + return null; + } + + return new AutoInstallsLayout(context, appWidgetHost, callback, resources, xmlResourceId, + TAG_WORKSPACE); + } + // Object Tags private static final String TAG_WORKSPACE = "workspace"; private static final String TAG_APP_ICON = "appicon"; diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 1715b02bf..58533c9ca 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -16,6 +16,7 @@ package com.android.launcher3; +import android.annotation.TargetApi; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; @@ -40,6 +41,9 @@ import android.database.sqlite.SQLiteStatement; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.UserManager; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -79,6 +83,9 @@ public class LauncherProvider extends ContentProvider { private static final String URI_PARAM_IS_EXTERNAL_ADD = "isExternalAdd"; + private static final String RESTRICTION_PACKAGE_NAME = "workspace.configuration.package.name"; + private static final String RESTRICTION_XML_RES_ID = "workspace.configuration.xml.resource.id"; + private LauncherProviderChangeListener mListener; /** @@ -301,9 +308,10 @@ public class LauncherProvider extends ContentProvider { /** * Loads the default workspace based on the following priority scheme: - * 1) From a package provided by play store - * 2) From a partner configuration APK, already in the system image - * 3) The default configuration for the particular device + * 1) From the app restrictions + * 2) From a package provided by play store + * 3) From a partner configuration APK, already in the system image + * 4) The default configuration for the particular device */ synchronized public void loadDefaultFavoritesIfNecessary() { String spKey = LauncherAppState.getSharedPreferencesKey(); @@ -312,9 +320,16 @@ public class LauncherProvider extends ContentProvider { if (sp.getBoolean(EMPTY_DATABASE_CREATED, false)) { Log.d(TAG, "loading default workspace"); - AutoInstallsLayout loader = AutoInstallsLayout.get(getContext(), - mOpenHelper.mAppWidgetHost, mOpenHelper); + // Application restrictions + AutoInstallsLayout loader = createWorkspaceLoaderFromAppRestriction(); + + // Play Store + if (loader == null) { + loader = AutoInstallsLayout.get(getContext(), mOpenHelper.mAppWidgetHost, + mOpenHelper); + } + // Partner APK if (loader == null) { final Partner partner = Partner.get(getContext().getPackageManager()); if (partner != null && partner.hasDefaultLayout()) { @@ -329,6 +344,7 @@ public class LauncherProvider extends ContentProvider { } final boolean usingExternallyProvidedLayout = loader != null; + // Default configuration if (loader == null) { loader = getDefaultLayoutParser(); } @@ -344,6 +360,39 @@ public class LauncherProvider extends ContentProvider { } } + /** + * Creates workspace loader from an XML resource listed in the app restrictions. + * + * @return the loader if the restrictions are set and the resource exists; null otherwise. + */ + @TargetApi(18) + private AutoInstallsLayout createWorkspaceLoaderFromAppRestriction() { + + // UserManager.getApplicationRestrictions() requires minSdkVersion >= 18 + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { + return null; + } + + Context ctx = getContext(); + UserManager um = (UserManager) ctx.getSystemService(Context.USER_SERVICE); + Bundle bundle = um.getApplicationRestrictions(ctx.getPackageName()); + String packageName = bundle.getString(RESTRICTION_PACKAGE_NAME); + int xmlResourceId = bundle.getInt(RESTRICTION_XML_RES_ID); + + AutoInstallsLayout loader = null; + if (packageName != null && xmlResourceId != 0) { + loader = AutoInstallsLayout.get(packageName, xmlResourceId, getContext(), + mOpenHelper.mAppWidgetHost, mOpenHelper); + + } + + if (loader != null) { + Log.d(TAG, "Will load workspace configuration from " + packageName); + } + + return loader; + } + private DefaultLayoutParser getDefaultLayoutParser() { int defaultLayout = LauncherAppState.getInstance() .getDynamicGrid().getDeviceProfile().defaultLayoutId; |