Merge "API for notification listener for Companioon apps" into oc-dev am: 01c0630e81
am: ab2bb40659
Change-Id: Iee1cbda7eb4cee9b34e7d9cb4577f3cf8902aa69
This commit is contained in:
@@ -2645,6 +2645,10 @@
|
||||
android:value="true" />
|
||||
</activity>
|
||||
|
||||
<!-- Confirmation dialog for enabling notification access from CompanionDeviceManager -->
|
||||
<activity android:name=".notification.NotificationAccessConfirmationActivity"
|
||||
android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert" />
|
||||
|
||||
<receiver android:name=".widget.SettingsAppWidgetProvider"
|
||||
android:label="@string/gadget_title"
|
||||
android:exported="false"
|
||||
|
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
package com.android.settings.notification;
|
||||
|
||||
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract
|
||||
.EXTRA_COMPONENT_NAME;
|
||||
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract
|
||||
.EXTRA_PACKAGE_TITLE;
|
||||
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract
|
||||
.EXTRA_USER_ID;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Activity;
|
||||
import android.content.ComponentName;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
import android.provider.SettingsStringUtil;
|
||||
import android.util.Slog;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
|
||||
import com.android.internal.app.AlertActivity;
|
||||
import com.android.internal.app.AlertController;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.TouchOverlayManager;
|
||||
|
||||
/** @hide */
|
||||
public class NotificationAccessConfirmationActivity extends Activity
|
||||
implements DialogInterface {
|
||||
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String LOG_TAG = "NotificationAccessConfirmationActivity";
|
||||
|
||||
private int mUserId;
|
||||
private ComponentName mComponentName;
|
||||
private TouchOverlayManager mTouchOverlayManager;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
mTouchOverlayManager = new TouchOverlayManager(this);
|
||||
|
||||
mComponentName = getIntent().getParcelableExtra(EXTRA_COMPONENT_NAME);
|
||||
mUserId = getIntent().getIntExtra(EXTRA_USER_ID, UserHandle.USER_NULL);
|
||||
String pkgTitle = getIntent().getStringExtra(EXTRA_PACKAGE_TITLE);
|
||||
|
||||
AlertController.AlertParams p = new AlertController.AlertParams(this);
|
||||
p.mTitle = getString(
|
||||
R.string.notification_listener_security_warning_title,
|
||||
pkgTitle);
|
||||
p.mMessage = getString(
|
||||
R.string.notification_listener_security_warning_summary,
|
||||
pkgTitle);
|
||||
p.mPositiveButtonText = getString(R.string.allow);
|
||||
p.mPositiveButtonListener = (a, b) -> onAllow();
|
||||
p.mNegativeButtonText = getString(R.string.deny);
|
||||
p.mNegativeButtonListener = (a, b) -> cancel();
|
||||
AlertController
|
||||
.create(this, this, getWindow())
|
||||
.installContent(p);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
final SettingsStringUtil.SettingStringHelper setting =
|
||||
new SettingsStringUtil.SettingStringHelper(
|
||||
getContentResolver(),
|
||||
Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
|
||||
mUserId);
|
||||
setting.write(SettingsStringUtil.ComponentNameSet.add(setting.read(), mComponentName));
|
||||
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
|
||||
return AlertActivity.dispatchPopulateAccessibilityEvent(this, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dismiss() {
|
||||
// This is called after the click, since we finish when handling the
|
||||
// click, don't do that again here.
|
||||
if (!isFinishing()) {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
mTouchOverlayManager.setOverlayAllowed(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
mTouchOverlayManager.setOverlayAllowed(true);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user