1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.content.browser.sms;
6 
7 import android.content.BroadcastReceiver;
8 import android.content.Context;
9 import android.content.ContextWrapper;
10 import android.content.Intent;
11 import android.content.IntentFilter;
12 
13 import com.google.android.gms.auth.api.phone.SmsCodeBrowserClient;
14 import com.google.android.gms.auth.api.phone.SmsCodeRetriever;
15 import com.google.android.gms.auth.api.phone.SmsRetrieverClient;
16 import com.google.android.gms.tasks.Task;
17 
18 class Wrappers {
19     // Prevent instantiation.
Wrappers()20     private Wrappers() {}
21 
22     /**
23      * Wraps com.google.android.gms.auth.api.phone.SmsRetrieverClient.
24      */
25     static class SmsRetrieverClientWrapper {
26         // Used for user consent flow.
27         private final SmsRetrieverClient mSmsRetrieverClient;
28         // Used for browser code flow.
29         private final SmsCodeBrowserClient mSmsCodeBrowserClient;
30         private WebOTPServiceContext mContext;
31 
SmsRetrieverClientWrapper( SmsRetrieverClient smsRetrieverClient, SmsCodeBrowserClient smsCodeBrowserClient)32         public SmsRetrieverClientWrapper(
33                 SmsRetrieverClient smsRetrieverClient, SmsCodeBrowserClient smsCodeBrowserClient) {
34             mSmsRetrieverClient = smsRetrieverClient;
35             mSmsCodeBrowserClient = smsCodeBrowserClient;
36         }
37 
setContext(WebOTPServiceContext context)38         public void setContext(WebOTPServiceContext context) {
39             mContext = context;
40         }
41 
getContext()42         public WebOTPServiceContext getContext() {
43             return mContext;
44         }
45 
startSmsCodeBrowserRetriever()46         public Task<Void> startSmsCodeBrowserRetriever() {
47             return mSmsCodeBrowserClient.startSmsCodeRetriever();
48         }
49 
startSmsUserConsent(String senderAddress)50         public Task<Void> startSmsUserConsent(String senderAddress) {
51             return mSmsRetrieverClient.startSmsUserConsent(senderAddress);
52         }
53     }
54 
55     /**
56      * Extends android.content.ContextWrapper to store and retrieve the
57      * registered BroadcastReceiver.
58      */
59     static class WebOTPServiceContext extends ContextWrapper {
60         private BroadcastReceiver mVerificationReceiver;
61         private BroadcastReceiver mUserConsentReceiver;
62 
WebOTPServiceContext(Context context)63         public WebOTPServiceContext(Context context) {
64             super(context);
65         }
66 
getRegisteredVerificationReceiver()67         public SmsVerificationReceiver getRegisteredVerificationReceiver() {
68             return (SmsVerificationReceiver) mVerificationReceiver;
69         }
70 
getRegisteredUserConsentReceiver()71         public SmsUserConsentReceiver getRegisteredUserConsentReceiver() {
72             return (SmsUserConsentReceiver) mUserConsentReceiver;
73         }
74 
75         // ---------------------------------------------------------------------
76         // Context overrides:
77 
78         @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)79         public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
80             if (filter.hasAction(SmsCodeRetriever.SMS_CODE_RETRIEVED_ACTION)) {
81                 mVerificationReceiver = receiver;
82             } else {
83                 mUserConsentReceiver = receiver;
84             }
85 
86             return super.registerReceiver(receiver, filter);
87         }
88 
89         @Override
unregisterReceiver(BroadcastReceiver receiver)90         public void unregisterReceiver(BroadcastReceiver receiver) {
91             if (receiver == mVerificationReceiver) {
92                 mVerificationReceiver = null;
93             } else {
94                 mUserConsentReceiver = null;
95             }
96 
97             super.unregisterReceiver(receiver);
98         }
99     }
100 }
101