Fix a crash in AppInfoBase where appEntry is invalid am: 2c6634a8a9

am: 4a1245e8c1

Change-Id: Ibf609a79a19fca98554b3ec60940163674125af9
This commit is contained in:
Fan Zhang
2017-07-06 20:36:05 +00:00
committed by android-build-merger
2 changed files with 45 additions and 2 deletions

View File

@@ -35,6 +35,7 @@ import android.os.IBinder;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
@@ -291,7 +292,8 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
@Override
public void onReceive(Context context, Intent intent) {
String packageName = intent.getData().getSchemeSpecificPart();
if (!mFinishing && mAppEntry.info.packageName.equals(packageName)) {
if (!mFinishing && (mAppEntry == null || mAppEntry.info == null
|| TextUtils.equals(mAppEntry.info.packageName, packageName))) {
onPackageRemoved();
}
}

View File

@@ -17,20 +17,24 @@
package com.android.settings.applications;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
import org.junit.After;
@@ -40,10 +44,12 @@ import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -85,11 +91,41 @@ public class AppInfoWithHeaderTest {
verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class));
}
@Test
public void packageRemoved_noAppEntry_shouldFinishActivity() {
BroadcastReceiver packageRemovedReceiver =
ReflectionHelpers.getField(mAppInfoWithHeader, "mPackageRemovedReceiver");
ReflectionHelpers.setField(mAppInfoWithHeader, "mAppEntry", null);
final Intent packageRemovedBroadcast = new Intent();
packageRemovedBroadcast.setData(Uri.parse("package:com.android.settings"));
packageRemovedReceiver.onReceive(RuntimeEnvironment.application, packageRemovedBroadcast);
assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
}
@Test
public void packageRemoved_appEntryMatchesPackageName_shouldFinishActivity() {
BroadcastReceiver packageRemovedReceiver =
ReflectionHelpers.getField(mAppInfoWithHeader, "mPackageRemovedReceiver");
final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
entry.info = new ApplicationInfo();
entry.info.packageName = "com.android.settings";
ReflectionHelpers.setField(mAppInfoWithHeader, "mAppEntry", entry);
final Intent packageRemovedBroadcast = new Intent();
packageRemovedBroadcast.setData(Uri.parse("package:" + entry.info.packageName));
packageRemovedReceiver.onReceive(RuntimeEnvironment.application, packageRemovedBroadcast);
assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
}
public static class TestFragment extends AppInfoWithHeader {
PreferenceManager mManager;
PreferenceScreen mScreen;
Context mShadowContext;
boolean mPackageRemovedCalled;
public TestFragment() {
mPm = mock(PackageManager.class);
@@ -132,6 +168,11 @@ public class AppInfoWithHeaderTest {
public Context getContext() {
return mShadowContext;
}
@Override
protected void onPackageRemoved() {
mPackageRemovedCalled = true;
}
}
}