Merge "DO NOT MERGE: Prevent non-system IME from becoming device admin" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
fbe97f1ee4
@@ -66,6 +66,7 @@ import android.text.TextUtils.TruncateAt;
|
|||||||
import android.util.EventLog;
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
|
import android.view.KeyEvent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -156,12 +157,12 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
|
|
||||||
mHandler = new Handler(getMainLooper());
|
mHandler = new Handler(getMainLooper());
|
||||||
|
|
||||||
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
|
mDPM = getSystemService(DevicePolicyManager.class);
|
||||||
mAppOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);
|
mAppOps = getSystemService(AppOpsManager.class);
|
||||||
mLayoutInflaternflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
mLayoutInflaternflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
PackageManager packageManager = getPackageManager();
|
PackageManager packageManager = getPackageManager();
|
||||||
|
|
||||||
if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
|
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
|
||||||
Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
|
Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
@@ -171,7 +172,7 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
EXTRA_CALLED_FROM_SUPPORT_DIALOG, false);
|
EXTRA_CALLED_FROM_SUPPORT_DIALOG, false);
|
||||||
|
|
||||||
String action = getIntent().getAction();
|
String action = getIntent().getAction();
|
||||||
ComponentName who = (ComponentName)getIntent().getParcelableExtra(
|
ComponentName who = (ComponentName) getIntent().getParcelableExtra(
|
||||||
DevicePolicyManager.EXTRA_DEVICE_ADMIN);
|
DevicePolicyManager.EXTRA_DEVICE_ADMIN);
|
||||||
if (who == null) {
|
if (who == null) {
|
||||||
String packageName = getIntent().getStringExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME);
|
String packageName = getIntent().getStringExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME);
|
||||||
@@ -229,7 +230,7 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
|
PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
|
||||||
int count = avail == null ? 0 : avail.size();
|
int count = avail == null ? 0 : avail.size();
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (int i=0; i<count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
ResolveInfo ri = avail.get(i);
|
ResolveInfo ri = avail.get(i);
|
||||||
if (ai.packageName.equals(ri.activityInfo.packageName)
|
if (ai.packageName.equals(ri.activityInfo.packageName)
|
||||||
&& ai.name.equals(ri.activityInfo.name)) {
|
&& ai.name.equals(ri.activityInfo.name)) {
|
||||||
@@ -345,22 +346,22 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified);
|
mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified);
|
||||||
mAdminWarning.setText(
|
mAdminWarning.setText(
|
||||||
mDPM.getResources().getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () ->
|
mDPM.getResources().getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () ->
|
||||||
getString(R.string.device_admin_warning_simplified,
|
getString(R.string.device_admin_warning_simplified,
|
||||||
mProfileOwnerName), mProfileOwnerName));
|
mProfileOwnerName), mProfileOwnerName));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setContentView(R.layout.device_admin_add);
|
setContentView(R.layout.device_admin_add);
|
||||||
|
|
||||||
mAdminIcon = (ImageView)findViewById(R.id.admin_icon);
|
mAdminIcon = (ImageView) findViewById(R.id.admin_icon);
|
||||||
mAdminName = (TextView)findViewById(R.id.admin_name);
|
mAdminName = (TextView) findViewById(R.id.admin_name);
|
||||||
mAdminDescription = (TextView)findViewById(R.id.admin_description);
|
mAdminDescription = (TextView) findViewById(R.id.admin_description);
|
||||||
mProfileOwnerWarning = (TextView) findViewById(R.id.profile_owner_warning);
|
mProfileOwnerWarning = (TextView) findViewById(R.id.profile_owner_warning);
|
||||||
|
|
||||||
mProfileOwnerWarning.setText(
|
mProfileOwnerWarning.setText(
|
||||||
mDPM.getResources().getString(SET_PROFILE_OWNER_POSTSETUP_WARNING,
|
mDPM.getResources().getString(SET_PROFILE_OWNER_POSTSETUP_WARNING,
|
||||||
() -> getString(R.string.adding_profile_owner_warning)));
|
() -> getString(R.string.adding_profile_owner_warning)));
|
||||||
|
|
||||||
mAddMsg = (TextView)findViewById(R.id.add_msg);
|
mAddMsg = (TextView) findViewById(R.id.add_msg);
|
||||||
mAddMsgExpander = (ImageView) findViewById(R.id.add_msg_expander);
|
mAddMsgExpander = (ImageView) findViewById(R.id.add_msg_expander);
|
||||||
final View.OnClickListener onClickListener = new View.OnClickListener() {
|
final View.OnClickListener onClickListener = new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -381,7 +382,7 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
boolean hideMsgExpander = mAddMsg.getLineCount() <= maxLines;
|
boolean hideMsgExpander = mAddMsg.getLineCount() <= maxLines;
|
||||||
mAddMsgExpander.setVisibility(hideMsgExpander ? View.GONE : View.VISIBLE);
|
mAddMsgExpander.setVisibility(hideMsgExpander ? View.GONE : View.VISIBLE);
|
||||||
if (hideMsgExpander) {
|
if (hideMsgExpander) {
|
||||||
((View)mAddMsgExpander.getParent()).invalidate();
|
((View) mAddMsgExpander.getParent()).invalidate();
|
||||||
}
|
}
|
||||||
mAddMsg.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
mAddMsg.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||||
}
|
}
|
||||||
@@ -399,7 +400,7 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
mCancelButton.setOnClickListener(new View.OnClickListener() {
|
mCancelButton.setOnClickListener(new View.OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_DECLINED_BY_USER,
|
EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_DECLINED_BY_USER,
|
||||||
mDeviceAdmin.getActivityInfo().applicationInfo.uid);
|
mDeviceAdmin.getActivityInfo().applicationInfo.uid);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -421,58 +422,64 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
|
|||||||
|
|
||||||
final View restrictedAction = findViewById(R.id.restricted_action);
|
final View restrictedAction = findViewById(R.id.restricted_action);
|
||||||
restrictedAction.setFilterTouchesWhenObscured(true);
|
restrictedAction.setFilterTouchesWhenObscured(true);
|
||||||
restrictedAction.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
final View.OnClickListener restrictedActionClickListener = v -> {
|
||||||
if (!mActionButton.isEnabled()) {
|
if (!mActionButton.isEnabled()) {
|
||||||
showPolicyTransparencyDialogIfRequired();
|
showPolicyTransparencyDialogIfRequired();
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (mAdding) {
|
|
||||||
addAndFinish();
|
|
||||||
} else if (isManagedProfile(mDeviceAdmin)
|
|
||||||
&& mDeviceAdmin.getComponent().equals(mDPM.getProfileOwner())) {
|
|
||||||
final int userId = UserHandle.myUserId();
|
|
||||||
UserDialogs.createRemoveDialog(DeviceAdminAdd.this, userId,
|
|
||||||
new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
UserManager um = UserManager.get(DeviceAdminAdd.this);
|
|
||||||
um.removeUser(userId);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
).show();
|
|
||||||
} else if (mUninstalling) {
|
|
||||||
mDPM.uninstallPackageWithActiveAdmins(mDeviceAdmin.getPackageName());
|
|
||||||
finish();
|
|
||||||
} else if (!mWaitingForRemoveMsg) {
|
|
||||||
try {
|
|
||||||
// Don't allow the admin to put a dialog up in front
|
|
||||||
// of us while we interact with the user.
|
|
||||||
ActivityManager.getService().stopAppSwitches();
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
mWaitingForRemoveMsg = true;
|
|
||||||
mDPM.getRemoveWarning(mDeviceAdmin.getComponent(),
|
|
||||||
new RemoteCallback(new RemoteCallback.OnResultListener() {
|
|
||||||
@Override
|
|
||||||
public void onResult(Bundle result) {
|
|
||||||
CharSequence msg = result != null
|
|
||||||
? result.getCharSequence(
|
|
||||||
DeviceAdminReceiver.EXTRA_DISABLE_WARNING)
|
|
||||||
: null;
|
|
||||||
continueRemoveAction(msg);
|
|
||||||
}
|
|
||||||
}, mHandler));
|
|
||||||
// Don't want to wait too long.
|
|
||||||
getWindow().getDecorView().getHandler().postDelayed(new Runnable() {
|
|
||||||
@Override public void run() {
|
|
||||||
continueRemoveAction(null);
|
|
||||||
}
|
|
||||||
}, 2*1000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (mAdding) {
|
||||||
|
addAndFinish();
|
||||||
|
} else if (isManagedProfile(mDeviceAdmin)
|
||||||
|
&& mDeviceAdmin.getComponent().equals(mDPM.getProfileOwner())) {
|
||||||
|
final int userId = UserHandle.myUserId();
|
||||||
|
UserDialogs.createRemoveDialog(DeviceAdminAdd.this, userId,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
UserManager um = UserManager.get(DeviceAdminAdd.this);
|
||||||
|
um.removeUser(userId);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).show();
|
||||||
|
} else if (mUninstalling) {
|
||||||
|
mDPM.uninstallPackageWithActiveAdmins(mDeviceAdmin.getPackageName());
|
||||||
|
finish();
|
||||||
|
} else if (!mWaitingForRemoveMsg) {
|
||||||
|
try {
|
||||||
|
// Don't allow the admin to put a dialog up in front
|
||||||
|
// of us while we interact with the user.
|
||||||
|
ActivityManager.getService().stopAppSwitches();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
}
|
||||||
|
mWaitingForRemoveMsg = true;
|
||||||
|
mDPM.getRemoveWarning(mDeviceAdmin.getComponent(),
|
||||||
|
new RemoteCallback(new RemoteCallback.OnResultListener() {
|
||||||
|
@Override
|
||||||
|
public void onResult(Bundle result) {
|
||||||
|
CharSequence msg = result != null
|
||||||
|
? result.getCharSequence(
|
||||||
|
DeviceAdminReceiver.EXTRA_DISABLE_WARNING)
|
||||||
|
: null;
|
||||||
|
continueRemoveAction(msg);
|
||||||
|
}
|
||||||
|
}, mHandler));
|
||||||
|
// Don't want to wait too long.
|
||||||
|
getWindow().getDecorView().getHandler().postDelayed(
|
||||||
|
() -> continueRemoveAction(null), 2 * 1000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
restrictedAction.setOnKeyListener((view, keyCode, keyEvent) -> {
|
||||||
|
if ((keyEvent.getFlags() & KeyEvent.FLAG_FROM_SYSTEM) == 0) {
|
||||||
|
Log.e(TAG, "Can not activate device-admin with KeyEvent from non-system app.");
|
||||||
|
// Consume event to suppress click.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Fallback to view click handler.
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
|
restrictedAction.setOnClickListener(restrictedActionClickListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user