Skip to content
This repository was archived by the owner on Dec 18, 2022. It is now read-only.

Commit ccb8e61

Browse files
authored
Merge pull request #70 from 05nelsonm/mn/feature/sample-app-tor-settings
TorSettings upgrades and implementing the features in the Sample App
2 parents 0b295ab + c114125 commit ccb8e61

File tree

49 files changed

+4188
-611
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+4188
-611
lines changed

sampleapp/src/main/java/io/matthewnelson/sampleapp/App.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,11 @@ import io.matthewnelson.sampleapp.topl_android.MyTorSettings
7474
import io.matthewnelson.sampleapp.ui.MainActivity
7575
import io.matthewnelson.sampleapp.ui.fragments.dashboard.DashMessage
7676
import io.matthewnelson.sampleapp.ui.fragments.dashboard.DashboardFragment
77-
import io.matthewnelson.sampleapp.ui.fragments.settings.library.LibraryPrefs
77+
import io.matthewnelson.sampleapp.ui.fragments.settings.library.components.LibraryPrefs
7878
import io.matthewnelson.topl_service.TorServiceController
7979
import io.matthewnelson.topl_service.notification.ServiceNotification
8080
import io.matthewnelson.topl_service.lifecycle.BackgroundManager
81+
import io.matthewnelson.topl_service.util.ServiceConsts.BackgroundPolicy
8182

8283
/**
8384
* @suppress
@@ -128,18 +129,18 @@ class App: Application() {
128129
* */
129130
fun generateBackgroundManagerPolicy(
130131
prefs: Prefs,
131-
policy: String? = null,
132+
@BackgroundPolicy policy: String? = null,
132133
killApp: Boolean? = null,
133134
executionDelay: Int? = null
134135
): BackgroundManager.Builder.Policy {
135136
val builder = BackgroundManager.Builder()
136137
return when (policy ?: LibraryPrefs.getBackgroundManagerPolicySetting(prefs)) {
137-
LibraryPrefs.BACKGROUND_MANAGER_POLICY_FOREGROUND -> {
138+
BackgroundPolicy.RUN_IN_FOREGROUND -> {
138139
builder.runServiceInForeground(
139140
killApp ?: LibraryPrefs.getBackgroundManagerKillAppSetting(prefs)
140141
)
141142
}
142-
LibraryPrefs.BACKGROUND_MANAGER_POLICY_RESPECT -> {
143+
BackgroundPolicy.RESPECT_RESOURCES -> {
143144
builder.respectResourcesWhileInBackground(
144145
executionDelay ?: LibraryPrefs.getBackgroundManagerExecuteDelaySetting(prefs)
145146
)

sampleapp/src/main/java/io/matthewnelson/sampleapp/topl_android/MyEventBroadcaster.kt

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ package io.matthewnelson.sampleapp.topl_android
6969
import androidx.lifecycle.LiveData
7070
import androidx.lifecycle.MutableLiveData
7171
import io.matthewnelson.sampleapp.ui.fragments.home.LogMessageAdapter
72-
import io.matthewnelson.topl_service.service.components.onionproxy.TorServiceEventBroadcaster
72+
import io.matthewnelson.topl_service.service.components.onionproxy.model.TorPortInfo
73+
import io.matthewnelson.topl_service.service.components.onionproxy.model.TorServiceEventBroadcaster
7374
import io.matthewnelson.topl_service.util.ServiceUtilities
7475

7576
/**
@@ -80,36 +81,14 @@ import io.matthewnelson.topl_service.util.ServiceUtilities
8081
class MyEventBroadcaster: TorServiceEventBroadcaster() {
8182

8283

83-
//////////////////////////
84-
/// ControlPortAddress ///
85-
//////////////////////////
86-
private val _liveControlPortAddress = MutableLiveData<String?>(null)
87-
val liveControlPortAddress: LiveData<String?> = _liveControlPortAddress
88-
89-
override fun broadcastControlPortAddress(controlPortAddress: String?) {
90-
_liveControlPortAddress.value = controlPortAddress
91-
}
92-
93-
94-
////////////////////////
95-
/// SocksPortAddress ///
96-
////////////////////////
97-
private val _liveSocksPortAddress = MutableLiveData<String?>(null)
98-
val liveSocksPortAddress: LiveData<String?> = _liveSocksPortAddress
99-
100-
override fun broadcastSocksPortAddress(socksPortAddress: String?) {
101-
_liveSocksPortAddress.value = socksPortAddress
102-
}
103-
104-
105-
///////////////////////
106-
/// HttpPortAddress ///
107-
///////////////////////
108-
private val _liveHttpPortAddress = MutableLiveData<String?>(null)
109-
val liveHttpPortAddress: LiveData<String?> = _liveHttpPortAddress
84+
///////////////////
85+
/// TorPortInfo ///
86+
///////////////////
87+
private val _liveTorPortInfo = MutableLiveData<TorPortInfo>(null)
88+
val liveTorPortInfo: LiveData<TorPortInfo> = _liveTorPortInfo
11089

111-
override fun broadcastHttpPortAddress(httpPortAddress: String?) {
112-
_liveHttpPortAddress.value = httpPortAddress
90+
override fun broadcastPortInformation(torPortInfo: TorPortInfo) {
91+
_liveTorPortInfo.value = torPortInfo
11392
}
11493

11594

sampleapp/src/main/java/io/matthewnelson/sampleapp/topl_android/MyTorSettings.kt

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ class MyTorSettings: TorSettings() {
7878
get() = DEFAULT__DISABLE_NETWORK
7979

8080
override val dnsPort: String
81-
get() = DEFAULT__DNS_PORT
81+
get() = PortOption.DISABLED
82+
83+
override val dnsPortIsolationFlags: List<@IsolationFlag String>?
84+
get() = arrayListOf(
85+
IsolationFlag.ISOLATE_CLIENT_PROTOCOL
86+
)
8287

8388
override val customTorrc: String?
8489
get() = null
@@ -93,10 +98,15 @@ class MyTorSettings: TorSettings() {
9398
get() = DEFAULT__EXIT_NODES
9499

95100
override val httpTunnelPort: String
96-
get() = "auto"
101+
get() = PortOption.DISABLED
102+
103+
override val httpTunnelPortIsolationFlags: List<@IsolationFlag String>?
104+
get() = arrayListOf(
105+
IsolationFlag.ISOLATE_CLIENT_PROTOCOL
106+
)
97107

98-
override val listOfSupportedBridges: List<@SupportedBridges String>
99-
get() = arrayListOf(SupportedBridges.MEEK, SupportedBridges.OBFS4)
108+
override val listOfSupportedBridges: List<@SupportedBridgeType String>
109+
get() = arrayListOf(SupportedBridgeType.MEEK, SupportedBridgeType.OBFS4)
100110

101111
override val proxyHost: String?
102112
get() = DEFAULT__PROXY_HOST
@@ -113,8 +123,8 @@ class MyTorSettings: TorSettings() {
113123
override val proxySocks5ServerPort: Int?
114124
get() = null
115125

116-
override val proxyType: String?
117-
get() = DEFAULT__PROXY_TYPE
126+
override val proxyType: @ProxyType String
127+
get() = ProxyType.DISABLED
118128

119129
override val proxyUser: String?
120130
get() = DEFAULT__PROXY_USER
@@ -125,11 +135,19 @@ class MyTorSettings: TorSettings() {
125135
override val relayNickname: String?
126136
get() = DEFAULT__RELAY_NICKNAME
127137

128-
override val relayPort: Int?
129-
get() = null
138+
override val relayPort: String
139+
get() = PortOption.DISABLED
130140

131141
override val socksPort: String
132-
get() = "auto"
142+
get() = PortOption.AUTO
143+
144+
override val socksPortIsolationFlags: List<@IsolationFlag String>?
145+
get() = arrayListOf(
146+
IsolationFlag.KEEP_ALIVE_ISOLATE_SOCKS_AUTH,
147+
IsolationFlag.IPV6_TRAFFIC,
148+
IsolationFlag.PREFER_IPV6,
149+
IsolationFlag.ISOLATE_CLIENT_PROTOCOL
150+
)
133151

134152
override val virtualAddressNetwork: String?
135153
get() = "10.192.0.2/10"
@@ -138,7 +156,7 @@ class MyTorSettings: TorSettings() {
138156
get() = DEFAULT__HAS_BRIDGES
139157

140158
override val connectionPadding: @ConnectionPadding String
141-
get() = DEFAULT__HAS_CONNECTION_PADDING
159+
get() = ConnectionPadding.OFF
142160

143161
override val hasCookieAuthentication: Boolean
144162
get() = DEFAULT__HAS_COOKIE_AUTHENTICATION
@@ -149,9 +167,6 @@ class MyTorSettings: TorSettings() {
149167
override val hasDormantCanceledByStartup: Boolean
150168
get() = DEFAULT__HAS_DORMANT_CANCELED_BY_STARTUP
151169

152-
override val hasIsolationAddressFlagForTunnel: Boolean
153-
get() = DEFAULT__HAS_ISOLATION_ADDRESS_FLAG_FOR_TUNNEL
154-
155170
override val hasOpenProxyOnAllInterfaces: Boolean
156171
get() = DEFAULT__HAS_OPEN_PROXY_ON_ALL_INTERFACES
157172

@@ -180,7 +195,12 @@ class MyTorSettings: TorSettings() {
180195
get() = DEFAULT__RUN_AS_DAEMON
181196

182197
override val transPort: String
183-
get() = DEFAULT__TRANS_PORT
198+
get() = PortOption.DISABLED
199+
200+
override val transPortIsolationFlags: List<@IsolationFlag String>?
201+
get() = arrayListOf(
202+
IsolationFlag.ISOLATE_CLIENT_PROTOCOL
203+
)
184204

185205
override val useSocks5: Boolean
186206
get() = DEFAULT__USE_SOCKS5

sampleapp/src/main/java/io/matthewnelson/sampleapp/ui/fragments/dashboard/DashMessage.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package io.matthewnelson.sampleapp.ui.fragments.dashboard
22

3+
import androidx.annotation.ColorRes
34
import androidx.annotation.DrawableRes
5+
import io.matthewnelson.sampleapp.R
46

57
class DashMessage(
68
val message: String,
79
@DrawableRes val background: Int,
8-
val showLength: Long
10+
val showLength: Long,
11+
@ColorRes val textColor: Int = R.color.tor_service_white
912
) {
1013
companion object {
1114
const val EXCEPTION = "~~~ EXCEPTION ~~~\n"

sampleapp/src/main/java/io/matthewnelson/sampleapp/ui/fragments/dashboard/DashboardFragment.kt

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.app.NotificationManager
55
import android.app.PendingIntent
66
import android.content.Context
77
import android.content.Intent
8+
import android.graphics.Color
89
import android.os.Build
910
import android.os.Bundle
1011
import androidx.fragment.app.Fragment
@@ -13,7 +14,7 @@ import android.view.View
1314
import android.view.ViewGroup
1415
import android.widget.Button
1516
import android.widget.TextView
16-
import android.widget.Toast
17+
import androidx.annotation.ColorRes
1718
import androidx.core.app.NotificationCompat
1819
import androidx.core.content.ContextCompat
1920
import androidx.lifecycle.*
@@ -50,9 +51,9 @@ class DashboardFragment : Fragment() {
5051
private lateinit var textViewState: TextView
5152

5253
// Bottom row
53-
private lateinit var textViewControlPort: TextView
54-
private lateinit var textViewSocksPort: TextView
54+
private lateinit var textViewDnsPort: TextView
5555
private lateinit var textViewHttpPort: TextView
56+
private lateinit var textViewSocksPort: TextView
5657

5758
// Messages
5859
private lateinit var textViewMessage: TextView
@@ -83,9 +84,9 @@ class DashboardFragment : Fragment() {
8384
textViewBandwidth = view.findViewById(R.id.dash_text_view_bandwidth)
8485
textViewNetworkState = view.findViewById(R.id.dash_text_view_tor_network_state)
8586
textViewState = view.findViewById(R.id.dash_text_view_tor_state)
86-
textViewControlPort = view.findViewById(R.id.dash_text_view_port_control)
87-
textViewSocksPort = view.findViewById(R.id.dash_text_view_port_socks)
87+
textViewDnsPort = view.findViewById(R.id.dash_text_view_port_dns)
8888
textViewHttpPort = view.findViewById(R.id.dash_text_view_port_http)
89+
textViewSocksPort = view.findViewById(R.id.dash_text_view_port_socks)
8990
textViewMessage = view.findViewById(R.id.dash_text_view_message)
9091
buttonAppRestart = view.findViewById(R.id.dash_button_app_restart)
9192
}
@@ -99,6 +100,8 @@ class DashboardFragment : Fragment() {
99100
liveDashMessage.observe(owner, Observer {
100101
if (it != null) {
101102
textViewMessage.text = it.message
103+
val colorHex = colorResToHexString(textViewMessage.context, it.textColor)
104+
textViewMessage.setTextColor(Color.parseColor(colorHex))
102105
textViewMessage.background = ContextCompat.getDrawable(textViewMessage.context, it.background)
103106
textViewMessage.visibility = View.VISIBLE
104107
launchCleanUpMessageJob(it.showLength)
@@ -120,22 +123,17 @@ class DashboardFragment : Fragment() {
120123
})
121124
}
122125
TorServiceController.appEventBroadcaster?.let {
123-
(it as MyEventBroadcaster).liveControlPortAddress.observe(owner, Observer { data ->
124-
textViewControlPort.text = data ?: "None"
125-
})
126-
}
127-
TorServiceController.appEventBroadcaster?.let {
128-
(it as MyEventBroadcaster).liveSocksPortAddress.observe(owner, Observer { data ->
129-
textViewSocksPort.text = data ?: "None"
130-
})
131-
}
132-
TorServiceController.appEventBroadcaster?.let {
133-
(it as MyEventBroadcaster).liveHttpPortAddress.observe(owner, Observer { data ->
134-
textViewHttpPort.text = data ?: "None"
126+
(it as MyEventBroadcaster).liveTorPortInfo.observe(owner, Observer { data ->
127+
textViewDnsPort.text = data?.dnsPort ?: "-----"
128+
textViewHttpPort.text = data?.httpPort ?: "-----"
129+
textViewSocksPort.text = data?.socksPort ?: "-----"
135130
})
136131
}
137132
}
138133

134+
private fun colorResToHexString(context: Context, @ColorRes colorRes: Int): String =
135+
"#${Integer.toHexString(ContextCompat.getColor(context, colorRes))}"
136+
139137
private var showMessageCleanUpJob: Job? = null
140138

141139
private fun launchCleanUpMessageJob(delayLength: Long) {
@@ -151,10 +149,16 @@ class DashboardFragment : Fragment() {
151149

152150
private fun initButtons(context: Context, owner: LifecycleOwner) {
153151
buttonAppRestart.setOnClickListener {
154-
buttonAppRestart.visibility = View.GONE
152+
buttonAppRestart.isEnabled = false
155153
HomeFragment.appIsBeingKilled()
156154

157-
Toast.makeText(context, "Killing Application", Toast.LENGTH_LONG).show()
155+
showMessage(
156+
DashMessage(
157+
"Application is being killed",
158+
R.drawable.dash_message_color_red,
159+
10_000
160+
)
161+
)
158162

159163
TorServiceController.appEventBroadcaster?.let {
160164
(it as MyEventBroadcaster).liveTorState.observe(owner, Observer { data ->

0 commit comments

Comments
 (0)