Fix VPN settings flow.
Bug: 3053019
This commit is contained in:
@@ -2711,6 +2711,8 @@ found in the list of installed applications.</string>
|
|||||||
<string name="vpn_type_title">Add VPN</string>
|
<string name="vpn_type_title">Add VPN</string>
|
||||||
<!-- "Add VPN" preference title -->
|
<!-- "Add VPN" preference title -->
|
||||||
<string name="vpn_add_new_vpn">Add VPN</string>
|
<string name="vpn_add_new_vpn">Add VPN</string>
|
||||||
|
<!-- VPN details screen title -->
|
||||||
|
<string name="vpn_details_title">VPN details</string>
|
||||||
<!-- VPN profile editor title when adding a new profile -->
|
<!-- VPN profile editor title when adding a new profile -->
|
||||||
<string name="vpn_edit_title_add">Add <xliff:g id="name">%s</xliff:g> VPN</string>
|
<string name="vpn_edit_title_add">Add <xliff:g id="name">%s</xliff:g> VPN</string>
|
||||||
<!-- VPN profile editor title when editing an existing profile -->
|
<!-- VPN profile editor title when editing an existing profile -->
|
||||||
|
@@ -63,50 +63,12 @@ public class SettingsPreferenceFragment extends PreferenceFragment
|
|||||||
|
|
||||||
private Button mNextButton;
|
private Button mNextButton;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
final Fragment f = getTargetFragment();
|
|
||||||
final int requestCode = getTargetRequestCode();
|
|
||||||
|
|
||||||
// TargetFragment becomes invalid when this object is resumed. Notify it to
|
|
||||||
// FragmentManager. Without this code, FragmentManager wrongly take the TargetFragment
|
|
||||||
// as live, and throws IllegalStateException.
|
|
||||||
setTargetFragment(null, -1);
|
|
||||||
|
|
||||||
if (f != null && (f instanceof SettingsPreferenceFragment)) {
|
|
||||||
final SettingsPreferenceFragment spf = (SettingsPreferenceFragment)f;
|
|
||||||
final int resultCode = spf.getResultCode();
|
|
||||||
final Intent resultData = spf.getResultData();
|
|
||||||
onActivityResult(requestCode, resultCode, resultData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
setupButtonBar();
|
setupButtonBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setResult(int resultCode) {
|
|
||||||
mResultCode = resultCode;
|
|
||||||
mResultData = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setResult(int resultCode, Intent data) {
|
|
||||||
mResultCode = resultCode;
|
|
||||||
mResultData = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getResultCode() {
|
|
||||||
return mResultCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final Intent getResultData() {
|
|
||||||
return mResultData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The name is intentionally made different from Activity#finish(), so that
|
* The name is intentionally made different from Activity#finish(), so that
|
||||||
* users won't misunderstand its meaning.
|
* users won't misunderstand its meaning.
|
||||||
@@ -196,9 +158,8 @@ public class SettingsPreferenceFragment extends PreferenceFragment
|
|||||||
Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
|
Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
|
||||||
if (getActivity() instanceof PreferenceActivity) {
|
if (getActivity() instanceof PreferenceActivity) {
|
||||||
PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
|
PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
|
||||||
Fragment f = Fragment.instantiate(getActivity(), fragmentClass, extras);
|
preferenceActivity.startPreferencePanel(fragmentClass, extras, 0, null, caller,
|
||||||
caller.setTargetFragment(f, requestCode);
|
requestCode);
|
||||||
preferenceActivity.switchToHeader(fragmentClass, extras);
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
|
Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
|
||||||
|
@@ -32,8 +32,8 @@ import android.net.vpn.VpnProfile;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
@@ -109,7 +109,11 @@ public class VpnEditor extends SettingsPreferenceFragment {
|
|||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case MENU_SAVE:
|
case MENU_SAVE:
|
||||||
if (validateAndSetResult()) finishFragment();
|
Intent resultIntent = validateAndGetResult();
|
||||||
|
if (resultIntent != null) {
|
||||||
|
((PreferenceActivity) getActivity()).finishPreferencePanel(
|
||||||
|
this, Activity.RESULT_OK, resultIntent);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MENU_CANCEL:
|
case MENU_CANCEL:
|
||||||
@@ -152,22 +156,24 @@ public class VpnEditor extends SettingsPreferenceFragment {
|
|||||||
* Checks the validity of the inputs and set the profile as result if valid.
|
* Checks the validity of the inputs and set the profile as result if valid.
|
||||||
* @return true if the result is successfully set
|
* @return true if the result is successfully set
|
||||||
*/
|
*/
|
||||||
private boolean validateAndSetResult() {
|
private Intent validateAndGetResult() {
|
||||||
String errorMsg = mProfileEditor.validate();
|
String errorMsg = mProfileEditor.validate();
|
||||||
|
|
||||||
if (errorMsg != null) {
|
if (errorMsg != null) {
|
||||||
Util.showErrorMessage(getActivity(), errorMsg);
|
Util.showErrorMessage(getActivity(), errorMsg);
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (profileChanged()) setResult(getProfile());
|
if (profileChanged()) {
|
||||||
return true;
|
return getResult(getProfile());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setResult(VpnProfile p) {
|
private Intent getResult(VpnProfile p) {
|
||||||
Intent intent = new Intent(getActivity(), VpnSettings.class);
|
Intent intent = new Intent(getActivity(), VpnSettings.class);
|
||||||
intent.putExtra(VpnSettings.KEY_VPN_PROFILE, (Parcelable) p);
|
intent.putExtra(VpnSettings.KEY_VPN_PROFILE, (Parcelable) p);
|
||||||
setResult(Activity.RESULT_OK, intent);
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VpnProfileEditor getEditor(VpnProfile p) {
|
private VpnProfileEditor getEditor(VpnProfile p) {
|
||||||
|
@@ -22,7 +22,6 @@ import com.android.settings.SettingsPreferenceFragment;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.Fragment;
|
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -39,19 +38,21 @@ import android.net.vpn.VpnState;
|
|||||||
import android.net.vpn.VpnType;
|
import android.net.vpn.VpnType;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceClickListener;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceCategory;
|
import android.preference.PreferenceCategory;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
import android.security.Credentials;
|
import android.security.Credentials;
|
||||||
import android.security.KeyStore;
|
import android.security.KeyStore;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
import android.view.ContextMenu.ContextMenuInfo;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ContextMenu.ContextMenuInfo;
|
||||||
import android.widget.AdapterView.AdapterContextMenuInfo;
|
import android.widget.AdapterView.AdapterContextMenuInfo;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -72,6 +73,9 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class VpnSettings extends SettingsPreferenceFragment
|
public class VpnSettings extends SettingsPreferenceFragment
|
||||||
implements DialogInterface.OnClickListener {
|
implements DialogInterface.OnClickListener {
|
||||||
|
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
// Key to the field exchanged for profile editing.
|
// Key to the field exchanged for profile editing.
|
||||||
static final String KEY_VPN_PROFILE = "vpn_profile";
|
static final String KEY_VPN_PROFILE = "vpn_profile";
|
||||||
|
|
||||||
@@ -87,7 +91,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
private static final String PROFILE_OBJ_FILE = ".pobj";
|
private static final String PROFILE_OBJ_FILE = ".pobj";
|
||||||
|
|
||||||
private static final int REQUEST_ADD_OR_EDIT_PROFILE = 1;
|
private static final int REQUEST_ADD_OR_EDIT_PROFILE = 1;
|
||||||
private static final int REQUEST_SELECT_VPN_TYPE = 2;
|
static final int REQUEST_SELECT_VPN_TYPE = 2;
|
||||||
|
|
||||||
private static final int CONTEXT_MENU_CONNECT_ID = ContextMenu.FIRST + 0;
|
private static final int CONTEXT_MENU_CONNECT_ID = ContextMenu.FIRST + 0;
|
||||||
private static final int CONTEXT_MENU_DISCONNECT_ID = ContextMenu.FIRST + 1;
|
private static final int CONTEXT_MENU_DISCONNECT_ID = ContextMenu.FIRST + 1;
|
||||||
@@ -134,6 +138,8 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
private StatusChecker mStatusChecker = new StatusChecker();
|
private StatusChecker mStatusChecker = new StatusChecker();
|
||||||
|
|
||||||
|
private Handler mHandler = new Handler();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -171,7 +177,8 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
if (DEBUG)
|
||||||
|
Log.d(TAG, "onResume");
|
||||||
if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
|
if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
|
||||||
Runnable action = mUnlockAction;
|
Runnable action = mUnlockAction;
|
||||||
mUnlockAction = null;
|
mUnlockAction = null;
|
||||||
@@ -282,7 +289,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
.setPositiveButton(R.string.vpn_yes_button,
|
.setPositiveButton(R.string.vpn_yes_button,
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int w) {
|
public void onClick(DialogInterface dialog, int w) {
|
||||||
startVpnEditor(mActiveProfile);
|
startVpnEditor(mActiveProfile, false);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.create();
|
.create();
|
||||||
@@ -295,7 +302,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
public void onClick(DialogInterface dialog, int w) {
|
public void onClick(DialogInterface dialog, int w) {
|
||||||
VpnProfile p = mActiveProfile;
|
VpnProfile p = mActiveProfile;
|
||||||
onIdle();
|
onIdle();
|
||||||
startVpnEditor(p);
|
startVpnEditor(p, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -362,7 +369,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case CONTEXT_MENU_EDIT_ID:
|
case CONTEXT_MENU_EDIT_ID:
|
||||||
startVpnEditor(p);
|
startVpnEditor(p, false);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case CONTEXT_MENU_DELETE_ID:
|
case CONTEXT_MENU_DELETE_ID:
|
||||||
@@ -376,14 +383,21 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onActivityResult(final int requestCode, final int resultCode,
|
public void onActivityResult(final int requestCode, final int resultCode,
|
||||||
final Intent data) {
|
final Intent data) {
|
||||||
|
|
||||||
|
if (DEBUG) Log.d(TAG, "onActivityResult , result = " + resultCode + ", data = " + data);
|
||||||
if ((resultCode == Activity.RESULT_CANCELED) || (data == null)) {
|
if ((resultCode == Activity.RESULT_CANCELED) || (data == null)) {
|
||||||
Log.d(TAG, "no result returned by editor");
|
Log.d(TAG, "no result returned by editor");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestCode == REQUEST_SELECT_VPN_TYPE) {
|
if (requestCode == REQUEST_SELECT_VPN_TYPE) {
|
||||||
String typeName = data.getStringExtra(KEY_VPN_TYPE);
|
final String typeName = data.getStringExtra(KEY_VPN_TYPE);
|
||||||
startVpnEditor(createVpnProfile(typeName));
|
mHandler.post(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
startVpnEditor(createVpnProfile(typeName), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
} else if (requestCode == REQUEST_ADD_OR_EDIT_PROFILE) {
|
} else if (requestCode == REQUEST_ADD_OR_EDIT_PROFILE) {
|
||||||
VpnProfile p = data.getParcelableExtra(KEY_VPN_PROFILE);
|
VpnProfile p = data.getParcelableExtra(KEY_VPN_PROFILE);
|
||||||
if (p == null) {
|
if (p == null) {
|
||||||
@@ -400,7 +414,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
p.getName()),
|
p.getName()),
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int w) {
|
public void onClick(DialogInterface dialog, int w) {
|
||||||
startVpnEditor(profile);
|
startVpnEditor(profile, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -431,7 +445,7 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
Util.showErrorMessage(activity, e + ": " + e.getMessage(),
|
Util.showErrorMessage(activity, e + ": " + e.getMessage(),
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int w) {
|
public void onClick(DialogInterface dialog, int w) {
|
||||||
startVpnEditor(profile);
|
startVpnEditor(profile, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -615,8 +629,9 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startVpnTypeSelection() {
|
private void startVpnTypeSelection() {
|
||||||
startFragment(this, VpnTypeSelection.class.getCanonicalName(),
|
((PreferenceActivity)getActivity()).startPreferencePanel(
|
||||||
REQUEST_SELECT_VPN_TYPE, null);
|
VpnTypeSelection.class.getCanonicalName(), null, R.string.vpn_type_title, null,
|
||||||
|
this, REQUEST_SELECT_VPN_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isKeyStoreUnlocked() {
|
private boolean isKeyStoreUnlocked() {
|
||||||
@@ -666,11 +681,14 @@ public class VpnSettings extends SettingsPreferenceFragment
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startVpnEditor(final VpnProfile profile) {
|
private void startVpnEditor(final VpnProfile profile, boolean add) {
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putParcelable(KEY_VPN_PROFILE, profile);
|
args.putParcelable(KEY_VPN_PROFILE, profile);
|
||||||
startFragment(this, VpnEditor.class.getCanonicalName(),
|
// TODO: Show different titles for add and edit.
|
||||||
REQUEST_ADD_OR_EDIT_PROFILE, args);
|
((PreferenceActivity)getActivity()).startPreferencePanel(
|
||||||
|
VpnEditor.class.getCanonicalName(), args,
|
||||||
|
add ? R.string.vpn_details_title : R.string.vpn_details_title, null,
|
||||||
|
this, REQUEST_ADD_OR_EDIT_PROFILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void connect(final VpnProfile p) {
|
private synchronized void connect(final VpnProfile p) {
|
||||||
|
@@ -25,6 +25,7 @@ import android.net.vpn.VpnManager;
|
|||||||
import android.net.vpn.VpnType;
|
import android.net.vpn.VpnType;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -46,8 +47,9 @@ public class VpnTypeSelection extends SettingsPreferenceFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceTreeClick(PreferenceScreen ps, Preference pref) {
|
public boolean onPreferenceTreeClick(PreferenceScreen ps, Preference pref) {
|
||||||
setResult(mTypeMap.get(pref.getTitle().toString()));
|
((PreferenceActivity)getActivity())
|
||||||
finishFragment();
|
.finishPreferencePanel(this, Activity.RESULT_OK,
|
||||||
|
getResultIntent(mTypeMap.get(pref.getTitle().toString())));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,9 +69,9 @@ public class VpnTypeSelection extends SettingsPreferenceFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setResult(VpnType type) {
|
private Intent getResultIntent(VpnType type) {
|
||||||
Intent intent = new Intent(getActivity(), VpnSettings.class);
|
Intent intent = new Intent(getActivity(), VpnSettings.class);
|
||||||
intent.putExtra(VpnSettings.KEY_VPN_TYPE, type.toString());
|
intent.putExtra(VpnSettings.KEY_VPN_TYPE, type.toString());
|
||||||
setResult(Activity.RESULT_OK, intent);
|
return intent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user