Skip to content

Commit c1ad4b0

Browse files
author
yuemingw
committed
Improve Override APN UI in TestDPC.
Auth type, mvno type, protocol, roaming protocol and carrier enabled should have spinner for user to choose from instead of text edit input. We should explicitly specify that entry name, apn name and apn type bitmask cannot be empty. Bug: 77949452 Test: manually by trying different inputs and inserting APN via TestDPC Change-Id: I56b39d9180ba3c6779113d21fae23ac7660465b3
1 parent a54e8f9 commit c1ad4b0

File tree

3 files changed

+130
-67
lines changed

3 files changed

+130
-67
lines changed

app/src/main/java/com/afwsamples/testdpc/policy/OverrideApnFragment.java

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@
3131
import android.text.TextUtils;
3232
import android.util.Log;
3333
import android.view.View;
34+
import android.widget.AdapterView;
35+
import android.widget.AdapterView.OnItemSelectedListener;
36+
import android.widget.ArrayAdapter;
3437
import android.widget.EditText;
38+
import android.widget.Spinner;
3539
import android.widget.Toast;
3640

3741
import com.afwsamples.testdpc.DeviceAdminReceiver;
@@ -110,6 +114,27 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
110114
return false;
111115
}
112116

117+
void setUpSpinner(View dialogView, int viewId, int textArrayId) {
118+
final Spinner spinner = (Spinner) dialogView.findViewById(viewId);
119+
final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
120+
getActivity(), textArrayId, android.R.layout.simple_spinner_item);
121+
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
122+
spinner.setAdapter(adapter);
123+
}
124+
125+
void setUpAllSpinners(View dialogView) {
126+
// Set up spinner for auth type.
127+
setUpSpinner(dialogView, R.id.apn_auth_type, R.array.apn_auth_type_choices);
128+
// Set up spinner for protocol.
129+
setUpSpinner(dialogView, R.id.apn_protocol, R.array.apn_protocol_choices);
130+
// Set up spinner for roaming protocol.
131+
setUpSpinner(dialogView, R.id.apn_roaming_protocol, R.array.apn_protocol_choices);
132+
// Set up spinner for mvno type.
133+
setUpSpinner(dialogView, R.id.apn_mvno_type, R.array.apn_mvno_type_choices);
134+
// Set up spinner for carrier enabled.
135+
setUpSpinner(dialogView, R.id.apn_carrier_enabled, R.array.apn_carrier_enabled_choices);
136+
}
137+
113138
void showInsertOverrideApnDialog() {
114139
if (getActivity() == null || getActivity().isFinishing()) {
115140
return;
@@ -135,44 +160,39 @@ void showInsertOverrideApnDialog() {
135160
R.id.apn_user);
136161
final EditText passwordEditText = (EditText) dialogView.findViewById(
137162
R.id.apn_password);
138-
final EditText authTypeEditText = (EditText) dialogView.findViewById(
139-
R.id.apn_auth_type);
140163
final EditText typeEditText = (EditText) dialogView.findViewById(
141164
R.id.apn_type);
142165
final EditText numericEditText = (EditText) dialogView.findViewById(
143166
R.id.apn_numeric);
144-
final EditText protocolEditText = (EditText) dialogView.findViewById(
145-
R.id.apn_protocol);
146-
final EditText roamingProtocolEditText = (EditText) dialogView.findViewById(
147-
R.id.apn_roaming_protocol);
148-
final EditText carrierEnabledEditText = (EditText) dialogView.findViewById(
149-
R.id.apn_carrier_enabled);
150167
final EditText networkBitmaskEditText = (EditText) dialogView.findViewById(
151168
R.id.apn_network_bitmask);
152-
final EditText mvnoTypeEditText = (EditText) dialogView.findViewById(
153-
R.id.apn_mvno_type);
169+
setUpAllSpinners(dialogView);
170+
171+
entryNameEditText.setHint(R.string.apn_entry_name_cannot_be_empty);
172+
apnNameEditText.setHint(R.string.apn_name_cannot_be_empty);
173+
typeEditText.setHint(R.string.apn_type_cannot_be_zero);
154174

155-
authTypeEditText.setHint(R.string.apn_auth_type_hint);
156175
numericEditText.setHint(R.string.apn_numeric_hint);
157-
carrierEnabledEditText.setHint(R.string.apn_carrier_enabled_hint);
158176

159177
new AlertDialog.Builder(getActivity())
160178
.setTitle(R.string.insert_override_apn)
161179
.setView(dialogView)
162180
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
163181
final String entryName = entryNameEditText.getText().toString();
164182
if (entryName.isEmpty()) {
165-
showToast(R.string.apn_no_entry_name);
183+
showToast(R.string.apn_entry_name_cannot_be_empty);
166184
return;
167185
}
168186
final String apnName = apnNameEditText.getText().toString();
169187
if (apnName.isEmpty()) {
170-
showToast(R.string.apn_no_apn_name);
188+
showToast(R.string.apn_name_cannot_be_empty);
189+
return;
190+
}
191+
final int apnTypeBitmask = parseInt(typeEditText.getText().toString(), 0);
192+
if (apnTypeBitmask == 0) {
193+
showToast(R.string.apn_type_cannot_be_zero);
171194
return;
172195
}
173-
int authType = parseInt(authTypeEditText.getText().toString(), 0);
174-
int enabled = parseInt(carrierEnabledEditText.getText().toString(), 0);
175-
int networkbitmask = parseInt(networkBitmaskEditText.getText().toString(), 0);
176196

177197
ApnSetting apn = makeApnSetting(
178198
numericEditText.getText().toString(),
@@ -185,13 +205,23 @@ void showInsertOverrideApnDialog() {
185205
parseInt(mmsPortEditText.getText().toString(), -1),
186206
userEditText.getText().toString(),
187207
passwordEditText.getText().toString(),
188-
authType,
189-
parseInt(typeEditText.getText().toString(), 0),
190-
parseInt(protocolEditText.getText().toString(), -1),
191-
parseInt(roamingProtocolEditText.getText().toString(), -1),
192-
enabled == 1,
193-
networkbitmask,
194-
parseInt(mvnoTypeEditText.getText().toString(), -1)
208+
// -1 here as we have extra default choice "Not specified" in the
209+
// spinner of auth type, protocol, roaming protocol and mvno type
210+
// in case user doesn't want to specify these fields. And
211+
// "Not Specified" should be transformed into "-1" in the builder
212+
// of ApnSetting.
213+
((Spinner)dialogView.findViewById(R.id.apn_auth_type))
214+
.getSelectedItemPosition() - 1,
215+
apnTypeBitmask,
216+
((Spinner)dialogView.findViewById(R.id.apn_protocol))
217+
.getSelectedItemPosition() - 1,
218+
((Spinner)dialogView.findViewById(
219+
R.id.apn_roaming_protocol)).getSelectedItemPosition() - 1,
220+
((Spinner)dialogView.findViewById(
221+
R.id.apn_carrier_enabled)).getSelectedItemPosition() == 1,
222+
parseInt(networkBitmaskEditText.getText().toString(), 0),
223+
((Spinner)dialogView.findViewById(R.id.apn_mvno_type))
224+
.getSelectedItemPosition() - 1
195225
);
196226
int insertedId = mDevicePolicyManager.addOverrideApn(mAdminComponentName, apn);
197227
if (insertedId == -1) {

app/src/main/res/layout/insert_apn.xml

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,11 @@
186186
android:layout_height="wrap_content"
187187
android:text="@string/apn_auth_type"
188188
style="@style/networking_item_label"/>
189-
<EditText android:id="@+id/apn_auth_type"
190-
android:layout_width="match_parent"
191-
android:layout_height="wrap_content"
192-
android:maxLength="32"
193-
android:singleLine="true"
194-
style="@style/networking_item_edit_content"/>
189+
<Spinner android:id="@+id/apn_auth_type"
190+
android:layout_width="match_parent"
191+
android:layout_height="wrap_content"
192+
android:prompt="@string/apn_auth_type"
193+
style="@style/networking_item_content"/>
195194
</LinearLayout>
196195

197196
<LinearLayout
@@ -237,12 +236,11 @@
237236
android:layout_height="wrap_content"
238237
android:text="@string/apn_protocol"
239238
style="@style/networking_item_label"/>
240-
<EditText android:id="@+id/apn_protocol"
241-
android:layout_width="match_parent"
242-
android:layout_height="wrap_content"
243-
android:maxLength="32"
244-
android:singleLine="true"
245-
style="@style/networking_item_edit_content"/>
239+
<Spinner android:id="@+id/apn_protocol"
240+
android:layout_width="match_parent"
241+
android:layout_height="wrap_content"
242+
android:prompt="@string/apn_protocol"
243+
style="@style/networking_item_content"/>
246244
</LinearLayout>
247245

248246
<LinearLayout
@@ -254,12 +252,11 @@
254252
android:layout_height="wrap_content"
255253
android:text="@string/apn_roaming_protocol"
256254
style="@style/networking_item_label"/>
257-
<EditText android:id="@+id/apn_roaming_protocol"
258-
android:layout_width="match_parent"
259-
android:layout_height="wrap_content"
260-
android:maxLength="32"
261-
android:singleLine="true"
262-
style="@style/networking_item_edit_content"/>
255+
<Spinner android:id="@+id/apn_roaming_protocol"
256+
android:layout_width="match_parent"
257+
android:layout_height="wrap_content"
258+
android:prompt="@string/apn_roaming_protocol"
259+
style="@style/networking_item_content"/>
263260
</LinearLayout>
264261

265262
<LinearLayout
@@ -271,12 +268,11 @@
271268
android:layout_height="wrap_content"
272269
android:text="@string/apn_carrier_enabled"
273270
style="@style/networking_item_label"/>
274-
<EditText android:id="@+id/apn_carrier_enabled"
275-
android:layout_width="match_parent"
276-
android:layout_height="wrap_content"
277-
android:maxLength="32"
278-
android:singleLine="true"
279-
style="@style/networking_item_edit_content"/>
271+
<Spinner android:id="@+id/apn_carrier_enabled"
272+
android:layout_width="match_parent"
273+
android:layout_height="wrap_content"
274+
android:prompt="@string/apn_carrier_enabled"
275+
style="@style/networking_item_content"/>
280276
</LinearLayout>
281277

282278
<LinearLayout
@@ -305,12 +301,11 @@
305301
android:layout_height="wrap_content"
306302
android:text="@string/apn_mvno_type"
307303
style="@style/networking_item_label"/>
308-
<EditText android:id="@+id/apn_mvno_type"
309-
android:layout_width="match_parent"
310-
android:layout_height="wrap_content"
311-
android:maxLength="32"
312-
android:singleLine="true"
313-
style="@style/networking_item_edit_content"/>
304+
<Spinner android:id="@+id/apn_mvno_type"
305+
android:layout_width="match_parent"
306+
android:layout_height="wrap_content"
307+
android:prompt="@string/apn_mvno_type"
308+
style="@style/networking_item_content"/>
314309
</LinearLayout>
315310

316311
</LinearLayout>

app/src/main/res/values/strings.xml

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -217,29 +217,67 @@
217217
<string name="enable_override_apn">Enable override APNs</string>
218218
<string name="apn_entry_name">Entry name</string>
219219
<string name="apn_apn_name">APN name</string>
220-
<string name="apn_proxy">Proxy</string>
221-
<string name="apn_port">Port</string>
220+
<string name="apn_proxy">Proxy address</string>
221+
<string name="apn_port">Proxy port</string>
222222
<string name="apn_mmsc">MMSC</string>
223-
<string name="apn_mmsproxy">MMS Proxy</string>
224-
<string name="apn_mmsport">MMS Port</string>
223+
<string name="apn_mmsproxy">MMS proxy address</string>
224+
<string name="apn_mmsport">MMS proxy port</string>
225225
<string name="apn_user">User</string>
226226
<string name="apn_password">Password</string>
227227
<string name="apn_auth_type">Authentication type</string>
228-
<string name="apn_type">Type</string>
229-
<string name="apn_numeric">Numeric(MCC+MNC)</string>
228+
<string name="apn_type">Apn type bitmask</string>
229+
<string name="apn_numeric">Operator numeric(MCC+MNC)</string>
230230
<string name="apn_protocol">Protocol</string>
231231
<string name="apn_roaming_protocol">Roaming protocol</string>
232232
<string name="apn_carrier_enabled">Carrier enabled</string>
233-
<string name="apn_network_bitmask">Network bitmask</string>
233+
<string name="apn_network_bitmask">Network type bitmask</string>
234234
<string name="apn_mvno_type">MVNO type</string>
235-
<string name="apn_auth_type_hint">0:None, 1:PAP, 2:CHAP, 3:PAP_OR_CHAP</string>
236235
<string name="apn_numeric_hint">Numeric=MCC+MNC</string>
237-
<string name="apn_carrier_enabled_hint">0 for false, 1 for true</string>
238-
<string name="apn_no_entry_name">Entry name is not specified</string>
239-
<string name="apn_no_apn_name">APN name is not specified</string>
236+
237+
<string name="apn_entry_name_cannot_be_empty">Entry name cannot be empty</string>
238+
<string name="apn_name_cannot_be_empty">APN name cannot be empty</string>
239+
<string name="apn_type_cannot_be_zero">Apn type bitmask cannot be empty or zero</string>
240240
<string name="apn_wrong_url">Cannot parse mmsc</string>
241-
<string name="apn_wrong_inetaddress">Cannot parse proxy or mmsproxy</string>
242-
<string name="apn_wrong_port">Cannot parse port or mmsport</string>
241+
<string name="apn_wrong_inetaddress">Cannot parse proxy address or MMS proxy address</string>
242+
<string name="apn_wrong_port">Cannot parse proxy port or MMS proxy port</string>
243+
244+
<string-array name="apn_auth_type_choices">
245+
<item>Not specified</item>
246+
<!-- Do not translate. -->
247+
<item>NONE</item>
248+
<!-- Do not translate. -->
249+
<item>PAP</item>
250+
<!-- Do not translate. -->
251+
<item>CHAP</item>
252+
<!-- Do not translate. -->
253+
<item>PAP or CHAP</item>
254+
</string-array>
255+
<string-array name="apn_protocol_choices">
256+
<item>Not specified</item>
257+
<!-- Do not translate. -->
258+
<item>IP</item>
259+
<!-- Do not translate. -->
260+
<item>IPV6</item>
261+
<!-- Do not translate. -->
262+
<item>IPV4V6</item>
263+
<!-- Do not translate. -->
264+
<item>PPP</item>
265+
</string-array>
266+
<string-array name="apn_mvno_type_choices">
267+
<item>Not specified</item>
268+
<!-- Do not translate. -->
269+
<item>SPN</item>
270+
<!-- Do not translate. -->
271+
<item>IMSI</item>
272+
<!-- Do not translate. -->
273+
<item>GID</item>
274+
<!-- Do not translate. -->
275+
<item>ICCID</item>
276+
</string-array>
277+
<string-array name="apn_carrier_enabled_choices">
278+
<item>Disabled</item>
279+
<item>Enabled</item>
280+
</string-array>
243281

244282
<!-- Strings for wifi management -->
245283
<string name="wifi_management_title">WI-FI management</string>

0 commit comments

Comments
 (0)