blob: 053314dc7f598c9bba0b677e2996408d8bbd06b8 [file] [log] [blame]
/*
* 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.server.wifi;
import static android.app.Notification.VISIBILITY_SECRET;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.net.wifi.ScanResult;
import android.util.Log;
import com.android.wifi.resources.R;
/**
* Helper to create notifications for {@link OpenNetworkNotifier}.
*/
public class ConnectToNetworkNotificationBuilder {
/** Intent when user dismissed the "Connect to Network" notification. */
public static final String ACTION_USER_DISMISSED_NOTIFICATION =
"com.android.server.wifi.ConnectToNetworkNotification.USER_DISMISSED_NOTIFICATION";
/** Intent when user tapped action button to connect to recommended network. */
public static final String ACTION_CONNECT_TO_NETWORK =
"com.android.server.wifi.ConnectToNetworkNotification.CONNECT_TO_NETWORK";
/** Intent when user tapped action button to open Wi-Fi Settings. */
public static final String ACTION_PICK_WIFI_NETWORK =
"com.android.server.wifi.ConnectToNetworkNotification.PICK_WIFI_NETWORK";
/** Intent when user tapped "Failed to connect" notification to open Wi-Fi Settings. */
public static final String ACTION_PICK_WIFI_NETWORK_AFTER_CONNECT_FAILURE =
"com.android.server.wifi.ConnectToNetworkNotification.PICK_NETWORK_AFTER_FAILURE";
/** Extra data added to the Intent to specify the registering network notifier. */
public static final String AVAILABLE_NETWORK_NOTIFIER_TAG =
"com.android.server.wifi.ConnectToNetworkNotification.AVAILABLE_NETWORK_NOTIFIER_TAG";
private WifiContext mContext;
private WifiInjector mWifiInjector;
private FrameworkFacade mFrameworkFacade;
public ConnectToNetworkNotificationBuilder(
WifiContext context,
WifiInjector wifiInjector,
FrameworkFacade framework) {
mContext = context;
mWifiInjector = wifiInjector;
mFrameworkFacade = framework;
}
/**
* Creates the connect to network notification that alerts users of a recommended connectable
* network.
*
* There are two actions - "Options" link to the Wi-Fi picker activity, and "Connect" prompts
* the connection to the recommended network.
*
* @param notifierTag Unique tag of calling network notifier
* @param network The network to be recommended
*/
public Notification createConnectToAvailableNetworkNotification(String notifierTag,
ScanResult network) {
CharSequence title;
switch (notifierTag) {
case OpenNetworkNotifier.TAG:
title = mContext.getText(R.string.wifi_available_title);
break;
default:
Log.wtf("ConnectToNetworkNotificationBuilder", "Unknown network notifier."
+ notifierTag);
return null;
}
Notification.Action connectAction = new Notification.Action.Builder(null /* icon */,
mContext.getResources().getText(R.string.wifi_available_action_connect),
getPrivateBroadcast(ACTION_CONNECT_TO_NETWORK, notifierTag)).build();
Notification.Action allNetworksAction = new Notification.Action.Builder(null /* icon */,
mContext.getResources().getText(R.string.wifi_available_action_all_networks),
getPrivateBroadcast(ACTION_PICK_WIFI_NETWORK, notifierTag)).build();
return createNotificationBuilder(title, network.SSID, notifierTag)
.setContentIntent(getPrivateBroadcast(ACTION_PICK_WIFI_NETWORK, notifierTag))
.addAction(connectAction)
.addAction(allNetworksAction)
.setVisibility(VISIBILITY_SECRET)
.build();
}
/**
* Creates the notification that indicates the controller is attempting to connect to the
* recommended network.
*
* @param notifierTag Unique tag of the calling network notifier
* @param network The network to be recommended
*/
public Notification createNetworkConnectingNotification(String notifierTag,
ScanResult network) {
return createNotificationBuilder(
mContext.getText(R.string.wifi_available_title_connecting), network.SSID,
notifierTag)
.setProgress(0 /* max */, 0 /* progress */, true /* indeterminate */)
.build();
}
/**
* Creates the notification that indicates the controller successfully connected to the
* recommended network.
*
* @param notifierTag Unique tag of the calling network notifier
* @param network The network to be recommended
*/
public Notification createNetworkConnectedNotification(String notifierTag, ScanResult network) {
return createNotificationBuilder(
mContext.getText(R.string.wifi_available_title_connected), network.SSID,
notifierTag)
.build();
}
/**
* Creates the notification that indicates the controller failed to connect to the recommended
* network. Tapping this notification opens the wifi picker.
*
* @param notifierTag Unique tag of the calling network notifier
*/
public Notification createNetworkFailedNotification(String notifierTag) {
return createNotificationBuilder(
mContext.getText(R.string.wifi_available_title_failed_to_connect),
mContext.getText(R.string.wifi_available_content_failed_to_connect), notifierTag)
.setContentIntent(
getPrivateBroadcast(ACTION_PICK_WIFI_NETWORK_AFTER_CONNECT_FAILURE,
notifierTag))
.setAutoCancel(true)
.build();
}
private int getNotifierRequestCode(String notifierTag) {
switch (notifierTag) {
case OpenNetworkNotifier.TAG:
return 1;
}
return 0;
}
private Notification.Builder createNotificationBuilder(
CharSequence title, CharSequence content, String extraData) {
return mFrameworkFacade.makeNotificationBuilder(mContext,
WifiService.NOTIFICATION_NETWORK_AVAILABLE)
.setSmallIcon(Icon.createWithResource(mContext.getWifiOverlayApkPkgName(),
com.android.wifi.resources.R.drawable.stat_notify_wifi_in_range))
.setTicker(title)
.setContentTitle(title)
.setContentText(content)
.setDeleteIntent(getPrivateBroadcast(ACTION_USER_DISMISSED_NOTIFICATION, extraData))
.setShowWhen(false)
.setLocalOnly(true)
.setColor(mContext.getResources().getColor(
android.R.color.system_notification_accent_color,
mContext.getTheme()));
}
private PendingIntent getPrivateBroadcast(String action, String extraData) {
Intent intent = new Intent(action)
.setPackage(mWifiInjector.getWifiStackPackageName());
int requestCode = 0; // Makes the different kinds of notifications distinguishable
if (extraData != null) {
intent.putExtra(AVAILABLE_NETWORK_NOTIFIER_TAG, extraData);
requestCode = getNotifierRequestCode(extraData);
}
return mFrameworkFacade.getBroadcast(mContext, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
}