Skip to content

Commit d67fa59

Browse files
committed
- updated libraries
- rearranged UI: made UI a little bit more friendly for one-hand operations - added haptic feedback
1 parent c9eacb9 commit d67fa59

File tree

6 files changed

+194
-165
lines changed

6 files changed

+194
-165
lines changed

app/build.gradle

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ android {
1111
applicationId "com.rudyii.pdnss"
1212
minSdk 29
1313
targetSdk 34
14-
versionCode 176
15-
versionName "1.7.6"
14+
versionCode 180
15+
versionName "1.8.0"
1616

1717
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1818
}
@@ -27,6 +27,10 @@ android {
2727
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2828
}
2929
}
30+
31+
buildFeatures {
32+
compose true
33+
}
3034
}
3135

3236
dependencies {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1616
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
1717
<uses-permission android:name="android.permission.INTERNET" />
18+
<uses-permission android:name="android.permission.VIBRATE" />
1819

1920
<application
2021
android:name=".PrivateDnsSwitcherApplication"

app/src/main/java/com/rudyii/pdnss/activities/ActivityMain.java

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import static com.rudyii.pdnss.common.PdnsModeType.OFF;
1111
import static com.rudyii.pdnss.common.PdnsModeType.ON;
1212
import static com.rudyii.pdnss.common.Utils.getConnectionType;
13-
import static com.rudyii.pdnss.common.Utils.getPDNSState;
13+
import static com.rudyii.pdnss.common.Utils.getPDNSStateInFloat;
1414
import static com.rudyii.pdnss.common.Utils.getSettingsValue;
1515
import static com.rudyii.pdnss.common.Utils.getSharedPrefs;
1616
import static com.rudyii.pdnss.common.Utils.getSharedPrefsEditor;
@@ -39,6 +39,7 @@
3939
import android.os.Build;
4040
import android.os.Bundle;
4141
import android.os.PowerManager;
42+
import android.os.VibrationEffect;
4243
import android.provider.Settings;
4344
import android.view.View;
4445
import android.view.inputmethod.InputMethodManager;
@@ -53,6 +54,7 @@
5354
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
5455

5556
import com.google.android.material.materialswitch.MaterialSwitch;
57+
import com.google.android.material.slider.Slider;
5658
import com.rudyii.pdnss.R;
5759
import com.rudyii.pdnss.common.ConnectionType;
5860

@@ -65,9 +67,6 @@ public class ActivityMain extends AppCompatActivity {
6567
public static final int BACKGROUND_LOCATION_PERMISSION_REQUEST_CODE = 1133;
6668
private BroadcastReceiver broadcastReceiver;
6769
private TextView txtCopyrights;
68-
private Button btnOn;
69-
private Button btnOff;
70-
private Button btnGoogle;
7170
private Button btnSet;
7271
private Button btnInstructions;
7372
private Button btnPermissions;
@@ -77,6 +76,7 @@ public class ActivityMain extends AppCompatActivity {
7776
private MaterialSwitch switchEnableForCellular;
7877
private MaterialSwitch switchTrustWiFiMode;
7978
private EditText editTxtDnsHost;
79+
private Slider slider;
8080
private boolean activityInitInProgress;
8181

8282
@Override
@@ -180,6 +180,7 @@ private void initCheckboxes() {
180180
switchDisableForVpn = this.findViewById(R.id.switchDisableForVpn);
181181
switchDisableForVpn.setOnCheckedChangeListener((compoundButton, checked) -> {
182182
if (!activityInitInProgress) {
183+
compoundButton.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
183184
showDozeModeWarning();
184185

185186
SharedPreferences.Editor editor = getSharedPrefsEditor();
@@ -195,6 +196,7 @@ private void initCheckboxes() {
195196
switchEnableForCellular = this.findViewById(R.id.switchEnableForCellular);
196197
switchEnableForCellular.setOnCheckedChangeListener((compoundButton, checked) -> {
197198
if (!activityInitInProgress) {
199+
compoundButton.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
198200
showDozeModeWarning();
199201

200202
SharedPreferences.Editor editor = getSharedPrefsEditor();
@@ -213,57 +215,62 @@ private void showDozeModeWarning() {
213215
}
214216

215217
private void initButtons() {
216-
if (btnOn == null) {
217-
btnOn = this.findViewById(R.id.btnOn);
218-
219-
if (isWriteSecureSettingsPermissionGranted()) {
220-
btnOn.setEnabled(getPDNSState() != ON);
221-
} else {
222-
btnOn.setEnabled(false);
223-
}
224-
225-
btnOn.setOnClickListener(v -> {
226-
if (isWriteSecureSettingsPermissionGranted()) {
227-
updatePdnsModeSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
228-
updateLastPdnsState(ON);
229-
updateControlButtonsStates();
230-
refreshQsTile();
218+
if (slider == null) {
219+
slider = this.findViewById(R.id.slider);
220+
221+
slider.setEnabled(isWriteSecureSettingsPermissionGranted());
222+
slider.setValue(getPDNSStateInFloat());
223+
224+
slider.setLabelFormatter(value -> {
225+
switch (String.valueOf(slider.getValue())) {
226+
case "1.0":
227+
return getString(R.string.txt_dns_state_off);
228+
case "2.0":
229+
return getString(R.string.txt_dns_state_google);
230+
case "3.0":
231+
return getString(R.string.txt_dns_state_on);
232+
default:
233+
return getString(R.string.txt_dns_state_unknown);
231234
}
232235
});
233-
}
234-
if (btnOff == null) {
235-
btnOff = this.findViewById(R.id.btnOff);
236236

237-
if (isWriteSecureSettingsPermissionGranted()) {
238-
btnOff.setEnabled(getPDNSState() != OFF);
239-
} else {
240-
btnOff.setEnabled(false);
241-
}
237+
slider.addOnChangeListener((slider1, value, fromUser) ->
238+
slider.performHapticFeedback(VibrationEffect.EFFECT_CLICK));
242239

243-
btnOff.setOnClickListener(v -> {
244-
if (isWriteSecureSettingsPermissionGranted()) {
245-
updatePdnsModeSettings(PRIVATE_DNS_MODE_OFF);
246-
updateLastPdnsState(OFF);
247-
updateControlButtonsStates();
248-
refreshQsTile();
249-
}
250-
});
251-
}
252-
if (btnGoogle == null) {
253-
btnGoogle = this.findViewById(R.id.btnGoogle);
240+
slider.addOnSliderTouchListener(new Slider.OnSliderTouchListener() {
241+
@Override
242+
public void onStartTrackingTouch(@NonNull Slider slider) {
254243

255-
if (isWriteSecureSettingsPermissionGranted()) {
256-
btnGoogle.setEnabled(getPDNSState() != GOOGLE);
257-
} else {
258-
btnGoogle.setEnabled(false);
259-
}
244+
}
260245

261-
btnGoogle.setOnClickListener(v -> {
262-
if (isWriteSecureSettingsPermissionGranted()) {
263-
updatePdnsModeSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC);
264-
updateLastPdnsState(GOOGLE);
265-
updateControlButtonsStates();
266-
refreshQsTile();
246+
@Override
247+
public void onStopTrackingTouch(@NonNull Slider slider) {
248+
switch (String.valueOf(slider.getValue())) {
249+
case "1.0":
250+
if (isWriteSecureSettingsPermissionGranted()) {
251+
updatePdnsModeSettings(PRIVATE_DNS_MODE_OFF);
252+
updateLastPdnsState(OFF);
253+
updateControlButtonsStates();
254+
refreshQsTile();
255+
}
256+
break;
257+
case "2.0":
258+
if (isWriteSecureSettingsPermissionGranted()) {
259+
updatePdnsModeSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC);
260+
updateLastPdnsState(GOOGLE);
261+
updateControlButtonsStates();
262+
refreshQsTile();
263+
}
264+
break;
265+
case "3.0":
266+
if (isWriteSecureSettingsPermissionGranted()) {
267+
updatePdnsModeSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
268+
updateLastPdnsState(ON);
269+
updateControlButtonsStates();
270+
refreshQsTile();
271+
}
272+
break;
273+
}
267274
}
268275
});
269276
}
@@ -273,6 +280,7 @@ private void initButtons() {
273280
btnSet.setEnabled(isWriteSecureSettingsPermissionGranted());
274281

275282
btnSet.setOnClickListener(v -> {
283+
v.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
276284
if (isWriteSecureSettingsPermissionGranted()) {
277285
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
278286
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
@@ -289,6 +297,7 @@ private void initButtons() {
289297
btnInstructions = this.findViewById(R.id.btnInstructions);
290298

291299
btnInstructions.setOnClickListener(v -> {
300+
v.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
292301
AlertDialog.Builder alert = new AlertDialog.Builder(this);
293302
alert.setTitle(getString(R.string.txt_instructions_title));
294303
alert.setMessage(R.string.txt_instructions);
@@ -305,21 +314,17 @@ private void initButtons() {
305314
if (btnPermissions == null) {
306315
btnPermissions = this.findViewById(R.id.btnPermissions);
307316

317+
btnPermissions.setEnabled(!isAllNeededLocationPermissionsGranted());
308318
btnPermissions.setOnClickListener(v -> {
319+
v.performHapticFeedback(VibrationEffect.EFFECT_TICK);
309320
checkPermissions();
310321
});
311322
}
312323
}
313324

314325
private void updateControlButtonsStates() {
315-
if (btnOn != null) {
316-
btnOn.setEnabled(getPDNSState() != ON);
317-
}
318-
if (btnOff != null) {
319-
btnOff.setEnabled(getPDNSState() != OFF);
320-
}
321-
if (btnGoogle != null) {
322-
btnGoogle.setEnabled(getPDNSState() != GOOGLE);
326+
if (slider != null) {
327+
slider.setValue(getPDNSStateInFloat());
323328
}
324329
}
325330

@@ -334,6 +339,7 @@ public void initSensitiveControls() {
334339

335340
switchTrustWiFiMode.setOnCheckedChangeListener((compoundButton, checked) -> {
336341
if (!activityInitInProgress) {
342+
compoundButton.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
337343
showDozeModeWarning();
338344

339345
SharedPreferences.Editor editor = getSharedPrefsEditor();
@@ -359,6 +365,7 @@ public void initSensitiveControls() {
359365
switchTrustAp.setEnabled(ConnectionType.WIFI.equals(getConnectionType()) && sharedPrefForInit.getBoolean(getString(R.string.settings_name_trust_wifi), false));
360366
switchTrustAp.setText(getString(R.string.txt_connected_ap_name, apName));
361367
switchTrustAp.setOnClickListener(v -> {
368+
v.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
362369
showDozeModeWarning();
363370

364371
switchTrustAp.setText(getString(R.string.txt_connected_ap_name, apName));
@@ -380,6 +387,7 @@ public void initSensitiveControls() {
380387

381388

382389
btnApList.setOnClickListener(v -> {
390+
v.performHapticFeedback(VibrationEffect.EFFECT_CLICK);
383391
Set<String> apsCopy = new HashSet<>(getSharedPrefs().getStringSet(getContext().getString(R.string.settings_name_trust_wifi_ap_set), Collections.emptySet()));
384392
if (apsCopy.isEmpty()) {
385393
showWarning(getString(R.string.txt_empty_ap_list));

app/src/main/java/com/rudyii/pdnss/common/Utils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,20 @@ public static PdnsModeType getPDNSState() {
105105
}
106106
}
107107

108+
public static float getPDNSStateInFloat() {
109+
String pDNSState = getSettingsValue(SETTINGS_PRIVATE_DNS_MODE);
110+
switch (pDNSState) {
111+
case VALUE_PRIVATE_DNS_MODE_OFF_STRING:
112+
return 1.0f;
113+
case VALUE_PRIVATE_DNS_MODE_GOOGLE_STRING:
114+
return 2.0f;
115+
case VALUE_PRIVATE_DNS_MODE_ON_STRING:
116+
return 3.0f;
117+
default:
118+
return 0.0f;
119+
}
120+
}
121+
108122
public static void showWarning(String warningMessage) {
109123
Toast.makeText(getContext(), warningMessage,
110124
Toast.LENGTH_LONG).show();

0 commit comments

Comments
 (0)