blob: 3b70fbe91b89422dd7daa0fe00da45ce08a00f3e [file] [log] [blame]
package com.matter.tv.server;
import static androidx.core.content.ContextCompat.getSystemService;
import android.app.Activity;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;
import android.util.Log;
import android.widget.EditText;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.NotificationCompat;
import com.matter.tv.server.tvapp.UserPrompter;
import com.matter.tv.server.tvapp.UserPrompterResolver;
public class MatterCommissioningPrompter extends UserPrompterResolver implements UserPrompter {
private Activity activity;
private NotificationManager notificationManager;
private final String CHANNEL_ID = "MatterCommissioningPrompter.CHANNEL";
private final int SUCCESS_ID = 0;
private final int FAIL_ID = 1;
public MatterCommissioningPrompter(Activity activity) {
this.activity = activity;
this.createNotificationChannel();
}
public void promptForCommissionOkPermission(
int vendorId, int productId, String commissioneeName) {
// TODO: find app by vendorId and productId
Log.d(
TAG,
"Received prompt for OK permission vendor id:"
+ vendorId
+ " productId:"
+ productId
+ ". Commissionee: "
+ commissioneeName);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder
.setMessage(commissioneeName + " is requesting permission to cast to this device, approve?")
.setTitle("Allow access to " + commissioneeName)
.setPositiveButton(
"Ok",
(dialog, which) -> {
OnPromptAccepted();
})
.setNegativeButton(
"Cancel",
(dialog, which) -> {
OnPromptDeclined();
})
.create()
.show();
}
@Override
public void promptForCommissionPinCode(int vendorId, int productId, String commissioneeName) {
// TODO: find app by vendorId and productId
Log.d(
TAG,
"Received prompt for PIN code vendor id:"
+ vendorId
+ " productId:"
+ productId
+ ". Commissionee: "
+ commissioneeName);
EditText editText = new EditText(activity);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder
.setMessage("Please enter PIN displayed in casting app.")
.setTitle("Allow access to " + commissioneeName)
.setView(editText)
.setPositiveButton(
"Ok",
(dialog, which) -> {
String pinCode = editText.getText().toString();
OnPinCodeEntered(Integer.parseInt(pinCode));
})
.setNegativeButton(
"Cancel",
(dialog, which) -> {
OnPinCodeDeclined();
})
.create()
.show();
}
public void promptCommissioningSucceeded(int vendorId, int productId, String commissioneeName) {
Log.d(
TAG,
"Received prompt for success vendor id:"
+ vendorId
+ " productId:"
+ productId
+ ". Commissionee: "
+ commissioneeName);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(activity, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_check_24)
.setContentTitle("Connection Complete")
.setContentText(
"Success. "
+ commissioneeName
+ " can now cast to this device. Visit settings to manage access control for casting.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
notificationManager.notify(SUCCESS_ID, builder.build());
}
public void promptCommissioningFailed(String commissioneeName, String error) {
Log.d(TAG, "Received prompt for failure Commissionee: " + commissioneeName);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(activity, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_clear_24)
.setContentTitle("Connection Failed")
.setContentText("Failed. " + commissioneeName + " experienced error: " + error + ".")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
notificationManager.notify(FAIL_ID, builder.build());
}
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "MatterPromptNotificationChannel";
String description = "Matter Channel for sending notifications";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
this.notificationManager = getSystemService(activity, NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
}