diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index a7aa8eacf92cb06bda05779712982616e4266f27..ca560cc3429a082511a78a844082303f1901aa77 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -23,10 +23,12 @@ import android.accounts.AccountManager; import android.accounts.AuthenticatorDescription; import android.app.ActionBar; import android.app.Activity; +import android.app.AlertDialog; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -39,6 +41,7 @@ import android.os.Environment; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.os.image.DynamicSystemManager; import android.provider.Settings; import android.sysprop.VoldProperties; import android.telephony.euicc.EuiccManager; @@ -262,6 +265,19 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis return; } + final DynamicSystemManager dsuManager = (DynamicSystemManager) + getActivity().getSystemService(Context.DYNAMIC_SYSTEM_SERVICE); + if (dsuManager.isInUse()) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(R.string.dsu_is_running); + builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) {} + }); + AlertDialog dsuAlertdialog = builder.create(); + dsuAlertdialog.show(); + return; + } + if (runKeyguardConfirmation(KEYGUARD_REQUEST)) { return; } diff --git a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java index a6b565ae6baaf4aceecf05e7cdd4092743697f52..f01e23a5e8fee359615989dd443d5c9887233c8b 100644 --- a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java +++ b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java @@ -29,12 +29,14 @@ import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; -import android.content.pm.ServiceInfo; +import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; +import android.service.notification.NotificationListenerService; import android.text.TextUtils; import android.util.Slog; import android.view.WindowManager; @@ -44,6 +46,8 @@ import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.settings.R; +import java.util.List; + /** @hide */ public class NotificationAccessConfirmationActivity extends Activity implements DialogInterface { @@ -92,6 +96,31 @@ public class NotificationAccessConfirmationActivity extends Activity return; } + // Check NLS service info. + String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE; + Intent NLSIntent = new Intent(NotificationListenerService.SERVICE_INTERFACE); + List matchedServiceList = getPackageManager().queryIntentServicesAsUser( + NLSIntent, /* flags */ 0, mUserId); + boolean hasNLSIntentFilter = false; + for (ResolveInfo service : matchedServiceList) { + if (service.serviceInfo.packageName.equals(mComponentName.getPackageName())) { + if (!requiredPermission.equals(service.serviceInfo.permission)) { + Slog.e(LOG_TAG, "Service " + mComponentName + " lacks permission " + + requiredPermission); + finish(); + return; + } + hasNLSIntentFilter = true; + break; + } + } + if (!hasNLSIntentFilter) { + Slog.e(LOG_TAG, "Service " + mComponentName + " lacks an intent-filter action " + + "for android.service.notification.NotificationListenerService."); + finish(); + return; + } + AlertController.AlertParams p = new AlertController.AlertParams(this); p.mTitle = getString( R.string.notification_listener_security_warning_title, @@ -126,19 +155,6 @@ public class NotificationAccessConfirmationActivity extends Activity } private void onAllow() { - String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE; - try { - ServiceInfo serviceInfo = getPackageManager().getServiceInfo(mComponentName, 0); - if (!requiredPermission.equals(serviceInfo.permission)) { - Slog.e(LOG_TAG, - "Service " + mComponentName + " lacks permission " + requiredPermission); - return; - } - } catch (PackageManager.NameNotFoundException e) { - Slog.e(LOG_TAG, "Failed to get service info for " + mComponentName, e); - return; - } - mNm.setNotificationListenerAccessGranted(mComponentName, true); finish(); @@ -149,12 +165,6 @@ public class NotificationAccessConfirmationActivity extends Activity return AlertActivity.dispatchPopulateAccessibilityEvent(this, event); } - @Override - public void onBackPressed() { - // Suppress finishing the activity on back button press, - // consistently with the permission dialog behavior - } - @Override public void cancel() { finish();