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