diff options
Diffstat (limited to 'app/src/main/java/me/brysonsteck/wiimmfiwatcher')
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; + }); + } + +} + |