aboutsummaryrefslogtreecommitdiff
path: root/shadows/framework/src/main/java/org/robolectric/shadows/NetworkRegistrationInfoTestBuilder.java
blob: 44706fba251bd7b340bb5a98afba3e0ca81bf583 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package org.robolectric.shadows;

import static android.os.Build.VERSION_CODES.Q;
import static android.os.Build.VERSION_CODES.TIRAMISU;
import static org.robolectric.util.reflector.Reflector.reflector;

import android.os.Build.VERSION;
import android.telephony.CellIdentity;
import android.telephony.DataSpecificRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.VoiceSpecificRegistrationInfo;
import androidx.annotation.RequiresApi;
import java.util.List;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.reflector.Accessor;
import org.robolectric.util.reflector.ForType;

/**
 * Builder class to create instance of {@link NetworkRegistrationInfo}.
 *
 * <p>NRI was first made a @SystemApi in Q then finally exposed as public in R.
 *
 * <p>This builder class does not extend {@link NetworkRegistrationInfo.Builder}. It uses {@link
 * NetworkRegistrationInfo.Builder} and some additional APIs to set NRI private fields.
 */
@RequiresApi(Q)
public class NetworkRegistrationInfoTestBuilder {

  private final NetworkRegistrationInfo.Builder buider = new NetworkRegistrationInfo.Builder();

  private VoiceSpecificRegistrationInfo voiceSpecificInfo;
  private DataSpecificRegistrationInfo dataSpecificInfo;
  private int roamingType;

  public static NetworkRegistrationInfoTestBuilder newBuilder() {
    return new NetworkRegistrationInfoTestBuilder();
  }

  public NetworkRegistrationInfo build() {
    NetworkRegistrationInfo networkRegistrationInfo = buider.build();
    if (VERSION.SDK_INT < Q) {
      throw new IllegalStateException(
          "NetworkRegistrationInfo not available on SDK : " + RuntimeEnvironment.getApiLevel());
    } else if (VERSION.SDK_INT < TIRAMISU) {
      reflector(NetworkRegistrationInfoReflector.class, networkRegistrationInfo)
          .setVoiceSpecificInfo(voiceSpecificInfo);
      reflector(NetworkRegistrationInfoReflector.class, networkRegistrationInfo)
          .setDataSpecificInfo(dataSpecificInfo);
    }
    networkRegistrationInfo.setRoamingType(roamingType);
    return networkRegistrationInfo;
  }

  public NetworkRegistrationInfoTestBuilder setAccessNetworkTechnology(int value) {
    buider.setAccessNetworkTechnology(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setAvailableServices(List<Integer> value) {
    buider.setAvailableServices(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setCellIdentity(CellIdentity value) {
    buider.setCellIdentity(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setDomain(int value) {
    buider.setDomain(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setEmergencyOnly(boolean value) {
    buider.setEmergencyOnly(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setRegisteredPlmn(String value) {
    if (VERSION.SDK_INT == Q) {
      throw new IllegalStateException(
          "Registered PLMN is not available on SDK : " + RuntimeEnvironment.getApiLevel());
    } else {
      buider.setRegisteredPlmn(value);
    }
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setRegistrationState(int value) {
    buider.setRegistrationState(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setRejectCause(int value) {
    buider.setRejectCause(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setTransportType(int value) {
    buider.setTransportType(value);
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setDataSpecificInfo(
      DataSpecificRegistrationInfo value) {
    if (VERSION.SDK_INT >= TIRAMISU) {
      buider.setDataSpecificInfo(value);
    } else {
      dataSpecificInfo = value;
    }
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setVoiceSpecificInfo(
      VoiceSpecificRegistrationInfo value) {
    if (VERSION.SDK_INT >= TIRAMISU) {
      buider.setVoiceSpecificInfo(value);
    } else {
      voiceSpecificInfo = value;
    }
    return this;
  }

  public NetworkRegistrationInfoTestBuilder setRoamingType(int value) {
    roamingType = value;
    return this;
  }

  @ForType(NetworkRegistrationInfo.class)
  private interface NetworkRegistrationInfoReflector {

    @Accessor("mDataSpecificInfo")
    public void setDataSpecificInfo(DataSpecificRegistrationInfo value);

    @Accessor("mVoiceSpecificInfo")
    public void setVoiceSpecificInfo(VoiceSpecificRegistrationInfo value);
  }
}