ShortcutPackageItem.java revision 22fcc68e6be0edaa98f3dacf79d580a5e5d50005
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 240acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport org.xmlpull.v1.XmlPullParserException; 250acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport org.xmlpull.v1.XmlSerializer; 260acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 270acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onukiimport java.io.IOException; 280acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 2922fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki/** 3022fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki * All methods should be guarded by {@code #mShortcutUser.mService.mLock}. 3122fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki */ 329da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onukiabstract class ShortcutPackageItem { 332e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private static final String TAG = ShortcutService.TAG; 342e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 359da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final int mPackageUserId; 369da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final String mPackageName; 379da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 382e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private final ShortcutPackageInfo mPackageInfo; 399da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 404d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki protected final ShortcutUser mShortcutUser; 414d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki 424d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, 434d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki int packageUserId, @NonNull String packageName, 449da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki @NonNull ShortcutPackageInfo packageInfo) { 454d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki mShortcutUser = shortcutUser; 469da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageUserId = packageUserId; 479da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageName = Preconditions.checkStringNotEmpty(packageName); 489da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo = Preconditions.checkNotNull(packageInfo); 499da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 509da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 519da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 529da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who actually has this package running on. For {@link ShortcutPackage}, 539da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * this is the same thing as {@link #getOwnerUserId}, but if it's a {@link ShortcutLauncher} and 549da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * {@link #getOwnerUserId} is of a work profile, then this ID could be the user who owns the 559da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * profile. 569da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 579da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public int getPackageUserId() { 589da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageUserId; 599da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 609da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 619da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 629da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who sees the shortcuts from this instance. 639da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 649da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract int getOwnerUserId(); 659da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 660acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki @NonNull 679da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public String getPackageName() { 689da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageName; 699da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 709da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 719da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public ShortcutPackageInfo getPackageInfo() { 729da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageInfo; 739da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 749da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 75c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki public void refreshPackageInfoAndSave() { 762e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (mPackageInfo.isShadow()) { 772e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Don't refresh for shadow user. 782e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 79c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki final ShortcutService s = mShortcutUser.mService; 809da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo.refresh(s, this); 819da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki s.scheduleSaveUser(getOwnerUserId()); 829da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 839da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 84c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki public void attemptToRestoreIfNeededAndSave() { 852e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.isShadow()) { 862e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Already installed, nothing to do. 879da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 88c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki final ShortcutService s = mShortcutUser.mService; 892e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!s.isPackageInstalled(mPackageName, mPackageUserId)) { 902e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 912e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Package still not installed: %s user=%d", 922e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageName, mPackageUserId)); 932e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 942e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Not installed, no need to restore yet. 952e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 962e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.hasSignatures()) { 972e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId 982e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki + " but signatures not found in the restore data."); 99c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki onRestoreBlocked(); 1002e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 1012e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1022e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1032e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); 1042e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.canRestoreTo(s, pi)) { 1052e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Package is now installed, but can't restore. Let the subclass do the cleanup. 106c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki onRestoreBlocked(); 1072e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 1082e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1092e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 1102e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, 1112e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageUserId, getOwnerUserId())); 1122e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1132e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 114c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki onRestored(); 1152e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1162e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Now the package is not shadow. 1172e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageInfo.setShadow(false); 1182e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1192e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.scheduleSaveUser(mPackageUserId); 1209da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 1210acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 1222e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1232e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package can't be restored because it has a lower version number 1242e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * or different signatures. 1252e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 126c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki protected abstract void onRestoreBlocked(); 1272e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1282e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1292e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package is successfully restored. 1302e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 131c51b2876ec5c0af449469a0f76bb38c51cfcff04Makoto Onuki protected abstract void onRestored(); 1322e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1339da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract void saveToXml(@NonNull XmlSerializer out, boolean forBackup) 1340acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki throws IOException, XmlPullParserException; 1350acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki} 136