diff --git a/.idea/misc.xml b/.idea/misc.xml
index e0d5b93..99202cc 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,26 +5,22 @@
diff --git a/app/build.gradle b/app/build.gradle
index 8e06b2a..45bc5c0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -28,6 +28,8 @@ dependencies {
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.android.support:recyclerview-v7:28.0.0'
+ implementation 'com.jakewharton:butterknife:6.1.0'
+ annotationProcessor 'com.jakewharton:butterknife:6.1.0'
implementation 'com.github.ivbaranov:materialfavoritebutton:0.1.4'
implementation 'com.google.android.gms:play-services-ads:17.1.1'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4023e35..f3b441f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,8 +2,6 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -34,8 +49,13 @@
+ android:parentActivityName=".activities.MainActivity" />
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/java/AndroidManifest.xml b/app/src/main/java/AndroidManifest.xml
new file mode 100644
index 0000000..a5773aa
--- /dev/null
+++ b/app/src/main/java/AndroidManifest.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/readybrains/coindesk/activities/LoginActivity.java b/app/src/main/java/com/readybrains/coindesk/activities/LoginActivity.java
new file mode 100644
index 0000000..9d61342
--- /dev/null
+++ b/app/src/main/java/com/readybrains/coindesk/activities/LoginActivity.java
@@ -0,0 +1,153 @@
+package com.readybrains.coindesk.activities;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.android.gms.ads.AdRequest;
+import com.google.android.gms.ads.AdView;
+import com.google.android.gms.ads.MobileAds;
+import com.readybrains.coindesk.R;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+
+public class LoginActivity extends AppCompatActivity {
+ private static final String TAG = "LoginActivity";
+ private static final int REQUEST_SIGNUP = 0;
+ private AdView mAdView;
+
+ @InjectView(R.id.input_email) EditText _emailText;
+ @InjectView(R.id.input_password) EditText _passwordText;
+
+ @InjectView(R.id.btn_login) Button _loginButton;
+ @InjectView(R.id.link_signup) TextView _signupLink;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.login);
+ MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713.");
+ mAdView = findViewById(R.id.adView);
+ AdRequest adRequest = new AdRequest.Builder().build();
+ mAdView.loadAd(adRequest);
+ ButterKnife.inject(this);
+
+ _loginButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ login();
+ }
+ });
+
+ _signupLink.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ // Start the Signup activity
+ Intent intent = new Intent(getApplicationContext(), SignUpActivity.class);
+ startActivityForResult(intent, REQUEST_SIGNUP);
+ finish();
+ overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
+ }
+ });
+ }
+
+ public void login() {
+ Log.d(TAG, "Login");
+
+ if (!validate()) {
+ onLoginFailed();
+ return;
+ }
+
+ _loginButton.setEnabled(false);
+
+ final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,
+ R.style.AppTheme_Dark_Dialog);
+ progressDialog.setIndeterminate(true);
+ progressDialog.setMessage("Authenticating...");
+ progressDialog.show();
+
+
+ String email = _emailText.getText().toString();
+ String password = _passwordText.getText().toString();
+
+ // TODO: Implement your own authentication logic here.
+
+
+ new android.os.Handler().postDelayed(
+ new Runnable() {
+ public void run() {
+ // On complete call either onLoginSuccess or onLoginFailed
+ onLoginSuccess();
+ Intent i = new Intent(LoginActivity.this, MainActivity.class);
+ startActivity(i);
+ // onLoginFailed();
+ progressDialog.dismiss();
+ }
+ }, 3000);
+ }
+
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_SIGNUP) {
+ if (resultCode == RESULT_OK) {
+
+ // TODO: Implement successful signup logic here
+ // By default we just finish the Activity and log them in automatically
+ this.finish();
+ }
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ // Disable going back to the MainActivity
+ moveTaskToBack(true);
+ }
+
+ public void onLoginSuccess() {
+ _loginButton.setEnabled(true);
+ finish();
+ }
+
+ public void onLoginFailed() {
+ Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();
+
+ _loginButton.setEnabled(true);
+ }
+
+ public boolean validate() {
+ boolean valid = true;
+
+ String email = _emailText.getText().toString();
+ String password = _passwordText.getText().toString();
+
+ if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
+ _emailText.setError("enter a valid email address");
+ valid = false;
+ } else {
+ _emailText.setError(null);
+ }
+
+ if (password.isEmpty() || password.length() < 4 || password.length() > 10) {
+ _passwordText.setError("between 4 and 10 alphanumeric characters");
+ valid = false;
+ } else {
+ _passwordText.setError(null);
+ }
+
+ return valid;
+ }
+}
diff --git a/app/src/main/java/com/readybrains/coindesk/activities/SignUpActivity.java b/app/src/main/java/com/readybrains/coindesk/activities/SignUpActivity.java
new file mode 100644
index 0000000..ac0e529
--- /dev/null
+++ b/app/src/main/java/com/readybrains/coindesk/activities/SignUpActivity.java
@@ -0,0 +1,171 @@
+package com.readybrains.coindesk.activities;
+
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+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.readybrains.coindesk.R;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+
+public class SignUpActivity extends AppCompatActivity {
+ private static final String TAG = "SignupActivity";
+ @InjectView(R.id.input_name)
+ EditText _nameText;
+ @InjectView(R.id.input_address)
+ EditText _addressText;
+ @InjectView(R.id.input_email)
+ EditText _emailText;
+ @InjectView(R.id.input_mobile)
+ EditText _mobileText;
+ @InjectView(R.id.input_password)
+ EditText _passwordText;
+ @InjectView(R.id.input_reEnterPassword)
+ EditText _reEnterPasswordText;
+ @InjectView(R.id.btn_signup)
+ Button _signupButton;
+ @InjectView(R.id.link_login)
+ TextView _loginLink;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_signup);
+ ButterKnife.inject(this);
+
+ _signupButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ signup();
+ }
+ });
+
+ _loginLink.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Finish the registration screen and return to the Login activity
+ Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
+ startActivity(intent);
+ finish();
+
+ }
+ });
+ }
+
+ public void signup() {
+ Log.d(TAG, "Signup");
+
+ if (!validate()) {
+ onSignupFailed();
+ return;
+ }
+
+ _signupButton.setEnabled(false);
+
+ final ProgressDialog progressDialog = new ProgressDialog(SignUpActivity.this,
+ R.style.AppTheme_Dark_Dialog);
+ progressDialog.setIndeterminate(true);
+ progressDialog.setMessage("Creating Account...");
+ progressDialog.show();
+
+ String name = _nameText.getText().toString();
+ String address = _addressText.getText().toString();
+ String email = _emailText.getText().toString();
+ String mobile = _mobileText.getText().toString();
+ String password = _passwordText.getText().toString();
+ String reEnterPassword = _reEnterPasswordText.getText().toString();
+
+
+ new android.os.Handler().postDelayed(
+ new Runnable() {
+ public void run() {
+ // On complete call either onSignupSuccess or onSignupFailed
+ // depending on success
+ onSignupSuccess();
+ // onSignupFailed();
+ progressDialog.dismiss();
+ }
+ }, 3000);
+ }
+
+
+ public void onSignupSuccess() {
+ _signupButton.setEnabled(true);
+ setResult(RESULT_OK, null);
+ finish();
+ }
+
+ public void onSignupFailed() {
+ Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();
+
+ _signupButton.setEnabled(true);
+ }
+
+ public boolean validate() {
+ boolean valid = true;
+
+ String name = _nameText.getText().toString();
+ String address = _addressText.getText().toString();
+ String email = _emailText.getText().toString();
+ String mobile = _mobileText.getText().toString();
+ String password = _passwordText.getText().toString();
+ String reEnterPassword = _reEnterPasswordText.getText().toString();
+
+ if (name.isEmpty() || name.length() < 3) {
+ _nameText.setError("at least 3 characters");
+ valid = false;
+ } else {
+ _nameText.setError(null);
+ }
+
+ if (address.isEmpty()) {
+ _addressText.setError("Enter Valid Address");
+ valid = false;
+ } else {
+ _addressText.setError(null);
+ }
+
+
+ if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
+ _emailText.setError("enter a valid email address");
+ valid = false;
+ } else {
+ _emailText.setError(null);
+ }
+
+ if (mobile.isEmpty() || mobile.length() != 10) {
+ _mobileText.setError("Enter Valid Mobile Number");
+ valid = false;
+ } else {
+ _mobileText.setError(null);
+ }
+
+ if (password.isEmpty() || password.length() < 4 || password.length() > 10) {
+ _passwordText.setError("between 4 and 10 alphanumeric characters");
+ valid = false;
+ } else {
+ _passwordText.setError(null);
+ }
+
+ if (reEnterPassword.isEmpty() || reEnterPassword.length() < 4 || reEnterPassword.length() > 10 || !(reEnterPassword.equals(password))) {
+ _reEnterPasswordText.setError("Password Do not match");
+ valid = false;
+ } else {
+ _reEnterPasswordText.setError(null);
+ }
+
+ return valid;
+ }
+}
+
diff --git a/app/src/main/java/com/readybrains/coindesk/fragments/NewsFragment.java b/app/src/main/java/com/readybrains/coindesk/fragments/NewsFragment.java
index bf65c11..991ac48 100644
--- a/app/src/main/java/com/readybrains/coindesk/fragments/NewsFragment.java
+++ b/app/src/main/java/com/readybrains/coindesk/fragments/NewsFragment.java
@@ -90,7 +90,7 @@ public void onRefresh() {
}
private void parseJSON() {
- String url = "http://devendra8112.pythonanywhere.com/api/get_news/";
+ String url = "https://min-api.cryptocompare.com/data/v2/news/?lang=EN&api_key=77e21907a80700fb0fcee2f5690baa7183392fbdb72569bf52a004ef3b4b40cc";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener() {
diff --git a/app/src/main/res/anim/push_left_in.xml b/app/src/main/res/anim/push_left_in.xml
new file mode 100644
index 0000000..b686855
--- /dev/null
+++ b/app/src/main/res/anim/push_left_in.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/push_left_out.xml b/app/src/main/res/anim/push_left_out.xml
new file mode 100644
index 0000000..449e950
--- /dev/null
+++ b/app/src/main/res/anim/push_left_out.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png
new file mode 100644
index 0000000..db3fe93
Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ
diff --git a/app/src/main/res/layout/activity_signup.xml b/app/src/main/res/layout/activity_signup.xml
new file mode 100644
index 0000000..f06cf50
--- /dev/null
+++ b/app/src/main/res/layout/activity_signup.xml
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/login.xml b/app/src/main/res/layout/login.xml
new file mode 100644
index 0000000..ac96f00
--- /dev/null
+++ b/app/src/main/res/layout/login.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 405c5f6..9a925ff 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,6 +2,20 @@
#0077b5
#0077b5
- #0077b5
+ #D81B60
+ #E43F3F
+ #E12929
+ #CC1D1D
+ #FFFFFF
+
+ #000000
+ #222222
+ #333333
+ #777777
+ #888888
+ #999999
+ #AAAAAA
+ #CCCCCC
#4d4d4d
+ #FFFFFF
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index a702118..03702fe 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,6 +8,37 @@
- @color/colorAccent
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
index 8d3ef8e..e062745 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
-
+
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files