116 lines
3.9 KiB
Java
116 lines
3.9 KiB
Java
/*
|
|
* Copyright © 2017-2018 WireGuard LLC. All Rights Reserved.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package com.wireguard.android.fragment;
|
|
|
|
import android.app.Activity;
|
|
import android.app.Dialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.os.Bundle;
|
|
import android.support.annotation.Nullable;
|
|
import android.support.v4.app.DialogFragment;
|
|
import android.support.v7.app.AlertDialog;
|
|
import android.view.inputmethod.InputMethodManager;
|
|
|
|
import com.wireguard.android.Application;
|
|
import com.wireguard.android.R;
|
|
import com.wireguard.android.databinding.ConfigNamingDialogFragmentBinding;
|
|
import com.wireguard.config.BadConfigException;
|
|
import com.wireguard.config.Config;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.Objects;
|
|
|
|
public class ConfigNamingDialogFragment extends DialogFragment {
|
|
|
|
private static final String KEY_CONFIG_TEXT = "config_text";
|
|
@Nullable private ConfigNamingDialogFragmentBinding binding;
|
|
@Nullable private Config config;
|
|
@Nullable private InputMethodManager imm;
|
|
|
|
public static ConfigNamingDialogFragment newInstance(final String configText) {
|
|
final Bundle extras = new Bundle();
|
|
extras.putString(KEY_CONFIG_TEXT, configText);
|
|
final ConfigNamingDialogFragment fragment = new ConfigNamingDialogFragment();
|
|
fragment.setArguments(extras);
|
|
return fragment;
|
|
}
|
|
|
|
private void createTunnelAndDismiss() {
|
|
if (binding != null) {
|
|
final String name = binding.tunnelNameText.getText().toString();
|
|
|
|
Application.getTunnelManager().create(name, config).whenComplete((tunnel, throwable) -> {
|
|
if (tunnel != null) {
|
|
dismiss();
|
|
} else {
|
|
binding.tunnelNameTextLayout.setError(throwable.getMessage());
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void dismiss() {
|
|
setKeyboardVisible(false);
|
|
super.dismiss();
|
|
}
|
|
|
|
@Override
|
|
public void onCreate(@Nullable final Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
|
|
try {
|
|
config = Config.parse(new ByteArrayInputStream(getArguments().getString(KEY_CONFIG_TEXT).getBytes(StandardCharsets.UTF_8)));
|
|
} catch (final BadConfigException | IOException e) {
|
|
throw new RuntimeException(getResources().getString(R.string.invalid_config_error, getClass().getSimpleName()), e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Dialog onCreateDialog(final Bundle savedInstanceState) {
|
|
final Activity activity = getActivity();
|
|
|
|
imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
|
|
alertDialogBuilder.setTitle(R.string.import_from_qrcode);
|
|
|
|
binding = ConfigNamingDialogFragmentBinding.inflate(getActivity().getLayoutInflater(), null, false);
|
|
binding.executePendingBindings();
|
|
alertDialogBuilder.setView(binding.getRoot());
|
|
|
|
alertDialogBuilder.setPositiveButton(R.string.create_tunnel, null);
|
|
alertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, which) -> dismiss());
|
|
|
|
return alertDialogBuilder.create();
|
|
}
|
|
|
|
@Override public void onResume() {
|
|
super.onResume();
|
|
|
|
final AlertDialog dialog = (AlertDialog) getDialog();
|
|
if (dialog != null) {
|
|
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(v -> createTunnelAndDismiss());
|
|
|
|
setKeyboardVisible(true);
|
|
}
|
|
}
|
|
|
|
private void setKeyboardVisible(final boolean visible) {
|
|
Objects.requireNonNull(imm);
|
|
|
|
if (visible) {
|
|
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
|
|
} else if (binding != null) {
|
|
imm.hideSoftInputFromWindow(binding.tunnelNameText.getWindowToken(), 0);
|
|
}
|
|
}
|
|
|
|
}
|