14ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen/*
24ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * Copyright (C) 2014 The Android Open Source Project
34ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen *
44ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * Licensed under the Apache License, Version 2.0 (the "License");
54ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * you may not use this file except in compliance with the License.
64ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * You may obtain a copy of the License at
74ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen *
84ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen *      http://www.apache.org/licenses/LICENSE-2.0
94ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen *
104ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * Unless required by applicable law or agreed to in writing, software
114ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * distributed under the License is distributed on an "AS IS" BASIS,
124ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * See the License for the specific language governing permissions and
144ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * limitations under the License.
154ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen */
164ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
174ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenpackage com.android.launcher3;
184ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
194ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport android.content.pm.PackageManager;
204ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport android.content.res.Resources;
214ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport android.util.DisplayMetrics;
224ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport android.util.Log;
234ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport android.util.Pair;
244ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
254ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenimport java.io.File;
264ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
274ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen/**
284ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * Utilities to discover and interact with partner customizations. There can
294ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * only be one set of customizations on a device, and it must be bundled with
304ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen * the system.
314ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen */
324ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohenpublic class Partner {
334ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
344ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    static final String TAG = "Launcher.Partner";
354ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
364ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    /** Marker action used to discover partner */
374ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private static final String
384ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            ACTION_PARTNER_CUSTOMIZATION = "com.android.launcher3.action.PARTNER_CUSTOMIZATION";
394ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
404ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_FOLDER = "partner_folder";
414ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_WALLPAPERS = "partner_wallpapers";
424ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_DEFAULT_LAYOUT = "partner_default_layout";
434ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
444ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_DEFAULT_WALLPAPER_HIDDEN = "default_wallpapper_hidden";
454ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_SYSTEM_WALLPAPER_DIR = "system_wallpaper_directory";
464ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
474ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_REQUIRE_FIRST_RUN_FLOW = "requires_first_run_flow";
484ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
494ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    /** These resources are used to override the device profile  */
504ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_GRID_NUM_ROWS = "grid_num_rows";
514ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_GRID_NUM_COLUMNS = "grid_num_columns";
524ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp";
534ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
544ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private static boolean sSearched = false;
554ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private static Partner sPartner;
564ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
574ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    /**
584ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen     * Find and return partner details, or {@code null} if none exists.
594ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen     */
604ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public static synchronized Partner get(PackageManager pm) {
614ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        if (!sSearched) {
624ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            Pair<String, Resources> apkInfo = Utilities.findSystemApk(ACTION_PARTNER_CUSTOMIZATION, pm);
634ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            if (apkInfo != null) {
644ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                sPartner = new Partner(apkInfo.first, apkInfo.second);
654ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            }
664ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            sSearched = true;
674ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        }
684ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return sPartner;
694ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
704ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
714ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private final String mPackageName;
724ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private final Resources mResources;
734ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
744ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    private Partner(String packageName, Resources res) {
754ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        mPackageName = packageName;
764ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        mResources = res;
774ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
784ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
794ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public String getPackageName() {
804ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return mPackageName;
814ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
824ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
834ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public Resources getResources() {
844ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return mResources;
854ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
864ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
874ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public boolean hasDefaultLayout() {
884ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        int defaultLayout = getResources().getIdentifier(Partner.RES_DEFAULT_LAYOUT,
894ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                "xml", getPackageName());
904ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return defaultLayout != 0;
914ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
924ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
934ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public boolean hasFolder() {
944ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        int folder = getResources().getIdentifier(Partner.RES_FOLDER,
954ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                "xml", getPackageName());
964ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return folder != 0;
974ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
984ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
994ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public boolean hideDefaultWallpaper() {
1004ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        int resId = getResources().getIdentifier(RES_DEFAULT_WALLPAPER_HIDDEN, "bool",
1014ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                getPackageName());
1024ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return resId != 0 && getResources().getBoolean(resId);
1034ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
1044ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1054ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public File getWallpaperDirectory() {
1064ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        int resId = getResources().getIdentifier(RES_SYSTEM_WALLPAPER_DIR, "string",
1074ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                getPackageName());
1084ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return (resId != 0) ? new File(getResources().getString(resId)) : null;
1094ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
1104ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1114ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    public boolean requiresFirstRunFlow() {
1124ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        int resId = getResources().getIdentifier(RES_REQUIRE_FIRST_RUN_FLOW, "bool",
1134ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                getPackageName());
1144ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        return resId != 0 && getResources().getBoolean(resId);
1154ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen    }
1164ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1172e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen    public void applyInvariantDeviceProfileOverrides(InvariantDeviceProfile inv, DisplayMetrics dm) {
1182e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        int numRows = -1;
1192e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        int numColumns = -1;
1202e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        float iconSize = -1;
1214ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1224ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen        try {
1234ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            int resId = getResources().getIdentifier(RES_GRID_NUM_ROWS,
1244ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                    "integer", getPackageName());
1254ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            if (resId > 0) {
1262e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                numRows = getResources().getInteger(resId);
1274ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            }
1284ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1294ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            resId = getResources().getIdentifier(RES_GRID_NUM_COLUMNS,
1304ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen                    "integer", getPackageName());
1314ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            if (resId > 0) {
1322e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                numColumns = getResources().getInteger(resId);
1334ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            }
1344ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1352e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            resId = getResources().getIdentifier(RES_GRID_ICON_SIZE_DP,
1362e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                    "dimen", getPackageName());
1374ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            if (resId > 0) {
1382e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                int px = getResources().getDimensionPixelSize(resId);
1392e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen                iconSize = Utilities.dpiFromPx(px, dm);
1404ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            }
1412e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        } catch (Resources.NotFoundException ex) {
1422e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            Log.e(TAG, "Invalid Partner grid resource!", ex);
1432e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            return;
1442e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        }
1454ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen
1462e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        if (numRows > 0 && numColumns > 0) {
1472e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            inv.numRows = numRows;
1482e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            inv.numColumns = numColumns;
1492e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        }
1502e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen
1512e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        if (iconSize > 0) {
1522e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen            inv.iconSize = iconSize;
1532e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen        }
1542e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen    }
1554ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen}
156