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 299da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onukiabstract class ShortcutPackageItem { 302e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private static final String TAG = ShortcutService.TAG; 312e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 329da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final int mPackageUserId; 339da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki private final String mPackageName; 349da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 352e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki private final ShortcutPackageInfo mPackageInfo; 369da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 374d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki protected final ShortcutUser mShortcutUser; 384d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki 394d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, 404d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki int packageUserId, @NonNull String packageName, 419da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki @NonNull ShortcutPackageInfo packageInfo) { 424d36b3a8c5ba1289d851ef337e46709bba333100Makoto Onuki mShortcutUser = shortcutUser; 439da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageUserId = packageUserId; 449da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageName = Preconditions.checkStringNotEmpty(packageName); 459da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo = Preconditions.checkNotNull(packageInfo); 469da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 479da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 489da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 499da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who actually has this package running on. For {@link ShortcutPackage}, 509da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * this is the same thing as {@link #getOwnerUserId}, but if it's a {@link ShortcutLauncher} and 519da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * {@link #getOwnerUserId} is of a work profile, then this ID could be the user who owns the 529da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * profile. 539da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 549da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public int getPackageUserId() { 559da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageUserId; 569da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 579da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 589da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 599da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who sees the shortcuts from this instance. 609da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 619da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract int getOwnerUserId(); 629da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 630acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki @NonNull 649da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public String getPackageName() { 659da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageName; 669da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 679da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 689da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public ShortcutPackageInfo getPackageInfo() { 699da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageInfo; 709da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 719da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 729da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public void refreshPackageInfoAndSave(ShortcutService s) { 732e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (mPackageInfo.isShadow()) { 742e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Don't refresh for shadow user. 752e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 769da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo.refresh(s, this); 779da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki s.scheduleSaveUser(getOwnerUserId()); 789da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 799da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 802e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki public void attemptToRestoreIfNeededAndSave(ShortcutService s) { 812e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.isShadow()) { 822e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Already installed, nothing to do. 839da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 842e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!s.isPackageInstalled(mPackageName, mPackageUserId)) { 852e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 862e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Package still not installed: %s user=%d", 872e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageName, mPackageUserId)); 882e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 892e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Not installed, no need to restore yet. 902e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 912e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.hasSignatures()) { 922e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId 932e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki + " but signatures not found in the restore data."); 942e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestoreBlocked(s); 952e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 962e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 972e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 982e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); 992e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.canRestoreTo(s, pi)) { 1002e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Package is now installed, but can't restore. Let the subclass do the cleanup. 1012e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestoreBlocked(s); 1022e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 1032e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1042e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 1052e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, 1062e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageUserId, getOwnerUserId())); 1072e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1082e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1092e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestored(s); 1102e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1112e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Now the package is not shadow. 1122e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageInfo.setShadow(false); 1132e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1142e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.scheduleSaveUser(mPackageUserId); 1159da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 1160acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 1172e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1182e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package can't be restored because it has a lower version number 1192e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * or different signatures. 1202e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 1212e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki protected abstract void onRestoreBlocked(ShortcutService s); 1222e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1232e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1242e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package is successfully restored. 1252e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 1262e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki protected abstract void onRestored(ShortcutService s); 1272e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1289da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract void saveToXml(@NonNull XmlSerializer out, boolean forBackup) 1290acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki throws IOException, XmlPullParserException; 1300acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki} 131