From 3adc972f460363df37a37444b58a5f978fa2e857 Mon Sep 17 00:00:00 2001 From: Kenneth Rosales Date: Sun, 19 Mar 2017 20:04:21 -0600 Subject: [PATCH 01/17] remove texview helloword --- .idea/misc.xml | 29 ++++++++++++++++++++++- app/src/main/res/layout/activity_main.xml | 4 ---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 731863b..14ccab6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,32 @@ + + + + + + + @@ -39,7 +66,7 @@ - + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81fb69e..a8e6d14 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,8 +10,4 @@ android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.kenneth.smartbudget.MainActivity"> - From 769ff98a797c366f25c3d805d9ba4b9344aac9d6 Mon Sep 17 00:00:00 2001 From: Kenneth Rosales Date: Thu, 6 Apr 2017 10:30:16 -0600 Subject: [PATCH 02/17] abilidad para loguearse con google, email/contrasenna y registrarse --- app/build.gradle | 7 + app/google-services.json | 55 ++ app/src/main/AndroidManifest.xml | 15 +- app/src/main/ic_launcher-web.png | Bin 0 -> 23677 bytes .../smartbudget/DashBoardActivity.java | 201 +++++++ .../kenneth/smartbudget/LoginActivity.java | 500 ++++++++++++++++++ .../kenneth/smartbudget/MainActivity.java | 13 - .../kenneth/smartbudget/SignUpActivity.java | 385 ++++++++++++++ app/src/main/res/drawable-hdpi/ic_account.png | Bin 0 -> 605 bytes .../res/drawable-hdpi/ic_add_location.png | Bin 0 -> 422 bytes app/src/main/res/drawable-hdpi/ic_ahorros.png | Bin 0 -> 270 bytes app/src/main/res/drawable-hdpi/ic_close.png | Bin 0 -> 282 bytes app/src/main/res/drawable-hdpi/ic_gastos.png | Bin 0 -> 219 bytes app/src/main/res/drawable-hdpi/ic_money.png | Bin 0 -> 479 bytes app/src/main/res/drawable-hdpi/ic_more.png | Bin 0 -> 179 bytes app/src/main/res/drawable-hdpi/ic_public.png | Bin 0 -> 610 bytes .../main/res/drawable-hdpi/ic_settings.png | Bin 0 -> 561 bytes app/src/main/res/drawable-mdpi/ic_account.png | Bin 0 -> 403 bytes .../res/drawable-mdpi/ic_add_location.png | Bin 0 -> 278 bytes app/src/main/res/drawable-mdpi/ic_ahorros.png | Bin 0 -> 193 bytes app/src/main/res/drawable-mdpi/ic_close.png | Bin 0 -> 212 bytes app/src/main/res/drawable-mdpi/ic_gastos.png | Bin 0 -> 145 bytes app/src/main/res/drawable-mdpi/ic_money.png | Bin 0 -> 290 bytes app/src/main/res/drawable-mdpi/ic_more.png | Bin 0 -> 133 bytes app/src/main/res/drawable-mdpi/ic_public.png | Bin 0 -> 407 bytes .../main/res/drawable-mdpi/ic_settings.png | Bin 0 -> 384 bytes .../main/res/drawable-xhdpi/ic_account.png | Bin 0 -> 781 bytes .../res/drawable-xhdpi/ic_add_location.png | Bin 0 -> 515 bytes .../main/res/drawable-xhdpi/ic_ahorros.png | Bin 0 -> 308 bytes app/src/main/res/drawable-xhdpi/ic_close.png | Bin 0 -> 335 bytes app/src/main/res/drawable-xhdpi/ic_gastos.png | Bin 0 -> 218 bytes app/src/main/res/drawable-xhdpi/ic_money.png | Bin 0 -> 534 bytes app/src/main/res/drawable-xhdpi/ic_more.png | Bin 0 -> 221 bytes app/src/main/res/drawable-xhdpi/ic_public.png | Bin 0 -> 803 bytes .../main/res/drawable-xhdpi/ic_settings.png | Bin 0 -> 678 bytes .../main/res/drawable-xxhdpi/ic_account.png | Bin 0 -> 1144 bytes .../res/drawable-xxhdpi/ic_add_location.png | Bin 0 -> 773 bytes .../main/res/drawable-xxhdpi/ic_ahorros.png | Bin 0 -> 445 bytes app/src/main/res/drawable-xxhdpi/ic_close.png | Bin 0 -> 464 bytes .../main/res/drawable-xxhdpi/ic_gastos.png | Bin 0 -> 310 bytes app/src/main/res/drawable-xxhdpi/ic_money.png | Bin 0 -> 801 bytes app/src/main/res/drawable-xxhdpi/ic_more.png | Bin 0 -> 309 bytes .../main/res/drawable-xxhdpi/ic_public.png | Bin 0 -> 1214 bytes .../main/res/drawable-xxhdpi/ic_settings.png | Bin 0 -> 1032 bytes .../main/res/drawable-xxxhdpi/ic_account.png | Bin 0 -> 1605 bytes .../res/drawable-xxxhdpi/ic_add_location.png | Bin 0 -> 1040 bytes .../main/res/drawable-xxxhdpi/ic_ahorros.png | Bin 0 -> 611 bytes .../main/res/drawable-xxxhdpi/ic_close.png | Bin 0 -> 603 bytes .../main/res/drawable-xxxhdpi/ic_gastos.png | Bin 0 -> 427 bytes .../main/res/drawable-xxxhdpi/ic_money.png | Bin 0 -> 1040 bytes app/src/main/res/drawable-xxxhdpi/ic_more.png | Bin 0 -> 411 bytes .../main/res/drawable-xxxhdpi/ic_public.png | Bin 0 -> 1648 bytes .../main/res/drawable-xxxhdpi/ic_settings.png | Bin 0 -> 1374 bytes app/src/main/res/drawable/head.jpg | Bin 0 -> 18988 bytes app/src/main/res/drawable/icon_wallet.png | Bin 0 -> 5410 bytes app/src/main/res/drawable/profile.png | Bin 0 -> 1394 bytes app/src/main/res/drawable/side_nav_bar.xml | 9 + .../main/res/layout/activity_dash_board.xml | 25 + app/src/main/res/layout/activity_login.xml | 119 +++++ app/src/main/res/layout/activity_sign_up.xml | 77 +++ .../main/res/layout/app_bar_dash_board.xml | 34 ++ ...tivity_main.xml => content_dash_board.xml} | 7 +- .../main/res/layout/nav_header_dash_board.xml | 37 ++ .../res/menu/activity_dash_board_drawer.xml | 42 ++ app/src/main/res/menu/dash_board.xml | 9 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 1824 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 1274 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 2511 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 4195 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10486 -> 6218 bytes app/src/main/res/values-v21/styles.xml | 9 + app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/dimens.xml | 4 + app/src/main/res/values/drawables.xml | 8 + app/src/main/res/values/strings.xml | 20 + app/src/main/res/values/styles.xml | 9 + build.gradle | 1 + 77 files changed, 1573 insertions(+), 19 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/example/kenneth/smartbudget/DashBoardActivity.java create mode 100644 app/src/main/java/com/example/kenneth/smartbudget/LoginActivity.java delete mode 100644 app/src/main/java/com/example/kenneth/smartbudget/MainActivity.java create mode 100644 app/src/main/java/com/example/kenneth/smartbudget/SignUpActivity.java create mode 100644 app/src/main/res/drawable-hdpi/ic_account.png create mode 100644 app/src/main/res/drawable-hdpi/ic_add_location.png create mode 100644 app/src/main/res/drawable-hdpi/ic_ahorros.png create mode 100644 app/src/main/res/drawable-hdpi/ic_close.png create mode 100644 app/src/main/res/drawable-hdpi/ic_gastos.png create mode 100644 app/src/main/res/drawable-hdpi/ic_money.png create mode 100644 app/src/main/res/drawable-hdpi/ic_more.png create mode 100644 app/src/main/res/drawable-hdpi/ic_public.png create mode 100644 app/src/main/res/drawable-hdpi/ic_settings.png create mode 100644 app/src/main/res/drawable-mdpi/ic_account.png create mode 100644 app/src/main/res/drawable-mdpi/ic_add_location.png create mode 100644 app/src/main/res/drawable-mdpi/ic_ahorros.png create mode 100644 app/src/main/res/drawable-mdpi/ic_close.png create mode 100644 app/src/main/res/drawable-mdpi/ic_gastos.png create mode 100644 app/src/main/res/drawable-mdpi/ic_money.png create mode 100644 app/src/main/res/drawable-mdpi/ic_more.png create mode 100644 app/src/main/res/drawable-mdpi/ic_public.png create mode 100644 app/src/main/res/drawable-mdpi/ic_settings.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_account.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_add_location.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_ahorros.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_close.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_gastos.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_money.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_more.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_public.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_settings.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_account.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add_location.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_ahorros.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_close.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_gastos.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_money.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_more.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_public.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_account.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_add_location.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_ahorros.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_close.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_gastos.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_money.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_more.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_public.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings.png create mode 100644 app/src/main/res/drawable/head.jpg create mode 100644 app/src/main/res/drawable/icon_wallet.png create mode 100644 app/src/main/res/drawable/profile.png create mode 100644 app/src/main/res/drawable/side_nav_bar.xml create mode 100644 app/src/main/res/layout/activity_dash_board.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_sign_up.xml create mode 100644 app/src/main/res/layout/app_bar_dash_board.xml rename app/src/main/res/layout/{activity_main.xml => content_dash_board.xml} (64%) create mode 100644 app/src/main/res/layout/nav_header_dash_board.xml create mode 100644 app/src/main/res/menu/activity_dash_board_drawer.xml create mode 100644 app/src/main/res/menu/dash_board.xml create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values/drawables.xml diff --git a/app/build.gradle b/app/build.gradle index 1e7424a..4bca751 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,5 +25,12 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' + compile 'com.android.support:design:25.2.0' testCompile 'junit:junit:4.12' + compile 'com.google.android.gms:play-services-auth:9.8.0' + compile 'com.android.support:design:25.0.0' + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'de.hdodenhof:circleimageview:2.1.0' + compile 'com.google.firebase:firebase-auth:9.8.0' } +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..8c82c5b --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,55 @@ +{ + "project_info": { + "project_number": "195337917179", + "firebase_url": "https://smartbudget-c306d.firebaseio.com", + "project_id": "smartbudget-c306d", + "storage_bucket": "smartbudget-c306d.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:195337917179:android:b67b1d269b5c818f", + "android_client_info": { + "package_name": "com.example.kenneth.smartbudget" + } + }, + "oauth_client": [ + { + "client_id": "195337917179-ta6qss5etnjf0oesjc4qvohaen2qffbf.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.kenneth.smartbudget", + "certificate_hash": "72bdcd44688b8e2af1f17d0044c3c1850eff0f3c" + } + }, + { + "client_id": "195337917179-qarnmufe4pd2q49dds7pp68120kog3q0.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAbVXuiKhp1qBGC7Vo0G-auyA4uUEPbQuk" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "195337917179-qarnmufe4pd2q49dds7pp68120kog3q0.apps.googleusercontent.com", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ef446f1..863d35b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,19 +2,32 @@ + + + + + + - + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..0d042660c3fb455cb74a30d7a8a78f6221269030 GIT binary patch literal 23677 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 { + @Override + public void onResult(@NonNull Status status) { + if (status.isSuccess()) { + goLogInScreen(); + } else { + Toast.makeText(getApplicationContext(), "No hemos podido cerrar sessión", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + + } + + /*autentificación*/ + + @Override + protected void onStart() { + super.onStart(); + firebaseAuth.addAuthStateListener(firebaseAuthListener); + + } + + + private void goLogInScreen() { + Intent intent = new Intent(this, LoginActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + + @Override + protected void onStop() { + super.onStop(); + + if (firebaseAuthListener != null) { + firebaseAuth.removeAuthStateListener(firebaseAuthListener); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/kenneth/smartbudget/LoginActivity.java b/app/src/main/java/com/example/kenneth/smartbudget/LoginActivity.java new file mode 100644 index 0000000..8d788d0 --- /dev/null +++ b/app/src/main/java/com/example/kenneth/smartbudget/LoginActivity.java @@ -0,0 +1,500 @@ +package com.example.kenneth.smartbudget; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.TargetApi; +import android.app.LoaderManager.LoaderCallbacks; +import android.content.CursorLoader; +import android.content.Intent; +import android.content.Loader; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.gms.auth.api.Auth; +import com.google.android.gms.auth.api.signin.GoogleSignInAccount; +import com.google.android.gms.auth.api.signin.GoogleSignInOptions; +import com.google.android.gms.auth.api.signin.GoogleSignInResult; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.SignInButton; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.GoogleAuthProvider; + +import java.util.ArrayList; +import java.util.List; + +import static android.Manifest.permission.READ_CONTACTS; +import static android.os.Build.VERSION_CODES.M; +import static com.example.kenneth.smartbudget.R.id.email; +import static com.example.kenneth.smartbudget.R.id.password; + +/** + * A login screen that offers login via email/password. + */ +public class LoginActivity extends AppCompatActivity implements LoaderCallbacks, GoogleApiClient.OnConnectionFailedListener { + + /** + * Id to identity READ_CONTACTS permission request. + */ + private static final int REQUEST_READ_CONTACTS = 0; + + + /** + * A dummy authentication store containing known user names and passwords. + * TODO: remove after connecting to a real authentication system. + */ + private static final String[] DUMMY_CREDENTIALS = new String[]{ + "foo@example.com:hello", "bar@example.com:world" + }; + /** + * Keep track of the login task to ensure we can cancel it if requested. + */ + private UserLoginTask mAuthTask = null; + + // UI references. + private AutoCompleteTextView mEmailView; + private EditText mPasswordView; + private View mProgressView; + private View mLoginFormView; + private SignInButton signInButton; + public static final int SIGN_IN_CODE = 777; + private GoogleApiClient googleApiClient; + private FirebaseAuth firebaseAuth; + private FirebaseAuth.AuthStateListener firebaseAuthListener; + private ProgressBar progressBar; + private TextView textViewSignin; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + // Set up the login form. + mEmailView = (AutoCompleteTextView) findViewById(email); + populateAutoComplete(); + + mPasswordView = (EditText) findViewById(password); + mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { + if (id == R.id.login || id == EditorInfo.IME_NULL) { + attemptLogin(); + return true; + } + return false; + } + }); + + textViewSignin = (TextView) findViewById(R.id.textViewSignin); + Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); + mEmailSignInButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + attemptLogin(); + } + }); + + textViewSignin.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + goSignUp(); + } + }); + + mLoginFormView = findViewById(R.id.login_form); + mProgressView = findViewById(R.id.progressBar); + + /*autentificacion*/ + + GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestIdToken(getString(R.string.default_web_client_id)) + .requestEmail() + .build(); + + googleApiClient = new GoogleApiClient.Builder(this) + .enableAutoManage(this, this) + .addApi(Auth.GOOGLE_SIGN_IN_API, gso) + .build(); + signInButton = (SignInButton) findViewById(R.id.signInButton); + + signInButton.setSize(SignInButton.SIZE_WIDE); + + signInButton.setColorScheme(SignInButton.COLOR_DARK); + + signInButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); + startActivityForResult(intent, SIGN_IN_CODE); + } + }); + + firebaseAuth = FirebaseAuth.getInstance(); + firebaseAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + goMainScreen(); + } + } + }; + progressBar = (ProgressBar) findViewById(R.id.progressBar); + + } + + + @Override + protected void onStart() { + super.onStart(); + firebaseAuth.addAuthStateListener(firebaseAuthListener); + } + + private void populateAutoComplete() { + if (!mayRequestContacts()) { + return; + } + + getLoaderManager().initLoader(0, null, this); + } + + private boolean mayRequestContacts() { + if (Build.VERSION.SDK_INT < M) { + return true; + } + if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + return true; + } + if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { + Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) + .setAction(android.R.string.ok, new View.OnClickListener() { + @Override + @TargetApi(M) + public void onClick(View v) { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + }); + } else { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + return false; + } + + /** + * Callback received when a permissions request has been completed. + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + if (requestCode == REQUEST_READ_CONTACTS) { + if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + populateAutoComplete(); + } + } + } + + + /** + * 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 void attemptLogin() { + if (mAuthTask != null) { + return; + } + + // Reset errors. + mEmailView.setError(null); + mPasswordView.setError(null); + + // Store values at the time of the login attempt. + String email = mEmailView.getText().toString(); + String password = mPasswordView.getText().toString(); + + boolean cancel = false; + View focusView = null; + + // Check for a valid password, if the user entered one. + if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { + mPasswordView.setError(getString(R.string.error_invalid_password)); + focusView = mPasswordView; + cancel = true; + } + + // Check for a valid email address. + if (TextUtils.isEmpty(email)) { + mEmailView.setError(getString(R.string.error_field_required)); + focusView = mEmailView; + cancel = true; + } else if (!isEmailValid(email)) { + mEmailView.setError(getString(R.string.error_invalid_email)); + focusView = mEmailView; + cancel = true; + } + + if (cancel) { + // There was an error; don't attempt login and focus the first + // form field with an error. + focusView.requestFocus(); + } else { + // Show a progress spinner, and kick off a background task to + // perform the user login attempt. + showProgress(true); + firebaseAuth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + finish(); + startActivity(new Intent(getApplicationContext(), DashBoardActivity.class)); + } + } + }); + // mAuthTask = new UserLoginTask(email, password); + // mAuthTask.execute((Void) null); + } + } + + private boolean isEmailValid(String email) { + //TODO: Replace this with your own logic + return email.contains("@"); + } + + private boolean isPasswordValid(String password) { + //TODO: Replace this with your own logic + return password.length() > 4; + } + + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + private void showProgress(final boolean show) { + // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow + // for very easy animations. If available, use these APIs to fade-in + // the progress spinner. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); + + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + mLoginFormView.animate().setDuration(shortAnimTime).alpha( + show ? 0 : 1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + }); + + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mProgressView.animate().setDuration(shortAnimTime).alpha( + show ? 1 : 0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + } + }); + } else { + // The ViewPropertyAnimator APIs are not available, so simply show + // and hide the relevant UI components. + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + } + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + return new CursorLoader(this, + // Retrieve data rows for the device user's 'profile' contact. + Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, + ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, + + // Select only email addresses. + ContactsContract.Contacts.Data.MIMETYPE + + " = ?", new String[]{ContactsContract.CommonDataKinds.Email + .CONTENT_ITEM_TYPE}, + + // Show primary email addresses first. Note that there won't be + // a primary email address if the user hasn't specified one. + ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == SIGN_IN_CODE) { + GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); + handleSignInResult(result); + } + } + + private void handleSignInResult(GoogleSignInResult result) { + if (result.isSuccess()) { + firebaseAuthWithGoogle(result.getSignInAccount()); + } else { + Toast.makeText(this, "No se pudo iniciar sesión", Toast.LENGTH_SHORT).show(); + } + } + + private void firebaseAuthWithGoogle(GoogleSignInAccount signInAccount) { + + progressBar.setVisibility(View.VISIBLE); + signInButton.setVisibility(View.GONE); + + AuthCredential credential = GoogleAuthProvider.getCredential(signInAccount.getIdToken(), null); + firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + + progressBar.setVisibility(View.GONE); + signInButton.setVisibility(View.VISIBLE); + + if (!task.isSuccessful()) { + Toast.makeText(getApplicationContext(), "No se podido iniciar sesión", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + + private void goMainScreen() { + Intent intent = new Intent(this, DashBoardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + private void goSignUp() { + Intent intent = new Intent(this, SignUpActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + + @Override + public void onLoadFinished(Loader cursorLoader, Cursor cursor) { + List emails = new ArrayList<>(); + cursor.moveToFirst(); + while (!cursor.isAfterLast()) { + emails.add(cursor.getString(ProfileQuery.ADDRESS)); + cursor.moveToNext(); + } + + addEmailsToAutoComplete(emails); + } + + @Override + public void onLoaderReset(Loader cursorLoader) { + + } + + private void addEmailsToAutoComplete(List emailAddressCollection) { + //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. + ArrayAdapter adapter = + new ArrayAdapter<>(LoginActivity.this, + android.R.layout.simple_dropdown_item_1line, emailAddressCollection); + + mEmailView.setAdapter(adapter); + } + + + private interface ProfileQuery { + String[] PROJECTION = { + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.CommonDataKinds.Email.IS_PRIMARY, + }; + + int ADDRESS = 0; + int IS_PRIMARY = 1; + } + + + public class UserLoginTask extends AsyncTask { + + private final String mEmail; + private final String mPassword; + + UserLoginTask(String email, String password) { + mEmail = email; + mPassword = password; + } + + @Override + protected Boolean doInBackground(Void... params) { + // TODO: attempt authentication against a network service. + + try { + // Simulate network access. + Thread.sleep(2000); + } catch (InterruptedException e) { + return false; + } + + for (String credential : DUMMY_CREDENTIALS) { + String[] pieces = credential.split(":"); + if (pieces[0].equals(mEmail)) { + // Account exists, return true if the password matches. + return pieces[1].equals(mPassword); + } + } + + // TODO: register the new account here. + return true; + } + + @Override + protected void onPostExecute(final Boolean success) { + mAuthTask = null; + showProgress(false); + + if (success) { + finish(); + } else { + mPasswordView.setError(getString(R.string.error_incorrect_password)); + mPasswordView.requestFocus(); + } + } + + @Override + protected void onCancelled() { + mAuthTask = null; + showProgress(false); + } + } + + @Override + protected void onStop() { + super.onStop(); + if (firebaseAuthListener != null) { + firebaseAuth.removeAuthStateListener(firebaseAuthListener); + } + } +} + diff --git a/app/src/main/java/com/example/kenneth/smartbudget/MainActivity.java b/app/src/main/java/com/example/kenneth/smartbudget/MainActivity.java deleted file mode 100644 index be46990..0000000 --- a/app/src/main/java/com/example/kenneth/smartbudget/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.kenneth.smartbudget; - -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - } -} diff --git a/app/src/main/java/com/example/kenneth/smartbudget/SignUpActivity.java b/app/src/main/java/com/example/kenneth/smartbudget/SignUpActivity.java new file mode 100644 index 0000000..96f2743 --- /dev/null +++ b/app/src/main/java/com/example/kenneth/smartbudget/SignUpActivity.java @@ -0,0 +1,385 @@ +package com.example.kenneth.smartbudget; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.TargetApi; +import android.app.LoaderManager.LoaderCallbacks; +import android.content.CursorLoader; +import android.content.Intent; +import android.content.Loader; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; + +import java.util.ArrayList; +import java.util.List; + +import static android.Manifest.permission.READ_CONTACTS; +import static android.os.Build.VERSION_CODES.M; + +/** + * A login screen that offers login via email/password. + */ +public class SignUpActivity extends AppCompatActivity implements LoaderCallbacks { + + private static final int REQUEST_READ_CONTACTS = 0; + private static final String[] DUMMY_CREDENTIALS = new String[]{ + "foo@example.com:hello", "bar@example.com:world" + }; + + private UserLoginTask mAuthTask = null; + + // UI references. + private AutoCompleteTextView mEmailView; + private EditText mPasswordView; + private View mProgressView; + private View mLoginFormView; + private FirebaseAuth firebaseAuth; + private FirebaseAuth.AuthStateListener firebaseAuthListener; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_up); + // Set up the login form. + mEmailView = (AutoCompleteTextView) findViewById(R.id.email); + populateAutoComplete(); + + mPasswordView = (EditText) findViewById(R.id.password); + mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { + if (id == R.id.login || id == EditorInfo.IME_NULL) { + attemptLogin(); + return true; + } + return false; + } + }); + + Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); + mEmailSignInButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + attemptLogin(); + } + }); + + mLoginFormView = findViewById(R.id.login_form); + mProgressView = findViewById(R.id.login_progress); + + firebaseAuth = FirebaseAuth.getInstance(); + firebaseAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + goMainScreen(); + } + } + }; + } + + @Override + protected void onStart() { + super.onStart(); + firebaseAuth.addAuthStateListener(firebaseAuthListener); + } + + private void populateAutoComplete() { + if (!mayRequestContacts()) { + return; + } + + getLoaderManager().initLoader(0, null, this); + } + + private boolean mayRequestContacts() { + if (Build.VERSION.SDK_INT < M) { + return true; + } + if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + return true; + } + if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { + Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) + .setAction(android.R.string.ok, new View.OnClickListener() { + @Override + @TargetApi(M) + public void onClick(View v) { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + }); + } else { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + return false; + } + + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + if (requestCode == REQUEST_READ_CONTACTS) { + if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + populateAutoComplete(); + } + } + } + + + private void attemptLogin() { + if (mAuthTask != null) { + return; + } + + // Reset errors. + mEmailView.setError(null); + mPasswordView.setError(null); + + // Store values at the time of the login attempt. + String email = mEmailView.getText().toString(); + String password = mPasswordView.getText().toString(); + + boolean cancel = false; + View focusView = null; + + // Check for a valid password, if the user entered one. + if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { + mPasswordView.setError(getString(R.string.error_invalid_password)); + focusView = mPasswordView; + cancel = true; + } + + // Check for a valid email address. + if (TextUtils.isEmpty(email)) { + mEmailView.setError(getString(R.string.error_field_required)); + focusView = mEmailView; + cancel = true; + } else if (!isEmailValid(email)) { + mEmailView.setError(getString(R.string.error_invalid_email)); + focusView = mEmailView; + cancel = true; + } + + if (cancel) { + // There was an error; don't attempt login and focus the first + // form field with an error. + focusView.requestFocus(); + } else { + // Show a progress spinner, and kick off a background task to + // perform the user login attempt. + showProgress(true); + firebaseAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + //checking if success + if(task.isSuccessful()){ + finish(); + startActivity(new Intent(getApplicationContext(), DashBoardActivity.class)); + }else{ + //display some message here + Toast.makeText(SignUpActivity.this,"Lo sentimos hubo un error al registrar tu cuenta ",Toast.LENGTH_LONG).show(); + } + } + }); + // mAuthTask = new UserLoginTask(email, password); + // mAuthTask.execute((Void) null); + + } + } + + private boolean isEmailValid(String email) { + //TODO: Replace this with your own logic + return email.contains("@"); + } + + private boolean isPasswordValid(String password) { + //TODO: Replace this with your own logic + return password.length() > 4; + } + + /** + * Shows the progress UI and hides the login form. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + private void showProgress(final boolean show) { + // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow + // for very easy animations. If available, use these APIs to fade-in + // the progress spinner. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); + + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + mLoginFormView.animate().setDuration(shortAnimTime).alpha( + show ? 0 : 1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + }); + + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mProgressView.animate().setDuration(shortAnimTime).alpha( + show ? 1 : 0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + } + }); + } else { + // The ViewPropertyAnimator APIs are not available, so simply show + // and hide the relevant UI components. + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + } + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + return new CursorLoader(this, + // Retrieve data rows for the device user's 'profile' contact. + Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, + ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, + + // Select only email addresses. + ContactsContract.Contacts.Data.MIMETYPE + + " = ?", new String[]{ContactsContract.CommonDataKinds.Email + .CONTENT_ITEM_TYPE}, + + // Show primary email addresses first. Note that there won't be + // a primary email address if the user hasn't specified one. + ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); + } + + @Override + public void onLoadFinished(Loader cursorLoader, Cursor cursor) { + List emails = new ArrayList<>(); + cursor.moveToFirst(); + while (!cursor.isAfterLast()) { + emails.add(cursor.getString(ProfileQuery.ADDRESS)); + cursor.moveToNext(); + } + + addEmailsToAutoComplete(emails); + } + + @Override + public void onLoaderReset(Loader cursorLoader) { + + } + + private void addEmailsToAutoComplete(List emailAddressCollection) { + //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. + ArrayAdapter adapter = + new ArrayAdapter<>(SignUpActivity.this, + android.R.layout.simple_dropdown_item_1line, emailAddressCollection); + + mEmailView.setAdapter(adapter); + } + + + private interface ProfileQuery { + String[] PROJECTION = { + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.CommonDataKinds.Email.IS_PRIMARY, + }; + + int ADDRESS = 0; + int IS_PRIMARY = 1; + } + + + public class UserLoginTask extends AsyncTask { + + private final String mEmail; + private final String mPassword; + + UserLoginTask(String email, String password) { + mEmail = email; + mPassword = password; + } + + @Override + protected Boolean doInBackground(Void... params) { + // TODO: attempt authentication against a network service. + + try { + // Simulate network access. + Thread.sleep(2000); + } catch (InterruptedException e) { + return false; + } + + for (String credential : DUMMY_CREDENTIALS) { + String[] pieces = credential.split(":"); + if (pieces[0].equals(mEmail)) { + // Account exists, return true if the password matches. + return pieces[1].equals(mPassword); + } + } + + // TODO: register the new account here. + return true; + } + + @Override + protected void onPostExecute(final Boolean success) { + mAuthTask = null; + showProgress(false); + + if (success) { + finish(); + } else { + mPasswordView.setError(getString(R.string.error_incorrect_password)); + mPasswordView.requestFocus(); + } + } + + @Override + protected void onCancelled() { + mAuthTask = null; + showProgress(false); + } + } + + private void goMainScreen() { + Intent intent = new Intent(this, DashBoardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + @Override + protected void onStop() { + super.onStop(); + if (firebaseAuthListener != null) { + firebaseAuth.removeAuthStateListener(firebaseAuthListener); + } + } +} + diff --git a/app/src/main/res/drawable-hdpi/ic_account.png b/app/src/main/res/drawable-hdpi/ic_account.png new file mode 100644 index 0000000000000000000000000000000000000000..bd220a95a68977ddfe69a43f8232d86723743fca GIT binary patch literal 605 zcmV-j0;2tiP)%X@X)OR8Zmr zBg99dp#O!jFy3Bf?k@N!eh_lE!|!f)W@pdmJKXdAD*l5|04#zO$bwr?A#UhDbuCKw z)=ek`cEJ;PXYvTrV9-mUW{?1{0+DLe+lvFgTcIF0bs-3Lf1Ic=jR9|m`^!lGu;tpjE!1CA!at2jO;X-*=N`Z z?J}P%!4TSH#!Bgg+66@~?x9c#v{?x)3Q{-25IPdXTd)#J3F}G3MrKwRD`_Q^6$UA4 zq?F8qFqUa0bnCG4nzUXvh0|1BD8C6+>ab04DgOzfn;#S^xLMSylJA2hFbO(A1JMPh zz%n=hZ*CTKt+ZD~a}9I|x=baw4xXK)ebi>a1sHPCybps*oA~oqLILW5tp-ecaH5#C z**aQvn`>G#Xxsy#2~F%ByWM_Jlm2d#yB0L zI`*7s0;p_R`7-BvR7DoLq8~@)2tGe<5MId&Hs)xmD00000NkvXXu0mjfp(p@v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_add_location.png b/app/src/main/res/drawable-hdpi/ic_add_location.png new file mode 100644 index 0000000000000000000000000000000000000000..a71140620a79a83e0fc1ecf5fab4736d8efeac2b GIT binary patch literal 422 zcmV;X0a^ZuP)UTQmt6NrzI;TRY`0>m8DbkJ-(mK^}%1}Hv&N8NO4Imn8D?;DWR zHsDeB4~WgF;h@b_a?pQh4y4FILO}e7iVpe>!~&E!$cKmoONxU)*ozVe6=E@v)Upd* ze?BD+s-b~{swr_$E)5)%O^Jg%Xpn~7D9vSmspue(S%Q?7Lx-v8po7#X7_+G8pbTm_ z2vo~|rb1oznW$Qy$ehwgK}`?Cz0|DjC4u-G1&;X&HG`@Rv~~&{)JlsMBPjl#k>Qx9 zv}iHHa3mQHilB9`V=D=c*+P$QkTej#C&DrBpla#TFN+|;LE-f7xz5Amn7ISdmF5EC z%UB$95!!7UkiNYt5Pv{&3@B}>4D?`wC$w4d2g)84qaUDla^C20%!qUl0Lo@{P5c(w Qg#Z8m07*qoM6N<$g0hgb=Kufz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_ahorros.png b/app/src/main/res/drawable-hdpi/ic_ahorros.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0e30cdd33c2bfd7d43f4f8ef4cc3a617b186d3 GIT binary patch literal 270 zcmV+p0rCEcP)35s3fO7;nJlC~OY$r-Nf)*pCa2{dSrW293(i{9E7ZolC(7Hph4rHOF(>i zusA3NNiJca9drqcxmO3$L6--cgZ@LK2_~03SQ7PB0wFV+?MEHNKiDeQLD&5F33Zgf zU~v##ny~eQt&tx}>89j9YyAvu$VlnVb(BO&*251M%QfpVaE^}VSnjDi%Tph`f4 zi;gICksL)plZ(}b1yLUJlpJ>!G)SUNA{Vt|_UG55nL0}7i$6XRZgSlLn4|%vj1oaX zn4FK=Cz^u-bEE)_$zAp-C<=r0A)j~&3NCV=#-NQchN3Y{r~Wn@G=|+eVkpaW^=3d- zy|UP9vS)nMzm_($%|M`(K0~8QVvubH0wEn3M*Zaok+992c0dbJKG&6fWn;l3?5)W| gzW$dfNI^}3-X)S25r6r#ng9R*07*qoM6N<$f^vRxi~s-t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_gastos.png b/app/src/main/res/drawable-hdpi/ic_gastos.png new file mode 100644 index 0000000000000000000000000000000000000000..61a5cc87253aa5602575c519bbcc25911bb960d2 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7J0fjhE&{od*dwU0R<$~y)HNK7u*;_e$1!f;E7p#|SN-{aUZT7?@5fkncNj7Q;4;~+}*}k-C zUZ482q;rwZR~_OQf*)xtP~hMa5#VTgAim&>m18E0K#fV5F$cXI|k1|%Oc%$NbBsytmBLn>~)y<*7KU?AXfG31zb zg>$vOlEj{6o_Yf26TG(FNDKTRewp`hG!y6PU9I}63`{H>0tyZdbv(0FmoM?^Qt@0A ze4OQ#^4p1rS0*!srfOK1`Yc$)6YD1{tfA?=8z|THcWdA8TG%zp%4Y&}! alkw0C4XzW$`+I?|VDNPHb6Mw<&;$VL4m*9E}4CgF_YLpK$ggghh>-h=5^q0S(5{Sr@|OA8-*hAp(v% zfEv6eM{+sZx9{7JL=%Q5fpWb*ZSU<}@%ip5zCXoS$OEAWkOqoC1Ly#Kq=VZEKne(Z zDU<+mz&kLIqzhz$xZ6S*Jo|x7-T=)Fp&(GUDe+~nt%x~o3F$lDIJheMty%}3+4h=H zN+48rAfvN_d7?m-{Z>*H$~cs{2K+4N35(HWg%XMde2=$BXBV%G-{eFuS)s>egmN}& zMRv7DSxxO(2}Km2Gpa(o9J(V9PZpfEQ7_wyLII#j_FonW6(t0|36H>>jrMau^5sQB z4H9^3BIHIBT_XAFA|blErm#M|5Sk(R+9IJo2@K#iE)|l%N+?Y7^<;%;^=B0e{S}xO z2!&*Y=q;OOzo|;?xN*y9Q7;-K%DVJ?k}m233EVeHmUThski?yegi<8%i4->H!hukb zwU4A#>*$i;H3wHIXR_ipNla%X#^PX2Y=}H&OQDuNfpcI2n8X!mUibzFi{of8+^J#^ zGYfnuuDUavlZM}0KumT((^#@&gO~;20r;^w#I351u)NV$4bMpZ`83*46^8s8OQf%k z4K}2!3S9|SuheT$$sp+qaD+>?pm=2hZoDXJtk6|ynbwShSLry;z+DBA4leDOmwz^d waqP@vA8KRA?&0S;wu7YPC^G(k=zk0S0?qT|=S4{DTL1t607*qoM6N<$f*>{wvH$=8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_settings.png b/app/src/main/res/drawable-hdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf37b9dbbaed733729dc4f3fa9fd6d588687635 GIT binary patch literal 561 zcmV-10?z%3P)vGb0Z^>jyKp8tfWCiII!=ip1j>0byv*$6$l zE#w778=*XCbW>>1My5n>rGP)rz)r{TGff zPG@FkS0pb!SlIu}H;!}8T2}wr+AIGpNP{})0v{}h@VNtOlu0Bgg9%tgFb1VKf)sc( zSXjoR+DHMn_zbup1G1n2<_d{cP*&{DWj1oJ$QD(CwC2n+jKEQ3N5JL;bIYCDX4M5Idpyk1vRQtjSYEtMt#?-u!YAdQn8w;V^7y?(Q^Hq&z(Nx?7 zf54r=;$e^c3UxP8!_Jd_ZVz06BO!APuEDF6eJ~x@9&@PBbDYw?65&n_Qo+Ub$RosoFZe#L3=3tAm*aaux)OWkfW9C@^5OM_PH-E1w1 re?s$F8%3^hDjfdXRzBCKl!svomv)-cm)V^_H!*m+`njxgN@xNA^596f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_close.png b/app/src/main/res/drawable-mdpi/ic_close.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc768cca267928c8003e8277e7d643776a1590c GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjvproLLn>~)o$AfipdjLUw`HB< zuQ&Be4vQ_=Hm|CwvEyc~qr#I1=RV1tJsq4A)vd4GwjlbTm!Sx!gUHdKv_1tr3ypt{ zLJzBdT`OQQIv71k=G{B9OIB4e0zwKR3> M>FVdQ&MBb@0DX&Ax&QzG literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_gastos.png b/app/src/main/res/drawable-mdpi/ic_gastos.png new file mode 100644 index 0000000000000000000000000000000000000000..e49bc7157ffa5b5f4310e852f6257c03a075e3c1 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj5uPrNAr-fhC!EnpTcDaIQ6|R1 z^wC@4pTAli>ydvybQT;bkf`fC-}FD^Q1f-BpsT$M+!v0z>nhx2a{A?_yWmdK!f>&@ ti<%zle~5hGpE#Gn=uUaX^^+mT8Tgs4mTckkQU}_>;OXk;vd$@?2>>tQG&KMK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_money.png b/app/src/main/res/drawable-mdpi/ic_money.png new file mode 100644 index 0000000000000000000000000000000000000000..180ba7aa13ae27cebb31a061594d724b018dbced GIT binary patch literal 290 zcmV+-0p0$IP)__dQf)#4$Rj4Ijfmn(bWswjN ze}Y<)Nv;L+pav|&A%7bxUq!A3-cSR6191vcM&ktHGNib0p;l4x3y5DqErf|JphhIS o1Mx<*q`D1=Lq_X^(MlhT0UF?R{S%ERmjD0&07*qoM6N<$g0B;EMF0Q* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_more.png b/app/src/main/res/drawable-mdpi/ic_more.png new file mode 100644 index 0000000000000000000000000000000000000000..1da2e97cf09fa1a81c15c683910b100cce636af3 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjKAtX)Ar-fhC!EnpTcDaIu{GgJ zQy@3nu_gtDI^HAe8*a>JDx4$MAo9Qc(R7iH$6FqVPHGbeF%HPT5}J?{&vnFo^2-&h ei^X`PxfxERc&%IAe*P!WTn0~9KbLh*2~7Z_OfKmF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_public.png b/app/src/main/res/drawable-mdpi/ic_public.png new file mode 100644 index 0000000000000000000000000000000000000000..420b91f37184c8ca9cc2614b3e53068ce6425188 GIT binary patch literal 407 zcmV;I0cie-P)q@YK3gS{)g!&8o z0?%>&D#b27NN48FH=URF5=EE&XsP_SpbFYx4013h#q$WXxaL=a26zGs2UBnmB3J_# z9vc_ji06#4PJ!>{&!7T2;6q5Pf=0mRJ0fmdNa`j*)#J`>IXmK-N08_QZI6@N1jTjT za^0a$Fg9%ZNv=HJ`(wrob%LCey?|4z)EM)i6U;dogH#A&13E#%n3+vbCMb2}<2qDO zUeUT3O9PX>!SRVsFydra2}%P5CmbK>1T9hi6(!Ilh?N#|&+(?I(576_Q3S6R$s5=M zr~I9p3N2z+T(Io7#P}|Fu}I#T*y4HL)$B4M=_=Rds`PW;cAbf!JO2Gm$L43g?YgAS z#^pM7{^ME#KA8y{*O28uBNM)g&2I@^#gG1<`2xvI^SQq5gw6l}002ovPDHLkV1i2O Bx^(~m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_settings.png b/app/src/main/res/drawable-mdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..85e27970411a1cd0dc3cabb25d4111a087791c5a GIT binary patch literal 384 zcmV-`0e}99P)7Z1O$%0Fv0yPZEjWY4g5%^^zy!p{fOt0$hXAoG)TMv1Snvmk z7XYy|5QhQr9w0sh#EkeXNJcZ{9~OiE6HpU}%K|8jgvJj{Ei({L!J+m$5QpQ615+S=gvI4dSW*Zx7N0x-Vq-$d zv=&WMH=bnJi>9`mn0$b4K@T-8ums{KXqs+7g9BYH3lQHzQws`SGh7zL1MyEB5jO?R z5|H83ai|3)lxS=gv=c~rH=se%i^b*WxCxsDyg>Y%3KzAdw11MGU@31{G8X zfp{Ab`vb8g5YL4cZ0H962I84OEDpqhK)fA@_Yo@WXkJ|7!ppH(u!x!#ltY6FhC#to eG^8qhvM~UA&;pUGVa%lf0000WdP)^ zx0&ii8;!D>5zGD?mJoyOv(`R)&rEn8elX0LS!?~z*?X9Jd23sHjj)(+(r>>2F4*E~l1=N8t@Clp<`3RnZ+H44@26J?GPkfRBQBajB0exWK zLg4ABWfpNMpa3j52s|D2G{Uw8lz{aN1b@mZ`LrUSKp6Z_Fb?2uDz6A6M?|ePuhBQ#-;o7}zDnO;m1A(J)K|+`m*!>JDO$5vdH(rxK zK#S1!tW-dqL6IsF2q-ovc2^_<#tc%QO96@}Tmkupy^UlEwHnx087_|_pwqDUJQoO< zGW5~L5in|KTotKnjNluEY4mS~IRch_v;ZGGL^KKuSvpG`0b4%%m?X6gEwovSY0Xdi zxbvrMas(tY*tAL6;|Ms)VF9UgA;88GItDTDmWb1L8CgOmoA^6;2?oFoPT=2j1IGqazGMKfoZkU}3hSPF;_fPh^NApu@w+H_+~2 z%GL!AJ$$!vn>k&z9B?=)e5mmo<2G}OXBtCg4h2+b{63bP2WmC-;EqE9{hIcqMtY=- zY7XyR4uZd>8M{oIoQbP6MeU1a5#8YHKYZ6rWah+*eaz#)f)XrXLE&BC5L#(gOZfhQ@?muKT8-&LBJ z#SH?FQF~C6E3aAGXl}Da2ai2^LMi&ZN!Ny`tIP{tbO!|4)+@ZlW)`;iny@qcUow-OIVX`g*-u28SRfW~M<59%K^_!91^ALzZ~->J zxO~-a9)rLxjr&FDdnajL;FtXS|B&kVWRVp>rUSa!KbCXND!|Aaq?LX$5g>znOr zo~fvGDf>aSDSTCa7O6JtH29TFMYT`7B#9f{u|O<9#2>WH35(F0k0$^C002ovPDHLk FV1kqM*|Got literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_ahorros.png b/app/src/main/res/drawable-xhdpi/ic_ahorros.png new file mode 100644 index 0000000000000000000000000000000000000000..469bfbca97f92f975d5d1322d37f3558057c91aa GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt-<~dxAr-gY-t^^bG7xA>{KirG znzN@|v5J>dO>d8ceYxSiLjo#~xZ0QG_~a%zS|{&2x_fn@oT_W)hFkNQPO<`xI8e`Q z7UF0c^8azvs!PTejBVoAv{(Gn{|h-wnf0pj#knN}cbo68bYb|AlE>$u{r6$s zQH}}Tb`N$0z1DR1S^AHwHpXmcZpEA+CZN`T)lA5I_I{ z{t0jiXuf=vyd-=xT>Ad5v}j2w3>iK5zs94UcGKDMVi*JgO7-Zy+e)k)y;Of)*Y< z3#AaW@Qh(D_G{C^v!>A$VrC410{qfn$Yngl_R|1+uS&~Au){M)aR?x%Ng<|KDBwtk z?a+ubzNDZCbJCYo&J+s;AP2J^fjBEX43Tr$Nb0IF#K2l?O%)bfp0(Jjv05CMt3_?6 h1rR_00R#{LT@M=6(**4?Spon6002ovPDHLkV1g@fgQWlf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_gastos.png b/app/src/main/res/drawable-xhdpi/ic_gastos.png new file mode 100644 index 0000000000000000000000000000000000000000..f77c4c2f5dd4dfb9dc4d2bfc78926cf8c890f401 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtg`O^sAr-gY-t^^jFc5Hf7mFkmR#PGW} zxb5J2Uqu&=1W}&)XGsikf(d<$YfdpSEHF86`8+cN!-4yZ<=25ULqnd!tKUGHfx#h; zVYv{)KE4Pq`#Z8CjK3y{%PbCAzGlXqkDSGS%xW_#woL)5I&q(E=7LwvrzPa`L7F^W L{an^LB{Ts5@ytyO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_money.png b/app/src/main/res/drawable-xhdpi/ic_money.png new file mode 100644 index 0000000000000000000000000000000000000000..7efb0f765f59526528745b6187e32fd16eafa690 GIT binary patch literal 534 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 KMNUMnLSTXndhyr* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_location.png b/app/src/main/res/drawable-xxhdpi/ic_add_location.png new file mode 100644 index 0000000000000000000000000000000000000000..dffe7c0b2ba65b6b7790e2d7e746cdca95a4c788 GIT binary patch literal 773 zcmV+g1N!`lP)kBRWNj^ zih~`kidIArq+2x#8Y_)e`+49ANT@c+JJ7Ya*Z{gP^0mYO&=_N&H`GAUBENY01+?#Z6u=`;v!PS7Eg)4BCD4!npg~HY zX#qf=D1kOS9K5OicmL~@Kq&!0yOcl~0YJYgfqn@9%1{FR5CD{-1o|cbXq6J^gMicg zM@pc60YC$kKo11~J*EVT<#{Hf0y;sJ)WaQzOfjS ze$Nmn!D-O`0Yjjs2(#;A%M30WW?SZX;jo<%&~uJJrD%%*&NeFJI(gwG1E3e2XLqPa zZj%sa)9ACu()^$nLZDVDGt3qVaK1{Kg4c-7eZ)D}_bF-;=Q|&PCM3>sy_x4_A+M$M zeTkeW-R%QVm*k1$C1}nf&U_G-BHTg87I2QOP9XPrtwxUppq?NtW>GJ-F9vaD^)>^w z9O{;#*=TATw}ZM~EN%cO9`qH5;~sFv!>}YXrYAKOinFF~8;UincTu_koV318s8&6< z6#(=stjoe*=YcaC=5_OG^l#xBoCV_}gaUt9pbG8$17}D7&;9a(UUZVqc~ic}V&9km zsh*-U-4izZ#Ry2%hk9A<6Eh(9<0cNs0XZO-1IoX@fWFnJ>msIy00000NkvXXu0mjf DFxyzn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_ahorros.png b/app/src/main/res/drawable-xxhdpi/ic_ahorros.png new file mode 100644 index 0000000000000000000000000000000000000000..bf53bb4f4b1e15075012d2729d4491d5da3cfe97 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U~KVpaSW-r_4c;E-ysK)hQhLt z`~(xZh8Jv)d3jo9?@$W$bNq0Ap~8#^L$@zXyTZj)PH@Q=N}0V4C{^2*zwhYwoJ;?h zjOQL${dUf`tSRyw42&!S4q)PF*OG``Q`0VOQqo=0S&}yIAoqoRCTj(};#Q~MDCQN> zJm^_H<&|DzlB-4LM(+hKiWla3FPQ1HV5j$jrI#3(G#D0KjVe$yt^XwyzRWx`-a*~uFKGk`~{37Ub;#KwlVTEczhyAycyth7OhS~d{(PYZ6Wr7Z`?=6|!^E&F1 zwZlz|%(oXB+gRU~$`}RgKd_e%X#DoT#_GMCwG;Cq*S+1)U7P>(t;`($hHJfNtBijf zzTUN%4dMv~#v}agsw`GaC+>+le6w51-0)_vS35)Qyu~}F^)1b9_#v$Bz>vBnLFC}Q zy-o{`s0R2e23%LYFzw44j^_uzI>cH{`niN9{rdBO_d6xsW{2lE`klGH>fK}4i5m-; hI20NfKm^lk?wG_j{{(?63xUzX;OXk;vd$@?2>@42x2XUC literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_close.png b/app/src/main/res/drawable-xxhdpi/ic_close.png new file mode 100644 index 0000000000000000000000000000000000000000..595e007e11a6fe75631bb3eccb10d88db5b1ca1a GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V4Uvh;uunK>+Nmtb%zXiS`*#& zMkngqn4NNF+QoK_W$`30g;Ix|jTUz6e(|5X^Y_Z68=T#*i*_nJW@J=oU|`|^5giOH z0uBs}Cg}@uPw6ccw7U?0N-qE< z70P=LODg3~ariy)P@HAB+pm_-r~Ejt*a(VvSXvy--{`uKOGRAfbm$r3lf1{PuksW+h zotq_&7m40x+0B;IblA1%Ul#)?@IWCb2n*1Rx=IG!li@*G%l>`^#uS66tDnm{r-UW| DU2eIp literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_gastos.png b/app/src/main/res/drawable-xxhdpi/ic_gastos.png new file mode 100644 index 0000000000000000000000000000000000000000..a80c27bce49d135dfde72ba00e037f2750906ade GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!e?46sLn>~)y?vIe$w8v+VptXL zRo-nAo7QcT*VsK(;m%E+W3jG>IDQq1oe!JCeC|~F)_bzyzvNgP8WzaUK8w literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_money.png b/app/src/main/res/drawable-xxhdpi/ic_money.png new file mode 100644 index 0000000000000000000000000000000000000000..45d1804ac6e6af0b1836240c416b6739e86dbc52 GIT binary patch literal 801 zcmV++1K#|JP)UuVoW0jtd!4eH#;s)}97>=d z3Zftiq96*QAPVYT27!MD{!kDFQ4j@D5C!!+K@&ly(^^X@4|HCP8;DKUP62`&n{Z8(vZMu=4fZYl9jxF)F9@Z>Ct z5px9i5EAdJ@)Y(Ko!D!zF1^LS_MN&|#j`6)|f6j2!e*#TXj(91kUb0+MHvJy#1CxEc z_Sqb<_wHjf^STilPSdCs0iBS$`cfJ(f2fk*xMCBJ6sWTwuHy=RVDTsR|Kt87SWj?^PO#| z;ikAEC}^X;RTgp=jExv`mZ1!J?phwyU`Xt~fkR-1GQv_JJ)ko(il@bEb}>a{1U&<2a1Pw7vWu!q+(2jGtSgkD42wq{suggk5XgPS9l9=Gt+n>db zVuftpcVf0&UxU4UaVy&wHB}8*YuSI^1g1(ejh`a$Qv?d4APS-&3gTzs6huK3L_rip fL4<-RC^`QDDB~RJ?sxG500000NkvXXu0mjf=g(x# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_more.png b/app/src/main/res/drawable-xxhdpi/ic_more.png new file mode 100644 index 0000000000000000000000000000000000000000..d94699809c5588ac357436bdf4eac9ede700836e GIT binary patch literal 309 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�s*4ELM;eM8jVluNRL%3mj7b0000Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account.png b/app/src/main/res/drawable-xxxhdpi/ic_account.png new file mode 100644 index 0000000000000000000000000000000000000000..a73cb986bda9448494d9804ac07a54eb4fbea30e GIT binary patch literal 1605 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 KMNUMnLSTYF&b?Ov literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_ahorros.png b/app/src/main/res/drawable-xxxhdpi/ic_ahorros.png new file mode 100644 index 0000000000000000000000000000000000000000..20ac16e509436347a4265bc59f97c8c6aa47d495 GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VAAq*aSW-r_4cm6-ysK)hQgHQ zuWT_4$vrLh>w4Q010P>X7U1DF-0(rCt%BhZ7nAl!zJ{DHzD7dAva_z0#d+;Nx?T0< zZ_!(R3#Y7l7~APr>m>DFQ_IRdO$Gwh;Vw%8vKr88oy`UMx z68;Ol8+*Tl=$?(exeS-sJBs5K85kOxnKO>wIOYu$cmbsC7+x~3d8?Ur<#lX<)U3O$ zH;kAL^8BC6y)kFH(zS0k`*ZoXHU2&Ge)*o~%m&&h6i_+m15`_@7~FV9*d^;Li)KD|kJ} z(R%hT1_`5#bbdPqDV|%Aci9>GH~in-xSo6CdwGK%$zSW9FA0D8e`gP0h5DOse~x%7 zWv)q|k=*q2dB;p!UhP9GpIwnFcpcihRpHV6FANF{$mr8e@gIk_u~dY*JAfSP>FVdQ I&MBb@073ugFaQ7m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close.png b/app/src/main/res/drawable-xxxhdpi/ic_close.png new file mode 100644 index 0000000000000000000000000000000000000000..e22f1030961c60eec30256b122c6b2956bea5b87 GIT binary patch literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U{dmQaSW-r_4dxe!b1ikEs0VJ znazAT<$Sy|rcBPoFRt#GEd5 zIH76(BwD&Ok&ol*>HdA(L2eT?_8%#3P-^n|xpZF3RDmU@^mmF)={EQlQ1|laj*Uu9 zDL+laoU;{9OpDL9+@;b~^3(J?vzNk&>G9RhYT}7mYin9%H)=8*Tvjtx_oS}inp5Go zgzqsOTvxNz_h-3)>+uT@|bcx7A$TIAxBL`14OwpEnf=+BNrJLe!brGM6jwt*F$RI^zuz9f>l-O z+C^faQVyAU=|RpfUbR}dw%j{4-TB4F8qJot)6*S0cC1)@Q!n%!`?D7e8{}RV&AV;A zF3r|9`~4^B4?G7y9#}Tv)8h9{a*7smkz!$WozELY5B|NdZ}0EP2FJt945V-6XaFM* h8f}>I>5)*!`0Ik##x16+gn{wQ;OXk;vd$@?2>?=F`9}Z% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gastos.png b/app/src/main/res/drawable-xxxhdpi/ic_gastos.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba39c5703516531eb8759ec87ed22e1e80d9dc0 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U@Y=B_g)uu`CFg#5e=qp5M}x3a^v~;o*XutmcP{_aoxSFhvEqH1 zjj!w5u6_tEzHMKSe*N8ZBUAI2j6g@jgJ{Ka{c`?Qp#`NgszKI!y85}Sb4q9e0N8nr A5&!@I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_money.png b/app/src/main/res/drawable-xxxhdpi/ic_money.png new file mode 100644 index 0000000000000000000000000000000000000000..838e4a6f112235cf8beb94df17d99ba1e7d3603e GIT binary patch literal 1040 zcmV+r1n>KaP)0w4eaAOHd&00JNY0w4ea`n7;zM5%#* zNf2Pp5MmvXBED)SKa)0MJ23_VWE2v+iI*Xg-WQ*U1H=dj_&aNe=av)S8}6qs zM7`t0XVOjVf`DJBA))0zCO?zCz6&UbF!?=H`z)Z=Flp)o-AtS%>X-(W`Bw8;YKB$p zqkyHFiMmH@Bc^0|Zaz^$9MPD*Hv1@`RhXO)L=`7iH^y}0jxbKCPXgu%lhR4d3>j+_ zzdhMvrF;^wUyzXR#4=0q=JWIZ6|ajJ?TY}(%%{n6%u9lpmA(jgB}m2w%Q342F%SA8 zAT3D7BFiynMex?eRzSBP84Dd0`O;aq;fsLx5ez}t56GZRAm9oFxZ{Ly9k3As+|~Uh z0@U0*0Re8d8#^`XKo^Or5MY-bn#DNvHk@`aJMvb5+6%aASdLbIw}>_5T47Aft$Tcv2Q; zO^S0Y8Ui#+8Ow=%#B~dAM;!!&Z*Q#R<}A~nO4}~XI@-4=k zBP`k_eGsryxF||ms@G2-9tdNW`yfD7FJB82ay8^J(lVY}N_WZz`?3zG4)m@TP>ZOw z#8||L#P=;pbtPGS1j+B<=_$G*m{ks&vU-2ilRN~XFQ|`>2X!gO zV+V=v;x?36wzbExDQhKhhIkXQV_Ho|)x~`QdPB`ntKkxZVP-`T<4gMb+lCA-ZiN5{ zfB*=900@8p2!H?xKw}oJDgY1w0RRFZ06+i)00@8p009sH%=rngVowIN9!fL-0000< KMNUMnLSTa8J-k!^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_more.png b/app/src/main/res/drawable-xxxhdpi/ic_more.png new file mode 100644 index 0000000000000000000000000000000000000000..2188b19c012a1982c7909ee3d61857a2e13c3ca0 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U`+CKaSW-r_4cNt-ysK)hQzXI z$`u@!3$(w>vHC<7h$Y*!u=p`amw2?bOg%AW<+Sg*|K6VVvG-c`_Q}Vesf+fXc4c62 zU|`??n#7>Mz`(-Lz`!8Dz`%r0@UL(~WY)}E%f9XOUFE&?*>&a_%feQ!m$!Oy)|Byi zIID%;zsH9jov+?sB%C}yUN)ih=p+Bq#%JNIGemX%l~`|Qd=}0gA(r>xMs~x`tBl)h z%{K5E?6*3w?>Ji-<1^+Rtk z>Pj2b?C1S2`AsJ#D+a~0Fk?$Rh=pfh;7`njxgN@xNAuX2z- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_public.png b/app/src/main/res/drawable-xxxhdpi/ic_public.png new file mode 100644 index 0000000000000000000000000000000000000000..1c81445508edc6a9faecc6e34c1174617e378602 GIT binary patch literal 1648 zcmV-$29NoPP)&-A26g|`60#J#KadPF^X{I zXEdoq1k@KE5U5W^&^H4V(v)9{G!;Y0GTxZ+G^bIlHs>?8En^z31-EeD2w^ zJF~MVin_a^AcqQ02mk_rpa38M2nqlKfS>>%u4d3e&|1(gP&cRtGyoa|-9-)J-_-w( zfOg_F>e{9NfUdEirJ(JgKF~cT^@6s67K0iBfPZTg{!;gXZZJB%lCFdHfEHlexdkvD zQ~;f`;Pgs53+e!k%M$=K1ayLab?ErGE`!#A>Z={Va?nqL93R&OPv0uR+!)0C5pCQ!0Q~51c<3>+?j=X3(F85T;85Fj@GpQ`U(J z{eKp8+Hg2(lmej6qX+K$nn2(u2H$m*Wp=~>;3H3*uZEdf1bbdJ7?O6l2C&kjspKXD zyOw}%62EtaD*)3xTH&fB&HaYmp77+l2twFKA!qQB7Yi17Lyu@0dC9QTt|8c5h<(KYU?(vY;R^?%IZM7AQi#&qB31FY5 zt%8kkbbks1ik<`bIrZ)cLL*HCqh@#nfy?<%+DgbM^`?${%YncJV70B3WQ1|;ksAAs z!JwjN0FG(e*~|%GF~P9uolqV!j?tdLP#vo8}$L!V0l;FROC)(qV9`-b&NC7sR_t}7VZo4`T!Sdyvh%%=$f%#O^CkI70Ku|GAK$kBcN z9C_-=P^jHbG~)FPi{Y}C%ICHccE6Ri%x0y0gtsYWOno`QcdM-~UkiXhJ%;B%Vn3z; zFg2nb`E?sZ8A%|NgbYU`=_=?^7XVDojJTEXPAESU)Xd~0VTXnbr8{YtVP&|(V2ZcF zgO#$0K1^*7gF|Ww^-{z28F4R>bO7JPrm9X4?Q1lwBU5wg=RF3X5>%5|e8-reQ2Bt1 zhK8u9;lrK*P-RIiY<^=-QqN2PL4|hTBIQrr1Nae>F`|zyR(Hag1jgOK+0GoH0D4(} z`57PH-DLP+j_ZeL=unKOqyL^f;_87rDHC61xOcvmu&a(*psiM#Z%0E%MA~+KiDkCq z@C6PlFj3>%k@Z(28?Q65R7ui8j2%hQfmGoI!7uS?Cx)_JzSe4)Ri8Mht5W%dHPO%k zcTyZbfXS3P>;7<9;HENWs}fFGxzvX_Tz9WG6i{h63U?9jChR!is*>r#9B++t`-PQ# zs^Mu7PW?_ZI=u(?YPLBUW;}kKtqStZ$KBUzgYY4&yXwcSl6O$o@o&emENCl^>GKRi u905Qs6`T+N1OPz+KmZUF00aO*_VpKmRX_0U{KGi_0000gf3Z literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings.png b/app/src/main/res/drawable-xxxhdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..fa771cd1a7113f8a9dbd8b7c1749e49cc378159d GIT binary patch literal 1374 zcmV-k1)=(hP) zD{3sLXslRc!#a!e1Ycf!`~IET-NZS37vcTx&iC^FyEF6es}^KrRukMIK@b5VKo9{U zKo9{UKo9|cF%ftH{50e_FhK+)&P#&eM^M+QE&}vvO&I(LZAE}SX$%5}hyZ=&FbJ40 z0`ytOAYg+C&}R>Wfc+vspGyn^u8IJC-ZKdJ;Nw!%$KbbO2!4b%A|O5k7zLz>fcT^{ z3Yc3}1@r~30rznU*)imGMgr#<1zZ3|g&bQ4ARBl9+ywghBA^~{FKVJcfP7#)P*dX? z!+>JOz(=G0ub~>_s)=(r27HgYh7wWV2La3CO!g753P_IeS@mxRECxQBeVBKOHLjI7 z_J4go%e4SC_%hAOegh8SEuaQ46?o$?_z_+MlW~(h}GFm^p5?KZqI}X-kSdlJSPXtG!qQ)DixN&@tXTE|Dkz&Q z+;$oS^!3+9SW4s^`^H4SIAJF<6^juZ58Q5yMev?X4`x-Anqs>i&=t5%Jdv#yIuW)p ztaiG%s)#iO4im2PJ6RCWnQ)(=(hf~r7v)tUVg6>a z!%4N2Taep_@BoVf1{sd^u8#stm!S(S3Rql~mZ7Stbv426@`ObJg#^!lEFU&v&9HZ# zDix6uRIXISVNAz35zsBhiy5ZmSP-zCc+7V&F=J9zKl#Whi41RB>bo2*I(X$Is zm8C7rMU5L+Mx+jYV@w@$j(s!6h(&;U8|I9qvR+=I6VdqMWvluxA;aM4j~$4x9Fn%whC9F4t*Qh=-8n#h`a8!jIcS!!-~+?aKRQouY< zS`!Pfm@*LWvvrYHm|j?n_h27d6VoXL)Nptks?zU_xjx73zkh4ehm)+T8o8VsvG%|x z2{PTA^I?{DYb4NgXGetXHhv_*E=Q=-Q^Ia=rc1!fG1+D|w7SK-P-URNMLnQbAcu8C zcIw>&M-{OhAqVZ_Q3qkiWK={l6%YjaXMBDI_5#E47N&k5;H3wFSHDp(4#zYi_Q2WTzXtgo!`HO7blK?H~ZK?H~Z gK?H~ZK?L~1FE`*SV4U22fB*mh07*qoM6N<$f-A*dA^-pY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/head.jpg b/app/src/main/res/drawable/head.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a79b2422e5c4372f12a42ab9eadffbcd752d65a GIT binary patch literal 18988 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_wallet.png b/app/src/main/res/drawable/icon_wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..3acf9e8a58f9237bc87215e69e7f9780bf224063 GIT binary patch literal 5410 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..458b4b0 --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dash_board.xml b/app/src/main/res/layout/activity_dash_board.xml new file mode 100644 index 0000000..bef0427 --- /dev/null +++ b/app/src/main/res/layout/activity_dash_board.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..2dac422 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +