Compare commits

..

14 commits
dev ... master

130 changed files with 335 additions and 261 deletions

View file

@ -1,3 +1,7 @@
# ----- **NOTICE** -----
Wiimmfi Watcher's functionality is currently broken due to new DDoS protection currently implemented on Wiimmfi's domain since September 4th, 2021. All requests made by Wiimmfi Watcher currently returns `HTML Error 503: Service Unavailable`. Until a work around is found (which will be unlikely for a guy like me) or the DDoS protection is taken down, Wiimmfi Watcher may not work as expected.
# Wiimmfi Watcher # Wiimmfi Watcher
Wiimmfi Watcher is an unofficial Android application that allows you to watch Mario Kart Wii gameplay by simply entering your friend code. This application can be found on the Google Play Store [here!](https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher) This app can be used in several different languages. Wiimmfi Watcher is an unofficial Android application that allows you to watch Mario Kart Wii gameplay by simply entering your friend code. This application can be found on the Google Play Store [here!](https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher) This app can be used in several different languages.
@ -42,7 +46,7 @@ Please note that donations are **NOT** required and does **NOT** add or remove f
## License ## License
© 2021 Bryson Steck. Wiimmfi Watcher is licensed under the [GPL-3.0](LICENSE). © 2021-2022 Bryson Steck. Wiimmfi Watcher is licensed under the [GPL-3.0](LICENSE).
Wiimmfi Watcher is free software: you can redistribute it and/or modify Wiimmfi Watcher is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

19
TODO.md
View file

@ -1,13 +1,18 @@
# TODO # TODO
These are issues in Wiimmfi Watcher I am at least aware of. Please **DO NOT** submit a bug report on the Google Form or an issue here on GitHub if it is mentioned on this list, unless you found a way that the bug can crash the app. These are issues in Wiimmfi Watcher I am at least aware of. Please **DO NOT** submit a bug report on the Google Form or an issue here on GitHub if it is mentioned on this list, unless you found a way that the bug can crash the app.
### Completed For Release 1.1.4 ### Completed For Release 1.2
* Added an updater to make sure subsequent releases are up to date * Fixed "null" version causing updater to appear
* Implement the updater into the UI * A Toast now appears discretely notifying the user that it failed to connect to the server.
* Track photos!
* No longer requiring strict rules in order to submit an issue or google form.
### Working On ### Working On
* Create a better looking header for the watcher activity * Create a better looking header for the watcher activity
* Add 'sections' I guess??? * Add 'sections' I guess???i
* Add the ability to search for a Mii name instead of a friend code
* Create a more feature rich settings and about page
* manual dark mode toggles, clear recent codes button, etc.
### Aware Of ### Aware Of
* The about fragment causes part of the screen to get cut off as the animation plays when returning to the main fragment (only if there are a few recent friend codes) * The about fragment causes part of the screen to get cut off as the animation plays when returning to the main fragment (only if there are a few recent friend codes)
@ -15,17 +20,11 @@ These are issues in Wiimmfi Watcher I am at least aware of. Please **DO NOT** su
* The selected player detail text and icon is black * The selected player detail text and icon is black
* The highlight color is barely visible * The highlight color is barely visible
* Adding the option to toggle dark mode manually so older devices can have that privledge as well * Adding the option to toggle dark mode manually so older devices can have that privledge as well
* Stop forcing a refresh after changing the data on the right
# Features I would like to add # Features I would like to add
* The watcher activity does not refresh automatically like the official website does * The watcher activity does not refresh automatically like the official website does
* Added a refresh button, but is there a better way with Jsoup? Like a new Thread? * Added a refresh button, but is there a better way with Jsoup? Like a new Thread?
* Add the Mario Kart Wii font * Add the Mario Kart Wii font
* I'll have to see if I can pull it from the Wiimmfi website somehow * I'll have to see if I can pull it from the Wiimmfi website somehow
* Add pictures for Nintendo and CTGP tracks
* Google's policies might prevent this...
* The ability to save friend codes and name them, not just save recent friend codes * The ability to save friend codes and name them, not just save recent friend codes
* Create a more feature rich settings and about page
* manual dark mode toggles, clear recent codes button, etc.
* Add the ability to search for a Mii name instead of a friend code
* Show statistics for other games * Show statistics for other games

View file

@ -11,8 +11,8 @@ android {
applicationId "me.brysonsteck.wiimmfiwatcher" applicationId "me.brysonsteck.wiimmfiwatcher"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 30 targetSdkVersion 30
versionCode 6 versionCode 8
versionName "1.1.4" versionName "1.2.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -35,7 +35,6 @@ android {
dependencies { dependencies {
implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.code.gson:gson:2.8.6'
def lifecycle_version = "2.3.1" def lifecycle_version = "2.3.1"
def preference_version = '1.1.1'
// ViewModel // ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
@ -48,7 +47,6 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.fragment:fragment:1.3.3" implementation "androidx.fragment:fragment:1.3.3"
implementation "androidx.preference:preference:$preference_version"
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0' implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

View file

@ -18,8 +18,8 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".wiimmfi.WiimmfiActivity"/> <activity android:name=".wiimmfi.WiimmfiActivity"
<activity android:name=".settings.SettingsActivity"/> android:theme="@style/Theme.WiimmfiWatcher.Watching"/>
</application> </application>
</manifest> </manifest>

View file

@ -12,10 +12,11 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room; import androidx.room.Room;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.tabs.TabLayout;
import me.brysonsteck.wiimmfiwatcher.database.AppDatabase; import me.brysonsteck.wiimmfiwatcher.database.AppDatabase;
import me.brysonsteck.wiimmfiwatcher.fragments.AboutFragment;
import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment; import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment;
import me.brysonsteck.wiimmfiwatcher.settings.SettingsActivity;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
AppDatabase database; AppDatabase database;
@ -28,22 +29,61 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
View settingsButton = findViewById(R.id.settings_button); View aboutButton = findViewById(R.id.about_button);
if (savedInstanceState == null) { if (savedInstanceState == null) {
settingsButton.setVisibility(View.VISIBLE); aboutButton.setVisibility(View.VISIBLE);
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.friend_code_input_fragment, new WatchCodeFragment(), null) .replace(R.id.friend_code_input_fragment, new WatchCodeFragment(true), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
database = Room.databaseBuilder(this, AppDatabase.class, "friend-codes-db").build(); database = Room.databaseBuilder(this, AppDatabase.class, "friend-codes-db").build();
settingsButton.setOnClickListener((about) -> { aboutButton.setOnClickListener((about) -> {
Intent intent = new Intent(this, SettingsActivity.class); aboutButton.setVisibility(View.INVISIBLE);
startActivity(intent); getSupportFragmentManager().beginTransaction()
.setCustomAnimations(
R.anim.slide_in,
R.anim.fade_out,
R.anim.fade_in,
R.anim.slide_out)
.replace(R.id.friend_code_input_fragment, new AboutFragment(), null)
.setReorderingAllowed(true)
.addToBackStack(null)
.commit();
}); });
// TabLayout tabLayout = findViewById(R.id.tablayout_main);
// tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
// @Override
// public void onTabSelected(TabLayout.Tab tab) {
// if (tab.getText().equals("Friend Code")) {
// getSupportFragmentManager().beginTransaction()
// .replace(R.id.friend_code_input_fragment, new WatchCodeFragment(true), null)
// .setReorderingAllowed(true)
// .commit();
//
// }
// else if (tab.getText().equals("Mii Name")) {
// getSupportFragmentManager().beginTransaction()
// .replace(R.id.friend_code_input_fragment, new WatchCodeFragment(false), null)
// .setReorderingAllowed(true)
// .commit();
// }
// }
// @Override
// public void onTabUnselected(TabLayout.Tab tab) {
//
// }
//
// @Override
// public void onTabReselected(TabLayout.Tab tab) {
//
// }
// });
//
} }
@Override @Override
@ -105,9 +145,8 @@ public class MainActivity extends AppCompatActivity {
.show(); .show();
} else if (failed[0] && !shownUpdate) { } else if (failed[0] && !shownUpdate) {
shownUpdate = true; shownUpdate = true;
Toast.makeText(this, "An error occurred while checking for updates for Wiimmfi Watcher.", Toast.LENGTH_LONG).show(); Toast.makeText(this, "An error occurred while checking for updates for Wiimmfi Watcher. Please try again later.", Toast.LENGTH_LONG).show();
} }
} }
@Override @Override

View file

@ -13,9 +13,9 @@ import java.net.URLConnection;
public class Updater { public class Updater {
public boolean outdated = false; public boolean outdated = false;
public boolean failed = false;
public String newestRelease; public String newestRelease;
public String githubRelease; public String githubRelease;
public boolean failed = false;
public String playStore = "https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher"; public String playStore = "https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher";
public Updater() { public Updater() {
@ -55,19 +55,21 @@ public class Updater {
} }
public void compareRelease(String deviceRelease) { public void compareRelease(String deviceRelease) {
if (newestRelease == null) { if (newestRelease == null) {
failed = true; failed = true;
} }
else if (!deviceRelease.equals(newestRelease)) { else if (!deviceRelease.equals(newestRelease)) {
outdated = true; outdated = true;
} }
} }
public boolean isOutdated() { public boolean isOutdated() {
return outdated; return outdated;
} }
public boolean hasFailed() { return failed; } public boolean hasFailed() {
return failed;
}
public String getNewestRelease() { public String getNewestRelease() {
return newestRelease; return newestRelease;

View file

@ -3,6 +3,7 @@ package me.brysonsteck.wiimmfiwatcher.fragments;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.transition.TransitionInflater; import android.transition.TransitionInflater;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
@ -27,9 +28,11 @@ import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity;
public class WatchCodeFragment extends Fragment { public class WatchCodeFragment extends Fragment {
ProgressDialog progressBar; ProgressDialog progressBar;
boolean friendCodeMode = true;
public WatchCodeFragment() { public WatchCodeFragment(boolean friendCodeMode) {
super(R.layout.watch_code_fragment); super(R.layout.watch_code_fragment);
this.friendCodeMode = friendCodeMode;
} }
public boolean isValidFriendCode(String friendCode) { public boolean isValidFriendCode(String friendCode) {
@ -62,6 +65,11 @@ public class WatchCodeFragment extends Fragment {
progressBar = new ProgressDialog(getContext(), R.style.AppCompatAlertDialogStyle); progressBar = new ProgressDialog(getContext(), R.style.AppCompatAlertDialogStyle);
MaterialTextView errorText = view.findViewById(R.id.error_text); MaterialTextView errorText = view.findViewById(R.id.error_text);
// TODO: Remove these 3 lines of code if DDoS protection is removed \/
errorText.setText(R.string.ddos_notice);
errorText.setClickable(true);
errorText.setMovementMethod(LinkMovementMethod.getInstance());
WatchCodeAdapter adapter = new WatchCodeAdapter(getContext(), viewModel.getEntries(), errorText, progressBar); WatchCodeAdapter adapter = new WatchCodeAdapter(getContext(), viewModel.getEntries(), errorText, progressBar);
viewModel.getEntries().addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<FriendCode>>() { viewModel.getEntries().addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<FriendCode>>() {
@Override @Override
@ -107,6 +115,9 @@ public class WatchCodeFragment extends Fragment {
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
EditText friendCode = view.findViewById(R.id.friend_code_edit_text); EditText friendCode = view.findViewById(R.id.friend_code_edit_text);
if (!friendCodeMode) {
friendCode.setHint(R.string.enter_mii);
}
Button watchButton = view.findViewById(R.id.watch_button); Button watchButton = view.findViewById(R.id.watch_button);
watchButton.setOnClickListener(buttonClick -> { watchButton.setOnClickListener(buttonClick -> {
startWiimmfiActivity( startWiimmfiActivity(

View file

@ -1,4 +0,0 @@
package me.brysonsteck.wiimmfiwatcher.settings;
public class ParseSettings {
}

View file

@ -1,26 +0,0 @@
package me.brysonsteck.wiimmfiwatcher.settings;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import me.brysonsteck.wiimmfiwatcher.R;
import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment;
public class SettingsActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
if (savedInstanceState != null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_fragment_view, new SettingsMainFragment(), null)
.setReorderingAllowed(true)
.commit();
}
}
}

View file

@ -1,37 +0,0 @@
package me.brysonsteck.wiimmfiwatcher.settings;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import me.brysonsteck.wiimmfiwatcher.R;
public class SettingsMainFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootkey) {
super.onCreate(savedInstanceState);
setPreferencesFromResource(R.xml.preferences, rootkey);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListPreference mListPreference = (ListPreference) getPreferenceManager().findPreference("preference_key");
mListPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// your code here
return true;
}
});
return inflater.inflate(R.layout.main_settings_fragment, container, false);
}
}

View file

@ -0,0 +1,103 @@
package me.brysonsteck.wiimmfiwatcher.wiimmfi;
import android.widget.ImageView;
import me.brysonsteck.wiimmfiwatcher.R;
public class SetImageView {
public SetImageView(ImageView image, String header, boolean failure) {
if (failure) {
image.setImageResource(R.drawable.globe);
} else {
header = header.toLowerCase();
if (header.contains("wii luigi circuit")) {
image.setImageResource(R.drawable.course_lc);
} else if (header.contains("wii moo moo meadows")) {
image.setImageResource(R.drawable.course_mmm);
} else if (header.contains("wii mushroom gorge")) {
image.setImageResource(R.drawable.course_mg);
} else if (header.contains("wii toad's factory")) {
image.setImageResource(R.drawable.course_tf);
} else if (header.contains("wii mario circuit")) {
image.setImageResource(R.drawable.course_mc);
} else if (header.contains("wii coconut mall")) {
image.setImageResource(R.drawable.course_cm);
} else if (header.contains("wii dk summit") || header.contains("wii dk's snowboard cross")) {
image.setImageResource(R.drawable.course_dks);
} else if (header.contains("wii wario's gold mine")) {
image.setImageResource(R.drawable.course_wgm);
} else if (header.contains("wii daisy circuit")) {
image.setImageResource(R.drawable.course_dc);
} else if (header.contains("wii koopa cape")) {
image.setImageResource(R.drawable.course_kc);
} else if (header.contains("wii maple treeway")) {
image.setImageResource(R.drawable.course_mt);
} else if (header.contains("wii grumble volcano")) {
image.setImageResource(R.drawable.course_gv);
} else if (header.contains("wii dry dry ruins")) {
image.setImageResource(R.drawable.course_ddr);
} else if (header.contains("wii moonview highway")) {
image.setImageResource(R.drawable.course_mh);
} else if (header.contains("wii bowser's castle")) {
image.setImageResource(R.drawable.course_bc);
} else if (header.contains("wii rainbow road")) {
image.setImageResource(R.drawable.course_rr);
} else if (header.contains("gcn peach beach")) {
image.setImageResource(R.drawable.course_rpb);
} else if (header.contains("ds yoshi falls")) {
image.setImageResource(R.drawable.course_ryf);
} else if (header.contains("snes ghost valley 2")) {
image.setImageResource(R.drawable.course_rgv2);
} else if (header.contains("n64 mario raceway")) {
image.setImageResource(R.drawable.course_rmr);
} else if (header.contains("n64 sherbet land")) {
image.setImageResource(R.drawable.course_rsl);
} else if (header.contains("gba shy guy beach")) {
image.setImageResource(R.drawable.course_rsgb);
} else if (header.contains("ds delfino square")) {
image.setImageResource(R.drawable.course_rds);
} else if (header.contains("gcn waluigi stadium")) {
image.setImageResource(R.drawable.course_rws);
} else if (header.contains("ds desert hills")) {
image.setImageResource(R.drawable.course_rdh);
} else if (header.contains("gba bowser castle 3")) {
image.setImageResource(R.drawable.course_rbc3);
} else if (header.contains("n64 dk's jungle parkway")) {
image.setImageResource(R.drawable.course_rdkjp);
} else if (header.contains("gcn mario circuit")) {
image.setImageResource(R.drawable.course_rmc);
} else if (header.contains("snes mario circuit 3")) {
image.setImageResource(R.drawable.course_rmc3);
} else if (header.contains("ds peach gardens")) {
image.setImageResource(R.drawable.course_rpg);
} else if (header.contains("gcn dk mountain")) {
image.setImageResource(R.drawable.course_rdkm);
} else if (header.contains("n64 bowser's castle")) {
image.setImageResource(R.drawable.course_rbc);
} else if (header.contains("wii block plaza")) {
image.setImageResource(R.drawable.battle_bp);
} else if (header.contains("wii delfino pier")) {
image.setImageResource(R.drawable.battle_dp);
} else if (header.contains("wii funky stadium")) {
image.setImageResource(R.drawable.battle_fs);
} else if (header.contains("wii chain chomp")) {
image.setImageResource(R.drawable.battle_ccw);
} else if (header.contains("wii thwomp desert")) {
image.setImageResource(R.drawable.battle_td);
} else if (header.contains("snes battle course 4")) {
image.setImageResource(R.drawable.battle_rbc4);
} else if (header.contains("n64 skyscraper")) {
image.setImageResource(R.drawable.battle_rs);
} else if (header.contains("gba battle course 3")) {
image.setImageResource(R.drawable.battle_rbc3);
} else if (header.contains("gcn cookie land")) {
image.setImageResource(R.drawable.battle_rcl);
} else if (header.contains("ds twilight house")) {
image.setImageResource(R.drawable.battle_rth);
} else if (header.contains("last track:") && !header.contains("nintendo")) {
image.setImageResource(R.drawable.course_ctgp);
}
}
}
}

View file

@ -5,6 +5,7 @@ import android.content.res.Configuration;
import android.graphics.Color; import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.os.StrictMode; import android.os.StrictMode;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
@ -32,6 +33,7 @@ public class WiimmfiActivity extends AppCompatActivity {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); StrictMode.setThreadPolicy(policy);
ImageView image = findViewById(R.id.image);
MaterialToolbar toolbar = findViewById(R.id.toolbar); MaterialToolbar toolbar = findViewById(R.id.toolbar);
DrawerLayout drawerLayout = findViewById(R.id.drawer_layout); DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
NavigationView drawer = findViewById(R.id.navigation_view); NavigationView drawer = findViewById(R.id.navigation_view);
@ -48,7 +50,7 @@ public class WiimmfiActivity extends AppCompatActivity {
if (savedInstanceState == null) { if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
@ -61,49 +63,49 @@ public class WiimmfiActivity extends AppCompatActivity {
if (menuItem.getItemId() == R.id.friend_code) { if (menuItem.getItemId() == R.id.friend_code) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "fc", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.roles) { if (menuItem.getItemId() == R.id.roles) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "roles", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "roles", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.login_regions) { if (menuItem.getItemId() == R.id.login_regions) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "login_regions", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "login_regions", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.room_match) { if (menuItem.getItemId() == R.id.room_match) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "room_match", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "room_match", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.world) { if (menuItem.getItemId() == R.id.world) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "world", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "world", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.conn_fail) { if (menuItem.getItemId() == R.id.conn_fail) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "conn_fail", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "conn_fail", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }
if (menuItem.getItemId() == R.id.vr_br) { if (menuItem.getItemId() == R.id.vr_br) {
players.clear(); players.clear();
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "vr_br", toolbar), null) .replace(R.id.room_fragment, new RoomFragment(friendCode, players, playerLink[0], "vr_br", toolbar, image), null)
.setReorderingAllowed(true) .setReorderingAllowed(true)
.commit(); .commit();
} }

View file

@ -2,7 +2,9 @@ package me.brysonsteck.wiimmfiwatcher.wiimmfi.fragments;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -18,6 +20,7 @@ import java.util.ArrayList;
import me.brysonsteck.wiimmfiwatcher.R; import me.brysonsteck.wiimmfiwatcher.R;
import me.brysonsteck.wiimmfiwatcher.wiimmfi.Player; import me.brysonsteck.wiimmfiwatcher.wiimmfi.Player;
import me.brysonsteck.wiimmfiwatcher.wiimmfi.RoomData; import me.brysonsteck.wiimmfiwatcher.wiimmfi.RoomData;
import me.brysonsteck.wiimmfiwatcher.wiimmfi.SetImageView;
public class RoomFragment extends Fragment { public class RoomFragment extends Fragment {
String display; String display;
@ -26,8 +29,9 @@ public class RoomFragment extends Fragment {
ArrayList<Player> players; ArrayList<Player> players;
RoomData roomData; RoomData roomData;
MaterialToolbar toolbar; MaterialToolbar toolbar;
ImageView image;
public RoomFragment(String friendCode, ArrayList<Player> players, String playerLink, String display, MaterialToolbar toolbar) { public RoomFragment(String friendCode, ArrayList<Player> players, String playerLink, String display, MaterialToolbar toolbar, ImageView image) {
super(R.layout.room_fragment); super(R.layout.room_fragment);
this.roomData = new RoomData(players, friendCode); this.roomData = new RoomData(players, friendCode);
new Thread(() -> { new Thread(() -> {
@ -37,6 +41,7 @@ public class RoomFragment extends Fragment {
this.players = players; this.players = players;
this.playerLink = playerLink; this.playerLink = playerLink;
this.toolbar = toolbar; this.toolbar = toolbar;
this.image = image;
} }
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
@ -46,20 +51,24 @@ public class RoomFragment extends Fragment {
if (header == null) { if (header == null) {
headerTextView.setText(R.string.header_null_error); headerTextView.setText(R.string.header_null_error);
toolbar.setNavigationIcon(null); toolbar.setNavigationIcon(null);
SetImageView setImageView = new SetImageView(image, header, true);
} }
if (roomData.error != null) { if (roomData.error != null) {
headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error));
toolbar.setNavigationIcon(null); toolbar.setNavigationIcon(null);
SetImageView setImageView = new SetImageView(image, header, true);
} }
if (roomData.error == null && header != null) { if (roomData.error == null && header != null) {
headerTextView.setText(header); headerTextView.setText(header);
toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24);
SetImageView setImageView = new SetImageView(image, header, false);
} }
RecyclerView recyclerView = view.findViewById(R.id.player_data_recycler_view); RecyclerView recyclerView = view.findViewById(R.id.player_data_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext()));
refreshButton.setOnClickListener((buttonView) -> { refreshButton.setOnClickListener((buttonView) -> {
Toast.makeText(getContext(), "Refreshing!", Toast.LENGTH_LONG).show();
this.players.clear(); this.players.clear();
this.header = ""; this.header = "";
this.roomData = roomData.refresh(); this.roomData = roomData.refresh();
@ -69,14 +78,17 @@ public class RoomFragment extends Fragment {
if (header == null) { if (header == null) {
headerTextView.setText(R.string.header_null_error); headerTextView.setText(R.string.header_null_error);
toolbar.setNavigationIcon(null); toolbar.setNavigationIcon(null);
SetImageView setImageView = new SetImageView(image, header, true);
} }
if (newRoomData.error instanceof java.net.SocketTimeoutException || newRoomData.error instanceof java.net.UnknownHostException) { if (newRoomData.error instanceof java.net.SocketTimeoutException || newRoomData.error instanceof java.net.UnknownHostException) {
headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error));
toolbar.setNavigationIcon(null); toolbar.setNavigationIcon(null);
SetImageView setImageView = new SetImageView(image, header, true);
} }
if (roomData.error == null && header != null) { if (roomData.error == null && header != null) {
headerTextView.setText(header); headerTextView.setText(header);
toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24);
SetImageView setImageView = new SetImageView(image, header, false);
} }
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext()));

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -1,5 +0,0 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>

View file

@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
</vector>

View file

@ -27,10 +27,32 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:elevation="0dp" android:elevation="0dp"
app:menu="@menu/top_app_bar_main" app:menu="@menu/top_app_bar"
app:title="Wiimmfi Watcher" app:title="Wiimmfi Watcher"
app:titleTextColor="@color/white" /> app:titleTextColor="@color/white" />
<!-- <com.google.android.material.tabs.TabLayout-->
<!-- android:id="@+id/tablayout_main"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:background="@color/blue_700"-->
<!-- app:tabIndicatorColor="@color/white"-->
<!-- app:tabMode="fixed"-->
<!-- app:tabTextColor="@color/white">-->
<!-- <com.google.android.material.tabs.TabItem-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="Friend Code" />-->
<!-- <com.google.android.material.tabs.TabItem-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="Mii Name" />-->
<!-- </com.google.android.material.tabs.TabLayout>-->
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView

View file

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer_layout"
tools:context=".settings.SettingsActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="@style/Widget.MaterialComponents.Toolbar.Primary"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
app:navigationIconTint="#FFFFFF"
android:elevation="0dp"
app:title="@string/settings_title"
app:titleTextColor="@color/white" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/settings_fragment_view"
android:name="me.brysonsteck.wiimmfiwatcher.settings.SettingsMainFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteY="56dp" />
<!-- <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton-->
<!-- android:id="@+id/clear_button"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="bottom|right"-->
<!-- android:layout_margin="15dp"-->
<!-- android:foregroundTint="#FFFFFF"-->
<!-- android:text="Clear"-->
<!-- android:textColor="#FFFFFF"-->
<!-- app:backgroundTint="#1E88E5"-->
<!-- app:icon="@drawable/ic_baseline_clear_all_24"-->
<!-- app:iconTint="#FFFFFF"-->
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
<!-- app:layout_constraintEnd_toEndOf="parent" />-->
<!-- Screen content -->
<!-- Use app:layout_behavior="@string/appbar_scrolling_view_behavior" to fit below top app bar -->
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -15,20 +15,40 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
style="@style/Widget.MaterialComponents.AppBarLayout.Primary" style="@style/Widget.MaterialComponents.AppBarLayout.Primary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="200dp"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/toolbar"
style="@style/Widget.MaterialComponents.Toolbar.Primary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="match_parent"
android:background="@android:color/transparent" android:fitsSystemWindows="true"
android:elevation="0dp" app:expandedTitleTextAppearance="@style/TextAppearance.App.CollapsingToolbar.Expanded"
app:navigationIcon="@drawable/ic_baseline_menu_24" app:collapsedTitleTextAppearance="@style/TextAppearance.App.CollapsingToolbar.Collapsed">
app:navigationIconTint="#FFFFFF"
app:title="Watching 0000-0000-0000" <ImageView
app:titleTextColor="#FFFFFF" /> android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/globe" />
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="@style/Widget.MaterialComponents.Toolbar.Primary"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:elevation="0dp"
app:navigationIcon="@drawable/ic_baseline_menu_24"
app:title="Watching 0000-0000-0000"
app:titleTextColor="#FFFFFF" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@ -51,7 +71,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:theme="@style/Theme.WiimmfiWatcher" android:theme="@style/Theme.WiimmfiWatcher.Watching"
app:headerLayout="@layout/header_navigation_drawer" app:headerLayout="@layout/header_navigation_drawer"
app:menu="@menu/drawer_navigation_menu"> app:menu="@menu/drawer_navigation_menu">

View file

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Switch
android:id="@+id/switch1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Switch"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ToggleButton
android:id="@+id/toggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ToggleButton" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</RadioGroup>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -11,10 +11,13 @@
android:id="@+id/room_header_text" android:id="@+id/room_header_text"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="18dp" android:paddingTop="18dp"
android:paddingLeft="18dp"
android:paddingRight="18dp"
android:text="TextView" android:text="TextView"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/player_data_recycler_view" android:id="@+id/player_data_recycler_view"

View file

@ -5,14 +5,7 @@
android:id="@+id/about_button" android:id="@+id/about_button"
android:icon="@drawable/ic_baseline_info_24" android:icon="@drawable/ic_baseline_info_24"
android:title="About" android:title="About"
android:visible="false" android:visible="true"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item
android:id="@+id/settings_button"
android:icon="@drawable/ic_baseline_settings_24"
android:visible="true"
app:showAsAction="ifRoom"
android:title="Settings" />
</menu> </menu>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
</menu>

View file

@ -34,4 +34,5 @@
<string name="update_negative">Später</string> <string name="update_negative">Später</string>
<string name="update_title">Ein neues Update ist verfügbar!</string> <string name="update_title">Ein neues Update ist verfügbar!</string>
<string name="update_message">Eine neue Version von Wiimmfi Watcher ist im Play Store verfügbar (Version %1$s)! Sie können es herunterladen, indem Sie auf \"Aktualisieren\" klicken.</string> <string name="update_message">Eine neue Version von Wiimmfi Watcher ist im Play Store verfügbar (Version %1$s)! Sie können es herunterladen, indem Sie auf \"Aktualisieren\" klicken.</string>
<string name="ddos_notice">*** NOTIZ ***\nDie Domäne von Wiimmfi hat aufgrund der jüngsten DDoS-Angriffe auf die Website kürzlich einen DDoS-Schutz implementiert. Dies beeinträchtigt die Funktionalität von Wiimmfi Watcher, bis der Schutz entfernt wird. Wenn auf dem nächsten Bildschirm der Fehler "Status=503" angezeigt wird, müssen Sie möglicherweise in der Zwischenzeit die <a href="https://wiimmfi.de">offizielle Website</a> verwenden. Entschuldigung für die Unannehmlichkeiten. Sie können den Status dieses Problems mit dieser <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">GitHub-Ausgabe</a> anzeigen.</string>
</resources> </resources>

View file

@ -34,4 +34,5 @@
<string name="update_negative">Luego</string> <string name="update_negative">Luego</string>
<string name="update_title">¡Hay una nueva actualización disponible!</string> <string name="update_title">¡Hay una nueva actualización disponible!</string>
<string name="update_message">¡Hay una nueva versión de Wiimmfi Watcher disponible en Play Store (versión %1$s)! Puedes descargarlo presionando \"Actualizar\".</string> <string name="update_message">¡Hay una nueva versión de Wiimmfi Watcher disponible en Play Store (versión %1$s)! Puedes descargarlo presionando \"Actualizar\".</string>
<string name="ddos_notice">*** AVISO ***\nEl dominio de Wiimmfi ha implementado recientemente la protección DDoS debido a los recientes ataques DDoS en el sitio web. Esto afectará la funcionalidad de Wiimmfi Watcher hasta que se elimine la protección. Si ves un error "Status=503" en la siguiente pantalla, es posible que tengas que usar el <a href="https://wiimmfi.de">sitio web oficial</a> mientras tanto. Disculpas por los inconvenientes. Puede ver el estado de este problema con este <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">problema de GitHub.</a></string>
</resources> </resources>

View file

@ -41,5 +41,6 @@
<string name="update_negative">Ensuite</string> <string name="update_negative">Ensuite</string>
<string name="update_title">Une nouvelle mise à jour est disponible!</string> <string name="update_title">Une nouvelle mise à jour est disponible!</string>
<string name="update_message">Une nouvelle version de Wiimmfi Watcher est disponible sur le Play Store (version %1$s)! Vous pouvez le télécharger en appuyant sur \"Mettre à jour\".</string> <string name="update_message">Une nouvelle version de Wiimmfi Watcher est disponible sur le Play Store (version %1$s)! Vous pouvez le télécharger en appuyant sur \"Mettre à jour\".</string>
<string name="ddos_notice">*** AVIS ***\nLe domaine de Wiimmfi a récemment mis en place une protection DDoS en raison des récentes attaques DDoS sur le site Web. Cela affectera les fonctionnalités de Wiimmfi Watcher jusqu\'à ce que la protection soit supprimée. Si vous voyez une erreur "Status=503" sur l\'écran suivant, vous devrez peut-être utiliser le <a href="https://wiimmfi.de">site officiel</a> entre-temps. Mes excuses pour le derangement. Vous pouvez afficher l\'état de ce problème avec ce <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">problème GitHub.</a></string>
</resources> </resources>

View file

@ -34,4 +34,5 @@
<string name="update_negative">Dopo</string> <string name="update_negative">Dopo</string>
<string name="update_title">È disponibile un nuovo aggiornamento!</string> <string name="update_title">È disponibile un nuovo aggiornamento!</string>
<string name="update_message">Una nuova versione di Wiimmfi Watcher è disponibile sul Play Store (versione %1$s)! Puoi scaricarlo premendo \"Aggiorna\".</string> <string name="update_message">Una nuova versione di Wiimmfi Watcher è disponibile sul Play Store (versione %1$s)! Puoi scaricarlo premendo \"Aggiorna\".</string>
<string name="ddos_notice">*** AVVISO ***\nIl dominio di Wiimmfi ha recentemente implementato la protezione DDoS a causa dei recenti attacchi DDoS al sito web. Ciò influenzerà la funzionalità di Wiimmfi Watcher fino alla rimozione della protezione. Se vedi un errore "Status=503" nella schermata successiva, potresti dover usare il <a href="https://wiimmfi.de">sito web ufficiale</a> nel frattempo. Scuse per l\'inconveniente. Puoi visualizzare lo stato di questo problema con questo <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">problema di GitHub.</a></string>
</resources> </resources>

View file

@ -34,4 +34,5 @@
<string name="update_negative">後で</string> <string name="update_negative">後で</string>
<string name="update_title">新しいアップデートが利用可能です!</string> <string name="update_title">新しいアップデートが利用可能です!</string>
<string name="update_message">Wiimmfiウォッチャーの新しいバージョンがPlayストアで入手できますバージョン %1$s「更新」を押すとダウンロードできます。</string> <string name="update_message">Wiimmfiウォッチャーの新しいバージョンがPlayストアで入手できますバージョン %1$s「更新」を押すとダウンロードできます。</string>
<string name="ddos_notice">*** 知らせ ***\nWiimmfiのドメインは、Webサイトに対する最近のDDoS攻撃により、最近DDoS保護を実装しました。 これは、保護が解除されるまでWiimmfiWatcherの機能に影響します。 次の画面で「Status=503」エラーが表示された場合は、当面の間、<a href="https://wiimmfi.de">公式Webサイト</a>を使用する必要がある場合があります。 ご迷惑をおかけして申し訳ございません。 この<a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">GitHubの問題</a>でこの問題の状態を確認できます。</string>
</resources> </resources>

View file

@ -34,4 +34,5 @@
<string name="update_negative">나중</string> <string name="update_negative">나중</string>
<string name="update_title">새로운 업데이트가 있습니다!</string> <string name="update_title">새로운 업데이트가 있습니다!</string>
<string name="update_message">Play 스토어 (버전 %1$s)에서 Wiimmfi Watcher의 새 버전을 사용할 수 있습니다! \"업데이트\"를 눌러 다운로드 할 수 있습니다.</string> <string name="update_message">Play 스토어 (버전 %1$s)에서 Wiimmfi Watcher의 새 버전을 사용할 수 있습니다! \"업데이트\"를 눌러 다운로드 할 수 있습니다.</string>
<string name="ddos_notice">*** 알아 채다 ***\nWiimmfi의 도메인은 최근 웹사이트에 대한 DDoS 공격으로 인해 DDoS 보호를 구현했습니다. 이것은 보호가 제거될 때까지 Wiimmfi Watcher의 기능에 영향을 미칩니다. 다음 화면에서 "Status=503" 오류가 표시되면 그 동안 <a href="https://wiimmfi.de">공식 웹사이트</a>를 사용해야 할 수 있습니다. 불편을 끼쳐 드린 것에 대해 죄송합니다. 이 <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">GitHub 문제</a>에서 이 문제의 상태를 볼 수 있습니다.</string>
</resources> </resources>

View file

@ -13,4 +13,28 @@
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
<style name="Theme.WiimmfiWatcher.Watching" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">#212121</item>
<item name="colorPrimaryVariant">#000000</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/blue_200</item>
<item name="colorSecondaryVariant">@color/blue_200</item>
<item name="colorOnSecondary">@color/white</item>
<item name="android:windowTranslucentStatus">true</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="TextAppearance.App.CollapsingToolbar.Expanded" parent="TextAppearance.MaterialComponents.Headline5">
<item name="android:textColor">@color/white</item>
</style>
<style name="TextAppearance.App.CollapsingToolbar.Collapsed" parent="TextAppearance.MaterialComponents.Headline6">
<item name="android:textColor">@color/white</item>
</style>
</resources> </resources>

View file

@ -34,4 +34,5 @@
<string name="update_negative">Mais tarde</string> <string name="update_negative">Mais tarde</string>
<string name="update_title">Uma nova atualização está disponível!</string> <string name="update_title">Uma nova atualização está disponível!</string>
<string name="update_message">Uma nova versão do Wiimmfi Watcher está disponível na Play Store (versão %1$s)! Você pode baixá-lo pressionando \"Atualizar\".</string> <string name="update_message">Uma nova versão do Wiimmfi Watcher está disponível na Play Store (versão %1$s)! Você pode baixá-lo pressionando \"Atualizar\".</string>
<string name="ddos_notice">*** PERCEBER ***\nO domínio de Wiimmfi implementou recentemente proteção DDoS devido aos recentes ataques DDoS no site. Isso afetará a funcionalidade do Wiimmfi Watcher até que a proteção seja removida. Se você vir um erro "Status=503" na próxima tela, talvez seja necessário usar o <a href="https://wiimmfi.de">site oficial</a> enquanto isso. Desculpas pela inconveniência. Você pode ver o estado desse problema com este <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">problema do GitHub.</a></string>
</resources> </resources>

View file

@ -5,13 +5,15 @@
<string name="about_me">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!</string> <string name="about_me">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!</string>
<string name="about_watcher">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 matches on your phone in a quick and easy way. </string> <string name="about_watcher">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 matches on your phone in a quick and easy way. </string>
<string name="github">All of the code in this project is open source on my GitHub repository <a href='https://github.com/brysonsteck/wiimmfi-watcher/tree/master'>here.</a> You are free to use this code and expand upon it under the <a href='https://github.com/brysonsteck/wiimmfi-watcher/tree/master/LICENSE'>GNU General Public License</a> (Version 3).</string> <string name="github">All of the code in this project is open source on my GitHub repository <a href='https://github.com/brysonsteck/wiimmfi-watcher/tree/master'>here.</a> You are free to use this code and expand upon it under the <a href='https://github.com/brysonsteck/wiimmfi-watcher/tree/master/LICENSE'>GNU General Public License</a> (Version 3).</string>
<string name="bugs">Speaking of bugs, did you find a bug? Do you want to provide feedback on the app? I\'d love to hear it! First, make sure that the issue you found is not listed on my <a href='https://github.com/brysonsteck/wiimmfi-watcher/blob/master/TODO.md'>todo list.</a> It\'s possible I\'m already aware of it or working on it. If your issue is not addressed on the todo list, then you can create an issue on my GitHub repository <a href='https://github.com/brysonsteck/wiimmfi-watcher/issues'>here.</a> If you don\'t know how to use GitHub, you can fill out this <a href='https://docs.google.com/forms/d/e/1FAIpQLSd6qCONAP2tsbHPgzu_CdZcHVHL5nx7q0XFqrVfExEc84kqUQ/viewform?usp=sf_link'>Google Form</a> instead.</string> <string name="bugs">Speaking of bugs, did you find a bug? Do you want to provide feedback on the app? I\'d love to hear it! You can create an issue on my GitHub repository <a href='https://github.com/brysonsteck/wiimmfi-watcher/issues'>here.</a> If you don\'t know how to use GitHub, you can fill out this <a href='https://docs.google.com/forms/d/e/1FAIpQLSd6qCONAP2tsbHPgzu_CdZcHVHL5nx7q0XFqrVfExEc84kqUQ/viewform?usp=sf_link'>Google Form</a> instead.</string>
<string name="license">&#169; Copyright 2021 Bryson Steck\n\nWiimmfi Watcher is available under the GNU General Public License Version 3. You can view the license <a href="https://github.com/brysonsteck/wiimmfi-watcher/tree/master/LICENSE">here.</a>\n\nWiimmfi Watcher is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nWiimmfi Watcher is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with Wiimmfi Watcher. If not, see &lt;<a href="https://www.gnu.org/licenses/">https://www.gnu.org/licenses/</a>&gt;.</string> <string name="license">&#169; Copyright 2021 Bryson Steck\n\nWiimmfi Watcher is available under the GNU General Public License Version 3. You can view the license <a href="https://github.com/brysonsteck/wiimmfi-watcher/tree/master/LICENSE">here.</a>\n\nWiimmfi Watcher is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nWiimmfi Watcher is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with Wiimmfi Watcher. If not, see &lt;<a href="https://www.gnu.org/licenses/">https://www.gnu.org/licenses/</a>&gt;.</string>
<string name="contact">If you would like to get a hold of me for any reason unrelated to bug reports or this app in general, you can contact me through email at <a href='mailto:steck.bryson@gmail.com'>steck.bryson@gmail.com</a> or on Discord at bryzinga#9971.</string> <string name="contact">If you would like to get a hold of me for any reason unrelated to bug reports or this app in general, you can contact me through email at <a href='mailto:steck.bryson@gmail.com'>steck.bryson@gmail.com</a> or on Discord at bryzinga#9971.</string>
<string name="watch">Watch</string> <string name="watch">Watch</string>
<string name="watching">Watching %1$s</string> <string name="watching">Watching %1$s</string>
<string name="enter_fc">Enter a friend code to watch</string> <string name="enter_fc">Enter a friend code to watch</string>
<string name="enter_mii">Enter the name of a Mii to watch</string>
<string name="mii_name">Mii Name</string>
<string name="recent_fc">Recently watched friend codes:</string> <string name="recent_fc">Recently watched friend codes:</string>
<string name="version_header">Version</string> <string name="version_header">Version</string>
<string name="version">You are running Wiimmfi Watcher version %1$s. You can view the release notes for this version <![CDATA[<a href="https://github.com/brysonsteck/wiimmfi-watcher/releases/">here.</a>]]></string> <string name="version">You are running Wiimmfi Watcher version %1$s. You can view the release notes for this version <![CDATA[<a href="https://github.com/brysonsteck/wiimmfi-watcher/releases/">here.</a>]]></string>
@ -43,5 +45,5 @@
<string name="update_positive">Update</string> <string name="update_positive">Update</string>
<string name="update_negative">Later</string> <string name="update_negative">Later</string>
<string name="settings_title">Settings</string> <string name="ddos_notice">"*** NOTICE ***\nWiimmfi's domain has recently implemented DDoS protection due to recent DDoS attacks on the website. This will affect Wiimmfi Watcher's functionality until the protection is removed. If you see a "Status=503" error on the next screen, you may have to use the <a href="https://wiimmfi.de">official website</a> in the meantime. Apologies for the inconvenience. You can view the state of this issue with this <a href="https://github.com/brysonsteck/wiimmfi-watcher/issues/2">GitHub issue.</a> "</string>
</resources> </resources>

View file

@ -10,8 +10,32 @@
<item name="colorSecondary">@color/blue_200</item> <item name="colorSecondary">@color/blue_200</item>
<item name="colorSecondaryVariant">@color/blue_200</item> <item name="colorSecondaryVariant">@color/blue_200</item>
<item name="colorOnSecondary">@color/white</item> <item name="colorOnSecondary">@color/white</item>
<item name="android:windowTranslucentStatus">false</item>
<!-- Status bar color. --> <!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
<style name="Theme.WiimmfiWatcher.Watching" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">#1E88E5</item>
<item name="colorPrimaryVariant">#0D47A1</item>
<item name="colorOnPrimary">@color/white</item>
<item name="backgroundColor">#ffffff</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/blue_200</item>
<item name="colorSecondaryVariant">@color/blue_200</item>
<item name="colorOnSecondary">@color/white</item>
<item name="android:windowTranslucentStatus">true</item>
<!-- Customize your theme here. -->
</style>
<style name="TextAppearance.App.CollapsingToolbar.Expanded" parent="TextAppearance.MaterialComponents.Headline5">
<item name="android:textColor">@color/white</item>
</style>
<style name="TextAppearance.App.CollapsingToolbar.Collapsed" parent="TextAppearance.MaterialComponents.Headline6">
<item name="android:textColor">@color/white</item>
</style>
</resources> </resources>

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="theme"
android:title="Theme"
android:summary="Blue (Default)" />
<SwitchPreference
android:key="dark_mode"
android:title="Dark mode"/>
</PreferenceScreen>

BIN
images/BC.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
images/BP.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/CCW.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/CM.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
images/CTGP.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/DC.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
images/DDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
images/DKS.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/DP.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
images/FS.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
images/GV.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
images/KC.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
images/LC.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
images/MC.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
images/MG.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/MH.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
images/MMM.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
images/MT.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
images/RR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
images/TD.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
images/TF.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
images/WGM.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/globe.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Some files were not shown because too many files have changed in this diff Show more