diff --git a/app/build.gradle b/app/build.gradle index fae5328..ea2a79c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.chiragagg5k.bu_news_android" minSdk 29 targetSdk 33 - versionCode 11 - versionName "1.6.0" + versionCode 13 + versionName "1.6.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -39,7 +39,9 @@ dependencies { implementation 'com.google.android.material:material:1.8.0' // Material Design implementation 'androidx.constraintlayout:constraintlayout:2.1.4' // Constraint Layout implementation platform('com.google.firebase:firebase-bom:31.2.2') // Firebase BOM - implementation 'com.google.firebase:firebase-auth:21.2.0' // Firebase Auth + implementation ('com.google.firebase:firebase-auth:21.3.0'){ + exclude module: "play-services-safetynet" + } // Firebase Auth implementation 'com.google.firebase:firebase-database' // Firebase Realtime Database implementation 'com.google.firebase:firebase-storage' // Firebase Storage implementation 'de.hdodenhof:circleimageview:3.1.0'// Circle Image View diff --git a/app/release/app-release.aab b/app/release/app-release.aab index f16ddfb..8b171df 100644 Binary files a/app/release/app-release.aab and b/app/release/app-release.aab differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f7a117..c7a64cc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,11 @@ android:windowSoftInputMode="adjustResize"> + + + diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/DashboardActivity.java b/app/src/main/java/com/chiragagg5k/bu_news_android/DashboardActivity.java index 4580bd8..68c1393 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/DashboardActivity.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/DashboardActivity.java @@ -38,8 +38,6 @@ import org.jetbrains.annotations.NotNull; -import java.util.Objects; - /** * @author Chirag Aggarwal */ diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/FoundFragment.java b/app/src/main/java/com/chiragagg5k/bu_news_android/FoundFragment.java index 7119455..39db56f 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/FoundFragment.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/FoundFragment.java @@ -11,7 +11,6 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -63,9 +62,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat user = FirebaseAuth.getInstance().getCurrentUser(); - if (user !=null) { + if (user != null) { setClickHereListener(); - }else{ + } else { foundTextView.setText("Found Something? Register to upload a post"); } @@ -80,7 +79,7 @@ public void onDataChange(@NonNull DataSnapshot snapshot) { lostFoundObjects.add(lostFoundObject); } - LostFoundAdaptor lostFoundAdaptor = new LostFoundAdaptor(lostFoundObjects, false); + LostFoundAdaptor lostFoundAdaptor = new LostFoundAdaptor(lostFoundObjects, false, getContext()); foundRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); foundRecyclerView.setAdapter(lostFoundAdaptor); diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/LoginFragment.java b/app/src/main/java/com/chiragagg5k/bu_news_android/LoginFragment.java index f559528..08ca571 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/LoginFragment.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/LoginFragment.java @@ -5,7 +5,6 @@ import android.text.Spannable; import android.text.SpannableString; import android.text.style.ClickableSpan; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundDetailActivity.java b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundDetailActivity.java new file mode 100644 index 0000000..1772a5f --- /dev/null +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundDetailActivity.java @@ -0,0 +1,68 @@ +package com.chiragagg5k.bu_news_android; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + +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 com.squareup.picasso.Picasso; + +public class LostFoundDetailActivity extends AppCompatActivity { + + ImageView backBtn, detailedLostFound_Image; + TextView detailedLostFound_ItemName, detailedLostFound_ItemDescription, detailedLostFound_UploaderName, detailedLostFound_UploaderContact, detailedLostFound_ItemLocation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detailed_lostfound); + + backBtn = findViewById(R.id.back_button); + detailedLostFound_ItemName = findViewById(R.id.detailedLostFound_ItemName); + detailedLostFound_ItemDescription = findViewById(R.id.detailedLostFound_ItemDescription); + detailedLostFound_UploaderName = findViewById(R.id.detailedLostFound_UploaderName); + detailedLostFound_UploaderContact = findViewById(R.id.detailedLostFound_UploaderContact); + detailedLostFound_Image = findViewById(R.id.detailedLostFound_Image); + detailedLostFound_ItemLocation = findViewById(R.id.detailedLostFound_ItemLocation); + + Intent intent = getIntent(); + String itemName = intent.getStringExtra("item_name"); + String itemDescription = intent.getStringExtra("item_description"); + String itemLocation = intent.getStringExtra("item_location"); + String itemImageURL = intent.getStringExtra("item_image_url"); + String uploaderUID = intent.getStringExtra("uploader_uid"); + String uploaderContact = intent.getStringExtra("uploader_contact"); + + DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("users").child(uploaderUID); + userRef.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + String uploaderName = snapshot.child("name").getValue().toString(); + detailedLostFound_UploaderName.setText("Uploaded by: " + uploaderName); + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + + } + }); + + detailedLostFound_ItemName.setText(itemName); + detailedLostFound_ItemDescription.setText("Item Description: " + itemDescription); + detailedLostFound_UploaderContact.setText("Contact: " + uploaderContact); + detailedLostFound_ItemLocation.setText("Lost known location : " + itemLocation); + + Picasso.get().load(itemImageURL).into(detailedLostFound_Image); + + backBtn.setOnClickListener(v -> finish()); + } +} + diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundUploadActivity.java b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundUploadActivity.java index 0387170..9ab6e9a 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundUploadActivity.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFoundUploadActivity.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.view.View; import android.webkit.MimeTypeMap; import android.widget.Button; import android.widget.EditText; @@ -20,9 +19,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.chiragagg5k.bu_news_android.objects.LostFoundObject; -import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.DataSnapshot; @@ -31,16 +28,13 @@ import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; -import com.google.firebase.storage.OnProgressListener; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.StorageTask; -import com.google.firebase.storage.UploadTask; -import com.squareup.picasso.Picasso; public class LostFoundUploadActivity extends AppCompatActivity { ImageView backBtn; - EditText title, description,location, contact; + EditText title, description, location, contact; TextView selectImageLabel; Button selectImage, upload; DatabaseReference lostFoundDatabase, lostDatabase, foundDatabase; @@ -108,7 +102,6 @@ public void onCancelled(@NonNull DatabaseError error) { }); - upload.setOnClickListener(v -> { String titleText = title.getText().toString(); String descriptionText = description.getText().toString(); diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/LostFragment.java b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFragment.java index d06c784..9f5d2f7 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/LostFragment.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/LostFragment.java @@ -6,7 +6,6 @@ import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -78,7 +77,7 @@ public void onDataChange(@NonNull DataSnapshot snapshot) { lostFoundObjects.add(lostFoundObject); } - LostFoundAdaptor lostFoundAdaptor = new LostFoundAdaptor(lostFoundObjects, true); + LostFoundAdaptor lostFoundAdaptor = new LostFoundAdaptor(lostFoundObjects, true, getContext()); lostRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); lostRecyclerView.setAdapter(lostFoundAdaptor); diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/PostFragment.java b/app/src/main/java/com/chiragagg5k/bu_news_android/PostFragment.java index e941292..59830ac 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/PostFragment.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/PostFragment.java @@ -27,8 +27,13 @@ import com.chiragagg5k.bu_news_android.objects.NewsObject; import com.daimajia.androidanimations.library.Techniques; import com.daimajia.androidanimations.library.YoYo; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +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 com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.StorageTask; @@ -37,16 +42,17 @@ @SuppressWarnings("rawtypes") public class PostFragment extends Fragment { - TextView image_status; + TextView image_status, what_to_post_tv; EditText heading, description; Button choose_image, post_button; ImageView preview_image; StorageReference storageRef; - DatabaseReference databaseRef; + DatabaseReference databaseRef, userRef; StorageTask uploadTask; Uri image_uri; Spinner category_spinner; ArrayAdapter category_adapter; + FirebaseUser user; /** * This is the callback for the result of the activity started by selectImage() @@ -91,10 +97,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat image_status = view.findViewById(R.id.selected_image_tv); category_spinner = view.findViewById(R.id.categories_spinner); preview_image = view.findViewById(R.id.preview_image); + what_to_post_tv = view.findViewById(R.id.what_to_post_tv); storageRef = FirebaseStorage.getInstance().getReference("uploads"); databaseRef = FirebaseDatabase.getInstance().getReference("uploads"); + user = FirebaseAuth.getInstance().getCurrentUser(); + userRef = FirebaseDatabase.getInstance().getReference("users").child(user.getUid()); + category_adapter = ArrayAdapter.createFromResource(getContext(), R.array.choice_category_names, android.R.layout.simple_spinner_item); category_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); category_spinner.setAdapter(category_adapter); @@ -111,6 +121,47 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat } }); + + userRef.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + DataSnapshot lastPostTimeSnapshot = snapshot.child("lastPostTime"); + DataSnapshot isAdminSnapshot = snapshot.child("admin"); + Boolean isAdmin = isAdminSnapshot.getValue(Boolean.class); + + if (isAdmin != null && isAdmin) { + what_to_post_tv.setText("You are an admin. You can post anything you want without cooldown."); + return; + } + + if (!lastPostTimeSnapshot.exists()) { + return; + } + + long lastPostTime = lastPostTimeSnapshot.getValue(Long.class); + long currentTime = System.currentTimeMillis(); + long timeDiff = currentTime - lastPostTime; + if (timeDiff < 7200000) { + post_button.setEnabled(false); + choose_image.setEnabled(false); + + try { + post_button.setBackgroundColor(getResources().getColor(R.color.backgroundColorDarker)); + choose_image.setBackgroundColor(getResources().getColor(R.color.backgroundColorDarker)); + } catch (Exception e) { + e.printStackTrace(); + } + + + what_to_post_tv.setText("Sorry for not informing in advance that posting has a cooldown of 2hrs! You can post again in " + (120 - timeDiff / 60000) + " minutes. Please wait."); + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + + } + }); } /** @@ -175,6 +226,9 @@ private void post() { if (uploadId != null) databaseRef.child(uploadId).setValue(upload); }); + // update the last post time + userRef.child("lastPostTime").setValue(System.currentTimeMillis()); + // clear the fields after 1 seconds new Handler().postDelayed(() -> { heading.setText(""); diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/ProfileActivity.java b/app/src/main/java/com/chiragagg5k/bu_news_android/ProfileActivity.java index 7e27ea1..36afa76 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/ProfileActivity.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/ProfileActivity.java @@ -3,11 +3,8 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.text.InputType; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -138,7 +135,7 @@ public void onClick(View view) { }); - }else { + } else { Toast.makeText(ProfileActivity.this, "Authentication failed", Toast.LENGTH_SHORT).show(); dialog.cancel(); } diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/adaptors/LostFoundAdaptor.java b/app/src/main/java/com/chiragagg5k/bu_news_android/adaptors/LostFoundAdaptor.java index c28b025..f7b8acf 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/adaptors/LostFoundAdaptor.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/adaptors/LostFoundAdaptor.java @@ -1,6 +1,7 @@ package com.chiragagg5k.bu_news_android.adaptors; -import android.net.Uri; +import android.content.Context; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,20 +11,23 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.chiragagg5k.bu_news_android.LostFoundDetailActivity; import com.chiragagg5k.bu_news_android.R; import com.chiragagg5k.bu_news_android.objects.LostFoundObject; import com.squareup.picasso.Picasso; import java.util.ArrayList; -public class LostFoundAdaptor extends RecyclerView.Adapter{ +public class LostFoundAdaptor extends RecyclerView.Adapter { ArrayList lostFoundObjects; boolean isLost; + private final Context context; - public LostFoundAdaptor(ArrayList lostFoundObjects, boolean isLost) { + public LostFoundAdaptor(ArrayList lostFoundObjects, boolean isLost, Context context) { this.lostFoundObjects = lostFoundObjects; this.isLost = isLost; + this.context = context; } @NonNull @@ -41,6 +45,18 @@ public void onBindViewHolder(@NonNull LostFoundAdaptor.ViewHolder holder, int po Picasso.get().load(lostFoundObjects.get(position).getItemImageURL()).fit().centerCrop().into(holder.itemImage); + holder.itemView.setOnClickListener(v -> { + Intent intent = new Intent(v.getContext(), LostFoundDetailActivity.class); + intent.putExtra("item_name", lostFoundObjects.get(position).getItemName()); + intent.putExtra("item_description", lostFoundObjects.get(position).getItemDescription()); + intent.putExtra("item_location", lostFoundObjects.get(position).getItemLocation()); + intent.putExtra("item_image_url", lostFoundObjects.get(position).getItemImageURL()); + intent.putExtra("item_date", lostFoundObjects.get(position).getItemDate()); + intent.putExtra("uploader_uid", lostFoundObjects.get(position).getToContactUID()); + intent.putExtra("uploader_contact", lostFoundObjects.get(position).getContactNo()); + + context.startActivity(intent); + }); } @Override diff --git a/app/src/main/java/com/chiragagg5k/bu_news_android/objects/LostFoundObject.java b/app/src/main/java/com/chiragagg5k/bu_news_android/objects/LostFoundObject.java index e74325f..7c7f2eb 100644 --- a/app/src/main/java/com/chiragagg5k/bu_news_android/objects/LostFoundObject.java +++ b/app/src/main/java/com/chiragagg5k/bu_news_android/objects/LostFoundObject.java @@ -4,10 +4,9 @@ import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; -import java.util.Objects; - public class LostFoundObject { + FirebaseUser user; private String itemName; private String itemDescription; private String itemLocation; @@ -15,7 +14,6 @@ public class LostFoundObject { private String toContactUID; private String itemImageURL; private String contactNo; - FirebaseUser user; public LostFoundObject() { // !IMPORTANT: This constructor is required for Firebase to work diff --git a/app/src/main/res/layout/activity_add_event.xml b/app/src/main/res/layout/activity_add_event.xml index 5d3afcb..6a952c2 100644 --- a/app/src/main/res/layout/activity_add_event.xml +++ b/app/src/main/res/layout/activity_add_event.xml @@ -5,7 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:theme="@style/Theme.BUNewsAndroidDark" - tools:context=".EditProfileActivity"> + tools:context=".EditProfileActivity" + tools:ignore="HardcodedText"> + android:textSize="18sp" /> + android:inputType="text" + android:labelFor="@+id/event_description_label" + android:padding="8dp" + android:textSize="18sp" /> @@ -24,7 +25,7 @@ @@ -92,13 +93,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="@color/colorPrimary" + android:contentDescription="Floating Action Post" android:src="@drawable/post_icon_foreground" app:borderWidth="0dp" app:layout_anchor="@id/app_bar" app:maxImageSize="40dp" - app:tint="@color/white" - android:contentDescription="Floating Action Post" - /> + app:tint="@color/white" /> @@ -126,8 +126,8 @@ android:layout_height="48dp" android:layout_marginBottom="30dp" android:gravity="center" - android:textSize="13sp" - android:text="Made by Team Obsidian\nver. 1.6.0" /> + android:text="Made by Team Obsidian\nver. 1.6.5" + android:textSize="13sp" /> diff --git a/app/src/main/res/layout/activity_detailed_lostfound.xml b/app/src/main/res/layout/activity_detailed_lostfound.xml new file mode 100644 index 0000000..97a659b --- /dev/null +++ b/app/src/main/res/layout/activity_detailed_lostfound.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_profile.xml b/app/src/main/res/layout/activity_edit_profile.xml index c679c2c..68fd123 100644 --- a/app/src/main/res/layout/activity_edit_profile.xml +++ b/app/src/main/res/layout/activity_edit_profile.xml @@ -68,6 +68,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:backgroundTint="@color/colorPrimary" + android:contentDescription="@string/edit_profile_image" android:src="@drawable/edit_icon" app:borderWidth="0dp" app:layout_constraintBottom_toBottomOf="parent" @@ -75,8 +76,7 @@ app:layout_constraintHorizontal_bias="0.676" app:layout_constraintStart_toStartOf="parent" app:maxImageSize="25dp" - app:tint="@color/white" - android:contentDescription="@string/edit_profile_image" /> + app:tint="@color/white" /> @@ -112,9 +112,9 @@ android:id="@+id/mini_profile_icon" android:layout_width="30dp" android:layout_height="30dp" + android:contentDescription="@string/profile_image" android:src="@drawable/profile_icon" - app:tint="@color/colorPrimary" - android:contentDescription="@string/profile_image" /> + app:tint="@color/colorPrimary" /> + android:singleLine="true" + android:text="@string/placeholder_name_to_be_replaced" + android:textSize="14sp" /> @@ -232,15 +231,14 @@ android:layout_alignParentEnd="true" android:layout_marginEnd="10dp" android:layout_toEndOf="@+id/contact_label" + android:autofillHints="Contact" android:backgroundTint="@color/textColor" + android:inputType="phone" + android:labelFor="@+id/edit_contact_text" android:singleLine="true" android:text="@string/placeholder_contact" android:textAlignment="textEnd" - android:textSize="14sp" - android:autofillHints="Contact" - android:inputType="phone" - android:labelFor="@+id/edit_contact_text" - /> + android:textSize="14sp" /> @@ -287,15 +285,14 @@ android:layout_alignParentEnd="true" android:layout_marginEnd="10dp" android:layout_toEndOf="@+id/address_label" + android:autofillHints="Zip Code" android:backgroundTint="@color/textColor" + android:inputType="text" + android:labelFor="@+id/edit_address_text" android:singleLine="true" android:text="@string/placeholder_address" android:textAlignment="textEnd" - android:textSize="14sp" - android:autofillHints="Zip Code" - android:inputType="text" - android:labelFor="@+id/edit_address_text" - /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_upload_lostfound.xml b/app/src/main/res/layout/activity_upload_lostfound.xml index 7ba8c63..2f190e4 100644 --- a/app/src/main/res/layout/activity_upload_lostfound.xml +++ b/app/src/main/res/layout/activity_upload_lostfound.xml @@ -134,15 +134,14 @@ android:textStyle="bold" /> + android:textColor="@color/textColor" />