Ofrecer al usuario una venta incremental de división de red

La Segmentación de red 5G les brinda a los proveedores la capacidad de proporcionar mejoras del rendimiento de la red para casos de uso específicos. En esta guía, se explica cómo una app puede activar el flujo de UX de venta incremental de la división de red y solicitar una conexión premium si el usuario decide comprar una.

El flujo de UX muestra al usuario una notificación que abre una hoja web del proveedor en la que puede completar la compra.
Figura 1: Ejemplo de flujo de UX de venta incremental

Cómo declarar intents de capacidad premium

Para que se respete la solicitud de tu app de una capacidad de red, tu app debe declarar su intent de modo que se solicite esa capacidad en el manifiesto de la app. De lo contrario, la solicitud de red falla y arroja una SecurityException.

Para ello, tu app debe declarar la propiedad PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES en el archivo AndroidManifest.xml e incluir un archivo de recursos XML correspondiente.

Una declaración de capacidad en el archivo de manifiesto se ve de la siguiente manera:

<property android:name="android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"
          android:resource="@xml/network_capabilities" />

El archivo de recursos network_capabilities.xml correspondiente se ve de la siguiente manera:

<network-capabilities-declaration> xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-network-capability android:name="NET_CAPABILITY_PRIORITIZE_LATENCY"/>
</network-capabilities-declaration>

Activa el flujo de venta incremental de la segmentación de red

En este ejemplo de código, se muestra cómo activar el flujo de venta incremental y solicitar la función premium comprada.

Context mContext;
Network mNetwork;

public void purchasePremiumCapability() {
    TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
    int capability = TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY;
    if (tm.isPremiumCapabilityAvailableForPurchase(capability)) {
        tm.purchasePremiumCapability(capability, Runnable::run, new Consumer<Integer>() {
            @Override
            public void accept(Integer result) {
                Log.d("Purchase premium capability result: "
                        + TelephonyManager.convertPurchaseResultToString(result));
                switch (result) {
                    case /* success or already purchased */:
                        requestPremiumCapabilityNetwork();
                        break;
                    case /* temporary failure */:
                        // TODO: wait and retry
                        break;
                    case /* hard failure */:
                        // TODO: handle failure
                        break;
                    default:
                        Log.e("Unknown purchase result: " + result);
                }
            }
        });
    } else {
        Log.e("Premium capability is not available for purchase.");
    }
}

public void requestPremiumCapabilityNetwork() {
    ConnectvityManager cm = mContext.getSystemService(ConnectivityManager.class);
    NetworkRequest request = NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY)
            .build();
    cm.requestNetwork(request, new NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            Log.d("Application can now use the network with the premium capability.");
            mNetwork = network;
        }

        @Override
        public void onLost(Network network) {
            Log.d("Premium capability network is no longer available.");
            mNetwork = null;
            // TODO: clean up anything relying on the premium capability network
        }
    });
}

En las siguientes secciones, se describen los pasos involucrados en este proceso con más detalle.

Paso 1: Verifica si la función premium está disponible

Llama al método de la API isPremiumCapabilityAvailableForPurchase() para determinar si la función premium seleccionada está disponible. Este método muestra true si la capacidad está disponible para la compra del proveedor mediante el flujo de trabajo de notificación de venta incremental.

Paso 2: Inicia el flujo de notificaciones de venta incremental

Después de confirmar que la función premium está disponible, tu app debe llamar a purchasePremiumCapability() para iniciar el flujo de notificaciones de venta incremental. Si el usuario aún no compró la capacidad especificada y se cumplen todas las condiciones previas, la plataforma le muestra una notificación para informarle que su proveedor podría ofrecer opciones de mejora de rendimiento. Si el usuario presiona la notificación, la plataforma abre la WebView del proveedor para que pueda continuar el proceso de compra.

La devolución de llamada parameter que se pasa a purchasePremiumCapability() muestra un código de resultado para la solicitud de compra.

Los códigos de resultado PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS y PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED representan resultados correctos en los que tu app puede continuar solicitando la función premium seleccionada.

Los códigos de resultado de la siguiente lista representan solicitudes de compra fallidas. Consulta la referencia de la API para obtener más información.

Paso 3: Solicita la conexión premium comprada

Si el flujo de notificación de venta incremental muestra un código correcto (PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS o PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED), tu app debería usar requestNetwork() para solicitar una red que cumpla con la capacidad solicitada. Ten en cuenta que cuando compilas un objeto NetworkRequest, la capacidad que agregas no es la misma que pasas a las APIs de TelephonyManager en los pasos anteriores. En la siguiente tabla, se asignan las constantes de la clase TelephonyManager a las constantes correspondientes en NetworkCapabilities.

Constante TelephonyManager Constante NetworkCapabilities
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY NET_CAPABILITY_PRIORITIZE_LATENCY

Si la solicitud de compra falla, tu app deberá solicitar y usar la red predeterminada. No hay un comportamiento de resguardo automático si la solicitud de porciones premium no se puede entregar.