summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sarah Chin <sarahchin@google.com> 2022-12-13 12:26:55 -0800
committer Sarah Chin <sarahchin@google.com> 2022-12-15 19:46:25 +0000
commitf09e5e1cc8795fd0542b321852abf5914ee7364e (patch)
tree8646eba3ba4e0b76967e1e966201cf756183bd97
parentf8fb10ff1fecc2fd794fc0af8e6f2cf12c74540f (diff)
Slice purchase app get URL from intent
Get the purchase URL from the intent sent by SlicePurchaseController instead of querying CarrierConfigManager directly. Test: manual Test: SlicePurchaseBroadcastReceiverTest, SlicePurchaseActivityTest Bug: 259498920 Change-Id: I163ecb44026486798e4d26dec23f2aa4aa6fbd56
-rw-r--r--packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseActivity.java60
-rw-r--r--packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiver.java37
-rw-r--r--packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseActivityTest.java9
-rw-r--r--packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiverTest.java29
4 files changed, 88 insertions, 47 deletions
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseActivity.java
index c8bc771aca26..c08b83a7ae78 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseActivity.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseActivity.java
@@ -22,17 +22,14 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
-import android.webkit.URLUtil;
import android.webkit.WebView;
import com.android.phone.slice.SlicePurchaseController;
-import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
@@ -61,37 +58,29 @@ public class SlicePurchaseActivity extends Activity {
@NonNull private WebView mWebView;
@NonNull private Context mApplicationContext;
@NonNull private Intent mIntent;
- @Nullable private URL mUrl;
- private int mSubId;
+ @NonNull private URL mUrl;
@TelephonyManager.PremiumCapability protected int mCapability;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mIntent = getIntent();
- mSubId = mIntent.getIntExtra(SlicePurchaseController.EXTRA_SUB_ID,
+ int subId = mIntent.getIntExtra(SlicePurchaseController.EXTRA_SUB_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
mCapability = mIntent.getIntExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
SlicePurchaseController.PREMIUM_CAPABILITY_INVALID);
+ String url = mIntent.getStringExtra(SlicePurchaseController.EXTRA_PURCHASE_URL);
mApplicationContext = getApplicationContext();
- mUrl = getUrl();
- logd("onCreate: subId=" + mSubId + ", capability="
- + TelephonyManager.convertPremiumCapabilityToString(mCapability)
- + ", url=" + mUrl);
+ logd("onCreate: subId=" + subId + ", capability="
+ + TelephonyManager.convertPremiumCapabilityToString(mCapability) + ", url=" + url);
// Cancel network boost notification
SlicePurchaseBroadcastReceiver.cancelNotification(mApplicationContext, mCapability);
- // Verify intent and values are valid
- if (!SlicePurchaseBroadcastReceiver.isIntentValid(mIntent)) {
- loge("Not starting SlicePurchaseActivity with an invalid Intent: " + mIntent);
- SlicePurchaseBroadcastReceiver.sendSlicePurchaseAppResponse(
- mIntent, SlicePurchaseController.EXTRA_INTENT_REQUEST_FAILED);
- finishAndRemoveTask();
- return;
- }
+ // Verify purchase URL is valid
+ mUrl = SlicePurchaseBroadcastReceiver.getPurchaseUrl(url);
if (mUrl == null) {
- String error = "Unable to create a URL from carrier configs.";
+ String error = "Unable to create a purchase URL.";
loge(error);
Intent data = new Intent();
data.putExtra(SlicePurchaseController.EXTRA_FAILURE_CODE,
@@ -102,9 +91,20 @@ public class SlicePurchaseActivity extends Activity {
finishAndRemoveTask();
return;
}
- if (mSubId != SubscriptionManager.getDefaultSubscriptionId()) {
+
+ // Verify intent is valid
+ if (!SlicePurchaseBroadcastReceiver.isIntentValid(mIntent)) {
+ loge("Not starting SlicePurchaseActivity with an invalid Intent: " + mIntent);
+ SlicePurchaseBroadcastReceiver.sendSlicePurchaseAppResponse(
+ mIntent, SlicePurchaseController.EXTRA_INTENT_REQUEST_FAILED);
+ finishAndRemoveTask();
+ return;
+ }
+
+ // Verify sub ID is valid
+ if (subId != SubscriptionManager.getDefaultSubscriptionId()) {
loge("Unable to start the slice purchase application on the non-default data "
- + "subscription: " + mSubId);
+ + "subscription: " + subId);
SlicePurchaseBroadcastReceiver.sendSlicePurchaseAppResponse(
mIntent, SlicePurchaseController.EXTRA_INTENT_NOT_DEFAULT_DATA_SUBSCRIPTION);
finishAndRemoveTask();
@@ -159,24 +159,6 @@ public class SlicePurchaseActivity extends Activity {
super.onDestroy();
}
- @Nullable private URL getUrl() {
- String url = mApplicationContext.getSystemService(CarrierConfigManager.class)
- .getConfigForSubId(mSubId).getString(
- CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING);
- boolean isUrlValid = URLUtil.isValidUrl(url);
- if (URLUtil.isAssetUrl(url)) {
- isUrlValid = url.equals(SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
- }
- if (isUrlValid) {
- try {
- return new URL(url);
- } catch (MalformedURLException ignored) {
- }
- }
- loge("Invalid URL: " + url);
- return null;
- }
-
private void setupWebView() {
// Create WebView
mWebView = new WebView(this);
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiver.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiver.java
index 3cc2a55421aa..30411381ae82 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiver.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiver.java
@@ -16,6 +16,7 @@
package com.android.carrierdefaultapp;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -35,11 +36,15 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
+import android.webkit.URLUtil;
import android.webkit.WebView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.phone.slice.SlicePurchaseController;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
@@ -140,7 +145,7 @@ public class SlicePurchaseBroadcastReceiver extends BroadcastReceiver{
* Check whether the Intent is valid and can be used to complete purchases in the slice purchase
* application. This checks that all necessary extras exist and that the values are valid.
*
- * @param intent The intent to check
+ * @param intent The intent to check.
* @return {@code true} if the intent is valid and {@code false} otherwise.
*/
public static boolean isIntentValid(@NonNull Intent intent) {
@@ -165,6 +170,12 @@ public class SlicePurchaseBroadcastReceiver extends BroadcastReceiver{
return false;
}
+ String purchaseUrl = intent.getStringExtra(SlicePurchaseController.EXTRA_PURCHASE_URL);
+ if (getPurchaseUrl(purchaseUrl) == null) {
+ loge("isIntentValid: invalid purchase URL: " + purchaseUrl);
+ return false;
+ }
+
String appName = intent.getStringExtra(SlicePurchaseController.EXTRA_REQUESTING_APP_NAME);
if (TextUtils.isEmpty(appName)) {
loge("isIntentValid: empty requesting application name: " + appName);
@@ -181,6 +192,30 @@ public class SlicePurchaseBroadcastReceiver extends BroadcastReceiver{
SlicePurchaseController.EXTRA_INTENT_NOTIFICATION_SHOWN);
}
+ /**
+ * Get the {@link URL} from the given purchase URL String, if it is valid.
+ *
+ * @param purchaseUrl The purchase URL String to use to create the URL.
+ * @return The purchase URL from the given String or {@code null} if it is invalid.
+ */
+ @Nullable public static URL getPurchaseUrl(@Nullable String purchaseUrl) {
+ if (!URLUtil.isValidUrl(purchaseUrl)) {
+ return null;
+ }
+ if (URLUtil.isAssetUrl(purchaseUrl)
+ && !purchaseUrl.equals(SlicePurchaseController.SLICE_PURCHASE_TEST_FILE)) {
+ return null;
+ }
+ URL url = null;
+ try {
+ url = new URL(purchaseUrl);
+ url.toURI();
+ } catch (MalformedURLException | URISyntaxException e) {
+ loge("Invalid purchase URL: " + purchaseUrl + ", " + e);
+ }
+ return url;
+ }
+
private static boolean isPendingIntentValid(@NonNull Intent intent, @NonNull String extra) {
String intentType = getPendingIntentType(extra);
PendingIntent pendingIntent = intent.getParcelableExtra(extra, PendingIntent.class);
diff --git a/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseActivityTest.java b/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseActivityTest.java
index cecc86d8e330..1bf644eb1fb6 100644
--- a/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseActivityTest.java
+++ b/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseActivityTest.java
@@ -39,7 +39,6 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.phone.slice.SlicePurchaseController;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -94,6 +93,8 @@ public class SlicePurchaseActivityTest extends ActivityUnitTestCase<SlicePurchas
SubscriptionManager.getDefaultDataSubscriptionId());
intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ intent.putExtra(SlicePurchaseController.EXTRA_PURCHASE_URL,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
intent.putExtra(SlicePurchaseController.EXTRA_REQUESTING_APP_NAME, TAG);
Intent spiedIntent = spy(intent);
@@ -110,12 +111,6 @@ public class SlicePurchaseActivityTest extends ActivityUnitTestCase<SlicePurchas
mSlicePurchaseActivity = startActivity(spiedIntent, null, null);
}
- @After
- public void tearDown() throws Exception {
- mSlicePurchaseActivity.onDestroy();
- super.tearDown();
- }
-
@Test
public void testOnPurchaseSuccessful() throws Exception {
int duration = 5 * 60 * 1000; // 5 minutes
diff --git a/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiverTest.java b/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiverTest.java
index 20ffb27d4294..958e13870759 100644
--- a/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiverTest.java
+++ b/packages/CarrierDefaultApp/tests/unit/src/com/android/carrierdefaultapp/SlicePurchaseBroadcastReceiverTest.java
@@ -18,6 +18,7 @@ package com.android.carrierdefaultapp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
@@ -55,6 +56,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.URL;
import java.util.Locale;
@RunWith(AndroidJUnit4.class)
@@ -132,6 +134,8 @@ public class SlicePurchaseBroadcastReceiverTest {
eq(SlicePurchaseController.EXTRA_SUB_ID), anyInt());
doReturn(TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY).when(mIntent).getIntExtra(
eq(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY), anyInt());
+ doReturn(SlicePurchaseController.SLICE_PURCHASE_TEST_FILE).when(mIntent).getStringExtra(
+ eq(SlicePurchaseController.EXTRA_PURCHASE_URL));
doReturn(TAG).when(mIntent).getStringExtra(
eq(SlicePurchaseController.EXTRA_REQUESTING_APP_NAME));
assertFalse(SlicePurchaseBroadcastReceiver.isIntentValid(mIntent));
@@ -145,6 +149,29 @@ public class SlicePurchaseBroadcastReceiverTest {
}
@Test
+ public void testGetPurchaseUrl() {
+ String[] invalidUrls = new String[] {
+ null,
+ "",
+ "www.google.com",
+ "htt://www.google.com",
+ "http//www.google.com",
+ "http:/www.google.com",
+ "file:///android_asset/",
+ "file:///android_asset/slice_store_test.html"
+ };
+
+ for (String url : invalidUrls) {
+ URL purchaseUrl = SlicePurchaseBroadcastReceiver.getPurchaseUrl(url);
+ assertNull(purchaseUrl);
+ }
+
+ assertEquals(SlicePurchaseController.SLICE_PURCHASE_TEST_FILE,
+ SlicePurchaseBroadcastReceiver.getPurchaseUrl(
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE).toString());
+ }
+
+ @Test
public void testDisplayNetworkBoostNotification() throws Exception {
displayNetworkBoostNotification();
@@ -200,6 +227,8 @@ public class SlicePurchaseBroadcastReceiverTest {
eq(SlicePurchaseController.EXTRA_SUB_ID), anyInt());
doReturn(TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY).when(mIntent).getIntExtra(
eq(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY), anyInt());
+ doReturn(SlicePurchaseController.SLICE_PURCHASE_TEST_FILE).when(mIntent).getStringExtra(
+ eq(SlicePurchaseController.EXTRA_PURCHASE_URL));
doReturn(TAG).when(mIntent).getStringExtra(
eq(SlicePurchaseController.EXTRA_REQUESTING_APP_NAME));
mSlicePurchaseBroadcastReceiver.onReceive(mContext, mIntent);