diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0e23f8e --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5d19981 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5f6fac3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index fe059e5..e3b59fb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ +<<<<<<< HEAD # sp17proj4android Repository for Spring 2017 MDB Android Training Program Mini-Project 4 Submissions +======= +# sp17proj3android + +Repository for Spring 2017 MDB Android Training Program Mini-Project 3 Submissions +>>>>>>> 98bd4d824a28c3e9b8d3b3ba6d65109ed6c7ab7c Finalized mini-projects should be stored in personal portfolios, but this repository will be used for providing feedback on code quality using the GitHub code review features. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..e70d098 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,42 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "com.example.shiv.mdbsocials" + minSdkVersion 15 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.1.1' + compile 'com.google.firebase:firebase-auth:10.0.1' + compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4' + compile 'com.google.firebase:firebase-database:10.0.1' + compile 'com.google.firebase:firebase-core:10.0.1' + compile 'com.google.firebase:firebase-storage:10.0.1' + testCompile 'junit:junit:4.12' + compile 'com.android.support:recyclerview-v7:25.1.1' + compile 'com.android.support:cardview-v7:25.1.1' + compile 'com.github.bumptech.glide:glide:3.7.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..3f904e2 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,55 @@ +{ + "project_info": { + "project_number": "354113820268", + "firebase_url": "https://mdbsocials-56ed5.firebaseio.com", + "project_id": "mdbsocials-56ed5", + "storage_bucket": "mdbsocials-56ed5.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:354113820268:android:6466447b4db7db8b", + "android_client_info": { + "package_name": "com.example.shiv.mdbsocials" + } + }, + "oauth_client": [ + { + "client_id": "354113820268-ndhfu3eu6jr9e0edo6ppttj8g2ae8atg.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.shiv.mdbsocials", + "certificate_hash": "A4C1F515078A1CF9A4EF9D1963EC038EEB1BD309" + } + }, + { + "client_id": "354113820268-9q4pheohaqoma2habsv7tcfu4m4jkm7v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBvHuNi9DVa_Ud9O0Ae7yV0hpy2UmOweN8" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "354113820268-9q4pheohaqoma2habsv7tcfu4m4jkm7v.apps.googleusercontent.com", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..4205a12 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/Shiv/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/com/example/shiv/mdbsocials/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/shiv/mdbsocials/ExampleInstrumentedTest.java new file mode 100644 index 0000000..a4a87f5 --- /dev/null +++ b/app/src/androidTest/java/com/example/shiv/mdbsocials/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.shiv.mdbsocials", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5eea635 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/shiv/mdbsocials/DetailActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/DetailActivity.java new file mode 100644 index 0000000..b4048b4 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/DetailActivity.java @@ -0,0 +1,229 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.bumptech.glide.Glide; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.database.ChildEventListener; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.MutableData; +import com.google.firebase.database.Transaction; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; + +public class DetailActivity extends AppCompatActivity implements View.OnClickListener { + + public Context context; + String firebaseKey; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail); + + //initialize + context = getApplicationContext(); + TextView eventName = (TextView) findViewById(R.id.textView7); + final ImageView img = (ImageView) findViewById(R.id.imageView2); + TextView date = (TextView) findViewById(R.id.textView8); + TextView description = (TextView) findViewById(R.id.textView9); + TextView email = (TextView) findViewById(R.id.textView10); + + //set onClick listeners + Button interested = (Button) findViewById(R.id.button10); + interested.setOnClickListener(this); + Button numPeopleGoing = (Button) findViewById(R.id.button9); + numPeopleGoing.setOnClickListener(this); + + //Fill out variables with the values from the intent + Intent intent = getIntent(); + String emailExtra = intent.getStringExtra("email"); + email.setText(emailExtra); + String eventNameExtra = intent.getStringExtra("name"); + eventName.setText(eventNameExtra); + String dateExtra = intent.getStringExtra("date"); + date.setText(dateExtra); + String descriptionExtra = intent.getStringExtra("description"); + description.setText(descriptionExtra); + firebaseKey = intent.getStringExtra("key"); + + //retrieve all the people interested and display this number + DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/events"); + ref.addChildEventListener(new ChildEventListener() { + @Override + public void onChildAdded(DataSnapshot dataSnapshot, String s) { + if (dataSnapshot.getKey().equals(firebaseKey)) { + ArrayList a = (ArrayList) dataSnapshot.child("peopleinterested").getValue(); + displayNumPeopleButton(a.size()); + } + } + + @Override + public void onChildChanged(DataSnapshot dataSnapshot, String s) { + + } + + @Override + public void onChildRemoved(DataSnapshot dataSnapshot) { + + } + + @Override + public void onChildMoved(DataSnapshot dataSnapshot, String s) { + + } + + @Override + public void onCancelled(DatabaseError databaseError) { + + } + }); + + //Display progress bar as the image loads + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar3); + pb.setVisibility(ProgressBar.VISIBLE); + + //Load the image in the background + class DownloadFilesTask extends AsyncTask { + + protected Bitmap doInBackground(String... strings) { + try { + URL url = new URL(strings[0]); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.connect(); + InputStream input = connection.getInputStream(); + Bitmap myBitmap = BitmapFactory.decodeStream(input); + return myBitmap; + } catch (IOException e) { + return null; + } + + } + + protected void onProgressUpdate(Void... progress) {} + + protected void onPostExecute(Bitmap result) { + img.setImageBitmap(result); + //after loading the image, make the progress bar invisible + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar3); + pb.setVisibility(ProgressBar.INVISIBLE); + } + } + String imageURLExtra = intent.getStringExtra("imageURL"); + FirebaseStorage.getInstance().getReferenceFromUrl("gs://mdbsocials-56ed5.appspot.com").child(imageURLExtra+ ".png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Uri uri) { + new DownloadFilesTask().execute(uri.toString()); Log.d("ye", uri.toString()); + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + Log.d("sad", exception.toString()); + } + }); + } + + /** + * Method increments the number of people interested in the event + */ + private void addInterested() { + + final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/events"); + + + + ref.child(firebaseKey).runTransaction(new Transaction.Handler() { + @Override + public Transaction.Result doTransaction(MutableData mutableData) { + String numStringInterested = mutableData.child("interested").getValue().toString(); + int numInterested = Integer.parseInt(numStringInterested); + ArrayList a = (ArrayList) mutableData.child("peopleinterested").getValue(); + if (!a.contains(MainActivity.email)) { + a.add(MainActivity.email); + ref.child(firebaseKey).child("peopleinterested").setValue(a); + numInterested++; + + } + + DetailActivity.addInterestedToDatabase(numInterested,firebaseKey); + + return Transaction.success(mutableData); + } + + @Override + public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) { + + } + }); + } + + /** + * Updates the actual database with the new number of interested people + * @param interested + * @param firekey + */ + + public static void addInterestedToDatabase(int interested, String firekey) { + DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/events"); + ref.child(firekey).child("interested").setValue(Integer.toString(interested)); + + } + + /** + * updates the buttontext of the number of people going + */ + + public void displayNumPeopleButton(int num) { + Button numPeopleGoing = (Button) findViewById(R.id.button9); + if (num > 0) { + numPeopleGoing.setText(num + " People Going"); + } + else { + numPeopleGoing.setText("0 People Going"); + } + + + } + + public void onClick(View view){ + if (view.getId() == R.id.button10) { + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar3); + pb.setVisibility(ProgressBar.VISIBLE); + addInterested(); + pb.setVisibility(ProgressBar.INVISIBLE); + Toast.makeText(getApplicationContext(), "Marked as Interested", Toast.LENGTH_SHORT).show(); + } + else if (view.getId() == R.id.button9) { + Intent intent = new Intent(getApplicationContext(), UsersInterestedActivity.class); + intent.putExtra("key",firebaseKey); + startActivity(intent); + + } + } +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/Event.java b/app/src/main/java/com/example/shiv/mdbsocials/Event.java new file mode 100644 index 0000000..cdcef60 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/Event.java @@ -0,0 +1,26 @@ +package com.example.shiv.mdbsocials; + +import android.net.Uri; + +import java.util.ArrayList; + +/** + * Created by Shiv on 2/20/17. + */ + +public class Event { + + String date; + String description; + String email; + String eventName; + String imageURL; + String key; + String numInterested; + ArrayList peopleInterested; + + public Event() { + peopleInterested = new ArrayList<>(); + + } +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/EventAdapter.java b/app/src/main/java/com/example/shiv/mdbsocials/EventAdapter.java new file mode 100644 index 0000000..138b56f --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/EventAdapter.java @@ -0,0 +1,155 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RatingBar; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.storage.FirebaseStorage; + +import org.w3c.dom.Text; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; + +/** + * Created by Shiv on 2/20/17. + */ + +public class EventAdapter extends RecyclerView.Adapter { + + Context context; + public static ArrayList events; + + public EventAdapter(Context context, ArrayList events) { + this.context = context; + this.events = events; + } + + + @Override + public EventAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_feed, parent, false); + return new CustomViewHolder(view); + } + + @Override + public void onBindViewHolder(final EventAdapter.CustomViewHolder holder, int position) { + Event currentEvent = events.get(events.size() - position - 1); + + + holder.eventName.setText(currentEvent.eventName); + holder.email.setText(currentEvent.email); + holder.numInterested.setText(currentEvent.numInterested); + holder.date = currentEvent.date; + holder.description = currentEvent.description; + holder.imageURL = currentEvent.imageURL; + holder.key = currentEvent.key; + holder.pplInterested = currentEvent.peopleInterested; + + + //Use glide in background + class DownloadFilesTask extends AsyncTask { + protected Bitmap doInBackground(String... strings) { + try {return Glide. + with(context). + load(strings[0]). + asBitmap(). + into(100, 100). // Width and height + get();} + catch (Exception e) {return null;} + + + + } + + + protected void onProgressUpdate(Void... progress) {} + + protected void onPostExecute(Bitmap result) { + holder.pic.setImageBitmap(result); + } + } + FirebaseStorage.getInstance().getReferenceFromUrl("gs://mdbsocials-56ed5.appspot.com").child(currentEvent.imageURL+ ".png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Uri uri) { + new DownloadFilesTask().execute(uri.toString()); Log.d("ye", uri.toString()); + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + Log.d("sad", exception.toString()); + } + }); + + } + + @Override + public int getItemCount() { + return events.size(); + } + + public class CustomViewHolder extends RecyclerView.ViewHolder { + + + TextView eventName; + TextView email; + TextView numInterested; + ImageView pic; + String date; + String description; + String imageURL; + String key; + ArrayList pplInterested; + + public CustomViewHolder(View view) { + super(view); + + eventName = (TextView) view.findViewById(R.id.textView13); + email = (TextView) view.findViewById(R.id.textView12); + numInterested = (TextView) view.findViewById(R.id.textView14); + pic = (ImageView) view.findViewById(R.id.imageView5); + + CardView cardView = (CardView) view.findViewById(R.id.cardView); + cardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(context, DetailActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("email",email.getText().toString()); + intent.putExtra("name",eventName.getText().toString()); + intent.putExtra("number",numInterested.getText().toString()); + intent.putExtra("description", description); + intent.putExtra("date", date); + intent.putExtra("imageURL",imageURL); + intent.putExtra("key",key); + intent.putExtra("peopleInterested",pplInterested); + + context.startActivity(intent); + } + }); + + + } + } + +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/FeedActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/FeedActivity.java new file mode 100644 index 0000000..42f0a82 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/FeedActivity.java @@ -0,0 +1,124 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.MainThread; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +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 com.google.firebase.database.ChildEventListener; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; + +import java.util.ArrayList; + +public class FeedActivity extends AppCompatActivity implements View.OnClickListener { + + RecyclerView rview; + EventAdapter eventAdapter; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_feed); + + + //initialize on click listeners for buttons + Button logout = (Button) findViewById(R.id.button5); + logout.setOnClickListener(this); + Button newsocial = (Button) findViewById(R.id.button6); + newsocial.setOnClickListener(this); + + //set up recycler view + rview = (RecyclerView) findViewById(R.id.recyclableView); + rview.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + eventAdapter = new EventAdapter(getApplicationContext(), getList());//events); + rview.setAdapter(eventAdapter); + } + + + /** + * Creates a list of events based on server data and returns it + * @return arraylist + */ + private ArrayList getList() { + final ArrayList currEvents = new ArrayList<>(); + DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/events"); + + + + ref.orderByChild("timestamp").addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + + currEvents.clear(); + + for (DataSnapshot x : dataSnapshot.getChildren()) { + + Log.d(x.getKey(), x.getValue().toString()); + + Event e = new Event(); + e.date = x.child("date").getValue(String.class); + e.description = x.child("description").getValue(String.class); + e.eventName = x.child("name").getValue(String.class); + e.imageURL = x.child("url").getValue(String.class); + e.email = x.child("email").getValue(String.class); + + e.numInterested = x.child("interested").getValue(String.class); + e.key = x.getKey(); + + currEvents.add(e); + eventAdapter.notifyDataSetChanged(); + } + + } + + @Override + public void onCancelled(DatabaseError databaseError) { + + } + }); + return currEvents; + + } + + @Override + protected void onResume() { + super.onResume(); + } + + public void onClick(View view) { + if (view.getId() == R.id.button5) { + FirebaseAuth.getInstance().signOut(); + Intent intent = new Intent(getApplicationContext(),MainActivity.class); + startActivity(intent); + + } else if (view.getId() == R.id.button6) { + Intent intent = new Intent(getApplicationContext(),NewSocialActivity.class); + startActivity(intent); + } + } +} + + + + + + diff --git a/app/src/main/java/com/example/shiv/mdbsocials/FirebaseUtils.java b/app/src/main/java/com/example/shiv/mdbsocials/FirebaseUtils.java new file mode 100644 index 0000000..e812f83 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/FirebaseUtils.java @@ -0,0 +1,91 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.util.Log; +import android.widget.EditText; +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 java.util.ArrayList; + +/** + * Created by Shiv on 2/28/17. + */ + +public class FirebaseUtils { + + /** + * Try to login to server with current credentials + * @param email + * @param password + * @param mAuth + * @param context + * @param var + */ + public static void attemptLogin(String email, String password, FirebaseAuth mAuth, final Context context, final MainActivity var){ + final ArrayList bool = new ArrayList<>(); + if (!email.equals("") && !password.equals("")) { + mAuth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(var, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + Log.d("SignIn Status", "signInWithEmail:onComplete:" + task.isSuccessful()); + + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Log.w("SignIn Status", "signInWithEmail", task.getException()); + Toast.makeText(context, "Authentication failed.", + Toast.LENGTH_SHORT).show(); + + } + + } + }); + + } + } + + /** + * Try to create new account on server + * @param email + * @param password + * @param mAuth + * @param context + * @param var + */ + public static void attemptRegister(String email, String password, FirebaseAuth mAuth, final Context context, final RegisterActivity var) { + + if (!email.equals("") && !password.equals("")) { + mAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(var, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + Log.d("SignUp Status", "createUserWithEmail:onComplete:" + task.isSuccessful()); + + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Toast.makeText(context, "Authentication failed.", + Toast.LENGTH_SHORT).show(); + } + + } + }); + } + + } + + + + + +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/MainActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/MainActivity.java new file mode 100644 index 0000000..e6bdfbf --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/MainActivity.java @@ -0,0 +1,117 @@ +package com.example.shiv.mdbsocials; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Paint; +import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.ProgressBar; +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; + +public class MainActivity extends AppCompatActivity implements View.OnClickListener { + + private FirebaseAuth mAuth; + private FirebaseAuth.AuthStateListener mAuthListener; + + //The current user's email address for other classes to use + public static String email; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + + //Initialize onClickListeners for the buttons + Button loginButton = (Button) findViewById(R.id.button2); + loginButton.setOnClickListener(this); + Button signUpButton = (Button) findViewById(R.id.button3); + signUpButton.setPaintFlags(signUpButton.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + signUpButton.setOnClickListener(this); + + + ImageView logo = (ImageView) findViewById(R.id.imageView); + logo.setImageResource(R.drawable.logo); + + + mAuth = FirebaseAuth.getInstance(); + mAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + // User is signed in + + Log.d("Login Status", "onAuthStateChanged:signed_in:" + user.getUid()); + MainActivity.email = user.getEmail(); + Intent intent = new Intent(getApplicationContext(),FeedActivity.class); + startActivity(intent); + + } else { + // User is signed out + Log.d("Login Status", "onAuthStateChanged:signed_out"); + } + + } + }; + + + } + + /** + * Takes user to signup activity + */ + private void attemptSignup() { + Intent intent = new Intent(getApplicationContext(), RegisterActivity.class); + startActivity(intent); + } + + @Override + public void onStart() { + super.onStart(); + mAuth.addAuthStateListener(mAuthListener); + } + @Override + public void onStop() { + super.onStop(); + if (mAuthListener != null) { + mAuth.removeAuthStateListener(mAuthListener); + } + } + + public void onClick(View view) { + if (view.getId() == R.id.button2) { + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar4); + pb.setVisibility(ProgressBar.VISIBLE); + FirebaseUtils.attemptLogin(((EditText) findViewById(R.id.editText)).getText().toString(),((EditText) findViewById(R.id.editText2)).getText().toString(),mAuth,getApplicationContext(),this);//attemptLogin(); + pb.setVisibility(View.INVISIBLE); + } + else { + attemptSignup(); + } + } + + //Make loading bar disappear on resume + @Override + protected void onResume() { + super.onResume(); + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar4); + pb.setVisibility(View.INVISIBLE); + + } + + +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/NewSocialActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/NewSocialActivity.java new file mode 100644 index 0000000..c709eeb --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/NewSocialActivity.java @@ -0,0 +1,233 @@ +package com.example.shiv.mdbsocials; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.provider.MediaStore; +import android.support.annotation.MainThread; +import android.support.annotation.NonNull; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +import com.bumptech.glide.Glide; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ServerValue; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; + +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; + +public class NewSocialActivity extends AppCompatActivity implements View.OnClickListener { + + //codes for telling what dialog action was taken + public static final int GET_FROM_GALLERY = 3; + public static final int GET_FROM_CAMERA = 4; + public Uri currentImage = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_new_social); + + //Set up onClick Listeners + Button add = (Button) findViewById(R.id.button7); + add.setOnClickListener(this); + Button butt = (Button) findViewById(R.id.button8); + butt.setOnClickListener(this); + + } + + + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + + super.onActivityResult(requestCode, resultCode, data); + + + //Detects request codes + if(requestCode==GET_FROM_GALLERY && resultCode == Activity.RESULT_OK) { + + + + Uri selectedImage = data.getData(); + currentImage = data.getData(); + Bitmap bitmap = null; + try { + bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); + BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + ((ImageButton) findViewById(R.id.imageButton)).setBackgroundDrawable(bitmapDrawable); + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + else if (requestCode == GET_FROM_CAMERA) { + + Uri selectedImage = data.getData(); + Bitmap bitmap = null; + try { + bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); + //BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + ((ImageView) findViewById(R.id.imageButton)).setImageBitmap(bitmap); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + /** + * Add the textfields and images to an event on the server + */ + private void sendToServer(){ + + final DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); + final String key = ref.child("events").push().getKey(); + StorageReference storageRef = FirebaseStorage.getInstance().getReferenceFromUrl("gs://mdbsocials-56ed5.appspot.com"); + StorageReference riversRef = storageRef.child(key + ".png"); + + class DownloadFilesTask extends AsyncTask { + protected Bitmap doInBackground(String... strings) { + + + String description = strings[0]; + String date = strings[1]; + String name = strings[2]; + String email = MainActivity.email; + ref.child("events").child(key).child("name").setValue(name); + ref.child("events").child(key).child("url").setValue(key); + ref.child("events").child(key).child("date").setValue(date); + ref.child("events").child(key).child("description").setValue(description); + ref.child("events").child(key).child("email").setValue(email); + ref.child("events").child(key).child("interested").setValue("1"); + ArrayList temp = new ArrayList(); + temp.add(email); + + ref.child("events").child(key).child("peopleinterested").setValue(temp); + ref.child("events").child(key).child("timestamp").setValue(ServerValue.TIMESTAMP); + return null; + + + } + + + protected void onProgressUpdate(Void... progress) {} + + protected void onPostExecute(Bitmap result) { + Intent intent = new Intent(getApplicationContext(), FeedActivity.class); + startActivity(intent); + } + } + + + + riversRef.putFile(currentImage).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + Toast.makeText(NewSocialActivity.this, "need an image!", Toast.LENGTH_SHORT).show(); + } + }).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(UploadTask.TaskSnapshot x) { + + new DownloadFilesTask().execute(((EditText) findViewById(R.id.editText7)).getText().toString(),((EditText) findViewById(R.id.editText4)).getText().toString(),((EditText) findViewById(R.id.editText3)).getText().toString()); + } + }); + + + } + + /** + * Makes sure the fields are valid + * @return whether the fields are valid + */ + public boolean verifyFields() { + String x =((EditText) findViewById(R.id.editText7)).getText().toString(); + String y = ((EditText) findViewById(R.id.editText4)).getText().toString(); + String z = ((EditText) findViewById(R.id.editText3)).getText().toString(); + if (x != null && y != null && z != null && currentImage != null) { + return true; + } + return false; + + } + + public void onClick(View view) { + if (view.getId() == R.id.button7) { + //processing data and sending to server + ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar2); + pb.setVisibility(ProgressBar.VISIBLE); + Toast.makeText(getApplicationContext(), "Adding Event",Toast.LENGTH_SHORT).show(); + if (verifyFields()) { + sendToServer(); + Toast.makeText(getApplicationContext(), "Event Saved!",Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(getApplicationContext(), "Fields Incomplete",Toast.LENGTH_SHORT).show(); + pb.setVisibility(ProgressBar.INVISIBLE); + } + + } + else if (view.getId() == R.id.button8) { + //Adding an image + + AlertDialog alertDialog = new AlertDialog.Builder(NewSocialActivity.this).create(); + alertDialog.setTitle("Set a Photo"); + alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Take a Photo", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + //Open Camera + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(getPackageManager()) != null) { + startActivityForResult(takePictureIntent, GET_FROM_CAMERA); + } + + dialog.dismiss(); + } + }); + alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Upload from Gallery", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + //launch gallery + dialog.dismiss(); + startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY); + } + }); + alertDialog.show(); + + } + } +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/RegisterActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/RegisterActivity.java new file mode 100644 index 0000000..3c0a515 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/RegisterActivity.java @@ -0,0 +1,73 @@ +package com.example.shiv.mdbsocials; + +import android.content.Intent; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +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; + +public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{ + + private FirebaseAuth mAuth; + private FirebaseAuth.AuthStateListener mAuthListener; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register); + + //set up onclick listeners for buttons + Button register = (Button) findViewById(R.id.button4); + register.setOnClickListener(this); + + mAuth = FirebaseAuth.getInstance(); + mAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + // User is signed in + Log.d("Register Status", "onAuthStateChanged:signed_in:" + user.getUid()); + MainActivity.email = user.getEmail(); + Intent intent = new Intent(getApplicationContext(),FeedActivity.class); + startActivity(intent); + } else { + // User is signed out + Log.d("Register Status", "onAuthStateChanged:signed_out"); + } + + } + }; + + } + + + @Override + public void onStart() { + super.onStart(); + mAuth.addAuthStateListener(mAuthListener); + } + @Override + public void onStop() { + super.onStop(); + if (mAuthListener != null) { + mAuth.removeAuthStateListener(mAuthListener); + } + } + + public void onClick(View view) { + if (view.getId() == R.id.button4) { + FirebaseUtils.attemptRegister(((EditText) findViewById(R.id.editText6)).getText().toString(),((EditText) findViewById(R.id.editText5)).getText().toString(),mAuth,getApplicationContext(),this); + } + } +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/User.java b/app/src/main/java/com/example/shiv/mdbsocials/User.java new file mode 100644 index 0000000..979c7d7 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/User.java @@ -0,0 +1,14 @@ +package com.example.shiv.mdbsocials; + +/** + * Created by Shiv on 2/23/17. + */ + +public class User { + String email; + String img; + public User(String x, String y) { + email = x; + img = y; + } +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/UserAdapter.java b/app/src/main/java/com/example/shiv/mdbsocials/UserAdapter.java new file mode 100644 index 0000000..20b38c7 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/UserAdapter.java @@ -0,0 +1,74 @@ +package com.example.shiv.mdbsocials; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.storage.FirebaseStorage; + +import java.util.ArrayList; + +/** + * Created by Shiv on 2/23/17. + */ + +public class UserAdapter extends RecyclerView.Adapter{ + + Context context; + public static ArrayList users; + + public UserAdapter(Context context, ArrayList users) { + this.context = context; + this.users = users; + } + @Override + public UserAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_usersinterested, parent, false); + return new CustomViewHolder(view); + } + @Override + public void onBindViewHolder(final UserAdapter.CustomViewHolder holder, int position) { + User currentUser = users.get(position); + + holder.emailText.setText(currentUser.email); + holder.imgView = currentUser.img; + } + + @Override + public int getItemCount() { + return users.size(); + } + + public void updateUsers(ArrayList arr) { + users = arr; + notifyDataSetChanged(); + } + + public class CustomViewHolder extends RecyclerView.ViewHolder { + + + TextView emailText; + String imgView; + + public CustomViewHolder(View view) { + super(view); + emailText = (TextView) view.findViewById(R.id.textView5); + } + } + +} diff --git a/app/src/main/java/com/example/shiv/mdbsocials/UsersInterestedActivity.java b/app/src/main/java/com/example/shiv/mdbsocials/UsersInterestedActivity.java new file mode 100644 index 0000000..81c3bb0 --- /dev/null +++ b/app/src/main/java/com/example/shiv/mdbsocials/UsersInterestedActivity.java @@ -0,0 +1,81 @@ +package com.example.shiv.mdbsocials; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; + +import com.google.firebase.database.ChildEventListener; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; + +import java.util.ArrayList; + +public class UsersInterestedActivity extends AppCompatActivity { + + RecyclerView rview; + UserAdapter userAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_users_interested); + + //setup recyclerview + rview = (RecyclerView) findViewById(R.id.rview2); + rview.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + userAdapter = new UserAdapter(getApplicationContext(), new ArrayList()); + rview.setAdapter(userAdapter); + + Intent intent = getIntent(); + final String firebasekey = intent.getStringExtra("key"); + + final ArrayList interestedPeople = new ArrayList<>(); + + //read the users interested and put it into a array + DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/events"); + ref.addChildEventListener(new ChildEventListener() { + @Override + public void onChildAdded(DataSnapshot dataSnapshot, String s) { + if (dataSnapshot.getKey().equals(firebasekey)) { + ArrayList a = (ArrayList) dataSnapshot.child("peopleinterested").getValue(); + for (int i = 0; i < a.size(); i++) { + interestedPeople.add(a.get(i)); + } + ArrayList arr = new ArrayList<>(); + for (int i = 0; i < interestedPeople.size(); i++) { + arr.add(new User(interestedPeople.get(i),"temp")); + } + + userAdapter.updateUsers(arr); + userAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onChildChanged(DataSnapshot dataSnapshot, String s) { + + } + + @Override + public void onChildRemoved(DataSnapshot dataSnapshot) { + + } + + @Override + public void onChildMoved(DataSnapshot dataSnapshot, String s) { + + } + + @Override + public void onCancelled(DatabaseError databaseError) { + + } + }); + } +} diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..3ba8982 Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/mdb.jpg b/app/src/main/res/drawable/mdb.jpg new file mode 100644 index 0000000..0b49839 Binary files /dev/null and b/app/src/main/res/drawable/mdb.jpg differ diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml new file mode 100644 index 0000000..9ca7392 --- /dev/null +++ b/app/src/main/res/layout/activity_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + +