diff --git a/app/build.gradle b/app/build.gradle index cd14f28..2b9bf3a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.iyxan23.sketch.collab" minSdkVersion 22 targetSdkVersion 30 - versionCode 1 - versionName "0.1-alpha" + versionCode 2 + versionName "0.1-alpha1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ffa365e..6339cb1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ android:name=".online.UploadActivity" android:theme="@style/Theme.SketchCollab.NoActionBar" /> task_proj = + database.collection(is_project_public ? "projects" : "userdata/" + author + "/projects").document(project_key) + .get(Source.SERVER); // Don't get the cache :/ + + // Wait for the task to finish, i don't want to query a lot of tasks in a short amount of time + DocumentSnapshot project_data = Tasks.await(task_proj); + + // Check if task is successful or not + if (!task_proj.isSuccessful()) { + assert task_proj.getException() != null; // Exception shouldn't be null if the task is not successful + + Toast.makeText(MainActivity.this, "Error: " + task_proj.getException().getMessage(), Toast.LENGTH_LONG).show(); + return; + } + + assert project_data != null; // This shouldn't be null + + ArrayList members = (ArrayList) project_data.get("members"); + + // Fallback to an empty arraylist if members is null / doesn't exist + // (To avoid NPE) + members = members == null ? new ArrayList<>() : members; + + // Check if user is an author / a member of this project + if (!author.equals(auth.getUid()) && !members.contains(auth.getUid())) { // Hmm, the user "stole" another user's project // Let's skip this one :e_sweat_smile: // ========================================================================= @@ -241,7 +267,7 @@ private void initialize() { .get(Source.SERVER); // Don't get the cache :/ // Wait for the task to finish, i don't want to query a lot of tasks in a short amount of time - QuerySnapshot snapshot = Tasks.await(task); + QuerySnapshot commit_snapshot = Tasks.await(task); // Check if task is successful or not if (!task.isSuccessful()) { @@ -251,15 +277,15 @@ private void initialize() { return; } - assert snapshot != null; // snapshot shouldn't be null + assert commit_snapshot != null; // snapshot shouldn't be null - Log.d("MainActivity", "documents: " + snapshot.getDocuments()); + Log.d("MainActivity", "documents: " + commit_snapshot.getDocuments()); Log.d("MainActivity", "project_key: " + project_key); // Check if the project doesn't exists in the database. - if (snapshot.getDocuments().size() == 0) continue; + if (commit_snapshot.getDocuments().size() == 0) continue; - DocumentSnapshot commit_info = snapshot.getDocuments().get(0); + DocumentSnapshot commit_info = commit_snapshot.getDocuments().get(0); if (!project_commit.equals(commit_info.getId())) { // Hmm, looks like this man's project has an older commit, tell him to update his project @@ -280,13 +306,13 @@ private void initialize() { // Alright looks like he's got some local updates with the same head commit // Fetch the project - Task project_data = + Task project_snapshot = database.collection(is_project_public ? "projects" : "userdata/" + author + "/projects").document(project_key).collection("snapshot") .get(Source.SERVER); // Don't get the cache :/ // Wait for the task to finish, i don't want to query a lot of tasks in a short amount of time, // it can cause some performance issues - QuerySnapshot project_data_snapshot = Tasks.await(project_data); + QuerySnapshot project_data_snapshot = Tasks.await(project_snapshot); SketchwareProject head_project = querySnapshotToSketchwareProject(project_data_snapshot); // Add this to the changed sketchcollab sketchware projects arraylist diff --git a/app/src/main/java/com/iyxan23/sketch/collab/online/BrowseActivity.java b/app/src/main/java/com/iyxan23/sketch/collab/online/BrowseActivity.java index 2c3974c..624e282 100644 --- a/app/src/main/java/com/iyxan23/sketch/collab/online/BrowseActivity.java +++ b/app/src/main/java/com/iyxan23/sketch/collab/online/BrowseActivity.java @@ -14,7 +14,6 @@ import com.google.android.gms.tasks.Tasks; import com.google.firebase.Timestamp; import com.google.firebase.firestore.CollectionReference; -import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.DocumentSnapshot; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query; diff --git a/app/src/main/java/com/iyxan23/sketch/collab/online/EditProjectActivity.java b/app/src/main/java/com/iyxan23/sketch/collab/online/EditProjectActivity.java index d10fbac..f4ef8f8 100644 --- a/app/src/main/java/com/iyxan23/sketch/collab/online/EditProjectActivity.java +++ b/app/src/main/java/com/iyxan23/sketch/collab/online/EditProjectActivity.java @@ -36,6 +36,8 @@ protected void onCreate(Bundle savedInstanceState) { members = getIntent().getParcelableArrayListExtra("members"); members_before.addAll(members); + update_members_text(); + TextInputEditText description_edit = findViewById(R.id.description_edit_project_text); description_edit.setText(description_before); } @@ -127,7 +129,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable @org. if (requestCode == MEMBER_USER_PICK_REQ_CODE) { if (resultCode == Activity.RESULT_OK) { - members.addAll( Objects.requireNonNull(data) .getParcelableArrayListExtra("selected_users")); + members = Objects.requireNonNull(data) .getParcelableArrayListExtra("selected_users"); update_members_text(); } diff --git a/app/src/main/java/com/iyxan23/sketch/collab/online/UploadActivity.java b/app/src/main/java/com/iyxan23/sketch/collab/online/UploadActivity.java index b2d2866..ab5e02d 100644 --- a/app/src/main/java/com/iyxan23/sketch/collab/online/UploadActivity.java +++ b/app/src/main/java/com/iyxan23/sketch/collab/online/UploadActivity.java @@ -224,6 +224,29 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { upload_batch .commit() .addOnSuccessListener(result -> { + // Add a custom key to the sketchware project named "sk-colab-key": "(pushkey)" and "sk-collab-owner": "(uid)" + try { + swProj.mysc_project = Util.encrypt( + new JSONObject( + Util.decrypt(swProj.mysc_project) + ) + .put("sk-collab-key", projectRefDoc.getId()) // The document id (location of the project) + .put("sk-collab-owner", auth.getUid()) // The owner of the project (used to access private projects) + .put("sk-collab-latest-commit", "initial") // The latest commit id of this project + .put("sk-collab-project-visibility", isPrivate.isChecked() ? "private" : "public") // The project visibility. Don't worry, it's used to determine where is the project located in the database + .toString() + .getBytes() + ); + swProj.applyChanges(); + } catch (JSONException | IOException e) { + // This shouldn't happen + e.printStackTrace(); + Toast.makeText(UploadActivity.this, "An error occured while applying the key: " + e.getMessage(), Toast.LENGTH_LONG).show(); + + // Stop + return; + } + Toast.makeText(UploadActivity.this, "Project Uploaded", Toast.LENGTH_SHORT).show(); progressDialog.dismiss(); finish(); diff --git a/app/src/main/java/com/iyxan23/sketch/collab/online/ViewOnlineProjectActivity.java b/app/src/main/java/com/iyxan23/sketch/collab/online/ViewOnlineProjectActivity.java index a19b3a2..fa6ec96 100644 --- a/app/src/main/java/com/iyxan23/sketch/collab/online/ViewOnlineProjectActivity.java +++ b/app/src/main/java/com/iyxan23/sketch/collab/online/ViewOnlineProjectActivity.java @@ -3,6 +3,7 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; @@ -39,6 +40,8 @@ public class ViewOnlineProjectActivity extends AppCompatActivity { + private static final String TAG = "ViewOnlineProjectActivi"; + private ActivityViewOnlineProjectBinding binding; private String description_; @@ -134,6 +137,8 @@ protected void onCreate(Bundle savedInstanceState) { }) */ .addOnSuccessListener(result -> { + Log.d(TAG, "onCreate: Fetch success"); + DocumentSnapshot project_data = tmp[0]; DocumentSnapshot uploader_userdata = tmp[1]; DocumentSnapshot latest_commit = result.getDocuments().get(0); @@ -168,15 +173,15 @@ protected void onCreate(Bundle savedInstanceState) { commit_start_id.setText(first_commit_id); description_textview.setText(description); + Log.d(TAG, "onCreate: Fetching members"); fetchMembers(members_); - - // Hide the progressbar - findViewById(R.id.progress_project).setVisibility(View.GONE); }) .addOnFailureListener(e -> Toast.makeText(this, "Error while fetching: " + e.getMessage(), Toast.LENGTH_LONG).show()); } private void fetchMembers(List members_) { + Log.d(TAG, "fetchMembers: members_: " + members_); + // Check if members_ is null bruh if (members_ == null) { // kekw we're outta here @@ -191,6 +196,8 @@ private void fetchMembers(List members_) { if (cached_names.containsKey(uid)) { username = cached_names.get(uid); + Log.d(TAG, "fetchMembers: Username already cached: " + uid + "; value: " + username); + } else { // Fetch it's username Task userdata_fetch = userdata.document(uid).get(); @@ -208,6 +215,8 @@ private void fetchMembers(List members_) { username = user.getString("name"); + Log.d(TAG, "fetchMembers: Username fetched, uid: " + uid + ", name: " + username); + cached_names.put(uid, username); } catch (ExecutionException | InterruptedException e) { @@ -218,8 +227,26 @@ private void fetchMembers(List members_) { } } + Log.d(TAG, "fetchMembers: Add member: " + username + " (" + uid + ")"); members.add(new Userdata(username, uid)); } + + // Update the textview + runOnUiThread(() -> { + TextView members_list = findViewById(R.id.members_list); + members_list.setText(""); + + boolean is_start = false; + + for (Userdata member_userdata: members) { + members_list.append((is_start ? ", " : "") + member_userdata.getName()); + + is_start = true; + } + + // Hide the progressbar + findViewById(R.id.progress_project).setVisibility(View.GONE); + }); }).start(); } diff --git a/app/src/main/java/com/iyxan23/sketch/collab/SketchwareProjectsListActivity.java b/app/src/main/java/com/iyxan23/sketch/collab/pman/SketchwareProjectsListActivity.java similarity index 95% rename from app/src/main/java/com/iyxan23/sketch/collab/SketchwareProjectsListActivity.java rename to app/src/main/java/com/iyxan23/sketch/collab/pman/SketchwareProjectsListActivity.java index 477b252..24355f6 100644 --- a/app/src/main/java/com/iyxan23/sketch/collab/SketchwareProjectsListActivity.java +++ b/app/src/main/java/com/iyxan23/sketch/collab/pman/SketchwareProjectsListActivity.java @@ -1,4 +1,4 @@ -package com.iyxan23.sketch.collab; +package com.iyxan23.sketch.collab.pman; import android.os.Bundle; import android.view.View; @@ -8,6 +8,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.iyxan23.sketch.collab.R; +import com.iyxan23.sketch.collab.Util; import com.iyxan23.sketch.collab.adapters.SketchwareProjectAdapter; import com.iyxan23.sketch.collab.models.SketchwareProject; diff --git a/app/src/main/res/layout/activity_sketchware_projects_list.xml b/app/src/main/res/layout/activity_sketchware_projects_list.xml index 1e3f863..b98504d 100644 --- a/app/src/main/res/layout/activity_sketchware_projects_list.xml +++ b/app/src/main/res/layout/activity_sketchware_projects_list.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorBackground" - tools:context=".SketchwareProjectsListActivity"> + tools:context=".pman.SketchwareProjectsListActivity">