From 01de134c7a834cbd34730364732f4a284bc105d7 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Thu, 7 Jul 2016 23:40:25 +0300 Subject: [PATCH] Created User Class. User is now saved on Login. and then passed as serialised String to the Class. MainActivity Has getUser() --- .../sagi/thesocialnotework/LoginActivity.java | 339 ++++++++++-------- .../sagi/thesocialnotework/MainActivity.java | 21 +- .../thesocialnotework/PersonalFragment.java | 10 +- .../thesocialnotework/SplashActivity.java | 6 +- .../ara/sagi/thesocialnotework/User.java | 134 +++++++ app/src/main/res/drawable/default_avatar.jpg | Bin 0 -> 5246 bytes app/src/main/res/layout/nav_header_main.xml | 15 +- app/src/main/res/values/strings.xml | 1 + 8 files changed, 353 insertions(+), 173 deletions(-) create mode 100644 app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/User.java create mode 100644 app/src/main/res/drawable/default_avatar.jpg diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java index bb0879a..21cb55f 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java @@ -15,189 +15,210 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; + import com.android.volley.Response; import com.android.volley.VolleyError; + +import org.json.JSONArray; import org.json.JSONObject; +import java.util.Vector; + /** * A login screen that offers login via email/password. */ -public class LoginActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher{ +public class LoginActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher { - // UI references. - private EditText mUsernameView; - private EditText mPasswordView; - private TextView mRegisterButton; - private Button mLoginButton; - private final String TAG = "[TSN/LoginActivity]"; - private final String BASE_URL = "http://thesocialnotework-api.appspot.com/api"; - private final String LOGIN_PATH = "/login"; - private LoginActivity self; //this - protected LinearLayout layout; + // UI references. + private EditText mUsernameView; + private EditText mPasswordView; + private TextView mRegisterButton; + private Button mLoginButton; + private final String TAG = "[TSN/LoginActivity]"; + private final String BASE_URL = "http://thesocialnotework-api.appspot.com/api"; + private final String LOGIN_PATH = "/login"; + private LoginActivity self; //this + protected LinearLayout layout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + this.self = this; + this.layout = (LinearLayout) findViewById(R.id.layout); + this.mUsernameView = (EditText) findViewById(R.id.al_username); + this.mUsernameView.addTextChangedListener(this); + this.mPasswordView = (EditText) findViewById(R.id.al_password); + this.mPasswordView.addTextChangedListener(this); + removeFocuse(); + this.mRegisterButton = (TextView) findViewById(R.id.al_register_button); + this.mRegisterButton.setOnClickListener(this); + + this.mLoginButton = (Button) findViewById(R.id.al_login_button); + this.mLoginButton.setOnClickListener(this); + this.mLoginButton.setEnabled(false); + + } + + private void removeFocuse() { + // Remove Auto Focus from the Text Fields + mUsernameView.clearFocus(); + mPasswordView.clearFocus(); + layout.setFocusable(true); + layout.setFocusableInTouchMode(true); + + } + + + /** + * Attempts to sign in or register the account specified by the login form. + * If there are form errors (invalid email, missing fields, etc.), the + * errors are presented and no actual login attempt is made. + */ + + private boolean isParamsValid(String username, String password) { + Log.d(TAG, "user: " + username); + Log.d(TAG, "pwd: " + password); + + if (TextUtils.isEmpty(username) || !isUsernameValid(username) || TextUtils.isEmpty(password) || !isPasswordValid(password)) { + return false; + } else { + return true; + } + } + + private void attemptLogin() { + MainActivity.showLoadingDialog(this, "Connecting", "Authenticating data"); + mPasswordView.setError(null); + if (isParamsValid(mUsernameView.getText().toString(), mPasswordView.getText().toString())) { + + String username = mUsernameView.getText().toString(); + String password = mPasswordView.getText().toString(); + + boolean cancel = false; + // http request register + JSONObject tempJson = new JSONObject(); + try { + tempJson.put("username", username); + tempJson.put("password", password); + } catch (Exception e) { + Log.d(TAG, e.toString()); + } + VolleyUtilSingleton.getInstance(LoginActivity.this).post(BASE_URL + LOGIN_PATH, tempJson, onLoginSuccess, onLoginError); + } else { + MainActivity.dismissLoadingDialog(); + Log.d(TAG, "Invalid params - make sure username exist & password is 4 characters or more"); + } + + } + + Response.Listener onLoginSuccess = new Response.Listener() { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_login); - this.self = this; - this.layout = (LinearLayout) findViewById(R.id.layout); - this.mUsernameView = (EditText) findViewById(R.id.al_username); - this.mUsernameView.addTextChangedListener(this); - this.mPasswordView = (EditText) findViewById(R.id.al_password); - this.mPasswordView.addTextChangedListener(this); - removeFocuse(); - this.mRegisterButton = (TextView) findViewById(R.id.al_register_button); - this.mRegisterButton.setOnClickListener(this); + public void onResponse(JSONObject response) { + try { + if (!response.isNull("user")) { + Log.e(TAG, "onLoginSuccess => user exist"); // TODO: REMOVE console + SharedPreferences sharedPref = self.getSharedPreferences(MainActivity.LOCAL_DATA_TSN, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPref.edit(); + String id, password, email, avatar, username, likedNotes = ""; - this.mLoginButton = (Button) findViewById(R.id.al_login_button); - this.mLoginButton.setOnClickListener(this); - this.mLoginButton.setEnabled(false); - - } - - private void removeFocuse() { - // Remove Auto Focus from the Text Fields - mUsernameView.clearFocus(); - mPasswordView.clearFocus(); - layout.setFocusable(true); - layout.setFocusableInTouchMode(true); - - } - - - /** - * Attempts to sign in or register the account specified by the login form. - * If there are form errors (invalid email, missing fields, etc.), the - * errors are presented and no actual login attempt is made. - */ - - private boolean isParamsValid(String username, String password) { - Log.d(TAG, "user: " + username); - Log.d(TAG, "pwd: " + password); - - if(TextUtils.isEmpty(username) || !isUsernameValid(username) || TextUtils.isEmpty(password) || !isPasswordValid(password)) { - return false; - } else{ - return true; - } - } - private void attemptLogin() { - MainActivity.showLoadingDialog(this, "Connecting", "Authenticating data"); - mPasswordView.setError(null); - if (isParamsValid(mUsernameView.getText().toString(), mPasswordView.getText().toString())) { - - String username = mUsernameView.getText().toString(); - String password = mPasswordView.getText().toString(); - - boolean cancel = false; - // http request register - JSONObject tempJson = new JSONObject(); - try { - tempJson.put("username", username); - tempJson.put("password", password); - } catch (Exception e) { - Log.d(TAG, e.toString()); + JSONArray likedNotes_JSON; + id = response.getJSONObject("user").getString("id"); + password = response.getJSONObject("user").getString("password"); + username = response.getJSONObject("user").getString("username"); + avatar = response.getJSONObject("user").getString("avatar"); + email = response.getJSONObject("user").getString("email"); + likedNotes_JSON = response.getJSONObject("user").getJSONArray("liked_notes_id"); + for (int i = 0; i < likedNotes_JSON.length(); i++) { + likedNotes += likedNotes_JSON.get(i); + if (i != likedNotes_JSON.length() - 1) { + likedNotes += User.LIKED_NOTES_DELIMETER; } - VolleyUtilSingleton.getInstance(LoginActivity.this).post(BASE_URL + LOGIN_PATH, tempJson, onLoginSuccess, onLoginError); + } + editor.putString("UserData", id+User.ATTARS_DELIMETER+username+User.ATTARS_DELIMETER+password+User.ATTARS_DELIMETER+email+User.ATTARS_DELIMETER+avatar+User.ATTARS_DELIMETER+likedNotes); + editor.commit(); + Intent personalSpaceActivity = new Intent(LoginActivity.this, MainActivity.class); + Bundle loginUserBundle = new Bundle(); + loginUserBundle.putString("UserData", id+User.ATTARS_DELIMETER+username+User.ATTARS_DELIMETER+password+User.ATTARS_DELIMETER+email+User.ATTARS_DELIMETER+avatar+User.ATTARS_DELIMETER+likedNotes); + personalSpaceActivity.putExtras(loginUserBundle); + MainActivity.dismissLoadingDialog(); + startActivity(personalSpaceActivity); } else { - MainActivity.dismissLoadingDialog(); - Log.d(TAG, "Invalid params - make sure username exist & password is 4 characters or more"); + MainActivity.dismissLoadingDialog(); + Toast.makeText(self, "Username or Password are incorrect", Toast.LENGTH_LONG).show(); + self.mUsernameView.getText().clear(); + self.mPasswordView.getText().clear(); + self.removeFocuse(); + ((TextView) findViewById(R.id.textView2)).setVisibility(View.INVISIBLE); + Log.d(TAG, "No such user, " + response.get("user")); + } - - } - - Response.Listener onLoginSuccess = new Response.Listener() { - @Override - public void onResponse(JSONObject response) { - try { - if(!response.isNull("user")) { - Log.e(TAG, "onLoginSuccess => user exist"); // TODO: REMOVE console - SharedPreferences sharedPref = self.getSharedPreferences(MainActivity.LOCAL_DATA_TSN, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = sharedPref.edit(); - editor.putString("UserId", response.getJSONObject("user").getString("id")); - editor.commit(); - Intent personalSpaceActivity = new Intent(LoginActivity.this, MainActivity.class); - Bundle loginUserBundle = new Bundle(); - loginUserBundle.putString("user_id", response.getJSONObject("user").getString("id")); - personalSpaceActivity.putExtras(loginUserBundle); - MainActivity.dismissLoadingDialog(); - startActivity(personalSpaceActivity); - } else { - MainActivity.dismissLoadingDialog(); - Toast.makeText(self, "Username or Password are incorrect", Toast.LENGTH_LONG).show(); - self.mUsernameView.getText().clear(); - self.mPasswordView.getText().clear(); - self.removeFocuse(); - ((TextView)findViewById(R.id.textView2)).setVisibility(View.INVISIBLE); - Log.d(TAG, "No such user, " + response.get("user")); - - } - }catch (Exception e) { - Log.e(TAG, "onLoginSuccess:" + e.getMessage()); - } - } - }; - - Response.ErrorListener onLoginError = new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - MainActivity.dismissLoadingDialog(); - Toast.makeText(self , "Username Or Password Incorrect", Toast.LENGTH_LONG).show(); - //Clean texts - self.mUsernameView.getText().clear(); - self.mPasswordView.getText().clear(); - self.removeFocuse(); - Log.d(TAG, "onErrorResponse: setting text to ''"); - Log.d(TAG, "onLoginError: msg: " + error.getMessage()); - } - }; - - - private boolean isUsernameValid(String username) { - return username.length() > 0; - } - - private boolean isPasswordValid(String password) { - return password.length() > 3; + } catch (Exception e) { + Log.e(TAG, "onLoginSuccess:" + e.getMessage()); + } } + }; + Response.ErrorListener onLoginError = new Response.ErrorListener() { @Override - public void onClick(View view) { - switch(view.getId()){ - case R.id.al_login_button: - //Do Login - Log.d(TAG, "Login......."); - attemptLogin(); - break; - case R.id.al_register_button: - //Do Register - Log.d(TAG, "going to Register...page"); - Intent registerActivity = new Intent(LoginActivity.this, RegisterActivity.class); - startActivity(registerActivity); - break; - } + public void onErrorResponse(VolleyError error) { + MainActivity.dismissLoadingDialog(); + Toast.makeText(self, "Username Or Password Incorrect", Toast.LENGTH_LONG).show(); + //Clean texts + self.mUsernameView.getText().clear(); + self.mPasswordView.getText().clear(); + self.removeFocuse(); + Log.d(TAG, "onErrorResponse: setting text to ''"); + Log.d(TAG, "onLoginError: msg: " + error.getMessage()); } + }; - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + private boolean isUsernameValid(String username) { + return username.length() > 0; + } + + private boolean isPasswordValid(String password) { + return password.length() > 3; + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.al_login_button: + //Do Login + Log.d(TAG, "Login......."); + attemptLogin(); + break; + case R.id.al_register_button: + //Do Register + Log.d(TAG, "going to Register...page"); + Intent registerActivity = new Intent(LoginActivity.this, RegisterActivity.class); + startActivity(registerActivity); + break; } + } - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - if(isParamsValid(mUsernameView.getText().toString(), mPasswordView.getText().toString())) { - ((TextView)findViewById(R.id.textView2)).setVisibility(View.INVISIBLE); - mLoginButton.setEnabled(true); - } - else{ - ((TextView)findViewById(R.id.textView2)).setVisibility(View.VISIBLE); - mLoginButton.setEnabled(false); - } + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + if (isParamsValid(mUsernameView.getText().toString(), mPasswordView.getText().toString())) { + ((TextView) findViewById(R.id.textView2)).setVisibility(View.INVISIBLE); + mLoginButton.setEnabled(true); + } else { + ((TextView) findViewById(R.id.textView2)).setVisibility(View.VISIBLE); + mLoginButton.setEnabled(false); } + } - @Override - public void afterTextChanged(Editable editable) { + @Override + public void afterTextChanged(Editable editable) { - } + } } diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java index caa84a1..33d39a3 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java @@ -4,6 +4,9 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; @@ -18,6 +21,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; +import android.widget.ImageView; import com.android.volley.Response; import com.android.volley.VolleyError; @@ -26,6 +30,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -34,7 +39,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { public static final String LOCAL_DATA_TSN = "TSN_DATA_STORE"; protected final String TAG = "[TSN / MainActivity]"; - protected String userId; + protected User user; private GPSUtils gpsUtils; private boolean locationPermission; public static ProgressDialog progress; @@ -42,6 +47,7 @@ public class MainActivity extends AppCompatActivity private PersonalFragment personalFragment; private Toolbar toolbar; public static final String BASE_URL = "http://thesocialnotework-api.appspot.com/api"; + private ImageView menu_avatar; @Override @@ -66,9 +72,12 @@ public class MainActivity extends AppCompatActivity navigationView.setNavigationItemSelectedListener(this); - //get Bundle data (Userid) + //get Bundle data (UserString) Bundle b = getIntent().getExtras(); - userId = b.getString("user_id"); + this.user = new User(b.getString("UserData")); + menu_avatar = (ImageView)findViewById(R.id.user_avatar); + //TODO - Change the menu_avatar to user.getAvatar() + //Change Layout Log.d(TAG, "Changing Fragment to Personal Activity"); @@ -225,6 +234,10 @@ public class MainActivity extends AppCompatActivity return stringArray; } - public String getUserId(){return userId;} + public User getUser(){ + return user; + } + + public String getUserId(){return user.getId();} } diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java index 3a7b172..98287bb 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java @@ -55,6 +55,7 @@ public class PersonalFragment extends Fragment { private ListAdapter noteListAdapter; private String userId; private final String TAG = "[TSN/PersonalFragment]"; + private MainActivity activity; public PersonalFragment() { // Required empty public constructor @@ -66,21 +67,22 @@ public class PersonalFragment extends Fragment { Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_personal, container, false); // Inflate the layout for this fragment + activity = (MainActivity) getActivity(); Bundle bundle = getArguments(); - this.userId = bundle.getString("user_id"); + this.userId = activity.getUserId(); Log.d(TAG, "onCreateView: userID: " + userId); //check for permission - ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_PERM); + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_PERM); this.noteList = (ListView) view.findViewById(R.id.ps_list_listview); - gpsUtils = ((MainActivity) getActivity()).getGPSUtils(); + gpsUtils = activity.getGPSUtils(); gpsUtils.getLocation(); listOfNotes = new ArrayList<>(); noteListAdapter = new ListAdapter(getContext(), listOfNotes); noteList.setAdapter(noteListAdapter); noteList.setOnItemClickListener(new ItemClickedListener()); - MainActivity.showLoadingDialog(getActivity(), "Fetching..", "getting your notes"); + MainActivity.showLoadingDialog(activity, "Fetching..", "getting your notes"); getAllNotes(); //https://thesocialnotework-api.appspot.com/api/note/all?uid= diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java index ca6dbb9..d8b6e40 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java @@ -34,7 +34,7 @@ public class SplashActivity extends AppCompatActivity { background.setImageDrawable( getResources().getDrawable(rand_splash())); } SharedPreferences sharedPref = this.getSharedPreferences(MainActivity.LOCAL_DATA_TSN, Context.MODE_PRIVATE); - final String userId = sharedPref.getString("UserId", null); + final String userData = sharedPref.getString("UserData", null); Thread timerThread = new Thread(){ public void run(){ @@ -43,12 +43,12 @@ public class SplashActivity extends AppCompatActivity { }catch(InterruptedException e){ e.printStackTrace(); }finally{ - if(userId == null){ + if(userData == null){ startActivity(new Intent(SplashActivity.this, LoginActivity.class)); }else{ Intent personalSpaceActivity = new Intent(SplashActivity.this, MainActivity.class); Bundle loginUserBundle = new Bundle(); - loginUserBundle.putString("user_id", userId); + loginUserBundle.putString("UserData", userData); personalSpaceActivity.putExtras(loginUserBundle); startActivity(personalSpaceActivity); } diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/User.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/User.java new file mode 100644 index 0000000..25c95dd --- /dev/null +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/User.java @@ -0,0 +1,134 @@ +package com.android_app.matan.ara.sagi.thesocialnotework; + +import android.util.Log; + +import java.util.Vector; + +/** + * Created by sagi on 7/7/16. - A Basic User Class + * "user": { + "id": 5733311175458816, + "username": "s", + "password": "1234", + "email": "sagi@dayan.com", + "creation_time": 1467814417313, + "avatar": "http://www.aljazeera.com/mritems/images/site/DefaultAvatar.jpg", + "liked_notes_id": [] + } + */ +public class User { + public static final int INDEX_ID = 0, INDEX_USERNAME = 1, INDEX_PASSWORD = 2, INDEX_EMAIL = 3, INDEX_AVATAR = 4, INDEX_LIKES_NOTES = 5; + public static final String TAG = "[TSN/User]", ATTARS_DELIMETER="||" , LIKED_NOTES_DELIMETER="|"; + protected String id, password, email, avatar, username; + protected Vector liked_notes; + + public User(String serializedUserData){ + liked_notes = new Vector<>(); + String[] array = serializedUserData.split("\\|\\|"); + for (int i = 0 ; i < array.length ; i ++){ + switch (i){ + case INDEX_ID: + this.id = array[i]; + break; + case INDEX_AVATAR: + this.avatar = array[i]; + break; + case INDEX_EMAIL: + this.email = array[i]; + break; + case INDEX_LIKES_NOTES: + createArrayNotes(array[i]); + break; + case INDEX_PASSWORD: + this.password = array[i]; + break; + case INDEX_USERNAME: + this.username = array[i]; + break; + default: + Log.w(TAG, "User: Got An Unowned value: " + array[i]); + break; + } + } + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Vector getLiked_notes() { + return liked_notes; + } + + public void setLiked_notes(Vector liked_notes) { + this.liked_notes = liked_notes; + } + + private void createArrayNotes(String s) { + Log.d(TAG, "createArrayNotes:" + s); + String[] noteIds = s.split("\\|"); + for (int i = 0; i < noteIds.length; i++) { + Log.d(TAG, "createArrayNotes: Note ID " + i + ": " + noteIds[i]); + liked_notes.add(noteIds[i]); + } + Log.d(TAG, "createArrayNotes: =================: == Done With Note IDS"); + } + + public String Serialise(){ + return id + "||" + username + "||" + password + "||" + email + "||" + serialiseNoteList(); + } + + private String serialiseNoteList() { + String result = ""; + for (int i = 0; i < liked_notes.size(); i++) { + result += liked_notes.get(i); + if(i != liked_notes.size() - 1){ + result+=";"; + } + } + return result; + } + + public String toString(){ + return "Id: "+id+" UserName: " + username +" Password: " +password +" email: " + email+ " Liked Notes: "+liked_notes.toString(); + } + + + +} diff --git a/app/src/main/res/drawable/default_avatar.jpg b/app/src/main/res/drawable/default_avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b81ccf184d186c7cd3fcf89e3663b104913bb9b GIT binary patch literal 5246 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 - - + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ee5a08..d5b0497 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,5 +38,6 @@ Hello blank fragment Password should be at least 4 chars long Map + Avatar