1ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler/* 2ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * Copyright (C) 2015 The Android Open Source Project 3ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * 4ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 5ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * you may not use this file except in compliance with the License. 6ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * You may obtain a copy of the License at 7ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * 8ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 9ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * 10ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * Unless required by applicable law or agreed to in writing, software 11ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 12ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * See the License for the specific language governing permissions and 14ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler * limitations under the License 15ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler */ 16ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 17ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerpackage com.android.settingslib.applications; 18ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 19ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.content.ComponentName; 20ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.content.Context; 21ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.content.IntentFilter; 2267952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargentimport android.content.pm.ApplicationInfo; 23ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.content.pm.PackageManager; 24ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.hardware.usb.IUsbManager; 25ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.os.RemoteException; 2667952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargentimport android.os.SystemProperties; 27ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.os.UserHandle; 28ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport android.util.Log; 29ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 30ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport com.android.settingslib.R; 314af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargentimport com.android.settingslib.applications.instantapps.InstantAppDataProvider; 32ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 33ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport java.util.ArrayList; 34ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerimport java.util.List; 35ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 36ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantlerpublic class AppUtils { 37ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler private static final String TAG = "AppUtils"; 38ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 394af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent /** 404af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent * This should normally only be set in robolectric tests, to avoid getting a method not found 414af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent * exception when calling the isInstantApp method of the ApplicationInfo class, because 424af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent * robolectric does not yet have an implementation of it. 434af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent */ 444af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent private static InstantAppDataProvider sInstantAppDataProvider = null; 454af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent 46ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler public static CharSequence getLaunchByDefaultSummary(ApplicationsState.AppEntry appEntry, 47ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler IUsbManager usbManager, PackageManager pm, Context context) { 48ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler String packageName = appEntry.info.packageName; 49ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler boolean hasPreferred = hasPreferredActivities(pm, packageName) 50ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler || hasUsbDefaults(usbManager, packageName); 51e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey int status = pm.getIntentVerificationStatusAsUser(packageName, UserHandle.myUserId()); 52ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler // consider a visible current link-handling state to be any explicitly designated behavior 53ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler boolean hasDomainURLsPreference = 54ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; 55ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler return context.getString(hasPreferred || hasDomainURLsPreference 56ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler ? R.string.launch_defaults_some 57ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler : R.string.launch_defaults_none); 58ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } 59ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 60ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler public static boolean hasUsbDefaults(IUsbManager usbManager, String packageName) { 61ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler try { 62ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler if (usbManager != null) { 63ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler return usbManager.hasDefaults(packageName, UserHandle.myUserId()); 64ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } 65ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } catch (RemoteException e) { 66ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler Log.e(TAG, "mUsbManager.hasDefaults", e); 67ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } 68ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler return false; 69ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } 70ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 71ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler public static boolean hasPreferredActivities(PackageManager pm, String packageName) { 72ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler // Get list of preferred activities 73ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler List<ComponentName> prefActList = new ArrayList<>(); 74ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler // Intent list cannot be null. so pass empty list 75ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler List<IntentFilter> intentList = new ArrayList<>(); 76ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler pm.getPreferredActivities(intentList, prefActList, packageName); 77ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler Log.d(TAG, "Have " + prefActList.size() + " number of activities in preferred list"); 78ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler return prefActList.size() > 0; 79ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler } 80ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler 8167952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent /** 8267952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent * Returns a boolean indicating whether the given package should be considered an instant app 8367952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent */ 8467952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent public static boolean isInstant(ApplicationInfo info) { 854af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent if (sInstantAppDataProvider != null) { 864af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent if (sInstantAppDataProvider.isInstantApp(info)) { 874af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent return true; 884af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent } 894af5b9276e48b606a2ec9f24adee2072eee0a1bfAntony Sargent } else if (info.isInstantApp()) { 9067952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent return true; 9167952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 9267952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent 9367952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent // For debugging/testing, we support setting the following property to a comma-separated 9467952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent // list of search terms (typically, but not necessarily, full package names) to match 9567952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent // against the package names of the app. 9667952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent String propVal = SystemProperties.get("settingsdebug.instant.packages"); 9767952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent if (propVal != null && !propVal.isEmpty() && info.packageName != null) { 9867952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent String[] searchTerms = propVal.split(","); 9967952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent if (searchTerms != null) { 10067952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent for (String term : searchTerms) { 10167952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent if (info.packageName.contains(term)) { 10267952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent return true; 10367952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 10467952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 10567952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 10667952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 10767952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent return false; 10867952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent } 10967952e94a92a429abd0dbc758c99655f67ae2c30Antony Sargent 110ed03f451c877326352e1d7b783099ff9c04f1d2eTony Mantler} 111