10acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki/* 20acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * Copyright (C) 2016 The Android Open Source Project 30acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * 40acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 50acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * you may not use this file except in compliance with the License. 60acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * You may obtain a copy of the License at 70acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * 80acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 90acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * 100acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * Unless required by applicable law or agreed to in writing, software 110acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 120acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * See the License for the specific language governing permissions and 140acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki * limitations under the License. 150acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki */ 160acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukipackage com.android.server.pm; 170acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 180acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport android.annotation.NonNull; 192e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onukiimport android.content.pm.PackageInfo; 202e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onukiimport android.util.Slog; 210acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 229da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onukiimport com.android.internal.util.Preconditions; 239da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 2476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport org.json.JSONException; 2576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport org.json.JSONObject; 260acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport org.xmlpull.v1.XmlPullParserException; 270acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport org.xmlpull.v1.XmlSerializer; 280acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 290acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport java.io.IOException; 300acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 3122fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki/** 3222fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki * All methods should be guarded by {@code #mShortcutUser.mService.mLock}. 3322fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki */ 349da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onukiabstract class ShortcutPackageItem { 352e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private static final String TAG = ShortcutService.TAG; 3676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki private static final String KEY_NAME = "name"; 372e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 389da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final int mPackageUserId; 399da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final String mPackageName; 409da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 412e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private final ShortcutPackageInfo mPackageInfo; 429da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 43fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki protected ShortcutUser mShortcutUser; 444d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki 454d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, 464d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki int packageUserId, @NonNull String packageName, 479da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki @NonNull ShortcutPackageInfo packageInfo) { 484d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki mShortcutUser = shortcutUser; 499da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageUserId = packageUserId; 509da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageName = Preconditions.checkStringNotEmpty(packageName); 519da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo = Preconditions.checkNotNull(packageInfo); 529da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 539da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 54fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki /** 55fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki * Change the parent {@link ShortcutUser}. Need it in the restore code. 56fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki */ 57fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki public void replaceUser(ShortcutUser user) { 58fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki mShortcutUser = user; 59fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki } 60fc4cf2da34335fd7e84c020f51eea1a341d3f134Makoto Onuki 614e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki public ShortcutUser getUser() { 624e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki return mShortcutUser; 634e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki } 644e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki 659da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 669da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who actually has this package running on. For {@link ShortcutPackage}, 679da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * this is the same thing as {@link #getOwnerUserId}, but if it's a {@link ShortcutLauncher} and 68c8c3329dd918b8ea16d6317d19ddee12325800f3Makoto Onuki * {@link #getOwnerUserId} is of work profile, then this ID is of the primary user. 699da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 709da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public int getPackageUserId() { 719da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageUserId; 729da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 739da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 749da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 759da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who sees the shortcuts from this instance. 769da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 779da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract int getOwnerUserId(); 789da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 790acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki @NonNull 809da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public String getPackageName() { 819da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageName; 829da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 839da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 849da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public ShortcutPackageInfo getPackageInfo() { 859da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageInfo; 869da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 879da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 88c8c3329dd918b8ea16d6317d19ddee12325800f3Makoto Onuki public void refreshPackageSignatureAndSave() { 892e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (mPackageInfo.isShadow()) { 902e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Don't refresh for shadow user. 912e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 92c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki final ShortcutService s = mShortcutUser.mService; 93c8c3329dd918b8ea16d6317d19ddee12325800f3Makoto Onuki mPackageInfo.refreshSignature(s, this); 949da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki s.scheduleSaveUser(getOwnerUserId()); 959da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 969da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 97c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki public void attemptToRestoreIfNeededAndSave() { 982e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.isShadow()) { 992e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Already installed, nothing to do. 1009da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 101c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki final ShortcutService s = mShortcutUser.mService; 1022e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!s.isPackageInstalled(mPackageName, mPackageUserId)) { 1032e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 1042e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Package still not installed: %s user=%d", 1052e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageName, mPackageUserId)); 1062e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1072e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Not installed, no need to restore yet. 1082e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 109fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki boolean blockRestore = false; 1102e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.hasSignatures()) { 1112e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId 1122e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki + " but signatures not found in the restore data."); 113fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki blockRestore = true; 1142e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 115fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki if (!blockRestore) { 116fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); 117fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki if (!mPackageInfo.canRestoreTo(s, pi)) { 118fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki // Package is now installed, but can't restore. Let the subclass do the cleanup. 119fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki blockRestore = true; 120fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki } 1212e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 122fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki if (blockRestore) { 123fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki onRestoreBlocked(); 124fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki } else { 125fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki if (ShortcutService.DEBUG) { 126fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, 127fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki mPackageUserId, getOwnerUserId())); 128fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki } 1292e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 130fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki onRestored(); 131fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki } 1322e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 133fac592f64c55004e9048e30e03d6dc65bdb4f00aMakoto Onuki // Either way, it's no longer a shadow. 1342e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageInfo.setShadow(false); 1352e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1362e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.scheduleSaveUser(mPackageUserId); 1379da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 1380acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 1392e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1402e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package can't be restored because it has a lower version number 1412e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * or different signatures. 1422e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 143c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki protected abstract void onRestoreBlocked(); 1442e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1452e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1462e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package is successfully restored. 1472e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 148c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki protected abstract void onRestored(); 1492e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1509da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract void saveToXml(@NonNull XmlSerializer out, boolean forBackup) 1510acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki throws IOException, XmlPullParserException; 1527001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki 15376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki public JSONObject dumpCheckin(boolean clear) throws JSONException { 15476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki final JSONObject result = new JSONObject(); 15576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki result.put(KEY_NAME, mPackageName); 15676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki return result; 15776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki } 15876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki 1597001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki /** 1607001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki * Verify various internal states. 1617001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki */ 1627001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki public void verifyStates() { 1637001a6154088c87a31d56641762ff0c2a48f1d57Makoto Onuki } 1640acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki} 165