summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java/com/wireguard/android/ConfigEditFragment.java
blob: 384aadef7425968403abd6858448c23418f3df2c (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
package com.wireguard.android;

import android.content.Context;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.LoginFilter;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;

import com.wireguard.android.databinding.ConfigEditFragmentBinding;
import com.wireguard.config.Config;

/**
 * Fragment for editing a WireGuard configuration.
 */

public class ConfigEditFragment extends BaseConfigFragment {
    private final Config localConfig = new Config();

    @Override
    protected void onCurrentConfigChanged(final Config config) {
        localConfig.copyFrom(config);
    }

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
        inflater.inflate(R.menu.config_edit, menu);
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup parent,
                             final Bundle savedInstanceState) {
        final ConfigEditFragmentBinding binding =
                ConfigEditFragmentBinding.inflate(inflater, parent, false);
        final EditText configNameText = binding.getRoot().findViewById(R.id.config_name_text);
        configNameText.setFilters(new InputFilter[]{
                new InputFilter.LengthFilter(16),
                new LoginFilter.UsernameFilterGeneric() {
                    @Override
                    public boolean isAllowed(final char c) {
                        return Character.isLetterOrDigit(c) || "_=+.-".indexOf(c) != -1;
                    }
                }
        });
        final EditText privateKeyText = binding.getRoot().findViewById(R.id.private_key_text);
        privateKeyText.setFilters(new InputFilter[]{new KeyInputFilter()});
        binding.setConfig(localConfig);
        return binding.getRoot();
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_action_save:
                saveConfig();
                return true;
            default:
                return false;
        }
    }

    private void saveConfig() {
        final String errorMessage = localConfig.validate();
        if (errorMessage != null) {
            Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_SHORT).show();
            return;
        }
        try {
            if (getCurrentConfig() != null)
                VpnService.getInstance().update(getCurrentConfig().getName(), localConfig);
            else
                VpnService.getInstance().add(localConfig);
        } catch (final IllegalStateException e) {
            Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
            return;
        }
        // Hide the keyboard; it rarely goes away on its own.
        final BaseConfigActivity activity = (BaseConfigActivity) getActivity();
        final View focusedView = activity.getCurrentFocus();
        if (focusedView != null) {
            final InputMethodManager inputManager =
                    (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(focusedView.getWindowToken(),
                    InputMethodManager.HIDE_NOT_ALWAYS);
        }
        // Tell the activity to finish itself or go back to the detail view.
        activity.setCurrentConfig(localConfig);
    }
}