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
|
/*
* Copyright © 2020 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.preference;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.AttributeSet;
import com.wireguard.android.Application;
import com.wireguard.android.R;
import com.wireguard.android.activity.SettingsActivity;
import com.wireguard.android.backend.Tunnel;
import com.wireguard.android.backend.WgQuickBackend;
import com.wireguard.util.NonNullForAll;
import java.util.ArrayList;
import java.util.Collection;
import androidx.preference.Preference;
import java9.util.concurrent.CompletableFuture;
import java9.util.stream.Collectors;
import java9.util.stream.StreamSupport;
@NonNullForAll
public class KernelModuleDisablerPreference extends Preference {
private State state;
public KernelModuleDisablerPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
state = Application.getBackend() instanceof WgQuickBackend ? State.ENABLED : State.DISABLED;
}
@Override
public CharSequence getSummary() {
return getContext().getString(state.summaryResourceId);
}
@Override
public CharSequence getTitle() {
return getContext().getString(state.titleResourceId);
}
@SuppressLint("ApplySharedPref")
@Override
protected void onClick() {
if (state == State.DISABLED) {
setState(State.ENABLING);
Application.getSharedPreferences().edit().putBoolean("disable_kernel_module", false).commit();
} else if (state == State.ENABLED) {
setState(State.DISABLING);
Application.getSharedPreferences().edit().putBoolean("disable_kernel_module", true).commit();
}
Application.getAsyncWorker().runAsync(() -> Application.getTunnelManager().getTunnels().thenApply(observableTunnels -> {
final Collection<CompletableFuture<Tunnel.State>> c = StreamSupport.stream(observableTunnels.values()).map(t -> t.setState(Tunnel.State.DOWN).toCompletableFuture()).collect(Collectors.toCollection(ArrayList::new));
return CompletableFuture.allOf(c.toArray(new CompletableFuture[0])).thenRun(() -> {
final Intent restartIntent = new Intent(getContext(), SettingsActivity.class);
restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Application.get().startActivity(restartIntent);
System.exit(0);
});
}).join());
}
private void setState(final State state) {
if (this.state == state)
return;
this.state = state;
if (isEnabled() != state.shouldEnableView)
setEnabled(state.shouldEnableView);
notifyChanged();
}
private enum State {
ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true),
DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true),
ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false),
DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false);
private final boolean shouldEnableView;
private final int summaryResourceId;
private final int titleResourceId;
State(final int titleResourceId, final int summaryResourceId, final boolean shouldEnableView) {
this.summaryResourceId = summaryResourceId;
this.titleResourceId = titleResourceId;
this.shouldEnableView = shouldEnableView;
}
}
}
|