aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/me
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/me')
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java82
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java45
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java61
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java113
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/AppDatabase.java11
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/FriendCodeDao.java34
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/model/FriendCode.java22
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/viewmodel/FriendCodeViewModel.java67
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java15
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java98
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java132
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java65
-rw-r--r--app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java108
13 files changed, 853 insertions, 0 deletions
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java
new file mode 100644
index 0000000..8f9111c
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java
@@ -0,0 +1,82 @@
+package me.brysonsteck.wiimmfiwatcher;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.text.method.LinkMovementMethod;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.google.android.material.appbar.MaterialToolbar;
+
+public class AboutFragment extends Fragment {
+ View aboutButton;
+ MaterialToolbar toolbar;
+
+ public AboutFragment() {
+ super(R.layout.about_fragment);
+ }
+
+ @SuppressLint("SetTextI18n")
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ aboutButton = getActivity().findViewById(R.id.about_button);
+ toolbar = getActivity().findViewById(R.id.toolbar);
+ toolbar.setTitle("About Wiimmfi Watcher");
+
+ TextView aboutWatcher = view.findViewById(R.id.about_watcher_text);
+ TextView aboutMe = view.findViewById(R.id.about_me_text);
+ TextView github = view.findViewById(R.id.github_text);
+ TextView donations = view.findViewById(R.id.donations_text);
+ TextView contact = view.findViewById(R.id.contact_text);
+ TextView bugs = view.findViewById(R.id.bugs_text);
+
+ aboutWatcher.setText("Wiimmfi Watcher is an UNOFFICIAL application created for a school project that I have decided to turn into a full application. " +
+ "This application was made to provide an easy shortcut to the Wiimmfi website and display data in a mobile friendly way, since the official website doesn't have a mobile friendly version. " +
+ "Free and open source, you can watch your Wiimmfi Mario Kart Wii matches on your phone in a quick and easy way. " +
+ "");
+
+ aboutMe.setText("Hi there! My name is Bryson Steck. I am a student studying Computer Science. This is my first official application that I'm maintaining. " +
+ "This whole \"application on the Google Play Store\" thing is new to me, so please be patient as I am learning how to maintain something like this. " +
+ "I hope you enjoy!");
+
+ github.setClickable(true);
+ github.setMovementMethod(LinkMovementMethod.getInstance());
+
+ github.setText(R.string.github);
+
+ donations.setText("Since this application is free and the code is open source, I do not receive income from maintaining this app. Because of that, I'd appreciate any donation in the following methods:\n\n" +
+ "PayPal: @bryzinga\n" +
+ "Venmo: @brysonsteck\n" +
+ "Bitcoin: 1Kbnp5JMTKd7a3Zs2WWm2JMCjfVb5tpcky\n" +
+ "Litecoin: LRboJVNzoJCjXHmwN6RQgyvYEQjjaFzEA7\n" +
+ "Dogecoin: DMx362YBEBYw1uDGetX3svdg8RypHsWTCS");
+
+ contact.setText("If you would like to get ahold of me for any reason unrelated to bug reports or this app in general, you can contact me through email at steck.bryson@gmail.com " +
+ "or on Discord at bryzinga#9971.");
+
+ bugs.setClickable(true);
+ bugs.setMovementMethod(LinkMovementMethod.getInstance());
+
+ bugs.setText(R.string.bugs);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ aboutButton.setVisibility(View.VISIBLE);
+ toolbar.setTitle("Wiimmfi Watcher");
+ }
+ @Override
+ public void onResume() {
+ super.onResume();
+ aboutButton.setVisibility(View.INVISIBLE);
+ toolbar.setTitle("About Wiimmfi Watcher");
+ }
+
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java
new file mode 100644
index 0000000..c37aaf7
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java
@@ -0,0 +1,45 @@
+package me.brysonsteck.wiimmfiwatcher;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.databinding.ObservableArrayList;
+import androidx.room.Room;
+
+import me.brysonsteck.wiimmfiwatcher.database.AppDatabase;
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+
+public class MainActivity extends AppCompatActivity {
+ ObservableArrayList<FriendCode> recentFCList = new ObservableArrayList<>();
+ AppDatabase database;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ View aboutButton = findViewById(R.id.about_button);
+ if (savedInstanceState == null) {
+ aboutButton.setVisibility(View.VISIBLE);
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.friend_code_input_fragment, new WatchCodeFragment(), null)
+ .setReorderingAllowed(true)
+ .commit();
+
+
+ }
+
+ database = Room.databaseBuilder(this, AppDatabase.class, "friend-codes-db").build();
+
+ aboutButton.setOnClickListener((about) -> {
+ aboutButton.setVisibility(View.INVISIBLE);
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.friend_code_input_fragment, new AboutFragment(), null)
+ .setReorderingAllowed(true)
+ .addToBackStack(null)
+ .commit();
+ });
+
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java
new file mode 100644
index 0000000..715dce8
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java
@@ -0,0 +1,61 @@
+package me.brysonsteck.wiimmfiwatcher;
+
+import android.content.Context;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.databinding.ObservableArrayList;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.button.MaterialButton;
+
+import java.util.ArrayList;
+
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity;
+
+public class WatchCodeAdapter extends RecyclerView.Adapter<WatchCodeAdapter.ViewHolder>{
+ ObservableArrayList<FriendCode> entries;
+ Context context;
+ ArrayList<String> recentCodes;
+
+ public WatchCodeAdapter(Context context, ObservableArrayList<FriendCode> entries) {
+ this.context = context;
+ this.entries = entries;
+ this.recentCodes = new ArrayList<>();
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recent_friend_codes_item, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ String currentFC = entries.get(position).friendCode;
+ MaterialButton fcButton = holder.itemView.findViewById(R.id.recent_friend_code_button);
+ fcButton.setText(currentFC);
+ fcButton.setOnClickListener(view -> {
+ Intent intent = new Intent(view.getContext(), WiimmfiActivity.class);
+ intent.putExtra("friendCode", currentFC);
+ context.startActivity(intent);
+ });
+ }
+
+
+ @Override
+ public int getItemCount() {
+ return entries.size();
+ }
+
+ class ViewHolder extends RecyclerView.ViewHolder {
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ }
+ }
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java
new file mode 100644
index 0000000..c1ba705
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java
@@ -0,0 +1,113 @@
+package me.brysonsteck.wiimmfiwatcher;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.databinding.ObservableList;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.textview.MaterialTextView;
+
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+import me.brysonsteck.wiimmfiwatcher.viewmodel.FriendCodeViewModel;
+import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity;
+
+public class WatchCodeFragment extends Fragment {
+
+ public WatchCodeFragment() {
+ super(R.layout.friend_code_input_fragment);
+ }
+
+ public boolean isValidFriendCode(String friendCode) {
+ String[] friendCodeSplit = friendCode.split("-");
+ boolean valid = false;
+ if (friendCodeSplit.length == 3) {
+ for (String friendCodePart : friendCodeSplit) {
+ valid = friendCodePart.length() == 4;
+ if (!valid) {
+ break;
+ }
+ }
+ }
+ return valid;
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ FriendCodeViewModel viewModel = new ViewModelProvider(getActivity()).get(FriendCodeViewModel.class);
+
+ WatchCodeAdapter adapter = new WatchCodeAdapter(getContext(), viewModel.getEntries());
+ viewModel.getEntries().addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<FriendCode>>() {
+ @Override
+ public void onChanged(ObservableList<FriendCode> sender) {
+ getActivity().runOnUiThread(() -> {
+ adapter.notifyDataSetChanged();
+ });
+ }
+
+ @Override
+ public void onItemRangeChanged(ObservableList<FriendCode> sender, int positionStart, int itemCount) {
+ getActivity().runOnUiThread(() -> {
+ adapter.notifyItemRangeChanged(positionStart, itemCount);
+ });
+ }
+
+ @Override
+ public void onItemRangeInserted(ObservableList<FriendCode> sender, int positionStart, int itemCount) {
+ getActivity().runOnUiThread(() -> {
+ adapter.notifyItemRangeInserted(positionStart, itemCount);
+ });
+ }
+
+ @Override
+ public void onItemRangeMoved(ObservableList<FriendCode> sender, int fromPosition, int toPosition, int itemCount) {
+ getActivity().runOnUiThread(() -> {
+ adapter.notifyItemMoved(fromPosition, toPosition);
+ });
+ }
+
+ @Override
+ public void onItemRangeRemoved(ObservableList<FriendCode> sender, int positionStart, int itemCount) {
+ getActivity().runOnUiThread(() -> {
+ adapter.notifyItemRangeRemoved(positionStart, itemCount);
+ });
+ }
+ });
+ RecyclerView recyclerView = view.findViewById(R.id.recent_friend_codes_recycler_view);
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
+ linearLayoutManager.setReverseLayout(true);
+ linearLayoutManager.setStackFromEnd(true);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ recyclerView.setAdapter(adapter);
+ Button watchButton = view.findViewById(R.id.watch_button);
+ EditText friendCode = view.findViewById(R.id.friend_code_edit_text);
+ MaterialTextView errorText = view.findViewById(R.id.error_text);
+ watchButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(view.getContext(), WiimmfiActivity.class);
+ if (!isValidFriendCode(friendCode.getText().toString())) {
+ errorText.setText("ERROR: Insert a friend code in the format XXXX-XXXX-XXXX");
+ friendCode.setText("");
+ } else {
+ errorText.setText("");
+ viewModel.saveFriendCode("", friendCode.getText().toString());
+ intent.putExtra("friendCode", friendCode.getText().toString());
+ startActivity(intent);
+ }
+ }
+ });
+
+
+
+ }
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/AppDatabase.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/AppDatabase.java
new file mode 100644
index 0000000..01884c2
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/AppDatabase.java
@@ -0,0 +1,11 @@
+package me.brysonsteck.wiimmfiwatcher.database;
+
+import androidx.room.Database;
+import androidx.room.RoomDatabase;
+
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+
+@Database(entities = {FriendCode.class}, version=1)
+public abstract class AppDatabase extends RoomDatabase {
+ public abstract FriendCodeDao getFriendCodeDao();
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/FriendCodeDao.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/FriendCodeDao.java
new file mode 100644
index 0000000..1b0788e
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/database/FriendCodeDao.java
@@ -0,0 +1,34 @@
+package me.brysonsteck.wiimmfiwatcher.database;
+
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.Query;
+import androidx.room.Update;
+
+import java.util.List;
+
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+
+@Dao
+public interface FriendCodeDao {
+
+ @Query("SELECT * FROM friendcode")
+ public List<FriendCode> getAll();
+
+// @Query("SELECT * FROM friendcodeobj")
+// public FriendCodeObj findByCode(String friendCode);
+
+ @Insert
+ public void insert(FriendCode friendCode);
+
+ @Update
+ public void update(FriendCode friendCode);
+
+ @Delete
+ public void delete(FriendCode friendCode);
+
+ @Query("DELETE FROM friendcode")
+ public void nukeTable();
+
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/model/FriendCode.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/model/FriendCode.java
new file mode 100644
index 0000000..5856a22
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/model/FriendCode.java
@@ -0,0 +1,22 @@
+package me.brysonsteck.wiimmfiwatcher.model;
+
+import androidx.annotation.NonNull;
+import androidx.room.ColumnInfo;
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+
+import java.io.Serializable;
+
+@Entity
+public class FriendCode implements Serializable {
+ @PrimaryKey (autoGenerate = true)
+ public long id;
+
+ @ColumnInfo(name="name")
+ public String name;
+
+ @NonNull
+ @ColumnInfo(name="friendCode")
+ public String friendCode;
+
+} \ No newline at end of file
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/viewmodel/FriendCodeViewModel.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/viewmodel/FriendCodeViewModel.java
new file mode 100644
index 0000000..25cdd64
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/viewmodel/FriendCodeViewModel.java
@@ -0,0 +1,67 @@
+package me.brysonsteck.wiimmfiwatcher.viewmodel;
+
+import android.app.Application;
+import android.database.sqlite.SQLiteDatabase;
+
+import androidx.databinding.ObservableArrayList;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.MutableLiveData;
+import androidx.room.Room;
+
+import me.brysonsteck.wiimmfiwatcher.database.AppDatabase;
+import me.brysonsteck.wiimmfiwatcher.model.FriendCode;
+
+public class FriendCodeViewModel extends AndroidViewModel {
+ ObservableArrayList<FriendCode> entries = new ObservableArrayList<>();
+ MutableLiveData<Boolean> saving = new MutableLiveData<>();
+ MutableLiveData<FriendCode> currentEntry = new MutableLiveData<>();
+ AppDatabase db;
+ public FriendCodeViewModel(Application app) {
+ super(app);
+ saving.setValue(false);
+ db = Room.databaseBuilder(app, AppDatabase.class, "friend-codes-db").build();
+ new Thread(() -> {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ entries.addAll(db.getFriendCodeDao().getAll());
+ }).start();
+ }
+
+ public ObservableArrayList<FriendCode> getEntries() {
+ return entries;
+ }
+
+// public boolean deleteAll() {
+// for (FriendCode entry: entries) {
+// db.getFriendCodeDao().nukeTable();
+// }
+// return true;
+// }
+
+ public void saveFriendCode(String name, String friendCode) {
+ saving.setValue(true);
+ new Thread(() -> {
+ if (currentEntry.getValue() != null) {
+
+ } else {
+ FriendCode newEntry = new FriendCode();
+ newEntry.name = name;
+ newEntry.friendCode = friendCode;
+ db.getFriendCodeDao().insert(newEntry);
+ entries.add(newEntry);
+ }
+
+ saving.postValue(false);
+ }).start();
+ }
+
+// public void deleteEntry(FriendCode entry) {
+// new Thread(() -> {
+// db.getFriendCodeDao().delete(entry);
+// entries.remove(entry);
+// }).start();
+// }
+ }
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java
new file mode 100644
index 0000000..fe9e072
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java
@@ -0,0 +1,15 @@
+package me.brysonsteck.wiimmfiwatcher.wiimmfi;
+
+public class Player {
+ String rosterNumber;
+ String miiName;
+ String friendCode;
+ String role;
+ String loginRegion;
+ String roomMatch;
+ String world;
+ String connFail;
+ String vr;
+ String br;
+ boolean watching;
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java
new file mode 100644
index 0000000..c7a0f29
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java
@@ -0,0 +1,98 @@
+package me.brysonsteck.wiimmfiwatcher.wiimmfi;
+
+import android.annotation.SuppressLint;
+import android.graphics.Color;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.card.MaterialCardView;
+
+import org.jsoup.*;
+
+import java.util.ArrayList;
+
+import me.brysonsteck.wiimmfiwatcher.R;
+
+public class RoomAdapter extends RecyclerView.Adapter<RoomAdapter.ViewHolder>{
+ String display;
+ String playerLink;
+ String header;
+ ArrayList<Player> players;
+
+ public RoomAdapter (String display, String playerLink, String header, ArrayList<Player> players) {
+ this.display = display;
+ this.playerLink = playerLink;
+ this.header = header;
+ this.players = players;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.room_player_data_item, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @SuppressLint("ResourceAsColor")
+ @Override
+ public void onBindViewHolder(@NonNull RoomAdapter.ViewHolder holder, int position) {
+ MaterialCardView cardView = holder.itemView.findViewById(R.id.player_card_view);
+ TextView rosterNumber = holder.itemView.findViewById(R.id.roster_number);
+ TextView miiName = holder.itemView.findViewById(R.id.mii_names);
+ TextView variableDisplay = holder.itemView.findViewById(R.id.variable_side_data);
+ Player currentPlayer = players.get(position);
+ if (currentPlayer.watching) {
+ cardView.setCardBackgroundColor(Color.parseColor("#0D47A1"));
+ rosterNumber.setTextColor(Color.WHITE);
+ miiName.setTextColor(Color.WHITE);
+ variableDisplay.setTextColor(Color.WHITE);
+ }
+ rosterNumber.setText(currentPlayer.rosterNumber + ") ");
+ miiName.setText(currentPlayer.miiName);
+
+ switch (display) {
+ case "fc":
+ variableDisplay.setText(currentPlayer.friendCode);
+ break;
+ case "roles":
+ variableDisplay.setText(currentPlayer.role);
+ break;
+ case "login_regions":
+ variableDisplay.setText(currentPlayer.loginRegion);
+ break;
+ case "room_match":
+ variableDisplay.setText(currentPlayer.roomMatch);
+ break;
+ case "world":
+ variableDisplay.setText(currentPlayer.world);
+ break;
+ case "conn_fail":
+ variableDisplay.setText(currentPlayer.connFail);
+ break;
+ case "vr_br":
+ variableDisplay.setText("VR: " + currentPlayer.vr + " / BR: " + currentPlayer.br);
+ break;
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ if (players == null) {
+ return 0;
+ } else {
+ return players.size();
+ }
+ }
+
+ class ViewHolder extends RecyclerView.ViewHolder {
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ }
+ }
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java
new file mode 100644
index 0000000..284b735
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java
@@ -0,0 +1,132 @@
+package me.brysonsteck.wiimmfiwatcher.wiimmfi;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class RoomData {
+ String roomHeader;
+ String playerLink;
+ String friendCode;
+ ArrayList<Player> players = new ArrayList<>();
+
+ public RoomData (ArrayList<Player> players, String friendCode) {
+ this.friendCode = friendCode;
+ getPlayerLink();
+ Document doc = null;
+
+ if (this.playerLink == null) {
+ System.out.println("The player link is null for some reason");
+ } else {
+
+ try {
+ doc = Jsoup.connect("https://wiimmfi.de/" + this.playerLink)
+ .userAgent("Wiimmfi Watcher for Android (https://github.com/brysonsteck/wiimmfi-watcher) (UNDER DEVELOPMENT)")
+ .get();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ Element table = doc.select("table").get(0);
+ Elements rows = table.select("tr");
+
+ for (int i = 0; i < rows.size(); i++) {
+ Element row = rows.get(i);
+ Elements colPlayers = row.select("td");
+ Elements colHeader = row.select("th");
+
+ if (colHeader.size() > 0) {
+ if (!colHeader.get(0).text().equals("friend code")) {
+ roomHeader = colHeader.get(0).text();
+ }
+ }
+ if (colPlayers.size() > 0) {
+
+ Player currentPlayer = new Player();
+ for (int j = 0; j < colPlayers.size(); j++) {
+ System.out.println("Player Data: " + colPlayers.get(j).text());
+ switch (j) {
+ case 0:
+ currentPlayer.friendCode = colPlayers.get(0).text();
+ break;
+ case 1:
+ currentPlayer.role = colPlayers.get(1).text().split(" ")[1];
+ currentPlayer.rosterNumber = colPlayers.get(1).text().split(" ")[0].replaceAll("\\s", "");
+ break;
+ case 2:
+ currentPlayer.loginRegion = colPlayers.get(2).text();
+ break;
+ case 3:
+ currentPlayer.roomMatch = colPlayers.get(3).text();
+ break;
+ case 4:
+ currentPlayer.world = colPlayers.get(4).text();
+ break;
+ case 5:
+ currentPlayer.connFail = colPlayers.get(5).text();
+ break;
+ case 6:
+ currentPlayer.vr = colPlayers.get(6).text();
+ break;
+ case 7:
+ currentPlayer.br = colPlayers.get(7).text();
+ break;
+ case 8:
+ currentPlayer.miiName = colPlayers.get(8).text();
+ break;
+ }
+ }
+ if (currentPlayer.friendCode.equals(friendCode)) {
+ currentPlayer.watching = true;
+ }
+ players.add(currentPlayer);
+ }
+
+ }
+ }
+ }
+
+ public void getPlayerLink() {
+ try {
+ Document doc = Jsoup.connect("https://wiimmfi.de/stats/mkw")
+ .userAgent("Wiimmfi Watcher for Android (https://github.com/brysonsteck/wiimmfi-watcher) (Developer testing)")
+ .get();
+ Element table = doc.select("table").get(0);
+ Elements rows = table.select("tr");
+
+ for (int i = 0; i < rows.size(); i++) {
+ Element row = rows.get(i);
+ Elements colPlayers = row.select("td");
+
+
+ if (colPlayers.size() > 0) {
+
+ String data = colPlayers.get(0).select("a").toString();
+ if (data.contains(friendCode)) {
+ System.out.println("Found friend code");
+ playerLink = data.split("\"")[3];
+ System.out.println("Player link: " + playerLink);
+ break;
+ }
+ }
+ }
+
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public ArrayList<Player> getPlayers() { return players; }
+
+ public String getRoomHeader() { return this.roomHeader; }
+
+ public RoomData refresh() {
+ players.clear();
+ roomHeader = "";
+ return new RoomData(players, friendCode);
+ }
+}
+
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java
new file mode 100644
index 0000000..afb21d6
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java
@@ -0,0 +1,65 @@
+package me.brysonsteck.wiimmfiwatcher.wiimmfi;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
+import java.util.ArrayList;
+
+import me.brysonsteck.wiimmfiwatcher.R;
+
+public class RoomFragment extends Fragment {
+ String display;
+ String header;
+ String playerLink;
+ ArrayList<Player> players;
+ RoomData roomData;
+
+ public RoomFragment(String friendCode, ArrayList<Player> players, String playerLink, String display) {
+ super(R.layout.fragment_room);
+ this.roomData = new RoomData(players, friendCode);
+ this.header = roomData.getRoomHeader();
+ this.display = display;
+ this.players = players;
+ this.playerLink = playerLink;
+
+ }
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ FloatingActionButton refreshButton = view.findViewById(R.id.refresh_button);
+ TextView headerTextView = view.findViewById(R.id.room_header_text);
+ if (header == null) {
+ header = "This player is not online, not inside a room or does not exist. Click the refresh button to try again, or click on the back button to enter a different friend code.";
+ }
+ headerTextView.setText(header);
+ RecyclerView recyclerView = view.findViewById(R.id.player_data_recycler_view);
+ recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+ recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players));
+
+ refreshButton.setOnClickListener((buttonView) -> {
+ refreshButton.setEnabled(false);
+ players.clear();
+ this.header = "";
+ roomData = roomData.refresh();
+ RoomData newRoomData = roomData.refresh();
+ players = roomData.getPlayers();
+ header = newRoomData.getRoomHeader();
+ if (header == null) {
+ header = "This player is not online, not inside a room or does not exist. Click the refresh button to try again, or click on the back button to enter a different friend code.";
+ }
+ headerTextView.setText(header);
+ recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+ recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players));
+ refreshButton.setEnabled(true);
+ });
+ }
+}
diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java
new file mode 100644
index 0000000..f3029af
--- /dev/null
+++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java
@@ -0,0 +1,108 @@
+package me.brysonsteck.wiimmfiwatcher.wiimmfi;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.StrictMode;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.drawerlayout.widget.DrawerLayout;
+
+import com.google.android.material.appbar.MaterialToolbar;
+import com.google.android.material.navigation.NavigationView;
+
+import org.jsoup.*;
+
+import java.util.ArrayList;
+
+import me.brysonsteck.wiimmfiwatcher.R;
+
+public class WiimmfiActivity extends AppCompatActivity {
+ ArrayList<Player> players = new ArrayList<>();
+ final String[] playerLink = new String[1];
+ String friendCode;
+ String roomHeader;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ friendCode = intent.getStringExtra("friendCode");
+ System.out.println(friendCode);
+ setContentView(R.layout.activity_wiimmfi);
+ StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+ StrictMode.setThreadPolicy(policy);
+
+
+ MaterialToolbar toolbar = findViewById(R.id.toolbar);
+ DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
+ NavigationView drawer = findViewById(R.id.navigation_view);
+
+ toolbar.setTitle("Watching " + friendCode);
+
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ toolbar.setNavigationOnClickListener(view -> {
+ drawerLayout.open();
+ });
+ drawer.setNavigationItemSelectedListener(menuItem -> {
+ menuItem.setChecked(true);
+ drawerLayout.close();
+ if (menuItem.getItemId() == R.id.friend_code) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.roles) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "roles"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.login_regions) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "login_regions"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.room_match) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "room_match"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.world) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "world"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.conn_fail) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "conn_fail"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ if (menuItem.getItemId() == R.id.vr_br) {
+ players.clear();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "vr_br"), null)
+ .setReorderingAllowed(true)
+ .commit();
+ }
+ return true;
+ });
+ }
+
+}
+