From 2abb9ca5578efa6e73d2bca8fdb7338752754ea7 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 9 Jun 2021 22:19:58 -0600 Subject: organization --- .../brysonsteck/wiimmfiwatcher/AboutFragment.java | 108 ------------- .../brysonsteck/wiimmfiwatcher/MainActivity.java | 2 + .../wiimmfiwatcher/WatchCodeAdapter.java | 84 ---------- .../wiimmfiwatcher/WatchCodeFragment.java | 174 -------------------- .../wiimmfiwatcher/fragments/AboutFragment.java | 111 +++++++++++++ .../wiimmfiwatcher/fragments/WatchCodeAdapter.java | 85 ++++++++++ .../fragments/WatchCodeFragment.java | 175 +++++++++++++++++++++ .../brysonsteck/wiimmfiwatcher/wiimmfi/Player.java | 22 +-- .../wiimmfiwatcher/wiimmfi/RoomAdapter.java | 121 -------------- .../wiimmfiwatcher/wiimmfi/RoomData.java | 2 +- .../wiimmfiwatcher/wiimmfi/RoomFragment.java | 88 ----------- .../wiimmfiwatcher/wiimmfi/WiimmfiActivity.java | 4 +- .../wiimmfi/fragments/RoomAdapter.java | 120 ++++++++++++++ .../wiimmfi/fragments/RoomFragment.java | 86 ++++++++++ 14 files changed, 592 insertions(+), 590 deletions(-) delete mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java delete mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java delete mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/AboutFragment.java create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeAdapter.java create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeFragment.java delete mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java delete mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomAdapter.java create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomFragment.java diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java deleted file mode 100644 index 87f3def..0000000 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/AboutFragment.java +++ /dev/null @@ -1,108 +0,0 @@ -package me.brysonsteck.wiimmfiwatcher; - -import android.annotation.SuppressLint; -import android.content.res.Configuration; -import android.graphics.Color; -import android.os.Bundle; -import android.text.Html; -import android.text.Spanned; -import android.text.method.LinkMovementMethod; -import android.transition.TransitionInflater; -import android.view.View; -import android.widget.ScrollView; -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; - ScrollView scrollView; - - public AboutFragment() { - super(R.layout.about_fragment); - } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - TransitionInflater inflater = TransitionInflater.from(requireContext()); - setEnterTransition(inflater.inflateTransition(R.transition.slide_right)); - setExitTransition(inflater.inflateTransition(R.transition.slide_right)); - } - - @SuppressLint("SetTextI18n") - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - scrollView = view.findViewById(R.id.about_view); - - int nightModeFlags = - getContext().getResources().getConfiguration().uiMode & - Configuration.UI_MODE_NIGHT_MASK; - if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { - // Night mode is active, we're using dark theme - scrollView.setBackgroundColor(Color.parseColor("#151515")); - } - - aboutButton = getActivity().findViewById(R.id.about_button); - toolbar = getActivity().findViewById(R.id.toolbar); - toolbar.setTitle(R.string.about_fragment_title); - - 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 contact = view.findViewById(R.id.contact_text); - TextView bugs = view.findViewById(R.id.bugs_text); - TextView license = view.findViewById(R.id.license_text); - TextView version = view.findViewById(R.id.version_text); - - aboutWatcher.setText(R.string.about_watcher); - - aboutMe.setText(R.string.about_me); - - github.setClickable(true); - github.setMovementMethod(LinkMovementMethod.getInstance()); - - github.setText(R.string.github); - - contact.setClickable(true); - contact.setMovementMethod(LinkMovementMethod.getInstance()); - - contact.setText(R.string.contact); - - bugs.setClickable(true); - bugs.setMovementMethod(LinkMovementMethod.getInstance()); - - bugs.setText(R.string.bugs); - - license.setClickable(true); - license.setMovementMethod(LinkMovementMethod.getInstance()); - - license.setText(R.string.license); - - version.setClickable(true); - version.setMovementMethod(LinkMovementMethod.getInstance()); - - Spanned version_text = Html.fromHtml(getResources().getString(R.string.version, BuildConfig.VERSION_NAME)); - - version.setText(version_text); - } - - @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(R.string.about_fragment_title); - } - -} diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java index 8084714..ee68742 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java @@ -10,6 +10,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import me.brysonsteck.wiimmfiwatcher.database.AppDatabase; +import me.brysonsteck.wiimmfiwatcher.fragments.AboutFragment; +import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment; public class MainActivity extends AppCompatActivity { AppDatabase database; diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java deleted file mode 100644 index 7034888..0000000 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeAdapter.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.brysonsteck.wiimmfiwatcher; - -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.graphics.Color; -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 com.google.android.material.textview.MaterialTextView; - -import java.util.ArrayList; - -import me.brysonsteck.wiimmfiwatcher.model.FriendCode; -import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity; - -public class WatchCodeAdapter extends RecyclerView.Adapter{ - ObservableArrayList entries; - Context context; - MaterialTextView errorText; - ProgressDialog progressBar; - ArrayList recentCodes; - - public WatchCodeAdapter(Context context, ObservableArrayList entries, - MaterialTextView errorText, ProgressDialog progressBar) { - this.context = context; - this.entries = entries; - this.errorText = errorText; - this.progressBar = progressBar; - 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); - int nightModeFlags = - context.getResources().getConfiguration().uiMode & - Configuration.UI_MODE_NIGHT_MASK; - if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { - // Night mode is active, we're using dark theme - fcButton.setBackgroundColor(Color.parseColor("#313131")); - } - fcButton.setText(currentFC); - fcButton.setOnClickListener(view -> { - progressBar.setCancelable(true); - progressBar.setMessage(holder.itemView.getResources().getString(R.string.locating_text, currentFC)); - progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); - progressBar.setProgress(0); - progressBar.setMax(100); - progressBar.show(); - errorText.setText(""); - 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 deleted file mode 100644 index 01069b6..0000000 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/WatchCodeFragment.java +++ /dev/null @@ -1,174 +0,0 @@ -package me.brysonsteck.wiimmfiwatcher; - -import android.app.ProgressDialog; -import android.content.Intent; -import android.os.Bundle; -import android.transition.TransitionInflater; -import android.view.KeyEvent; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ProgressBar; - -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 { - ProgressDialog progressBar; - - public WatchCodeFragment() { - super(R.layout.watch_code_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 onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - TransitionInflater inflater = TransitionInflater.from(requireContext()); - setEnterTransition(inflater.inflateTransition(R.transition.fade)); - setExitTransition(inflater.inflateTransition(R.transition.fade)); - } - - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - FriendCodeViewModel viewModel = new ViewModelProvider(getActivity()).get(FriendCodeViewModel.class); - progressBar = new ProgressDialog(getContext(), R.style.AppCompatAlertDialogStyle); - - MaterialTextView errorText = view.findViewById(R.id.error_text); - WatchCodeAdapter adapter = new WatchCodeAdapter(getContext(), viewModel.getEntries(), errorText, progressBar); - viewModel.getEntries().addOnListChangedCallback(new ObservableList.OnListChangedCallback>() { - @Override - public void onChanged(ObservableList sender) { - getActivity().runOnUiThread(() -> { - adapter.notifyDataSetChanged(); - }); - } - - @Override - public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { - getActivity().runOnUiThread(() -> { - adapter.notifyItemRangeChanged(positionStart, itemCount); - }); - } - - @Override - public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { - getActivity().runOnUiThread(() -> { - adapter.notifyItemRangeInserted(positionStart, itemCount); // this is the only method that seems to be called - }); - } - - @Override - public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { - getActivity().runOnUiThread(() -> { - adapter.notifyItemMoved(fromPosition, toPosition); - }); - } - - @Override - public void onItemRangeRemoved(ObservableList 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); - - EditText friendCode = view.findViewById(R.id.friend_code_edit_text); - Button watchButton = view.findViewById(R.id.watch_button); - watchButton.setOnClickListener(buttonClick -> { - startWiimmfiActivity( - view, - friendCode, - errorText, - watchButton, - viewModel - ); - watchButton.setText(R.string.watch); - }); - friendCode.setOnKeyListener(new View.OnKeyListener() - { - public boolean onKey(View view1, int keyCode, KeyEvent event) - { - if (event.getAction() == KeyEvent.ACTION_DOWN) - { - switch (keyCode) - { - case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_ENTER: - startWiimmfiActivity( - view, - friendCode, - errorText, - watchButton, - viewModel - ); - return true; - default: - break; - } - } - return false; - } - }); - } - - @Override - public void onStop() { - super.onStop(); - if (progressBar.isShowing()) { progressBar.dismiss(); } - } - - public void startWiimmfiActivity(View view, EditText friendCode, MaterialTextView errorText, Button watchButton, FriendCodeViewModel viewModel) { - Intent intent = new Intent(view.getContext(), WiimmfiActivity.class); - if (!isValidFriendCode(friendCode.getText().toString())) { - errorText.setText(R.string.error_fc_syntax); - } else { - progressBar.setCancelable(false); - progressBar.setMessage(getResources().getString(R.string.locating_text, friendCode.getText())); - progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); - progressBar.show(); - - errorText.setText(""); - viewModel.saveFriendCode("", friendCode.getText().toString()); - intent.putExtra("friendCode", friendCode.getText().toString()); - ProgressBar p = view.findViewById(R.id.progressBar1); - if(p.getVisibility() != View.GONE){ // check if it is visible - p.setVisibility(View.GONE); // if not set it to visible - watchButton.setVisibility(View.VISIBLE); // use 1 or 2 as parameters.. arg0 is the view(your button) from the onclick listener - } - startActivity(intent); - } - } -} diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/AboutFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/AboutFragment.java new file mode 100644 index 0000000..3047e85 --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/AboutFragment.java @@ -0,0 +1,111 @@ +package me.brysonsteck.wiimmfiwatcher.fragments; + +import android.annotation.SuppressLint; +import android.content.res.Configuration; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Html; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.transition.TransitionInflater; +import android.view.View; +import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.google.android.material.appbar.MaterialToolbar; + +import me.brysonsteck.wiimmfiwatcher.BuildConfig; +import me.brysonsteck.wiimmfiwatcher.R; + +public class AboutFragment extends Fragment { + View aboutButton; + MaterialToolbar toolbar; + ScrollView scrollView; + + public AboutFragment() { + super(R.layout.about_fragment); + } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + TransitionInflater inflater = TransitionInflater.from(requireContext()); + setEnterTransition(inflater.inflateTransition(R.transition.slide_right)); + setExitTransition(inflater.inflateTransition(R.transition.slide_right)); + } + + @SuppressLint("SetTextI18n") + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + scrollView = view.findViewById(R.id.about_view); + + int nightModeFlags = + getContext().getResources().getConfiguration().uiMode & + Configuration.UI_MODE_NIGHT_MASK; + if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { + // Night mode is active, we're using dark theme + scrollView.setBackgroundColor(Color.parseColor("#151515")); + } + + aboutButton = getActivity().findViewById(R.id.about_button); + toolbar = getActivity().findViewById(R.id.toolbar); + toolbar.setTitle(R.string.about_fragment_title); + + 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 contact = view.findViewById(R.id.contact_text); + TextView bugs = view.findViewById(R.id.bugs_text); + TextView license = view.findViewById(R.id.license_text); + TextView version = view.findViewById(R.id.version_text); + + aboutWatcher.setText(R.string.about_watcher); + + aboutMe.setText(R.string.about_me); + + github.setClickable(true); + github.setMovementMethod(LinkMovementMethod.getInstance()); + + github.setText(R.string.github); + + contact.setClickable(true); + contact.setMovementMethod(LinkMovementMethod.getInstance()); + + contact.setText(R.string.contact); + + bugs.setClickable(true); + bugs.setMovementMethod(LinkMovementMethod.getInstance()); + + bugs.setText(R.string.bugs); + + license.setClickable(true); + license.setMovementMethod(LinkMovementMethod.getInstance()); + + license.setText(R.string.license); + + version.setClickable(true); + version.setMovementMethod(LinkMovementMethod.getInstance()); + + Spanned version_text = Html.fromHtml(getResources().getString(R.string.version, BuildConfig.VERSION_NAME)); + + version.setText(version_text); + } + + @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(R.string.about_fragment_title); + } + +} diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeAdapter.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeAdapter.java new file mode 100644 index 0000000..400436b --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeAdapter.java @@ -0,0 +1,85 @@ +package me.brysonsteck.wiimmfiwatcher.fragments; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Color; +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 com.google.android.material.textview.MaterialTextView; + +import java.util.ArrayList; + +import me.brysonsteck.wiimmfiwatcher.R; +import me.brysonsteck.wiimmfiwatcher.model.FriendCode; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity; + +public class WatchCodeAdapter extends RecyclerView.Adapter{ + ObservableArrayList entries; + Context context; + MaterialTextView errorText; + ProgressDialog progressBar; + ArrayList recentCodes; + + public WatchCodeAdapter(Context context, ObservableArrayList entries, + MaterialTextView errorText, ProgressDialog progressBar) { + this.context = context; + this.entries = entries; + this.errorText = errorText; + this.progressBar = progressBar; + 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); + int nightModeFlags = + context.getResources().getConfiguration().uiMode & + Configuration.UI_MODE_NIGHT_MASK; + if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { + // Night mode is active, we're using dark theme + fcButton.setBackgroundColor(Color.parseColor("#313131")); + } + fcButton.setText(currentFC); + fcButton.setOnClickListener(view -> { + progressBar.setCancelable(true); + progressBar.setMessage(holder.itemView.getResources().getString(R.string.locating_text, currentFC)); + progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progressBar.setProgress(0); + progressBar.setMax(100); + progressBar.show(); + errorText.setText(""); + 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/fragments/WatchCodeFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeFragment.java new file mode 100644 index 0000000..2687518 --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/fragments/WatchCodeFragment.java @@ -0,0 +1,175 @@ +package me.brysonsteck.wiimmfiwatcher.fragments; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.Bundle; +import android.transition.TransitionInflater; +import android.view.KeyEvent; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; + +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.R; +import me.brysonsteck.wiimmfiwatcher.model.FriendCode; +import me.brysonsteck.wiimmfiwatcher.viewmodel.FriendCodeViewModel; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.WiimmfiActivity; + +public class WatchCodeFragment extends Fragment { + ProgressDialog progressBar; + + public WatchCodeFragment() { + super(R.layout.watch_code_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 onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + TransitionInflater inflater = TransitionInflater.from(requireContext()); + setEnterTransition(inflater.inflateTransition(R.transition.fade)); + setExitTransition(inflater.inflateTransition(R.transition.fade)); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + FriendCodeViewModel viewModel = new ViewModelProvider(getActivity()).get(FriendCodeViewModel.class); + progressBar = new ProgressDialog(getContext(), R.style.AppCompatAlertDialogStyle); + + MaterialTextView errorText = view.findViewById(R.id.error_text); + WatchCodeAdapter adapter = new WatchCodeAdapter(getContext(), viewModel.getEntries(), errorText, progressBar); + viewModel.getEntries().addOnListChangedCallback(new ObservableList.OnListChangedCallback>() { + @Override + public void onChanged(ObservableList sender) { + getActivity().runOnUiThread(() -> { + adapter.notifyDataSetChanged(); + }); + } + + @Override + public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { + getActivity().runOnUiThread(() -> { + adapter.notifyItemRangeChanged(positionStart, itemCount); + }); + } + + @Override + public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { + getActivity().runOnUiThread(() -> { + adapter.notifyItemRangeInserted(positionStart, itemCount); // this is the only method that seems to be called + }); + } + + @Override + public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { + getActivity().runOnUiThread(() -> { + adapter.notifyItemMoved(fromPosition, toPosition); + }); + } + + @Override + public void onItemRangeRemoved(ObservableList 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); + + EditText friendCode = view.findViewById(R.id.friend_code_edit_text); + Button watchButton = view.findViewById(R.id.watch_button); + watchButton.setOnClickListener(buttonClick -> { + startWiimmfiActivity( + view, + friendCode, + errorText, + watchButton, + viewModel + ); + watchButton.setText(R.string.watch); + }); + friendCode.setOnKeyListener(new View.OnKeyListener() + { + public boolean onKey(View view1, int keyCode, KeyEvent event) + { + if (event.getAction() == KeyEvent.ACTION_DOWN) + { + switch (keyCode) + { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + startWiimmfiActivity( + view, + friendCode, + errorText, + watchButton, + viewModel + ); + return true; + default: + break; + } + } + return false; + } + }); + } + + @Override + public void onStop() { + super.onStop(); + if (progressBar.isShowing()) { progressBar.dismiss(); } + } + + public void startWiimmfiActivity(View view, EditText friendCode, MaterialTextView errorText, Button watchButton, FriendCodeViewModel viewModel) { + Intent intent = new Intent(view.getContext(), WiimmfiActivity.class); + if (!isValidFriendCode(friendCode.getText().toString())) { + errorText.setText(R.string.error_fc_syntax); + } else { + progressBar.setCancelable(false); + progressBar.setMessage(getResources().getString(R.string.locating_text, friendCode.getText())); + progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progressBar.show(); + + errorText.setText(""); + viewModel.saveFriendCode("", friendCode.getText().toString()); + intent.putExtra("friendCode", friendCode.getText().toString()); + ProgressBar p = view.findViewById(R.id.progressBar1); + if(p.getVisibility() != View.GONE){ // check if it is visible + p.setVisibility(View.GONE); // if not set it to visible + watchButton.setVisibility(View.VISIBLE); // use 1 or 2 as parameters.. arg0 is the view(your button) from the onclick listener + } + startActivity(intent); + } + } +} diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java index fe9e072..257ee20 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/Player.java @@ -1,15 +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; + public String rosterNumber; + public String miiName; + public String friendCode; + public String role; + public String loginRegion; + public String roomMatch; + public String world; + public String connFail; + public String vr; + public String br; + public 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 deleted file mode 100644 index 5538869..0000000 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomAdapter.java +++ /dev/null @@ -1,121 +0,0 @@ -package me.brysonsteck.wiimmfiwatcher.wiimmfi; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.Color; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -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{ - String display; - String playerLink; - String header; - ArrayList players; - Context context; - - public RoomAdapter (String display, String playerLink, String header, ArrayList players, Context context) { - this.display = display; - this.playerLink = playerLink; - this.header = header; - this.players = players; - this.context = context; - } - - @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); - LinearLayout.LayoutParams cardViewParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - cardView.setLayoutParams(cardViewParams); - ViewGroup.MarginLayoutParams cardViewMarginParams = (ViewGroup.MarginLayoutParams) cardView.getLayoutParams(); - cardViewMarginParams.setMargins(40,40,40,40); - cardView.requestLayout(); - int nightModeFlags = - context.getResources().getConfiguration().uiMode & - Configuration.UI_MODE_NIGHT_MASK; - if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { - // Night mode is active, we're using dark theme - cardView.setCardBackgroundColor(Color.parseColor("#313131")); - } - 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; - } - if (position + 1 == getItemCount()) { - cardViewMarginParams.setMargins(40,40,40,250); - cardView.requestLayout(); - } - - } - - @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 index 60ad7df..b5f6aaf 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomData.java @@ -14,7 +14,7 @@ public class RoomData { String roomHeader; String playerLink; String friendCode; - Exception error; + public Exception error; ArrayList players = new ArrayList<>(); String userAgent = "Wiimmfi Watcher for Android (https://github.com/brysonsteck/wiimmfi-watcher) Version " + BuildConfig.VERSION_NAME; diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java deleted file mode 100644 index fc144aa..0000000 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/RoomFragment.java +++ /dev/null @@ -1,88 +0,0 @@ -package me.brysonsteck.wiimmfiwatcher.wiimmfi; - -import android.os.Bundle; -import android.os.Looper; -import android.view.View; -import android.widget.TextView; -import android.widget.Toast; - -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.appbar.MaterialToolbar; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; - -import me.brysonsteck.wiimmfiwatcher.R; - -public class RoomFragment extends Fragment { - String display; - String header; - String playerLink; - ArrayList players; - RoomData roomData; - MaterialToolbar toolbar; - - public RoomFragment(String friendCode, ArrayList players, String playerLink, String display, MaterialToolbar toolbar) { - super(R.layout.room_fragment); - this.roomData = new RoomData(players, friendCode); - new Thread(() -> { - this.header = roomData.getRoomHeader(); - }).start(); - this.display = display; - this.players = players; - this.playerLink = playerLink; - this.toolbar = toolbar; - } - @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) { - headerTextView.setText(R.string.header_null_error); - toolbar.setNavigationIcon(null); - } - if (roomData.error != null) { - headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); - toolbar.setNavigationIcon(null); - } - if (roomData.error == null && header != null) { - headerTextView.setText(header); - toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); - } - RecyclerView recyclerView = view.findViewById(R.id.player_data_recycler_view); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); - - refreshButton.setOnClickListener((buttonView) -> { - this.players.clear(); - this.header = ""; - this.roomData = roomData.refresh(); - RoomData newRoomData = roomData.refresh(); - this.players = roomData.getPlayers(); - header = newRoomData.getRoomHeader(); - if (header == null) { - headerTextView.setText(R.string.header_null_error); - toolbar.setNavigationIcon(null); - } - if (newRoomData.error instanceof java.net.SocketTimeoutException || newRoomData.error instanceof java.net.UnknownHostException) { - headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); - toolbar.setNavigationIcon(null); - } - if (roomData.error == null && header != null) { - headerTextView.setText(header); - toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); - } - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); - - }); - } -} diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java index c0d4c9f..6936275 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/WiimmfiActivity.java @@ -5,7 +5,6 @@ import android.content.res.Configuration; import android.graphics.Color; import android.os.Bundle; import android.os.StrictMode; -import android.view.View; import androidx.appcompat.app.AppCompatActivity; import androidx.drawerlayout.widget.DrawerLayout; @@ -13,11 +12,10 @@ 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; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.fragments.RoomFragment; public class WiimmfiActivity extends AppCompatActivity { ArrayList players = new ArrayList<>(); diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomAdapter.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomAdapter.java new file mode 100644 index 0000000..2840ce6 --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomAdapter.java @@ -0,0 +1,120 @@ +package me.brysonsteck.wiimmfiwatcher.wiimmfi.fragments; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.card.MaterialCardView; + +import java.util.ArrayList; + +import me.brysonsteck.wiimmfiwatcher.R; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.Player; + +public class RoomAdapter extends RecyclerView.Adapter{ + String display; + String playerLink; + String header; + ArrayList players; + Context context; + + public RoomAdapter (String display, String playerLink, String header, ArrayList players, Context context) { + this.display = display; + this.playerLink = playerLink; + this.header = header; + this.players = players; + this.context = context; + } + + @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); + LinearLayout.LayoutParams cardViewParams = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + cardView.setLayoutParams(cardViewParams); + ViewGroup.MarginLayoutParams cardViewMarginParams = (ViewGroup.MarginLayoutParams) cardView.getLayoutParams(); + cardViewMarginParams.setMargins(40,40,40,40); + cardView.requestLayout(); + int nightModeFlags = + context.getResources().getConfiguration().uiMode & + Configuration.UI_MODE_NIGHT_MASK; + if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { + // Night mode is active, we're using dark theme + cardView.setCardBackgroundColor(Color.parseColor("#313131")); + } + 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; + } + if (position + 1 == getItemCount()) { + cardViewMarginParams.setMargins(40,40,40,250); + cardView.requestLayout(); + } + + } + + @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/fragments/RoomFragment.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomFragment.java new file mode 100644 index 0000000..d6326f7 --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/wiimmfi/fragments/RoomFragment.java @@ -0,0 +1,86 @@ +package me.brysonsteck.wiimmfiwatcher.wiimmfi.fragments; + +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.appbar.MaterialToolbar; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; + +import me.brysonsteck.wiimmfiwatcher.R; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.Player; +import me.brysonsteck.wiimmfiwatcher.wiimmfi.RoomData; + +public class RoomFragment extends Fragment { + String display; + String header; + String playerLink; + ArrayList players; + RoomData roomData; + MaterialToolbar toolbar; + + public RoomFragment(String friendCode, ArrayList players, String playerLink, String display, MaterialToolbar toolbar) { + super(R.layout.room_fragment); + this.roomData = new RoomData(players, friendCode); + new Thread(() -> { + this.header = roomData.getRoomHeader(); + }).start(); + this.display = display; + this.players = players; + this.playerLink = playerLink; + this.toolbar = toolbar; + } + @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) { + headerTextView.setText(R.string.header_null_error); + toolbar.setNavigationIcon(null); + } + if (roomData.error != null) { + headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); + toolbar.setNavigationIcon(null); + } + if (roomData.error == null && header != null) { + headerTextView.setText(header); + toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); + } + RecyclerView recyclerView = view.findViewById(R.id.player_data_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); + + refreshButton.setOnClickListener((buttonView) -> { + this.players.clear(); + this.header = ""; + this.roomData = roomData.refresh(); + RoomData newRoomData = roomData.refresh(); + this.players = roomData.getPlayers(); + header = newRoomData.getRoomHeader(); + if (header == null) { + headerTextView.setText(R.string.header_null_error); + toolbar.setNavigationIcon(null); + } + if (newRoomData.error instanceof java.net.SocketTimeoutException || newRoomData.error instanceof java.net.UnknownHostException) { + headerTextView.setText(getResources().getString(R.string.jsoup_error, roomData.error)); + toolbar.setNavigationIcon(null); + } + if (roomData.error == null && header != null) { + headerTextView.setText(header); + toolbar.setNavigationIcon(R.drawable.ic_baseline_menu_24); + } + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setAdapter(new RoomAdapter(display, playerLink, header, players, getContext())); + + }); + } +} -- cgit v1.2.3 From 8ecb977629189f0bad5c223a7815ec4f323470d2 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 9 Jun 2021 22:43:55 -0600 Subject: added new update checker, need to implement into ui --- app/build.gradle | 5 +- .../brysonsteck/wiimmfiwatcher/MainActivity.java | 21 ++++++- .../me/brysonsteck/wiimmfiwatcher/Updater.java | 69 ++++++++++++++++++++++ 3 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java diff --git a/app/build.gradle b/app/build.gradle index 20b68a8..3e0d1a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "me.brysonsteck.wiimmfiwatcher" minSdkVersion 19 targetSdkVersion 30 - versionCode 5 - versionName "1.1.3" + versionCode 6 + versionName "1.1.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -33,6 +33,7 @@ android { } dependencies { + implementation 'com.google.code.gson:gson:2.8.6' def lifecycle_version = "2.3.1" // ViewModel diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java index ee68742..3a42749 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java @@ -16,7 +16,6 @@ import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment; public class MainActivity extends AppCompatActivity { AppDatabase database; - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -49,6 +48,26 @@ public class MainActivity extends AppCompatActivity { }); } + + @Override + protected void onStart() { + super.onStart(); + new Thread(() -> { + Updater updater = new Updater(); + updater.compareRelease(BuildConfig.VERSION_NAME); + if (updater.isOutdated()) { + System.out.println("---------------------------------------------------------------"); + System.out.println("\tA newer version of Wiimmfi Watcher is available! (" + updater.getNewestRelease() + ")"); + System.out.println("\tView the release notes and the source code here: " + updater.getGithubRelease()); + System.out.println("\t---------------------------------------------------------------"); + } else { + System.out.println("---------------------------------------------------------------"); + System.out.println("\t\t" + updater.getNewestRelease() + " is the latest release of Wiimmfi Watcher."); + System.out.println("\t\t---------------------------------------------------------------"); + } + }).start(); + } + @Override protected void onStop() { super.onStop(); diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java new file mode 100644 index 0000000..eaa4d0c --- /dev/null +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java @@ -0,0 +1,69 @@ +package me.brysonsteck.wiimmfiwatcher; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; + +public class Updater { + + public boolean outdated = false; + public String newestRelease; + public String githubRelease; + public String playStore = "https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher"; + + public Updater() { + try { + String json = urlReader(); + JsonElement root = new JsonParser().parse(json); + JsonObject rootObj = root.getAsJsonObject(); + newestRelease = rootObj.get("current-release").getAsString(); + githubRelease = rootObj.get("github-release").getAsString(); + } catch (IOException e) { + System.out.println("An error has occurred while attempting to check for updates."); + e.printStackTrace(); + } + } + + public String urlReader() throws IOException { + URL website = new URL("https://brysonsteck.net/watcher.json"); + URLConnection connection = website.openConnection(); + BufferedReader in = new BufferedReader( + new InputStreamReader( + connection.getInputStream())); + + StringBuilder response = new StringBuilder(); + String inputLine; + + while ((inputLine = in.readLine()) != null) + response.append(inputLine); + + in.close(); + + return response.toString(); + + } + + public void compareRelease(String deviceRelease) { + if (!deviceRelease.equals(newestRelease)) { + outdated = true; + } + } + + public boolean isOutdated() { + return outdated; + } + + public String getNewestRelease() { + return newestRelease; + } + + public String getGithubRelease() { + return githubRelease; + } +} -- cgit v1.2.3 From ad2f3c702e5363c4a82a20369c8e2d1d49ea32cc Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 9 Jun 2021 23:07:39 -0600 Subject: updated doc --- README.md | 57 +++++++++++++++++++++++++++++++-------------------------- TODO.md | 21 +++++++++------------ 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 44584d2..ceace68 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,30 @@ # Wiimmfi Watcher -Wiimmfi Watcher is an 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 English, German, French, Italian and Japanese. +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. This application is currently being maintained by myself out of love for Mario Kart Wii and appreciation for the developers of Wiimmfi. I am in no way affiliated with Wiimmfi or any of the Wiimmfi developers. ## Screenshots -![](screenshots/sc-1.png) -![](screenshots/sc-1-dark.png) -![](screenshots/sc-2.png) -![](screenshots/sc-3.png) -![](screenshots/sc-3-dark.png) -![](screenshots/sc-4.png) -![](screenshots/sc-5.png) -![](screenshots/sc-6.png) -![](screenshots/sc-7.png) +![Main Screen](screenshots/sc-1.png) +![Main Screen in Dark Mode (for versions of Android that support it)](screenshots/sc-1-dark.png) +![Simply insert the friend code...](screenshots/sc-2.png) +![... And there is the room!](screenshots/sc-3.png) +![Dark Mode variant of the room screen.](screenshots/sc-3-dark.png) +![Press the menu button on the right for more display options.](screenshots/sc-4.png) +![Selecting an option changes the data on the right.](screenshots/sc-5.png) +![The app shows you what data is being displayed in the menu.](screenshots/sc-6.png) +![You can change data views at any point.](screenshots/sc-7.png) ## Download -You can visit the Google Play Store to download the most recent and stable version (link goes here once approved). You are also free to clone the repository and download the source code for the most stable release in the Releases tab if you would like to build it from scratch. +You can visit the Google Play Store to download the most recent and stable version [here!](https://play.google.com/store/apps/details?id=me.brysonsteck.wiimmfiwatcher) You are also free to clone the repository and download the source code for the most stable release in the Releases tab if you would like to build it from scratch. -## Feedback +## Feedback and Bugs This is officially my first project and Google Play app that I'm maintaining, so if you have any feedback about my work, I would love to hear it! You can create an issue tagged "feedback", or you can fill out this [Google Form](https://docs.google.com/forms/d/e/1FAIpQLSd6qCONAP2tsbHPgzu_CdZcHVHL5nx7q0XFqrVfExEc84kqUQ/viewform). I also have a section in my TODO list under "Features I would like to add" for things I am already considering adding to future releases. -## Bugs - -If you found any bugs in the `master` branch (i. e. the most recent Google Play release), **PLEASE READ MY [TODO LIST](https://github.com/brysonsteck/wiimmfi-watcher/blob/dev/TODO.md) FIRST** to make sure that the bug you found isn't something I'm already aware of. Once you have made sure of that, you can then create an issue or fill out this [Google Form](https://docs.google.com/forms/d/e/1FAIpQLSd6qCONAP2tsbHPgzu_CdZcHVHL5nx7q0XFqrVfExEc84kqUQ/viewform). - -## Devices - -Wiimmfi Watcher has been officially tested and confirmed to work on the following devices: -* x86_64 emulated Pixel 4 (Android 5.0.2) by brysonsteck -* x86_64 emulated Pixel 4 (Android 11) by brysonsteck -* x86_64 emulated Nexus 7 (Android 10) by brysonsteck -* x86_64 emulated Nexus 10 (Android 10) by brysonsteck -* x86_64 emulated Nexus 7 (Android 5.0.2) by brysonsteck -* x86_64 emulated Nexus 10 (Android 5.0.2) by brysonsteck +Additionally, If you find any bugs in the app (the `master` branch contains the same code as the latest release), you can create an issue here on GitHub or fill out the Google Form linked before in a similar manner. Please only submit bugs that pertain to the [most recent release.](https://github.com/brysonsteck/wiimmfi-watcher/releases) ## Donations @@ -44,7 +32,7 @@ This application is completely free, ad-less and open source. That means that no If you'd like to donate to this project, I'd ask that you first [donate to Wiimmfi.](https://wiimmfi.de/donate) This app nor my 3,069+ hours of fun on their service would not be possible without them. -Once you donate to them or you choose not to (why?? :( ), then here are ways you can donate to me: +Once you donate to them or you choose not to (why?? :( how sad), then here are ways you can donate to me: * [PayPal](https://www.paypal.com/donate/?business=steck.bryson%40gmail.com&item_name=Bryson+Steck¤cy_code=USD&Z3JncnB0=) * Bitcoin: 1Kbnp5JMTKd7a3Zs2WWm2JMCjfVb5tpcky * Litecoin: LRboJVNzoJCjXHmwN6RQgyvYEQjjaFzEA7 @@ -52,6 +40,23 @@ Once you donate to them or you choose not to (why?? :( ), then here are ways you Please note that donations are **NOT** required and does **NOT** add or remove functionality from the app. +## License + +© 2021 Bryson Steck. Wiimmfi Watcher is licensed under the [GPL-3.0](LICENSE). + +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 +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Wiimmfi 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. + +You should have received a copy of the GNU General Public License +along with Wiimmfi Watcher. If not, see . + ## Credits Wiimmfi Watcher is made possible by the following: diff --git a/TODO.md b/TODO.md index 518fedd..0f8d74f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,27 +1,24 @@ # 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. -## Completed For Release 1.1.3 -* Added language translations for Korean, Portuguese and Spanish. -* Fixed a bug where the error message that appears does not disappear when clicking on a recent friend code. -* Added a new dialog between searching for a friend code and the watcher screen. -* Fixed a bug where the internal Java error on the watcher screen wouldn't show after pressing the refresh button at least once. -* Fixed a bug where the final button of the recent friend codes wouldn't show if it reached past the bottom of the screen, especially with devices that have the software navigation bar. -* Fixed a bug in the English version of the app where the "License" portion of the about page was not formatted correctly. +### Completed For Release 1.1.4 +* Added an updater to make sure subsequent releases are up to date -## Working On +### Working On +* Implement the updater into the UI * Create a better looking header for the watcher activity * Add 'sections' I guess??? -* Adding the option to toggle dark mode manually so older devices can have that privledge as well +* Remove requirement of reading todo list before submitting issues -## Aware Of -* The about page causes part of the screen to get cut off as the animation plays (only if there are not a lot of recent friend codes present) -* The navigation menu in Dark Mode is messed up +### 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 navigation menu in Dark Mode is messed up (colors) * The selected player detail text and icon is black * The highlight color is barely visible * Pressing the watch or refresh buttons cause the app to hang until refreshing is completed. * Working with threads should fix this * Adding a dialog helps make it look like the app is working for now +* Adding the option to toggle dark mode manually so older devices can have that privledge as well # Features I would like to add * The watcher activity does not refresh automatically like the official website does -- cgit v1.2.3 From 0c0d4b9bb1c532a1b6f9178ad9b4db3144381e01 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 9 Jun 2021 23:16:39 -0600 Subject: updated credits in readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ceace68..e2ae102 100644 --- a/README.md +++ b/README.md @@ -60,5 +60,6 @@ along with Wiimmfi Watcher. If not, see . ## Credits Wiimmfi Watcher is made possible by the following: -* [Jsoup](https://jsoup.org) HTML parser, version 1.13.1 - +* [Wiimmfi](https://wiimmfi.de) for being the complete backbone of this app. +* [Jsoup](https://jsoup.org) version 1.13.1, which powers getting the information from Wiimmfi with HTML parsing. (This will soon be replaced in favor of JSON parsing.) +* [Gson](https://github.com/google/gson) version 2.8.7, which powers the updater (coming in 1.1.4). -- cgit v1.2.3 From 71975e98f4b2de35af051577d5d11d935b108374 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 28 Jun 2021 22:31:33 -0600 Subject: added update dialog --- .../brysonsteck/wiimmfiwatcher/MainActivity.java | 71 +++++++++++++++++----- .../me/brysonsteck/wiimmfiwatcher/Updater.java | 10 ++- app/src/main/res/values/strings.xml | 5 ++ 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java index 3a42749..e98856b 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/MainActivity.java @@ -1,20 +1,25 @@ package me.brysonsteck.wiimmfiwatcher; -import android.os.Build; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.WindowManager; -import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import me.brysonsteck.wiimmfiwatcher.database.AppDatabase; import me.brysonsteck.wiimmfiwatcher.fragments.AboutFragment; import me.brysonsteck.wiimmfiwatcher.fragments.WatchCodeFragment; public class MainActivity extends AppCompatActivity { AppDatabase database; + final MaterialAlertDialogBuilder[] dialog = new MaterialAlertDialogBuilder[1]; + boolean shownUpdate = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -52,20 +57,56 @@ public class MainActivity extends AppCompatActivity { @Override protected void onStart() { super.onStart(); - new Thread(() -> { - Updater updater = new Updater(); - updater.compareRelease(BuildConfig.VERSION_NAME); - if (updater.isOutdated()) { - System.out.println("---------------------------------------------------------------"); - System.out.println("\tA newer version of Wiimmfi Watcher is available! (" + updater.getNewestRelease() + ")"); - System.out.println("\tView the release notes and the source code here: " + updater.getGithubRelease()); - System.out.println("\t---------------------------------------------------------------"); - } else { - System.out.println("---------------------------------------------------------------"); - System.out.println("\t\t" + updater.getNewestRelease() + " is the latest release of Wiimmfi Watcher."); - System.out.println("\t\t---------------------------------------------------------------"); + final String[] newestRelease = {""}; + final boolean[] outdated = {false}; + Thread thread = new Thread() { + public void run() { + Updater updater = new Updater(); + updater.compareRelease(BuildConfig.VERSION_NAME); + if (updater.isOutdated()) { + System.out.println("---------------------------------------------------------------"); + System.out.println("\tA newer version of Wiimmfi Watcher is available! (" + updater.getNewestRelease() + ")"); + System.out.println("\tView the release notes and the source code here: " + updater.getGithubRelease()); + System.out.println("\t---------------------------------------------------------------"); + } else { + System.out.println("---------------------------------------------------------------"); + System.out.println("\t\t" + updater.getNewestRelease() + " is the latest release of Wiimmfi Watcher."); + System.out.println("\t\t---------------------------------------------------------------"); + } + newestRelease[0] = updater.getNewestRelease(); + outdated[0] = updater.isOutdated(); } - }).start(); + }; + thread.start(); + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (outdated[0] && !shownUpdate) { + shownUpdate = true; + final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object + new MaterialAlertDialogBuilder(this) + .setTitle(R.string.update_title) + .setMessage(getResources().getString(R.string.update_message, newestRelease[0])) + .setNegativeButton(getResources().getString(R.string.update_negative), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }) + .setPositiveButton(getResources().getString(R.string.update_positive), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + try { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); + } catch (android.content.ActivityNotFoundException anfe) { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); + } + } + }) + .show(); + } + } @Override diff --git a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java index eaa4d0c..eb3e813 100644 --- a/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java +++ b/app/src/main/java/me/brysonsteck/wiimmfiwatcher/Updater.java @@ -22,8 +22,12 @@ public class Updater { String json = urlReader(); JsonElement root = new JsonParser().parse(json); JsonObject rootObj = root.getAsJsonObject(); - newestRelease = rootObj.get("current-release").getAsString(); - githubRelease = rootObj.get("github-release").getAsString(); + JsonElement softwareElement = rootObj.getAsJsonObject("wiimmfi-watcher"); + JsonObject softwareObj = softwareElement.getAsJsonObject(); + newestRelease = softwareObj.get("current-release").getAsString(); + newestRelease = newestRelease.replace("\"", ""); + githubRelease = softwareObj.get("github-release").getAsString(); + githubRelease = githubRelease.replace("\"", ""); } catch (IOException e) { System.out.println("An error has occurred while attempting to check for updates."); e.printStackTrace(); @@ -31,7 +35,7 @@ public class Updater { } public String urlReader() throws IOException { - URL website = new URL("https://brysonsteck.net/watcher.json"); + URL website = new URL("https://brysonsteck.net/updates.json"); URLConnection connection = website.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb30d2a..05fc69e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,4 +37,9 @@ 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. Whoops! Wiimmfi Watcher was unable to connect to the Wiimmfi servers. This could be that you are not connected to the internet, but it could be something else. Here was the error:\n\n%1$s\n\nIf the error is along the lines of \"Unable to resolve host\" or \"Timeout\", you are probably having internet issues. Make sure you are connected to the internet then click the refresh button or press back to watch a new friend code.\n\nIf the error is something other than that or if the error persists, make sure that Wiimmfi\'s website is currently running. Otherwise, please screenshot this screen and submit a bug report by clicking the About icon on the main page. Locating %1$s… + + A new update is available! + A new version of Wiimmfi Watcher is available on the Play Store (version %1$s)! You can download it by pressing \"Update\". + Update + Later \ No newline at end of file -- cgit v1.2.3 From 084f8ef90b06bc1daa40544ae96a6b7916526876 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 28 Jun 2021 22:49:42 -0600 Subject: added translations for update dialog --- app/src/main/res/values-de/strings.xml | 4 ++++ app/src/main/res/values-es/strings.xml | 4 ++++ app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-it/strings.xml | 4 ++++ app/src/main/res/values-ja/strings.xml | 4 ++++ app/src/main/res/values-ko/strings.xml | 4 ++++ app/src/main/res/values-pt/strings.xml | 4 ++++ 7 files changed, 28 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 05fc857..5e0cbeb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -30,4 +30,8 @@ Ausführung Sie verwenden die Wiimmfi Watcher Version %1$s aus. Sie können die Versionshinweise für diese Version hier]]> anzeigen. Suchen von %1$s… + Aktualisieren + Später + Ein neues Update ist verfügbar! + 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. \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 29c9f22..08be5f5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -30,4 +30,8 @@ © Copyright 2021 Bryson Steck Wiimmfi Watcher está disponible bajo la Licencia Pública General de GNU Versión 3. Puede ver la licencia aquí.\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 <https://www.gnu.org/licenses/>. Si desea comunicarse conmigo por cualquier motivo que no esté relacionado con los informes de errores o esta aplicación en general, puede comunicarse conmigo por correo electrónico a steck.bryson@gmail.com o en Discord a bryzinga#9971. Localizando %1$s… + Actualizar + Luego + ¡Hay una nueva actualización disponible! + ¡Hay una nueva versión de Wiimmfi Watcher disponible en Play Store (versión %1$s)! Puedes descargarlo presionando \"Actualizar\". \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4109ad8..9b37214 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -37,5 +37,9 @@ Version Vous exécutez la version %1$s de Wiimmfi Watcher. Vous pouvez consulter les notes de publication de cette version ici.]]> Localisation de %1$s… + réactualiser + Ensuite + Une nouvelle mise à jour est disponible! + 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\". \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d094f92..00de712 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -30,4 +30,8 @@ Versione Stai eseguendo Wiimmfi Watcher versione %1$s. È possibile visualizzare le note di rilascio per questa versione qui.]]> Individuazione %1$s… + Aggiornare + Dopo + È disponibile un nuovo aggiornamento! + Una nuova versione di Wiimmfi Watcher è disponibile sul Play Store (versione %1$s)! Puoi scaricarlo premendo \"Aggiorna\". \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cc89096..6e120cc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -30,4 +30,8 @@ バージョン Wiimmfi Watcherバージョン%1$sを実行しています。このバージョンのリリースノートはこちら]]>でご覧いただけます。 %1$sの検索… + 更新 + 後で + 新しいアップデートが利用可能です! + Wiimmfiウォッチャーの新しいバージョンがPlayストアで入手できます(バージョン %1$s!「更新」を押すとダウンロードできます。 \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bde3c68..0343262 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -30,4 +30,8 @@ © Copyright 2021 Bryson Steck\n\nWiimmfi Watcher는 GNU General Public License 버전 3에 따라 사용할 수 있습니다. 여기에서 라이센스를 볼 수 있습니다.\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 <https://www.gnu.org/licenses/>. 일반적으로 버그 보고서 나이 앱과 관련이없는 이유로 저를 붙잡 으려면 steck.bryson@gmail.com으로 이메일을 보내거나 bryzinga#9971로 Discord를 통해 저에게 연락 할 수 있습니다. %1$s 찾는 중… + 최신 정보 + 나중 + 새로운 업데이트가 있습니다! + Play 스토어 (버전 %1$s)에서 Wiimmfi Watcher의 새 버전을 사용할 수 있습니다! \"업데이트\"를 눌러 다운로드 할 수 있습니다. \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d8aa961..4b7611d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -30,4 +30,8 @@ © Copyright 2021 Bryson Steck\n\nWiimmfi Watcher está disponível sob a Licença Pública Geral GNU Versão 3. Você pode visualizar a licença aqui.\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 <https://www.gnu.org/licenses/>. Se você quiser entrar em contato comigo por qualquer motivo não relacionado a relatórios de bugs ou a este aplicativo em geral, pode entrar em contato comigo por e-mail steck.bryson@gmail.com ou no Discord em bryzinga#9971. Localizando %1$s… + Atualizar + Mais tarde + Uma nova atualização está disponível! + Uma nova versão do Wiimmfi Watcher está disponível na Play Store (versão %1$s)! Você pode baixá-lo pressionando \"Atualizar\". \ No newline at end of file -- cgit v1.2.3 From 3c10ea67a3dab3d221e609d8dc6bc0df145f1220 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 28 Jun 2021 23:04:29 -0600 Subject: updated doc for 1.1.4 --- README.md | 2 +- TODO.md | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e2ae102..6f14830 100644 --- a/README.md +++ b/README.md @@ -62,4 +62,4 @@ along with Wiimmfi Watcher. If not, see . Wiimmfi Watcher is made possible by the following: * [Wiimmfi](https://wiimmfi.de) for being the complete backbone of this app. * [Jsoup](https://jsoup.org) version 1.13.1, which powers getting the information from Wiimmfi with HTML parsing. (This will soon be replaced in favor of JSON parsing.) -* [Gson](https://github.com/google/gson) version 2.8.7, which powers the updater (coming in 1.1.4). +* [Gson](https://github.com/google/gson) version 2.8.7, which powers the updater. diff --git a/TODO.md b/TODO.md index 0f8d74f..2b81322 100644 --- a/TODO.md +++ b/TODO.md @@ -3,21 +3,17 @@ These are issues in Wiimmfi Watcher I am at least aware of. Please **DO NOT** su ### Completed For Release 1.1.4 * Added an updater to make sure subsequent releases are up to date +* Implement the updater into the UI ### Working On -* Implement the updater into the UI * Create a better looking header for the watcher activity * Add 'sections' I guess??? -* Remove requirement of reading todo list before submitting issues ### 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 navigation menu in Dark Mode is messed up (colors) * The selected player detail text and icon is black * The highlight color is barely visible -* Pressing the watch or refresh buttons cause the app to hang until refreshing is completed. - * Working with threads should fix this - * Adding a dialog helps make it look like the app is working for now * Adding the option to toggle dark mode manually so older devices can have that privledge as well # Features I would like to add -- cgit v1.2.3