Loading src/java/com/android/internal/telephony/uicc/ShowInstallAppNotificationReceiver.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -38,7 +38,7 @@ public class ShowInstallAppNotificationReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { String pkgName = intent.getStringExtra(EXTRA_PACKAGE_NAME); String pkgName = intent.getStringExtra(EXTRA_PACKAGE_NAME); if (!UiccProfile.isPackageInstalled(context, pkgName)) { if (!UiccProfile.isPackageBundled(context, pkgName)) { InstallCarrierAppUtils.showNotification(context, pkgName); InstallCarrierAppUtils.showNotification(context, pkgName); InstallCarrierAppUtils.registerPackageInstallReceiver(context); InstallCarrierAppUtils.registerPackageInstallReceiver(context); } } Loading src/java/com/android/internal/telephony/uicc/UiccProfile.java +75 −21 Original line number Original line Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Message; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.os.Registrant; import android.os.Registrant; import android.os.RegistrantList; import android.os.RegistrantList; import android.os.UserManager; import android.preference.PreferenceManager; import android.preference.PreferenceManager; import android.provider.Settings; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; Loading Loading @@ -145,15 +146,28 @@ public class UiccProfile extends IccCard { new ContentObserver(new Handler()) { new ContentObserver(new Handler()) { @Override @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange) { synchronized (mLock) { mContext.getContentResolver().unregisterContentObserver(this); mContext.getContentResolver().unregisterContentObserver(this); for (String pkgName : getUninstalledCarrierPackages()) { mProvisionCompleteContentObserverRegistered = false; InstallCarrierAppUtils.showNotification(mContext, pkgName); showCarrierAppNotificationsIfPossible(); InstallCarrierAppUtils.registerPackageInstallReceiver(mContext); } } }; private boolean mProvisionCompleteContentObserverRegistered; private final BroadcastReceiver mUserUnlockReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { synchronized (mLock) { mContext.unregisterReceiver(this); mUserUnlockReceiverRegistered = false; showCarrierAppNotificationsIfPossible(); } } } } }; }; private boolean mUserUnlockReceiverRegistered; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mCarrierConfigChangedReceiver = new BroadcastReceiver() { @Override @Override public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { Loading Loading @@ -258,7 +272,7 @@ public class UiccProfile extends IccCard { IntentFilter intentfilter = new IntentFilter(); IntentFilter intentfilter = new IntentFilter(); intentfilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intentfilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); c.registerReceiver(mReceiver, intentfilter); c.registerReceiver(mCarrierConfigChangedReceiver, intentfilter); } } /** /** Loading @@ -276,11 +290,22 @@ public class UiccProfile extends IccCard { unregisterAllAppEvents(); unregisterAllAppEvents(); unregisterCurrAppEvents(); unregisterCurrAppEvents(); if (mProvisionCompleteContentObserverRegistered) { mContext.getContentResolver() .unregisterContentObserver(mProvisionCompleteContentObserver); mProvisionCompleteContentObserverRegistered = false; } if (mUserUnlockReceiverRegistered) { mContext.unregisterReceiver(mUserUnlockReceiver); mUserUnlockReceiverRegistered = false; } InstallCarrierAppUtils.hideAllNotifications(mContext); InstallCarrierAppUtils.hideAllNotifications(mContext); InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext); InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext); mCi.unregisterForOffOrNotAvailable(mHandler); mCi.unregisterForOffOrNotAvailable(mHandler); mContext.unregisterReceiver(mReceiver); mContext.unregisterReceiver(mCarrierConfigChangedReceiver); if (mCatService != null) mCatService.dispose(); if (mCatService != null) mCatService.dispose(); for (UiccCardApplication app : mUiccApplications) { for (UiccCardApplication app : mUiccApplications) { Loading Loading @@ -1166,10 +1191,13 @@ public class UiccProfile extends IccCard { } } } } static boolean isPackageInstalled(Context context, String pkgName) { static boolean isPackageBundled(Context context, String pkgName) { PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager(); try { try { pm.getPackageInfo(pkgName, PackageManager.GET_ACTIVITIES); // We also match hidden-until-installed apps. The assumption here is that some other // mechanism (like CarrierAppUtils) would automatically enable such an app, so we // shouldn't prompt the user about it. pm.getApplicationInfo(pkgName, PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS); if (DBG) log(pkgName + " is installed."); if (DBG) log(pkgName + " is installed."); return true; return true; } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Loading @@ -1196,21 +1224,47 @@ public class UiccProfile extends IccCard { synchronized (mLock) { synchronized (mLock) { mCarrierPrivilegeRegistrants.notifyRegistrants(); mCarrierPrivilegeRegistrants.notifyRegistrants(); boolean isProvisioned = Settings.Global.getInt( boolean isProvisioned = isProvisioned(); mContext.getContentResolver(), boolean isUnlocked = isUserUnlocked(); Settings.Global.DEVICE_PROVISIONED, 1) == 1; // Only show dialog if the phone is through with Setup Wizard and is unlocked. // Only show dialog if the phone is through with Setup Wizard. Otherwise, wait for // Otherwise, wait for completion and unlock and show a notification instead. // completion and show a notification instead if (isProvisioned && isUnlocked) { if (isProvisioned) { for (String pkgName : getUninstalledCarrierPackages()) { for (String pkgName : getUninstalledCarrierPackages()) { promptInstallCarrierApp(pkgName); promptInstallCarrierApp(pkgName); } } } else { } else { if (!isProvisioned) { final Uri uri = Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED); final Uri uri = Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED); mContext.getContentResolver().registerContentObserver( mContext.getContentResolver().registerContentObserver( uri, uri, false, false, mProvisionCompleteContentObserver); mProvisionCompleteContentObserver); mProvisionCompleteContentObserverRegistered = true; } if (!isUnlocked) { mContext.registerReceiver( mUserUnlockReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); mUserUnlockReceiverRegistered = true; } } } } private boolean isProvisioned() { return Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1) == 1; } private boolean isUserUnlocked() { return mContext.getSystemService(UserManager.class).isUserUnlocked(); } private void showCarrierAppNotificationsIfPossible() { if (isProvisioned() && isUserUnlocked()) { for (String pkgName : getUninstalledCarrierPackages()) { InstallCarrierAppUtils.showNotification(mContext, pkgName); InstallCarrierAppUtils.registerPackageInstallReceiver(mContext); } } } } } } Loading @@ -1234,7 +1288,7 @@ public class UiccProfile extends IccCard { for (UiccAccessRule accessRule : accessRules) { for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString().toUpperCase(); String certHexString = accessRule.getCertificateHexString().toUpperCase(); String pkgName = certPackageMap.get(certHexString); String pkgName = certPackageMap.get(certHexString); if (!TextUtils.isEmpty(pkgName) && !isPackageInstalled(mContext, pkgName)) { if (!TextUtils.isEmpty(pkgName) && !isPackageBundled(mContext, pkgName)) { uninstalledCarrierPackages.add(pkgName); uninstalledCarrierPackages.add(pkgName); } } } } Loading tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -265,6 +265,8 @@ public class ContextFixture implements TestFixture<Context> { return Context.APP_OPS_SERVICE; return Context.APP_OPS_SERVICE; } else if (serviceClass == TelecomManager.class) { } else if (serviceClass == TelecomManager.class) { return Context.TELECOM_SERVICE; return Context.TELECOM_SERVICE; } else if (serviceClass == UserManager.class) { return Context.USER_SERVICE; } } return super.getSystemServiceName(serviceClass); return super.getSystemServiceName(serviceClass); } } Loading Loading
src/java/com/android/internal/telephony/uicc/ShowInstallAppNotificationReceiver.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -38,7 +38,7 @@ public class ShowInstallAppNotificationReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { String pkgName = intent.getStringExtra(EXTRA_PACKAGE_NAME); String pkgName = intent.getStringExtra(EXTRA_PACKAGE_NAME); if (!UiccProfile.isPackageInstalled(context, pkgName)) { if (!UiccProfile.isPackageBundled(context, pkgName)) { InstallCarrierAppUtils.showNotification(context, pkgName); InstallCarrierAppUtils.showNotification(context, pkgName); InstallCarrierAppUtils.registerPackageInstallReceiver(context); InstallCarrierAppUtils.registerPackageInstallReceiver(context); } } Loading
src/java/com/android/internal/telephony/uicc/UiccProfile.java +75 −21 Original line number Original line Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Message; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.os.Registrant; import android.os.Registrant; import android.os.RegistrantList; import android.os.RegistrantList; import android.os.UserManager; import android.preference.PreferenceManager; import android.preference.PreferenceManager; import android.provider.Settings; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; Loading Loading @@ -145,15 +146,28 @@ public class UiccProfile extends IccCard { new ContentObserver(new Handler()) { new ContentObserver(new Handler()) { @Override @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange) { synchronized (mLock) { mContext.getContentResolver().unregisterContentObserver(this); mContext.getContentResolver().unregisterContentObserver(this); for (String pkgName : getUninstalledCarrierPackages()) { mProvisionCompleteContentObserverRegistered = false; InstallCarrierAppUtils.showNotification(mContext, pkgName); showCarrierAppNotificationsIfPossible(); InstallCarrierAppUtils.registerPackageInstallReceiver(mContext); } } }; private boolean mProvisionCompleteContentObserverRegistered; private final BroadcastReceiver mUserUnlockReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { synchronized (mLock) { mContext.unregisterReceiver(this); mUserUnlockReceiverRegistered = false; showCarrierAppNotificationsIfPossible(); } } } } }; }; private boolean mUserUnlockReceiverRegistered; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mCarrierConfigChangedReceiver = new BroadcastReceiver() { @Override @Override public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { Loading Loading @@ -258,7 +272,7 @@ public class UiccProfile extends IccCard { IntentFilter intentfilter = new IntentFilter(); IntentFilter intentfilter = new IntentFilter(); intentfilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intentfilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); c.registerReceiver(mReceiver, intentfilter); c.registerReceiver(mCarrierConfigChangedReceiver, intentfilter); } } /** /** Loading @@ -276,11 +290,22 @@ public class UiccProfile extends IccCard { unregisterAllAppEvents(); unregisterAllAppEvents(); unregisterCurrAppEvents(); unregisterCurrAppEvents(); if (mProvisionCompleteContentObserverRegistered) { mContext.getContentResolver() .unregisterContentObserver(mProvisionCompleteContentObserver); mProvisionCompleteContentObserverRegistered = false; } if (mUserUnlockReceiverRegistered) { mContext.unregisterReceiver(mUserUnlockReceiver); mUserUnlockReceiverRegistered = false; } InstallCarrierAppUtils.hideAllNotifications(mContext); InstallCarrierAppUtils.hideAllNotifications(mContext); InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext); InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext); mCi.unregisterForOffOrNotAvailable(mHandler); mCi.unregisterForOffOrNotAvailable(mHandler); mContext.unregisterReceiver(mReceiver); mContext.unregisterReceiver(mCarrierConfigChangedReceiver); if (mCatService != null) mCatService.dispose(); if (mCatService != null) mCatService.dispose(); for (UiccCardApplication app : mUiccApplications) { for (UiccCardApplication app : mUiccApplications) { Loading Loading @@ -1166,10 +1191,13 @@ public class UiccProfile extends IccCard { } } } } static boolean isPackageInstalled(Context context, String pkgName) { static boolean isPackageBundled(Context context, String pkgName) { PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager(); try { try { pm.getPackageInfo(pkgName, PackageManager.GET_ACTIVITIES); // We also match hidden-until-installed apps. The assumption here is that some other // mechanism (like CarrierAppUtils) would automatically enable such an app, so we // shouldn't prompt the user about it. pm.getApplicationInfo(pkgName, PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS); if (DBG) log(pkgName + " is installed."); if (DBG) log(pkgName + " is installed."); return true; return true; } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Loading @@ -1196,21 +1224,47 @@ public class UiccProfile extends IccCard { synchronized (mLock) { synchronized (mLock) { mCarrierPrivilegeRegistrants.notifyRegistrants(); mCarrierPrivilegeRegistrants.notifyRegistrants(); boolean isProvisioned = Settings.Global.getInt( boolean isProvisioned = isProvisioned(); mContext.getContentResolver(), boolean isUnlocked = isUserUnlocked(); Settings.Global.DEVICE_PROVISIONED, 1) == 1; // Only show dialog if the phone is through with Setup Wizard and is unlocked. // Only show dialog if the phone is through with Setup Wizard. Otherwise, wait for // Otherwise, wait for completion and unlock and show a notification instead. // completion and show a notification instead if (isProvisioned && isUnlocked) { if (isProvisioned) { for (String pkgName : getUninstalledCarrierPackages()) { for (String pkgName : getUninstalledCarrierPackages()) { promptInstallCarrierApp(pkgName); promptInstallCarrierApp(pkgName); } } } else { } else { if (!isProvisioned) { final Uri uri = Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED); final Uri uri = Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED); mContext.getContentResolver().registerContentObserver( mContext.getContentResolver().registerContentObserver( uri, uri, false, false, mProvisionCompleteContentObserver); mProvisionCompleteContentObserver); mProvisionCompleteContentObserverRegistered = true; } if (!isUnlocked) { mContext.registerReceiver( mUserUnlockReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); mUserUnlockReceiverRegistered = true; } } } } private boolean isProvisioned() { return Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1) == 1; } private boolean isUserUnlocked() { return mContext.getSystemService(UserManager.class).isUserUnlocked(); } private void showCarrierAppNotificationsIfPossible() { if (isProvisioned() && isUserUnlocked()) { for (String pkgName : getUninstalledCarrierPackages()) { InstallCarrierAppUtils.showNotification(mContext, pkgName); InstallCarrierAppUtils.registerPackageInstallReceiver(mContext); } } } } } } Loading @@ -1234,7 +1288,7 @@ public class UiccProfile extends IccCard { for (UiccAccessRule accessRule : accessRules) { for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString().toUpperCase(); String certHexString = accessRule.getCertificateHexString().toUpperCase(); String pkgName = certPackageMap.get(certHexString); String pkgName = certPackageMap.get(certHexString); if (!TextUtils.isEmpty(pkgName) && !isPackageInstalled(mContext, pkgName)) { if (!TextUtils.isEmpty(pkgName) && !isPackageBundled(mContext, pkgName)) { uninstalledCarrierPackages.add(pkgName); uninstalledCarrierPackages.add(pkgName); } } } } Loading
tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -265,6 +265,8 @@ public class ContextFixture implements TestFixture<Context> { return Context.APP_OPS_SERVICE; return Context.APP_OPS_SERVICE; } else if (serviceClass == TelecomManager.class) { } else if (serviceClass == TelecomManager.class) { return Context.TELECOM_SERVICE; return Context.TELECOM_SERVICE; } else if (serviceClass == UserManager.class) { return Context.USER_SERVICE; } } return super.getSystemServiceName(serviceClass); return super.getSystemServiceName(serviceClass); } } Loading