ShortcutPackageItem.java revision 2e210c4d0f766e52ea4c087a1d54213c36a4e0ea
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 379da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki protected ShortcutPackageItem(int packageUserId, @NonNull String packageName, 389da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki @NonNull ShortcutPackageInfo packageInfo) { 399da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageUserId = packageUserId; 409da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageName = Preconditions.checkStringNotEmpty(packageName); 419da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo = Preconditions.checkNotNull(packageInfo); 429da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 439da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 449da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 459da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who actually has this package running on. For {@link ShortcutPackage}, 469da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * this is the same thing as {@link #getOwnerUserId}, but if it's a {@link ShortcutLauncher} and 479da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * {@link #getOwnerUserId} is of a work profile, then this ID could be the user who owns the 489da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * profile. 499da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 509da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public int getPackageUserId() { 519da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageUserId; 529da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 539da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 549da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki /** 559da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki * ID of the user who sees the shortcuts from this instance. 569da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki */ 579da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract int getOwnerUserId(); 589da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 590acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki @NonNull 609da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public String getPackageName() { 619da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageName; 629da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 639da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 649da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public ShortcutPackageInfo getPackageInfo() { 659da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki return mPackageInfo; 669da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 679da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 689da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public void refreshPackageInfoAndSave(ShortcutService s) { 692e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (mPackageInfo.isShadow()) { 702e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Don't refresh for shadow user. 712e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 729da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki mPackageInfo.refresh(s, this); 739da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki s.scheduleSaveUser(getOwnerUserId()); 749da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 759da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki 762e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki public void attemptToRestoreIfNeededAndSave(ShortcutService s) { 772e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.isShadow()) { 782e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Already installed, nothing to do. 799da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 802e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!s.isPackageInstalled(mPackageName, mPackageUserId)) { 812e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 822e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Package still not installed: %s user=%d", 832e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageName, mPackageUserId)); 842e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 852e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; // Not installed, no need to restore yet. 862e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 872e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.hasSignatures()) { 882e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId 892e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki + " but signatures not found in the restore data."); 902e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestoreBlocked(s); 912e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 922e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 932e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 942e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); 952e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (!mPackageInfo.canRestoreTo(s, pi)) { 962e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Package is now installed, but can't restore. Let the subclass do the cleanup. 972e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestoreBlocked(s); 982e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki return; 992e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1002e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki if (ShortcutService.DEBUG) { 1012e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, 1022e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageUserId, getOwnerUserId())); 1032e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki } 1042e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1052e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki onRestored(s); 1062e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1072e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki // Now the package is not shadow. 1082e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki mPackageInfo.setShadow(false); 1092e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1102e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki s.scheduleSaveUser(mPackageUserId); 1119da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki } 1120acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki 1132e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1142e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package can't be restored because it has a lower version number 1152e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * or different signatures. 1162e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 1172e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki protected abstract void onRestoreBlocked(ShortcutService s); 1182e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1192e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki /** 1202e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki * Called when the new package is successfully restored. 1212e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki */ 1222e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki protected abstract void onRestored(ShortcutService s); 1232e210c4d0f766e52ea4c087a1d54213c36a4e0eaMakoto Onuki 1249da23fc6ac565b38129d52f4f8f174c833a9bd01Makoto Onuki public abstract void saveToXml(@NonNull XmlSerializer out, boolean forBackup) 1250acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki throws IOException, XmlPullParserException; 1260acbb14574d859b5f1cc0b7c6bbdfbeba38f3e55Makoto Onuki} 127