diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb434..f1b42451 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,4 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 43e5eb32..2c34144d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,86 +1,86 @@ + xmlns:tools="http://schemas.android.com/tools"> - - - + + + - - - - - - + + + + + + - - - - + + + + - - + + - - - - - + + + + + - - - + + + - - - + + + - + - + - + - + - \ No newline at end of file + diff --git a/app/src/main/java/org/bepass/oblivion/BugActivity.java b/app/src/main/java/org/bepass/oblivion/BugActivity.java index 4322902b..cb9cf637 100644 --- a/app/src/main/java/org/bepass/oblivion/BugActivity.java +++ b/app/src/main/java/org/bepass/oblivion/BugActivity.java @@ -1,7 +1,5 @@ package org.bepass.oblivion; -import androidx.appcompat.app.AppCompatActivity; - import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -9,6 +7,8 @@ import android.widget.ScrollView; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; + import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; @@ -16,11 +16,11 @@ public class BugActivity extends AppCompatActivity { + private final Handler handler = new Handler(Looper.getMainLooper()); private ImageView back; private TextView logs; private ScrollView logScrollView; private boolean isUserScrollingUp = false; - private Handler handler = new Handler(Looper.getMainLooper()); private Runnable logUpdater; @Override @@ -86,4 +86,4 @@ private void readLogsFromFile() { } }).start(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/bepass/oblivion/ConnectionState.java b/app/src/main/java/org/bepass/oblivion/ConnectionState.java index a3861845..db46e661 100644 --- a/app/src/main/java/org/bepass/oblivion/ConnectionState.java +++ b/app/src/main/java/org/bepass/oblivion/ConnectionState.java @@ -1,7 +1,5 @@ package org.bepass.oblivion; public enum ConnectionState { - CONNECTING, - CONNECTED, - DISCONNECTED + CONNECTING, CONNECTED, DISCONNECTED } diff --git a/app/src/main/java/org/bepass/oblivion/EditSheet.java b/app/src/main/java/org/bepass/oblivion/EditSheet.java index ba4d9107..3029eaca 100644 --- a/app/src/main/java/org/bepass/oblivion/EditSheet.java +++ b/app/src/main/java/org/bepass/oblivion/EditSheet.java @@ -6,7 +6,6 @@ import android.widget.TextView; import com.google.android.material.bottomsheet.BottomSheetDialog; -import org.bepass.oblivion.R; public class EditSheet { diff --git a/app/src/main/java/org/bepass/oblivion/FileManager.java b/app/src/main/java/org/bepass/oblivion/FileManager.java index 31a3fc10..938d1717 100644 --- a/app/src/main/java/org/bepass/oblivion/FileManager.java +++ b/app/src/main/java/org/bepass/oblivion/FileManager.java @@ -2,13 +2,11 @@ import android.content.Context; import android.content.SharedPreferences; -import android.util.Log; public class FileManager { - private static FileManager instance; - private SharedPreferences sharedPreferences; - public static String currentLog; + private static FileManager instance; + private final SharedPreferences sharedPreferences; // Private constructor for singleton pattern private FileManager(Context context) { @@ -60,6 +58,7 @@ public String getString(String name, String defaultValue) { public boolean getBoolean(String name) { return sharedPreferences.getBoolean(name, false); } + public boolean getBoolean(String name, boolean defaultValue) { return sharedPreferences.getBoolean(name, defaultValue); } diff --git a/app/src/main/java/org/bepass/oblivion/InfoActivity.java b/app/src/main/java/org/bepass/oblivion/InfoActivity.java index a625d6e3..c0daaaed 100644 --- a/app/src/main/java/org/bepass/oblivion/InfoActivity.java +++ b/app/src/main/java/org/bepass/oblivion/InfoActivity.java @@ -1,14 +1,12 @@ package org.bepass.oblivion; -import androidx.appcompat.app.AppCompatActivity; - import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.widget.ImageView; import android.widget.RelativeLayout; -import org.bepass.oblivion.R; +import androidx.appcompat.app.AppCompatActivity; public class InfoActivity extends AppCompatActivity { @@ -37,4 +35,4 @@ protected void openURL(String url) { Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/bepass/oblivion/MainActivity.java b/app/src/main/java/org/bepass/oblivion/MainActivity.java index d73d6795..736d2c61 100644 --- a/app/src/main/java/org/bepass/oblivion/MainActivity.java +++ b/app/src/main/java/org/bepass/oblivion/MainActivity.java @@ -23,25 +23,19 @@ public class MainActivity extends AppCompatActivity { private static final String ConnectionStateObserverKey = "mainActivity"; - private ActivityResultLauncher pushNotificationPermissionLauncher; - private ActivityResultLauncher vpnPermissionLauncher; - - private Messenger serviceMessenger; - private boolean isBound; - - // Views ImageView infoIcon, bugIcon, settingsIcon; TouchAwareSwitch switchButton; TextView stateText; - FileManager fileManager; - Boolean canShowNotification = false; - + private ActivityResultLauncher pushNotificationPermissionLauncher; + private ActivityResultLauncher vpnPermissionLauncher; + private Messenger serviceMessenger; + private boolean isBound; private ConnectionState lastKnownConnectionState = ConnectionState.DISCONNECTED; - private ServiceConnection connection = new ServiceConnection() { + private final ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { serviceMessenger = new Messenger(service); @@ -59,7 +53,7 @@ public void onServiceDisconnected(ComponentName arg0) { private SwitchButton.OnCheckedChangeListener createSwitchCheckedChangeListener() { return (view, isChecked) -> { - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !canShowNotification) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !canShowNotification) { pushNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS); return; } @@ -72,7 +66,7 @@ private SwitchButton.OnCheckedChangeListener createSwitchCheckedChangeListener() } else { startVpnService(); } - } else if(lastKnownConnectionState == ConnectionState.CONNECTED || lastKnownConnectionState == ConnectionState.CONNECTING) { + } else if (lastKnownConnectionState == ConnectionState.CONNECTED || lastKnownConnectionState == ConnectionState.CONNECTING) { stopVpnService(); } }; @@ -88,7 +82,6 @@ protected void onCreate(Bundle savedInstanceState) { } - private void observeConnectionStatus() { if (!isBound) return; OblivionVpnService.registerConnectionStateObserver(ConnectionStateObserverKey, serviceMessenger, new ConnectionStateChangeListener() { @@ -104,8 +97,9 @@ private void unsubscribeConnectionStatus() { if (!isBound) return; OblivionVpnService.unregisterConnectionStateObserver(ConnectionStateObserverKey, serviceMessenger); } + private void updateUi() { - switch(lastKnownConnectionState) { + switch (lastKnownConnectionState) { case DISCONNECTED: disconnected(); break; @@ -164,28 +158,22 @@ private void firstValueInit() { } private void initPermissionLauncher() { - pushNotificationPermissionLauncher = registerForActivityResult( - new ActivityResultContracts.RequestPermission(), - isGranted -> { - if (isGranted) { - canShowNotification = true; - } else { - disconnected(); - Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show(); - } - } - ); - vpnPermissionLauncher = registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - result -> { - if (result.getResultCode() == RESULT_OK) { - startVpnService(); - } else { - stopVpnService(); - Toast.makeText(this, "Really!?", Toast.LENGTH_LONG).show(); - } - } - ); + pushNotificationPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { + if (isGranted) { + canShowNotification = true; + } else { + disconnected(); + Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show(); + } + }); + vpnPermissionLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK) { + startVpnService(); + } else { + stopVpnService(); + Toast.makeText(this, "Really!?", Toast.LENGTH_LONG).show(); + } + }); } @@ -220,4 +208,4 @@ private void init() { bugIcon.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, BugActivity.class))); settingsIcon.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, SettingsActivity.class))); } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/bepass/oblivion/OblivionVpnService.java b/app/src/main/java/org/bepass/oblivion/OblivionVpnService.java index 737d64f8..d1ed1cdd 100644 --- a/app/src/main/java/org/bepass/oblivion/OblivionVpnService.java +++ b/app/src/main/java/org/bepass/oblivion/OblivionVpnService.java @@ -23,9 +23,6 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import tun2socks.Tun2socks; -import tun2socks.StartOptions; - import java.io.FileOutputStream; import java.io.IOException; import java.lang.ref.WeakReference; @@ -33,32 +30,43 @@ import java.util.HashMap; import java.util.Map; +import tun2socks.StartOptions; +import tun2socks.Tun2socks; + public class OblivionVpnService extends VpnService { - private static final String TAG = "oblivionVPN"; public static final String FLAG_VPN_START = "org.bepass.oblivion.START"; public static final String FLAG_VPN_STOP = "org.bepass.oblivion.STOP"; + static final int MSG_PERFORM_CONNECTION_TEST = 1; + static final int MSG_CONNECTION_STATE_SUBSCRIBE = 2; + static final int MSG_CONNECTION_STATE_UNSUBSCRIBE = 3; + static final int MSG_TILE_STATE_SUBSCRIPTION_RESULT = 4; + private static final String TAG = "oblivionVPN"; private static final String PRIVATE_VLAN4_CLIENT = "172.19.0.1"; private static final String PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1"; + private final Handler handler = new Handler(); + private final Messenger serviceMessenger = new Messenger(new IncomingHandler(this)); + private final Map connectionStateObservers = new HashMap<>(); + private final Runnable logRunnable = new Runnable() { + @Override + public void run() { + String logMessages = Tun2socks.getLogMessages(); + if (!logMessages.isEmpty()) { + try (FileOutputStream fos = getApplicationContext().openFileOutput("logs.txt", Context.MODE_APPEND)) { + fos.write((logMessages).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } + handler.postDelayed(this, 2000); // Poll every 2 seconds + } + }; private Notification notification; private ParcelFileDescriptor mInterface; private Thread vpnThread; private String bindAddress; - private final Handler handler = new Handler(); - private FileManager fileManager; - private ConnectionState lastKnownState = ConnectionState.DISCONNECTED; - static final int MSG_PERFORM_CONNECTION_TEST= 1; - static final int MSG_CONNECTION_STATE_SUBSCRIBE = 2; - static final int MSG_CONNECTION_STATE_UNSUBSCRIBE = 3; - static final int MSG_TILE_STATE_SUBSCRIPTION_RESULT = 4; - - private final Messenger serviceMessenger = new Messenger(new IncomingHandler(this)); - - private final Map connectionStateObservers = new HashMap<>(); - - public static void registerConnectionStateObserver(String key, Messenger serviceMessenger, ConnectionStateChangeListener observer) { // Create a message for the service Message subscriptionMessage = Message.obtain(null, OblivionVpnService.MSG_CONNECTION_STATE_SUBSCRIBE); @@ -152,20 +160,6 @@ private static int findFreePort() { throw new IllegalStateException("Could not find a free TCP/IP port to start embedded Jetty HTTP Server on"); } - private String getBindAddress() { - String port = fileManager.getString("USERSETTING_port"); - boolean enableLan = fileManager.getBoolean("USERSETTING_lan"); - if (OblivionVpnService.isLocalPortInUse("127.0.0.1:" + port).equals("true")) { - port = findFreePort() + ""; - } - String Bind = ""; - Bind += "127.0.0.1:" + port; - if (enableLan) { - Bind = "0.0.0.0:" + port; - } - return Bind; - } - public static String isLocalPortInUse(String bindAddress) { Map result = splitHostAndPort(bindAddress); if (result == null) { @@ -210,76 +204,18 @@ private static void performConnectionTest(String bindAddress, ConnectionStateCha }).start(); } - - private static class IncomingHandler extends Handler { - private final WeakReference serviceRef; - - IncomingHandler(OblivionVpnService service) { - serviceRef = new WeakReference<>(service); + private String getBindAddress() { + String port = fileManager.getString("USERSETTING_port"); + boolean enableLan = fileManager.getBoolean("USERSETTING_lan"); + if (OblivionVpnService.isLocalPortInUse("127.0.0.1:" + port).equals("true")) { + port = String.valueOf(findFreePort()); } - - @Override - public void handleMessage(Message msg) { - final Message message = new Message(); - message.copyFrom(msg); - OblivionVpnService service = serviceRef.get(); - if (service == null) return; - switch (msg.what) { - case MSG_PERFORM_CONNECTION_TEST: { - performConnectionTest(service.bindAddress, new ConnectionStateChangeListener() { - @Override - public void onChange(ConnectionState state) { - service.setLastKnownState(state); - Bundle data = new Bundle(); - if (state == ConnectionState.DISCONNECTED) { - data.putBoolean("success", false); - Message replyMsg = Message.obtain(null, MSG_PERFORM_CONNECTION_TEST); - replyMsg.setData(data); - try { - message.replyTo.send(replyMsg); - } catch (RemoteException e) { - e.printStackTrace(); - } - } else { - data.putBoolean("success", true); - Message replyMsg = Message.obtain(null, MSG_PERFORM_CONNECTION_TEST); - replyMsg.setData(data); - try { - message.replyTo.send(replyMsg); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - } - }); - break; - } - case MSG_CONNECTION_STATE_SUBSCRIBE: { - String key = message.getData().getString("key"); - if (key == null) - throw new RuntimeException("No key was provided for the connection state observer"); - if (service.connectionStateObservers.containsKey(key)) { - //Already subscribed. Just push the latest known state to it. - service.publishConnectionStateTo(key, service.lastKnownState); - break; - } - service.addConnectionStateObserver(key, message.replyTo); - service.publishConnectionState(service.lastKnownState); - break; - } - case MSG_CONNECTION_STATE_UNSUBSCRIBE: { - String key = message.getData().getString("key"); - if (key == null) - throw new RuntimeException("No observer was specified to unregister"); - service.removeConnectionStateObserver(key, null); - break; - } - default: { - super.handleMessage(msg); - } - } + String Bind = ""; + Bind += "127.0.0.1:" + port; + if (enableLan) { + Bind = "0.0.0.0:" + port; } + return Bind; } @Override @@ -295,21 +231,6 @@ public IBinder onBind(Intent intent) { return serviceMessenger.getBinder(); } - private final Runnable logRunnable = new Runnable() { - @Override - public void run() { - String logMessages = Tun2socks.getLogMessages(); - if (!logMessages.isEmpty()) { - try (FileOutputStream fos = getApplicationContext().openFileOutput("logs.txt", Context.MODE_APPEND)) { - fos.write((logMessages).getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } - } - handler.postDelayed(this, 2000); // Poll every 2 seconds - } - }; - private void clearLogFile() { try (FileOutputStream fos = getApplicationContext().openFileOutput("logs.txt", Context.MODE_PRIVATE)) { fos.write("".getBytes()); // Overwrite with empty content @@ -406,7 +327,8 @@ private void stopVpn() { private void publishConnectionState(ConnectionState state) { if (!connectionStateObservers.isEmpty()) { - for (String observerKey : connectionStateObservers.keySet()) publishConnectionStateTo(observerKey, state); + for (String observerKey : connectionStateObservers.keySet()) + publishConnectionStateTo(observerKey, state); } } @@ -532,4 +454,75 @@ private void configure() { vpnThread = new Thread(() -> Tun2socks.runWarp(so)); vpnThread.start(); } -} \ No newline at end of file + + private static class IncomingHandler extends Handler { + private final WeakReference serviceRef; + + IncomingHandler(OblivionVpnService service) { + serviceRef = new WeakReference<>(service); + } + + @Override + public void handleMessage(Message msg) { + final Message message = new Message(); + message.copyFrom(msg); + OblivionVpnService service = serviceRef.get(); + if (service == null) return; + switch (msg.what) { + case MSG_PERFORM_CONNECTION_TEST: { + performConnectionTest(service.bindAddress, new ConnectionStateChangeListener() { + @Override + public void onChange(ConnectionState state) { + service.setLastKnownState(state); + Bundle data = new Bundle(); + if (state == ConnectionState.DISCONNECTED) { + data.putBoolean("success", false); + Message replyMsg = Message.obtain(null, MSG_PERFORM_CONNECTION_TEST); + replyMsg.setData(data); + try { + message.replyTo.send(replyMsg); + } catch (RemoteException e) { + e.printStackTrace(); + } + } else { + data.putBoolean("success", true); + Message replyMsg = Message.obtain(null, MSG_PERFORM_CONNECTION_TEST); + replyMsg.setData(data); + try { + message.replyTo.send(replyMsg); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + } + }); + break; + } + case MSG_CONNECTION_STATE_SUBSCRIBE: { + String key = message.getData().getString("key"); + if (key == null) + throw new RuntimeException("No key was provided for the connection state observer"); + if (service.connectionStateObservers.containsKey(key)) { + //Already subscribed. Just push the latest known state to it. + service.publishConnectionStateTo(key, service.lastKnownState); + break; + } + service.addConnectionStateObserver(key, message.replyTo); + service.publishConnectionState(service.lastKnownState); + break; + } + case MSG_CONNECTION_STATE_UNSUBSCRIBE: { + String key = message.getData().getString("key"); + if (key == null) + throw new RuntimeException("No observer was specified to unregister"); + service.removeConnectionStateObserver(key, null); + break; + } + default: { + super.handleMessage(msg); + } + } + } + } +} diff --git a/app/src/main/java/org/bepass/oblivion/QuickStartService.java b/app/src/main/java/org/bepass/oblivion/QuickStartService.java index ad819995..9d81cee2 100644 --- a/app/src/main/java/org/bepass/oblivion/QuickStartService.java +++ b/app/src/main/java/org/bepass/oblivion/QuickStartService.java @@ -16,13 +16,11 @@ import androidx.core.content.ContextCompat; @RequiresApi(api = Build.VERSION_CODES.N) -public class QuickStartService extends TileService { +public class QuickStartService extends TileService { + private final static String CONNECTION_OBSERVER_KEY = "quickstartToggleButton"; private boolean isBound; private Messenger serviceMessenger; - - private final static String CONNECTION_OBSERVER_KEY = "quickstartToggleButton"; - - private ServiceConnection connection = new ServiceConnection() { + private final ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { serviceMessenger = new Messenger(service); @@ -38,7 +36,6 @@ public void onServiceDisconnected(ComponentName arg0) { }; - // Called when your app can update your tile. @Override public void onStartListening() { diff --git a/app/src/main/java/org/bepass/oblivion/SettingsActivity.java b/app/src/main/java/org/bepass/oblivion/SettingsActivity.java index 5c69da64..5adf96b3 100644 --- a/app/src/main/java/org/bepass/oblivion/SettingsActivity.java +++ b/app/src/main/java/org/bepass/oblivion/SettingsActivity.java @@ -1,9 +1,6 @@ package org.bepass.oblivion; -import androidx.appcompat.app.AppCompatActivity; - import android.os.Bundle; -import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -13,7 +10,7 @@ import android.widget.Spinner; import android.widget.TextView; -import org.bepass.oblivion.R; +import androidx.appcompat.app.AppCompatActivity; public class SettingsActivity extends AppCompatActivity { @@ -119,7 +116,7 @@ private void settingBasicValuesFromSPF() { String countryCode = fileManager.getString("USERSETTING_country"); int index; - if("".equals(countryCode)) { + if ("".equals(countryCode)) { index = 0; } else { String countryName = CountryUtils.getCountryName(countryCode); @@ -165,4 +162,4 @@ private void init() { back.setOnClickListener(v -> onBackPressed()); } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/bepass/oblivion/SheetsCallBack.java b/app/src/main/java/org/bepass/oblivion/SheetsCallBack.java index bfb33237..2e32fe85 100644 --- a/app/src/main/java/org/bepass/oblivion/SheetsCallBack.java +++ b/app/src/main/java/org/bepass/oblivion/SheetsCallBack.java @@ -3,4 +3,3 @@ public interface SheetsCallBack { void onSheetClosed(); } - diff --git a/app/src/main/java/org/bepass/oblivion/TouchAwareSwitch.java b/app/src/main/java/org/bepass/oblivion/TouchAwareSwitch.java index 5751c1bf..cf407d08 100644 --- a/app/src/main/java/org/bepass/oblivion/TouchAwareSwitch.java +++ b/app/src/main/java/org/bepass/oblivion/TouchAwareSwitch.java @@ -3,8 +3,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; import com.suke.widget.SwitchButton; @@ -21,6 +19,7 @@ public TouchAwareSwitch(Context context, AttributeSet attrs) { public TouchAwareSwitch(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + @SuppressLint("ClickableViewAccessibility") @Override public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) { @@ -44,8 +43,4 @@ public void setChecked(boolean checked, boolean notify) { } - - - - } diff --git a/app/src/main/res/drawable-anydpi/about_item.xml b/app/src/main/res/drawable-anydpi/about_item.xml index 093bde88..0889317c 100644 --- a/app/src/main/res/drawable-anydpi/about_item.xml +++ b/app/src/main/res/drawable-anydpi/about_item.xml @@ -1,7 +1,7 @@ + android:shape="rectangle"> - - + + diff --git a/app/src/main/res/drawable-anydpi/bottom_sheet_closer.xml b/app/src/main/res/drawable-anydpi/bottom_sheet_closer.xml index 3b8242fe..448713ee 100644 --- a/app/src/main/res/drawable-anydpi/bottom_sheet_closer.xml +++ b/app/src/main/res/drawable-anydpi/bottom_sheet_closer.xml @@ -1,7 +1,7 @@ + android:shape="rectangle"> - - + + diff --git a/app/src/main/res/drawable-anydpi/edittext_back.xml b/app/src/main/res/drawable-anydpi/edittext_back.xml index 007a4e9e..e16f4e4e 100644 --- a/app/src/main/res/drawable-anydpi/edittext_back.xml +++ b/app/src/main/res/drawable-anydpi/edittext_back.xml @@ -1,7 +1,7 @@ + android:shape="rectangle"> - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_back.xml b/app/src/main/res/drawable-anydpi/ic_back.xml index e4e11807..af0695f3 100644 --- a/app/src/main/res/drawable-anydpi/ic_back.xml +++ b/app/src/main/res/drawable-anydpi/ic_back.xml @@ -1,12 +1,12 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#5E5E5E" + android:alpha="0.6" + android:autoMirrored="true"> + android:fillColor="@android:color/white" + android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" /> diff --git a/app/src/main/res/drawable-anydpi/ic_bug.xml b/app/src/main/res/drawable-anydpi/ic_bug.xml index b45538d2..ecabc241 100644 --- a/app/src/main/res/drawable-anydpi/ic_bug.xml +++ b/app/src/main/res/drawable-anydpi/ic_bug.xml @@ -1,11 +1,11 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#5E5E5E" + android:alpha="0.6"> + android:fillColor="@android:color/white" + android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" /> diff --git a/app/src/main/res/drawable-anydpi/ic_info.xml b/app/src/main/res/drawable-anydpi/ic_info.xml index 58389a33..8b074f59 100644 --- a/app/src/main/res/drawable-anydpi/ic_info.xml +++ b/app/src/main/res/drawable-anydpi/ic_info.xml @@ -1,11 +1,11 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#5E5E5E" + android:alpha="0.6"> + android:fillColor="@android:color/white" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" /> diff --git a/app/src/main/res/drawable-anydpi/ic_power.xml b/app/src/main/res/drawable-anydpi/ic_power.xml index 9847dd37..e9780d2b 100644 --- a/app/src/main/res/drawable-anydpi/ic_power.xml +++ b/app/src/main/res/drawable-anydpi/ic_power.xml @@ -1,11 +1,11 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#5E5E5E" + android:alpha="0.6"> + android:fillColor="@android:color/white" + android:pathData="M13,3h-2v10h2L13,3zM17.83,5.17l-1.42,1.42C17.99,7.86 19,9.81 19,12c0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7c0,-2.19 1.01,-4.14 2.58,-5.42L6.17,5.17C4.23,6.82 3,9.26 3,12c0,4.97 4.03,9 9,9s9,-4.03 9,-9c0,-2.74 -1.23,-5.18 -3.17,-6.83z" /> diff --git a/app/src/main/res/drawable-anydpi/ic_settings.xml b/app/src/main/res/drawable-anydpi/ic_settings.xml index d1763c9a..3cefc4cd 100644 --- a/app/src/main/res/drawable-anydpi/ic_settings.xml +++ b/app/src/main/res/drawable-anydpi/ic_settings.xml @@ -1,11 +1,11 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#5E5E5E" + android:alpha="0.6"> + android:fillColor="@android:color/white" + android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" /> diff --git a/app/src/main/res/drawable-hdpi/rounded_bottom_sheet.xml b/app/src/main/res/drawable-hdpi/rounded_bottom_sheet.xml index 84eec740..94506a97 100644 --- a/app/src/main/res/drawable-hdpi/rounded_bottom_sheet.xml +++ b/app/src/main/res/drawable-hdpi/rounded_bottom_sheet.xml @@ -1,8 +1,8 @@ - - + android:shape="rectangle"> + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 05c351ca..01fee93e 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -1,30 +1,31 @@ - - - - - - - - - - \ No newline at end of file + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + diff --git a/app/src/main/res/drawable/background_gradient.xml b/app/src/main/res/drawable/background_gradient.xml index 792a1efa..275da24a 100644 --- a/app/src/main/res/drawable/background_gradient.xml +++ b/app/src/main/res/drawable/background_gradient.xml @@ -1,9 +1,9 @@ - - \ No newline at end of file + android:shape="rectangle"> + + diff --git a/app/src/main/res/drawable/bottom_sheet_cancel.xml b/app/src/main/res/drawable/bottom_sheet_cancel.xml index f945455c..a94adfc7 100644 --- a/app/src/main/res/drawable/bottom_sheet_cancel.xml +++ b/app/src/main/res/drawable/bottom_sheet_cancel.xml @@ -1,7 +1,7 @@ + android:shape="rectangle"> - - + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 2d80bfa7..fc9655e7 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,170 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/layout_border_bottom.xml b/app/src/main/res/drawable/layout_border_bottom.xml index e4aea104..82feed3f 100644 --- a/app/src/main/res/drawable/layout_border_bottom.xml +++ b/app/src/main/res/drawable/layout_border_bottom.xml @@ -1,19 +1,19 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/vpn_off.xml b/app/src/main/res/drawable/vpn_off.xml index d33949b7..9ae84aa3 100644 --- a/app/src/main/res/drawable/vpn_off.xml +++ b/app/src/main/res/drawable/vpn_off.xml @@ -1,5 +1,6 @@ - + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + diff --git a/app/src/main/res/drawable/vpn_on.xml b/app/src/main/res/drawable/vpn_on.xml index 1339fb3b..280ecbdc 100644 --- a/app/src/main/res/drawable/vpn_on.xml +++ b/app/src/main/res/drawable/vpn_on.xml @@ -1,5 +1,6 @@ - + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + diff --git a/app/src/main/res/layout/activity_bug.xml b/app/src/main/res/layout/activity_bug.xml index 397a0b97..a86271a4 100644 --- a/app/src/main/res/layout/activity_bug.xml +++ b/app/src/main/res/layout/activity_bug.xml @@ -1,62 +1,63 @@ - + + - - - - - - - - - - - - - - - - \ No newline at end of file + android:layout_height="48dp" + android:layout_marginTop="8dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_info.xml b/app/src/main/res/layout/activity_info.xml index f3743bfd..08c1ef81 100644 --- a/app/src/main/res/layout/activity_info.xml +++ b/app/src/main/res/layout/activity_info.xml @@ -1,102 +1,102 @@ - - - - + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/background_gradient" + android:orientation="vertical" + tools:context="org.bepass.oblivion.InfoActivity"> - + - + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:layout_marginEnd="16dp" + android:fontFamily="@font/shabnamlight" + android:text="درباره برنامه" + android:textColor="@color/black" + android:textSize="32sp" /> - + - + - + - + - + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:layout_marginEnd="16dp" + android:fontFamily="@font/shabnambold" + android:text="BePass/Oblivion" + android:textColor="@color/black" /> + + + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cd5f90e8..74c0412d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,125 +1,126 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + android:layout_height="48dp" + android:layout_marginTop="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 3c2922b8..3e7d5dc6 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,457 +1,458 @@ - + + + android:layout_height="48dp" + android:layout_marginTop="8dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + - + + + + + - - + android:layout_height="10dp" + android:gravity="center" + android:orientation="vertical" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:textSize="20sp" /> + + + - + - + android:layout_height="10dp" + android:gravity="center" + android:orientation="vertical" + > + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_weight="2" + > + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/country_item_layout.xml b/app/src/main/res/layout/country_item_layout.xml index bccdd4e3..f5e2f2a8 100644 --- a/app/src/main/res/layout/country_item_layout.xml +++ b/app/src/main/res/layout/country_item_layout.xml @@ -1,7 +1,7 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="5dp" + android:textSize="18sp" + android:fontFamily="@font/shabnammedium" /> diff --git a/app/src/main/res/layout/edit_sheet.xml b/app/src/main/res/layout/edit_sheet.xml index 03115aa9..4be01c80 100644 --- a/app/src/main/res/layout/edit_sheet.xml +++ b/app/src/main/res/layout/edit_sheet.xml @@ -1,75 +1,75 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/rounded_bottom_sheet" + android:gravity="center" + android:orientation="vertical"> - + - + - + - + -