summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
blob: ed4ae24b72b25c9137c3df10dc5784e06beb2c54 (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 se.leap.bitmaskclient.tor;

import android.content.Context;
import android.os.Handler;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Observable;

import se.leap.bitmaskclient.R;

public class TorStatusObservable extends Observable {

    private static final String TAG = TorStatusObservable.class.getSimpleName();

    public enum TorStatus {
        ON,
        OFF,
        STARTING,
        STOPPING,
        UNKOWN
    }

    private static TorStatusObservable instance;
    private TorStatus status = TorStatus.UNKOWN;
    private final TorNotificationManager torNotificationManager;
    private String lastError;
    private int port = -1;

    private TorStatusObservable() {
        torNotificationManager = new TorNotificationManager();
    }

    public static TorStatusObservable getInstance() {
        if (instance == null) {
            instance = new TorStatusObservable();
        }
        return instance;
    }

    public static TorStatus getStatus() {
        return getInstance().status;
    }


    public static void updateState(Context context, String status) {
        try {
            Log.d(TAG, "update tor state: " + status);
            getInstance().status = TorStatus.valueOf(status);
            if (getInstance().status == TorStatus.OFF) {
                getInstance().torNotificationManager.cancelNotifications(context);
            } else {
                getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context));
            }
            instance.setChanged();
            instance.notifyObservers();


        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }

    public static void setLastError(String error) {
        getInstance().lastError = error;
        instance.setChanged();
        instance.notifyObservers();
    }

    public static void setProxyPort(int port) {
        getInstance().port = port;
        instance.setChanged();
        instance.notifyObservers();
    }

    public static int getProxyPort() {
        return getInstance().port;
    }


    @Nullable
    public String getLastError() {
        return lastError;
    }

    private static String getStringForCurrentStatus(Context context) {
        switch (getInstance().status) {
            case ON:
                return context.getString(R.string.tor_started);
            case STARTING:
                return context.getString(R.string.tor_starting);
            case STOPPING:
                return context.getString(R.string.tor_stopping);
            case OFF:
            case UNKOWN:
                break;
        }
        return null;
    }
}