Browse Source

Merge pull request 'ui_sprint_2' (#12) from ui_sprint_2 into dev

Reviewed-on: https://git.bubblev.org/bubblev/bubble-droid/pulls/12
pull/13/head
Gegham Kurghinyan 4 years ago
parent
commit
8d605ba5c1
20 changed files with 217 additions and 68 deletions
  1. +22
    -0
      ui/src/main/java/com/wireguard/android/activity/BaseActivityBubble.java
  2. +11
    -1
      ui/src/main/java/com/wireguard/android/activity/LoginActivity.java
  3. +35
    -0
      ui/src/main/java/com/wireguard/android/activity/MainActivity.java
  4. +32
    -9
      ui/src/main/java/com/wireguard/android/repository/DataRepository.java
  5. +10
    -0
      ui/src/main/java/com/wireguard/android/util/UserStore.java
  6. +4
    -0
      ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java
  7. +4
    -0
      ui/src/main/java/com/wireguard/android/viewmodel/MainViewModel.java
  8. BIN
     
  9. BIN
     
  10. BIN
     
  11. BIN
     
  12. BIN
     
  13. BIN
     
  14. +10
    -0
      ui/src/main/res/drawable/custom_toast.xml
  15. +0
    -9
      ui/src/main/res/drawable/main_background.xml
  16. +49
    -49
      ui/src/main/res/layout/activity_main.xml
  17. +37
    -0
      ui/src/main/res/layout/toast_layout.xml
  18. +1
    -0
      ui/src/main/res/values/colors.xml
  19. +1
    -0
      ui/src/main/res/values/dimens.xml
  20. +1
    -0
      ui/src/main/res/values/strings.xml

+ 22
- 0
ui/src/main/java/com/wireguard/android/activity/BaseActivityBubble.java View File

@@ -1,8 +1,20 @@
package com.wireguard.android.activity;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.wireguard.android.R;
import com.wireguard.android.fragment.LoadingDialogFragment;

import java.net.ConnectException;
import java.net.UnknownHostException;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Lifecycle;
@@ -58,4 +70,14 @@ public class BaseActivityBubble extends AppCompatActivity {
loadingDialog.dismissAllowingStateLoss();
}
}

protected void showNetworkNotAvailableMessage() {
final LayoutInflater inflater = getLayoutInflater();
final View layout = inflater.inflate(R.layout.toast_layout, findViewById(R.id.custom_toast_container));
final Toast toast = new Toast(this);
toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 60);
toast.setView(layout);
toast.show();
}

}

+ 11
- 1
ui/src/main/java/com/wireguard/android/activity/LoginActivity.java View File

@@ -41,6 +41,7 @@ public class LoginActivity extends BaseActivityBubble {
private static final String BUBBLE_NAME_KEY = "bubbleName";
private static final String USER_NAME_KEY = "userName";
private static final String PASSWORD_KEY = "password";
private static final String NO_INTERNET_CONNECTION = "no internet connection";


@Override
@@ -175,9 +176,14 @@ public class LoginActivity extends BaseActivityBubble {
loginViewModel.getCertificate(LoginActivity.this).observe(LoginActivity.this, new Observer<byte[]>() {
@Override public void onChanged(final byte[] encodedCertificate) {
closeLoadingDialog();
//TODO change implementation login function, function has be return certificate data
if (encodedCertificate.length == 0) {
Toast.makeText(LoginActivity.this, getString(R.string.failed_bubble), Toast.LENGTH_SHORT).show();
} else {
}
else if(encodedCertificate.length == 1){
showNetworkNotAvailableMessage();
}
else {
final Intent intent = KeyChain.createInstallIntent();
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, encodedCertificate);
intent.putExtra(KeyChain.EXTRA_NAME, CERTIFICATE_NAME);
@@ -191,6 +197,9 @@ public class LoginActivity extends BaseActivityBubble {
break;
case ERROR:
closeLoadingDialog();
if(userStatusResource.message.equals(NO_INTERNET_CONNECTION)){
showNetworkNotAvailableMessage();
}
Toast.makeText(LoginActivity.this, getString(R.string.login_failed), Toast.LENGTH_SHORT).show();
Log.d("TAG", "Error");
break;
@@ -203,6 +212,7 @@ public class LoginActivity extends BaseActivityBubble {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
Toast.makeText(this, getString(R.string.success), Toast.LENGTH_SHORT).show();
loginViewModel.setHostName(this,bubbleName.getText().toString().trim());
Log.d("TAG", "Success");
final Intent mainActivityIntent = new Intent(this, MainActivity.class);
mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);


+ 35
- 0
ui/src/main/java/com/wireguard/android/activity/MainActivity.java View File

@@ -5,10 +5,12 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.wireguard.android.R;
@@ -22,6 +24,8 @@ public class MainActivity extends AppCompatActivity {
private Button connectButton;
private ImageView imageMyBubble;
private ImageView mark;
private ImageButton myBubbleButton;
private ImageButton accountButton;
private boolean connectionStateFlag;

private static final int REQUEST_CODE_VPN_PERMISSION = 23491;
@@ -30,6 +34,9 @@ public class MainActivity extends AppCompatActivity {
public static final int CONNECTED_TEXT_VIEW_TOP_MARGIN = 150;
public static final int DISCONNECTED_TEXT_VIEW_BOTTOM_MARGIN = 90;
public static final int CONNECTED_TEXT_VIEW_BOTTOM_MARGIN = 100;
private static final String BASE_URL_PREFIX = "https://";
private static final String BASE_URL_SUFFIX_MY_BUBBLE = ":1443/";
private static final String BASE_URL_SUFFIX_ACCOUNT = ":1443/me";

@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -68,6 +75,8 @@ public class MainActivity extends AppCompatActivity {
imageMyBubble = findViewById(R.id.imageMyBubble);
mark = findViewById(R.id.mark);
titleMyBubble = findViewById(R.id.titleMyBubble);
myBubbleButton = findViewById(R.id.myBubbleButton);
accountButton = findViewById(R.id.accountButton);
}

private void initListeners() {
@@ -76,6 +85,32 @@ public class MainActivity extends AppCompatActivity {
connect();
}
});
myBubbleButton.setOnClickListener(new OnClickListener() {
@Override public void onClick(final View v) {
showMyBubble();
}
});
accountButton.setOnClickListener(new OnClickListener() {
@Override public void onClick(final View v) {
showAccount();
}
});
}

private void showAccount() {
final String hostname = mainViewModel.getHostname(this);
final String url = BASE_URL_PREFIX + hostname + BASE_URL_SUFFIX_ACCOUNT;
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}

private void showMyBubble() {
final String hostname = mainViewModel.getHostname(this);
final String url = BASE_URL_PREFIX + hostname + BASE_URL_SUFFIX_MY_BUBBLE;
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}

private void connect() {


+ 32
- 9
ui/src/main/java/com/wireguard/android/repository/DataRepository.java View File

@@ -6,7 +6,6 @@ import android.os.Build;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.widget.Toast;

import com.wireguard.android.Application;
import com.wireguard.android.R;
import com.wireguard.android.activity.MainActivity;
@@ -31,6 +30,8 @@ import com.wireguard.config.Config;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -61,7 +62,6 @@ public class DataRepository {
private TunnelManager tunnelManager;
private ObservableTunnel pendingTunnel;

public static final String NO_INTERNET_CONNECTION = "no_internet_connection";
private static final String SEPARATOR = ":";
private static final String SPACE = " ";
private static final String DELIMITER = "\\A";
@@ -69,6 +69,7 @@ public class DataRepository {
private static String BASE_URL = "";
private static final String TUNNEL_NAME = "BubbleVPN";
private static final int REQUEST_CODE_VPN_PERMISSION = 23491;
private static final String NO_INTERNET_CONNECTION = "no internet connection";

private DataRepository(Context context, String url) {
BASE_URL = url;
@@ -114,7 +115,8 @@ public class DataRepository {
getAllDevices(context);
}
}, throwable -> {
setMutableLiveData(StatusResource.error(throwable.getMessage()));
setErrorMessage(throwable,this);
// setMutableLiveData(StatusResource.error(throwable.getMessage()));
});
compositeDisposable.add(disposableLogin);
}
@@ -139,7 +141,8 @@ public class DataRepository {
addDevice(context);
}
}, throwable -> {
setMutableLiveData(StatusResource.error(throwable.getMessage()));
setErrorMessage(throwable,this);
// setMutableLiveData(StatusResource.error(throwable.getMessage()));
});
compositeDisposable.add(disposableAllDevices);
}
@@ -193,7 +196,8 @@ public class DataRepository {
UserStore.getInstance(context).setDevice(device.getName(), device.getUuid());
getConfig(context);
}, throwable -> {
setMutableLiveData(StatusResource.error(throwable.getMessage()));
setErrorMessage(throwable,this);
// setMutableLiveData(StatusResource.error(throwable.getMessage()));
});
compositeDisposable.add(disposableAddDevice);
} else {
@@ -231,19 +235,22 @@ public class DataRepository {
UserStore.getInstance(context).setDevice(device.getName(), device.getUuid());
getConfig(context);
}, throwable -> {
setMutableLiveData(StatusResource.error(throwable.getMessage()));
setErrorMessage(throwable,this);
// setMutableLiveData(StatusResource.error(throwable.getMessage()));
});
compositeDisposable.add(disposableAddDevice);
}
}
}
}, throwable -> {
setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION));
setErrorMessage(throwable,this);
// setMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION));
});
compositeDisposable.add(disposableAllDevices);
}

private void getConfig(Context context) {
NetworkBoundStatusResource<User> liveData = this;
final String deviceID = UserStore.getInstance(context).getDeviceID();
final String token = UserStore.getInstance(context).getToken();
Request request = new Request.Builder()
@@ -252,7 +259,8 @@ public class DataRepository {
.build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(final okhttp3.Call call, final IOException e) {
setMutableLiveData(StatusResource.error(e.getMessage()));
setErrorMessage(e,liveData);
// postMutableLiveData(StatusResource.error(e.getMessage()));
}

@Override public void onResponse(final okhttp3.Call call, final Response response) throws IOException {
@@ -373,7 +381,7 @@ public class DataRepository {
.build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(final okhttp3.Call call, final IOException e) {
liveData.postValue(new byte[]{});
liveData.postValue(new byte[]{1});
}

@Override public void onResponse(final okhttp3.Call call, final Response response) throws IOException {
@@ -446,4 +454,19 @@ public class DataRepository {
});
return liveData;
}


public void setHostName(Context context, String hostname){
UserStore.getInstance(context).setHostname(hostname);
}

public String getHostname(Context context){
return UserStore.getInstance(context).getHostname();
}

private void setErrorMessage(Throwable throwable , NetworkBoundStatusResource<User> liveData){
if( throwable instanceof UnknownHostException || throwable instanceof ConnectException){
liveData.postMutableLiveData(StatusResource.error(NO_INTERNET_CONNECTION));
}
}
}

+ 10
- 0
ui/src/main/java/com/wireguard/android/util/UserStore.java View File

@@ -12,10 +12,12 @@ public class UserStore {
private static final String DEVICE_DATA_KEY = "com.wireguard.android.util.bubbleDeviceResponse";
private static final String DEVICE_ID_KEY = "com.wireguard.android.util.bubbleDeviceIDResponse";
private static final String USER_BASE_URL_KEY = "com.wireguard.android.util.bubbleUserURLResponse";
private static final String HOSTNAME_KEY = "com.wireguard.android.util.bubbleHostnameResponse";
public static final String USER_TOKEN_DEFAULT_VALUE = "";
public static final String DEVICE_DEFAULT_VALUE = "";
public static final String DEVICE_ID_DEFAULT_VALUE = "";
public static final String USER_BASE_URL_DEFAULT_VALUE = "";
private static final String HOSTNAME_DEFAULT_VALUE = "";

public static UserStore getInstance(Context context) {
if (instance == null) {
@@ -61,4 +63,12 @@ public class UserStore {
public String getUserURL(){
return sharedPreferences.getString(USER_BASE_URL_KEY,USER_BASE_URL_DEFAULT_VALUE);
}

public void setHostname(String hostName){
sharedPreferences.edit().putString(HOSTNAME_KEY,hostName).apply();
}

public String getHostname(){
return sharedPreferences.getString(HOSTNAME_KEY,HOSTNAME_DEFAULT_VALUE);
}
}

+ 4
- 0
ui/src/main/java/com/wireguard/android/viewmodel/LoginViewModel.java View File

@@ -36,4 +36,8 @@ public class LoginViewModel extends ViewModel {
public MutableLiveData<byte[]> getCertificate(Context context){
return DataRepository.getRepositoryInstance().getCertificate(context);
}

public void setHostName(Context context, String hostname){
DataRepository.getRepositoryInstance().setHostName(context,hostname);
}
}

+ 4
- 0
ui/src/main/java/com/wireguard/android/viewmodel/MainViewModel.java View File

@@ -39,4 +39,8 @@ public class MainViewModel extends ViewModel {
public boolean isVPNConnected(Context context, boolean connectionStateFlag) {
return DataRepository.getRepositoryInstance().isVPNConnected(context,connectionStateFlag);
}

public String getHostname(Context context){
return DataRepository.getRepositoryInstance().getHostname(context);
}
}

BIN
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 10
- 0
ui/src/main/res/drawable/custom_toast.xml View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item>
<shape android:shape="rectangle">
<gradient android:endColor="@color/toast_color" android:startColor="@color/toast_color" />
<corners android:radius="100dp" />
</shape>
</item>
</selector>

+ 0
- 9
ui/src/main/res/drawable/main_background.xml View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item>
<shape android:shape="rectangle">
<gradient android:endColor="@color/main_background_end_color" android:centerColor="@color/main_background_center_color" android:startColor="@color/main_background_start_color" />
</shape>
</item>
</selector>

+ 49
- 49
ui/src/main/res/layout/activity_main.xml View File

@@ -5,7 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/main_background"
android:background="@drawable/bkrnd"
tools:context="com.wireguard.android.activity.MainActivity">


@@ -19,36 +19,36 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<TextView
android:id="@+id/bubbleConnectionTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginTop="32dp"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:fontFamily="@font/josefin_sans"
android:letterSpacing="-0.02"
android:text="@string/my_bubble"
android:textColor="@color/black"
android:textSize="@dimen/bubble_connection_title_text_size"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginTop="@dimen/margin_start_and_end"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:text="@string/your_private_bubble"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/bubbleConnectionTitle" />
<TextView
android:id="@+id/bubbleConnectionTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginTop="32dp"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:fontFamily="@font/josefin_sans"
android:letterSpacing="-0.02"
android:text="@string/my_bubble"
android:textColor="@color/black"
android:textSize="@dimen/bubble_connection_title_text_size"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginTop="@dimen/margin_start_and_end"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:text="@string/your_private_bubble"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/bubbleConnectionTitle" />


<ImageView
@@ -84,9 +84,9 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginTop="80dp"
android:visibility="gone"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:src="@drawable/mark"
android:visibility="gone"

app:layout_constraintEnd_toEndOf="@+id/imageMyBubble"
app:layout_constraintStart_toStartOf="@+id/imageMyBubble"
@@ -135,29 +135,29 @@
</LinearLayout>

<ImageButton
android:id="@+id/myBubbleImageView"
android:id="@+id/myBubbleButton"
android:layout_width="@dimen/icons_size"
android:layout_height="@dimen/icons_size"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginBottom="44dp"
android:background="@drawable/my_bubble"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/accountImageView"
app:layout_constraintEnd_toStartOf="@+id/accountButton"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />

<ImageButton
android:id="@+id/accountImageView"
android:layout_width="@dimen/icons_size"
android:layout_height="@dimen/icons_size"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:background="@drawable/account"
app:layout_constraintBottom_toBottomOf="@+id/myBubbleImageView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/myBubbleImageView"
app:layout_constraintTop_toTopOf="@+id/myBubbleImageView" />
<ImageButton
android:id="@+id/accountButton"
android:layout_width="@dimen/icons_size"
android:layout_height="@dimen/icons_size"
android:layout_marginStart="@dimen/margin_start_and_end"
android:layout_marginEnd="@dimen/margin_start_and_end"
android:background="@drawable/account"
app:layout_constraintBottom_toBottomOf="@+id/myBubbleButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/myBubbleButton"
app:layout_constraintTop_toTopOf="@+id/myBubbleButton" />

<ImageButton
android:id="@+id/imageButton"
@@ -166,9 +166,9 @@
android:layout_marginTop="32dp"
android:background="@drawable/home"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/accountImageView"
app:layout_constraintStart_toEndOf="@+id/myBubbleImageView"
app:layout_constraintTop_toTopOf="@+id/myBubbleImageView" />
app:layout_constraintEnd_toStartOf="@+id/accountButton"
app:layout_constraintStart_toEndOf="@+id/myBubbleButton"
app:layout_constraintTop_toTopOf="@+id/myBubbleButton" />

<androidx.constraintlayout.widget.Constraints
android:id="@+id/constraints"


+ 37
- 0
ui/src/main/res/layout/toast_layout.xml View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/custom_toast_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/custom_toast"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<TextView
android:id="@+id/text"
android:textSize="@dimen/toast_text_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_top"
android:layout_marginTop="@dimen/margin_start_and_end"
android:layout_marginEnd="@dimen/margin_top"
android:paddingBottom="10dp"
android:layout_marginBottom="@dimen/margin_top"
android:text="@string/network_not_found"
android:textColor="#FFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

+ 1
- 0
ui/src/main/res/values/colors.xml View File

@@ -42,4 +42,5 @@
<color name="sign_in_disable_end_color">#DF9BDF</color>
<color name="sign_in_enable_start_color">#EC2F91</color>
<color name="sign_in_enable_end_color">#C037C0</color>
<color name="toast_color">#4E4E4E</color>
</resources>

+ 1
- 0
ui/src/main/res/values/dimens.xml View File

@@ -16,4 +16,5 @@
<dimen name="edit_text_height">55dp</dimen>
<dimen name="bubble_connection_title_text_size">30sp</dimen>
<dimen name="icons_size">90dp</dimen>
<dimen name="toast_text_size">14sp</dimen>
</resources>

+ 1
- 0
ui/src/main/res/values/strings.xml View File

@@ -256,4 +256,5 @@
<string name="you_can_find_your_bubble_name_in_your_email">You can find your Bubble name in your email</string>
<string name="enter_your_bubble_name">Enter your Bubble Name</string>
<string name="your_private_bubble">Your private Bubble provides \n protection on this device.</string>
<string name="network_not_found">Sorry, friends. Network not currently available.</string>
</resources>

Loading…
Cancel
Save