Previously ApnPrefence starts an intent with URI content://telephony/carrier/filtered/id, this URI is only implemented in telephony provider for query(), but not for delete() or update(). This caused the crash when user tries to update or delete an APN through this URI. We should let ApnPrefence starts an intent with URI content://telephony/carrier/id, which is a general telephony URI and all of query() add() delete() update() are implemented for non-DPC mode. And let ApnPrefence starts an intent with URI content://telephony/carrier/filtered/id in DPC mode(as the general URI can't access DPC-owned APN), when only DPC-owned APNs are presented to user. In the DPC mode, user can't update, add or delete an APN, they can only view(query) the APN, so it won't crash with URI_FILTERED. Bug: 72387301 Test: manual. Tried update, delete, and add action in Access Point Name page, no crash occurs. Instrumentation test will be added in b/72154761. Change-Id: I9979cbffcc94a37b2bd96db766ececd0ac7b20e2
149 lines
4.7 KiB
Java
Executable File
149 lines
4.7 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2009 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings;
|
|
|
|
import static android.provider.Telephony.Carriers.CONTENT_URI;
|
|
import static android.provider.Telephony.Carriers.FILTERED_URI;
|
|
|
|
import android.content.ContentUris;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.net.Uri;
|
|
import android.support.v7.preference.Preference;
|
|
import android.support.v7.preference.PreferenceViewHolder;
|
|
import android.telephony.SubscriptionManager;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
import android.view.View.OnClickListener;
|
|
import android.widget.CompoundButton;
|
|
import android.widget.RadioButton;
|
|
import android.widget.RelativeLayout;
|
|
|
|
public class ApnPreference extends Preference implements
|
|
CompoundButton.OnCheckedChangeListener, OnClickListener {
|
|
final static String TAG = "ApnPreference";
|
|
private boolean mDpcEnforced = false;
|
|
|
|
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
|
|
|
public ApnPreference(Context context, AttributeSet attrs, int defStyle) {
|
|
super(context, attrs, defStyle);
|
|
}
|
|
|
|
public ApnPreference(Context context, AttributeSet attrs) {
|
|
this(context, attrs, R.attr.apnPreferenceStyle);
|
|
}
|
|
|
|
public ApnPreference(Context context) {
|
|
this(context, null);
|
|
}
|
|
|
|
private static String mSelectedKey = null;
|
|
private static CompoundButton mCurrentChecked = null;
|
|
private boolean mProtectFromCheckedChange = false;
|
|
private boolean mSelectable = true;
|
|
|
|
@Override
|
|
public void onBindViewHolder(PreferenceViewHolder view) {
|
|
super.onBindViewHolder(view);
|
|
|
|
View widget = view.findViewById(R.id.apn_radiobutton);
|
|
if ((widget != null) && widget instanceof RadioButton) {
|
|
RadioButton rb = (RadioButton) widget;
|
|
if (mSelectable) {
|
|
rb.setOnCheckedChangeListener(this);
|
|
|
|
boolean isChecked = getKey().equals(mSelectedKey);
|
|
if (isChecked) {
|
|
mCurrentChecked = rb;
|
|
mSelectedKey = getKey();
|
|
}
|
|
|
|
mProtectFromCheckedChange = true;
|
|
rb.setChecked(isChecked);
|
|
mProtectFromCheckedChange = false;
|
|
rb.setVisibility(View.VISIBLE);
|
|
} else {
|
|
rb.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
|
|
View textLayout = view.findViewById(R.id.text_layout);
|
|
if ((textLayout != null) && textLayout instanceof RelativeLayout) {
|
|
textLayout.setOnClickListener(this);
|
|
}
|
|
}
|
|
|
|
public boolean isChecked() {
|
|
return getKey().equals(mSelectedKey);
|
|
}
|
|
|
|
public void setChecked() {
|
|
mSelectedKey = getKey();
|
|
}
|
|
|
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
|
Log.i(TAG, "ID: " + getKey() + " :" + isChecked);
|
|
if (mProtectFromCheckedChange) {
|
|
return;
|
|
}
|
|
|
|
if (isChecked) {
|
|
if (mCurrentChecked != null) {
|
|
mCurrentChecked.setChecked(false);
|
|
}
|
|
mCurrentChecked = buttonView;
|
|
mSelectedKey = getKey();
|
|
callChangeListener(mSelectedKey);
|
|
} else {
|
|
mCurrentChecked = null;
|
|
mSelectedKey = null;
|
|
}
|
|
}
|
|
|
|
public void onClick(android.view.View v) {
|
|
if ((v != null) && (R.id.text_layout == v.getId())) {
|
|
Context context = getContext();
|
|
if (context != null) {
|
|
int pos = Integer.parseInt(getKey());
|
|
Uri url = ContentUris.withAppendedId(
|
|
mDpcEnforced ? FILTERED_URI : CONTENT_URI, pos);
|
|
Intent editIntent = new Intent(Intent.ACTION_EDIT, url);
|
|
editIntent.putExtra(ApnSettings.SUB_ID, mSubId);
|
|
context.startActivity(editIntent);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setSelectable(boolean selectable) {
|
|
mSelectable = selectable;
|
|
}
|
|
|
|
public boolean getSelectable() {
|
|
return mSelectable;
|
|
}
|
|
|
|
public void setSubId(int subId) {
|
|
mSubId = subId;
|
|
}
|
|
|
|
public void setDpcEnforced(boolean enforced) {
|
|
mDpcEnforced = enforced;
|
|
}
|
|
}
|