[Safer intents] Applications

To avoid implicit intents, make intents launch explicitly.

Test: build, robotest
Bug: 323061508
Change-Id: I9bf4eb102550f4afd8d14a6799940d37fc0ab9a7
This commit is contained in:
Jason Chiu
2024-03-27 11:49:33 +08:00
parent 9ab22c28fb
commit 071dfe8691
7 changed files with 22 additions and 3 deletions

View File

@@ -72,7 +72,9 @@
<extra
android:name="classname"
android:value="com.android.settings.Settings$ClonedAppsListActivity"/>
<intent android:action="android.settings.MANAGE_CLONED_APPS_SETTINGS"/>
<intent
android:action="android.settings.MANAGE_CLONED_APPS_SETTINGS"
android:targetPackage="${applicationId}"/>
</Preference>
<PreferenceCategory

View File

@@ -512,6 +512,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
} else {
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
Uri.fromParts("package", mAppEntry.info.packageName, null));
intent.setPackage("android");
intent.putExtra(Intent.EXTRA_PACKAGES, new String[]{mAppEntry.info.packageName});
intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
@@ -538,6 +539,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
// Create new intent to launch Uninstaller activity
Uri packageUri = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
uninstallIntent.setPackage(mContext.getString(
R.string.config_package_installer_package_name));
uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
mMetricsFeatureProvider.action(mActivity, SettingsEnums.ACTION_SETTINGS_UNINSTALL_APP);

View File

@@ -642,6 +642,7 @@ public class AppInfoDashboardFragment extends DashboardFragment
// Create new intent to launch Uninstaller activity
final Uri packageURI = Uri.parse("package:" + packageName);
final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
uninstallIntent.setPackage(getString(R.string.config_package_installer_package_name));
uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_SETTINGS_UNINSTALL_APP);

View File

@@ -60,6 +60,7 @@ public class TimeSpentInAppPreferenceController extends LiveDataController {
public void setPackageName(String packageName) {
mPackageName = packageName;
mIntent = new Intent(SEE_TIME_IN_APP_TEMPLATE)
.setPackage(mPackageManager.getWellbeingPackageName())
.putExtra(Intent.EXTRA_PACKAGE_NAME, mPackageName);
}

View File

@@ -34,6 +34,7 @@ import android.util.Log;
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
import com.android.settings.Utils;
import java.util.HashSet;
@@ -78,6 +79,8 @@ public class CloneBackend {
// Create new intent to launch Uninstaller activity.
Uri packageUri = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
uninstallIntent.setPackage(mContext.getString(
R.string.config_package_installer_package_name));
uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
uninstallIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(mCloneUserId));
// Trigger uninstall as clone user.

View File

@@ -20,6 +20,7 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.UserHandle
import com.android.settings.R
/**
* Based on PackageManagerService design, and it looks like the suggested replacement in the
@@ -36,6 +37,7 @@ fun Context.startUninstallActivity(
val packageUri = Uri.parse("package:$packageName")
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri).apply {
setPackage(getString(R.string.config_package_installer_package_name))
putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, forAllUsers)
}
startActivityAsUser(intent, userHandle)

View File

@@ -22,7 +22,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -30,6 +32,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import androidx.preference.Preference;
@@ -55,6 +58,7 @@ public class TimeSpentInAppPreferenceControllerTest {
private static final String TEST_KEY = "test_tey";
private static final Intent TEST_INTENT = new Intent(
TimeSpentInAppPreferenceController.SEE_TIME_IN_APP_TEMPLATE)
.setPackage("com.wellbeing")
.putExtra(EXTRA_PACKAGE_NAME, "com.android.settings");
@Mock
@@ -70,8 +74,11 @@ public class TimeSpentInAppPreferenceControllerTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mContext = RuntimeEnvironment.application;
mPackageManager = Shadows.shadowOf(mContext.getPackageManager());
mContext = spy(RuntimeEnvironment.application);
PackageManager pm = spy(mContext.getPackageManager());
doReturn(pm).when(mContext).getPackageManager();
doReturn(TEST_INTENT.getPackage()).when(pm).getWellbeingPackageName();
mPackageManager = Shadows.shadowOf(pm);
mController = new TimeSpentInAppPreferenceController(mContext, TEST_KEY);
mPreference = new Preference(mContext);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);