Reviewed-on: https://git.bubblev.org/bubblev/bubble-droid/pulls/12pull/13/head
@@ -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(); | |||
} | |||
} |
@@ -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); | |||
@@ -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() { | |||
@@ -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)); | |||
} | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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> |
@@ -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> |
@@ -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" | |||
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |