diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8b01d869..9003cab6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,6 +150,20 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activities.main.MainActivity" /> + + + + - - - - - - \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java index 057b6d63..76d15b4f 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java @@ -8,6 +8,7 @@ import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; @@ -142,7 +143,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo mainContent.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); totalItemCount = layoutManager.getItemCount(); lastVisibleItem = layoutManager.findLastVisibleItemPosition(); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarksActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarksActivity.java index 107ed6ce..dcf2ea84 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarksActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/bookmarks/BookmarksActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.os.Bundle; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -128,7 +129,7 @@ public class BookmarksActivity extends BaseActivity { * it may be best to switch to a * {@link FragmentStatePagerAdapter}. */ - private class SectionsPagerAdapter extends FragmentPagerAdapter { + private static class SectionsPagerAdapter extends FragmentPagerAdapter { private final List fragmentList = new ArrayList<>(); private final List fragmentTitleList = new ArrayList<>(); @@ -142,6 +143,7 @@ public class BookmarksActivity extends BaseActivity { notifyDataSetChanged(); } + @NonNull @Override public Fragment getItem(int position) { return fragmentList.get(position); @@ -158,8 +160,7 @@ public class BookmarksActivity extends BaseActivity { } @Override - public int getItemPosition(Object object) { - @SuppressWarnings("RedundantCast") + public int getItemPosition(@NonNull Object object) { int position = fragmentList.indexOf((Fragment) object); return position == -1 ? POSITION_NONE : position; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 625f7440..ed4431ce 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -32,8 +32,6 @@ import gr.thmmy.mthmmy.utils.parsing.ParseException; import gr.thmmy.mthmmy.views.CustomRecyclerView; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; import okhttp3.Response; -import timber.log.Timber; - /** * A {@link BaseFragment} subclass. @@ -86,10 +84,8 @@ public class RecentFragment extends BaseFragment { recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); recentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, SessionManager.indexUrl.toString()); } - Timber.d("onActivityCreated"); } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java index 749f42bc..a0cac182 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java @@ -21,6 +21,7 @@ import org.jsoup.select.Elements; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Objects; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.utils.parsing.ParseHelpers; @@ -68,7 +69,7 @@ public class SummaryFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - profileSummaryDocument = Jsoup.parse(requireArguments().getString(PROFILE_DOCUMENT)); + profileSummaryDocument = Jsoup.parse(Objects.requireNonNull(requireArguments().getString(PROFILE_DOCUMENT))); parsedProfileSummaryData = new LinkedHashMap<>(); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/shoutbox/ShoutboxFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/shoutbox/ShoutboxFragment.java index d6ab6cfd..fd7bb28e 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/shoutbox/ShoutboxFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/shoutbox/ShoutboxFragment.java @@ -56,6 +56,7 @@ public class ShoutboxFragment extends Fragment { LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); layoutManager.setReverseLayout(true); recyclerView.setLayoutManager(layoutManager); + recyclerView.setItemViewCacheSize(25); recyclerView.setOnTouchListener((view, motionEvent) -> { editorView.hideMarkdown(); InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); @@ -82,7 +83,7 @@ public class ShoutboxFragment extends Fragment { } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.shoutbox_menu, menu); } @@ -100,7 +101,7 @@ public class ShoutboxFragment extends Fragment { public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); shoutboxViewModel = ViewModelProviders.of(getActivity()).get(ShoutboxViewModel.class); - shoutboxViewModel.getShoutboxMutableLiveData().observe(this, shoutbox -> { + shoutboxViewModel.getShoutboxMutableLiveData().observe(getViewLifecycleOwner(), shoutbox -> { if (shoutbox != null) { Timber.i("Shoutbox loaded successfully"); shoutAdapter.setShouts(shoutbox.getShouts()); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 0584192f..9d0d4556 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -43,7 +43,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.AppCompatButton; -import androidx.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -113,7 +113,7 @@ class TopicAdapter extends RecyclerView.Adapter { this.postFocusListener = context; this.emojiKeyboard = emojiKeyboard; - viewModel = ViewModelProviders.of(context).get(TopicViewModel.class); + viewModel = new ViewModelProvider(context).get(TopicViewModel.class); } @Override @@ -137,7 +137,8 @@ class TopicAdapter extends RecyclerView.Adapter { quickReplyText.setFocusableInTouchMode(true); quickReplyText.setOnFocusChangeListener((v, hasFocus) -> quickReplyText.post(() -> { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(quickReplyText, InputMethodManager.SHOW_IMPLICIT); + if (imm != null) + imm.showSoftInput(quickReplyText, InputMethodManager.SHOW_IMPLICIT); })); quickReplyText.requestFocus(); @@ -150,7 +151,8 @@ class TopicAdapter extends RecyclerView.Adapter { editPostEdittext.setFocusableInTouchMode(true); editPostEdittext.setOnFocusChangeListener((v, hasFocus) -> editPostEdittext.post(() -> { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(editPostEdittext, InputMethodManager.SHOW_IMPLICIT); + if (imm != null) + imm.showSoftInput(editPostEdittext, InputMethodManager.SHOW_IMPLICIT); })); editPostEdittext.requestFocus(); @@ -215,12 +217,10 @@ class TopicAdapter extends RecyclerView.Adapter { for (Poll.Entry entry : entries) { CheckBox checkBox = new CheckBox(context); checkBox.setMovementMethod(LinkMovementMethod.getInstance()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) checkBox.setText(Html.fromHtml(entry.getEntryName(), Html.FROM_HTML_MODE_LEGACY)); - } else { - //noinspection deprecation + else checkBox.setText(Html.fromHtml(entry.getEntryName())); - } checkBox.setTextColor(primaryTextColor); holder.optionsLayout.addView(checkBox); } @@ -236,10 +236,9 @@ class TopicAdapter extends RecyclerView.Adapter { radioButton.setMovementMethod(LinkMovementMethod.getInstance()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { radioButton.setText(Html.fromHtml(entries[i].getEntryName(), Html.FROM_HTML_MODE_LEGACY)); - } else { - //noinspection deprecation + } else radioButton.setText(Html.fromHtml(entries[i].getEntryName())); - } + radioButton.setText(ThmmyParser.html2span(context, entries[i].getEntryName())); radioButton.setTextColor(primaryTextColor); radioGroup.addView(radioButton); @@ -255,12 +254,11 @@ class TopicAdapter extends RecyclerView.Adapter { Poll.Entry entry = entries1[i]; TextView textView = new TextView(context); textView.setMovementMethod(LinkMovementMethod.getInstance()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) textView.setText(Html.fromHtml(entry.getEntryName(), Html.FROM_HTML_MODE_LEGACY)); - } else { - //noinspection deprecation + else textView.setText(Html.fromHtml(entry.getEntryName())); - } + textView.setTextColor(primaryTextColor); if (poll.getSelectedEntryIndex() == i) { // apply bold to the selected entry @@ -363,7 +361,6 @@ class TopicAdapter extends RecyclerView.Adapter { holder.post.setClickable(true); holder.post.setWebViewClient(new LinkLauncher()); - //noinspection ConstantConditions loadAvatar(currentPost.getThumbnailURL(), holder.thumbnail, holder.itemView.getContext()); //Sets username,submit date, index number, subject, post's and attached files texts @@ -385,7 +382,7 @@ class TopicAdapter extends RecyclerView.Adapter { int filesTextColor; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { filesTextColor = context.getResources().getColor(R.color.accent, null); - } else //noinspection deprecation + } else filesTextColor = context.getResources().getColor(R.color.accent); for (final ThmmyFile attachedFile : currentPost.getAttachedFiles()) { @@ -408,7 +405,7 @@ class TopicAdapter extends RecyclerView.Adapter { int lastEditTextColor; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { lastEditTextColor = context.getResources().getColor(R.color.white, null); - } else //noinspection deprecation + } else lastEditTextColor = context.getResources().getColor(R.color.white); final TextView lastEdit = new TextView(context); @@ -492,7 +489,7 @@ class TopicAdapter extends RecyclerView.Adapter { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { holder.cardChildLinear.setBackground(context.getResources(). getDrawable(R.drawable.mention_card, null)); - } else //noinspection deprecation + } else holder.cardChildLinear.setBackground(context.getResources(). getDrawable(R.drawable.mention_card)); } else if (mUserColor == TopicParser.USER_COLOR_PINK) { @@ -500,7 +497,7 @@ class TopicAdapter extends RecyclerView.Adapter { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { holder.cardChildLinear.setBackground(context.getResources(). getDrawable(R.drawable.member_of_the_month_card, null)); - } else //noinspection deprecation + } else holder.cardChildLinear.setBackground(context.getResources(). getDrawable(R.drawable.member_of_the_month_card)); } else holder.cardChildLinear.setBackground(null); @@ -623,7 +620,6 @@ class TopicAdapter extends RecyclerView.Adapter { popUp.showAsDropDown(holder.overflowButton); }); - //noinspection PointlessBooleanExpression,ConstantConditions if (!BaseActivity.getSessionManager().isLoggedIn() || !viewModel.canReply()) holder.quoteToggle.setVisibility(View.GONE); else { @@ -644,7 +640,6 @@ class TopicAdapter extends RecyclerView.Adapter { final QuickReplyViewHolder holder = (QuickReplyViewHolder) currentHolder; Post reply = (Post) topicItems.get(position); - //noinspection ConstantConditions loadAvatar(getSessionManager().getAvatarLink(), holder.thumbnail, holder.itemView.getContext()); holder.username.setText(getSessionManager().getUsername()); @@ -669,7 +664,9 @@ class TopicAdapter extends RecyclerView.Adapter { return; } InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (imm != null) + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + holder.itemView.setAlpha(0.5f); holder.itemView.setEnabled(false); emojiKeyboard.hide(); @@ -706,7 +703,6 @@ class TopicAdapter extends RecyclerView.Adapter { } else if (currentHolder instanceof EditMessageViewHolder) { final EditMessageViewHolder holder = (EditMessageViewHolder) currentHolder; - //noinspection ConstantConditions loadAvatar(getSessionManager().getAvatarLink(), holder.thumbnail, holder.itemView.getContext()); holder.username.setText(getSessionManager().getUsername()); @@ -729,7 +725,9 @@ class TopicAdapter extends RecyclerView.Adapter { return; } InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (imm != null) + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + holder.itemView.setAlpha(0.5f); holder.itemView.setEnabled(false); emojiKeyboard.hide(); @@ -898,9 +896,7 @@ class TopicAdapter extends RecyclerView.Adapter { * This class is used to handle link clicks in WebViews. When link url is one that the app can * handle internally, it does. Otherwise user is prompt to open the link in a browser. */ - @SuppressWarnings("unchecked") private class LinkLauncher extends WebViewClient { - @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { final Uri uri = Uri.parse(url); diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/crashreporting/CrashReportingTree.java b/app/src/main/java/gr/thmmy/mthmmy/utils/crashreporting/CrashReportingTree.java index 83e55a37..77d4e352 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/crashreporting/CrashReportingTree.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/crashreporting/CrashReportingTree.java @@ -2,6 +2,8 @@ package gr.thmmy.mthmmy.utils.crashreporting; import android.util.Log; +import androidx.annotation.NonNull; + import com.google.firebase.crashlytics.FirebaseCrashlytics; import timber.log.Timber.DebugTree; @@ -14,7 +16,7 @@ public class CrashReportingTree extends DebugTree { } @Override - protected void log(int priority, String tag, String message, Throwable t) { + protected void log(int priority, String tag, @NonNull String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/views/editorview/EditorView.java b/app/src/main/java/gr/thmmy/mthmmy/views/editorview/EditorView.java index 051bfdfb..df39daa3 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/views/editorview/EditorView.java +++ b/app/src/main/java/gr/thmmy/mthmmy/views/editorview/EditorView.java @@ -375,11 +375,13 @@ public class EditorView extends LinearLayout implements EmojiInputField { if (emojiKeyboard.onEmojiButtonToggle()) { //prevent system keyboard from appearing when clicking the edittext editText.setTextIsSelectable(true); - imm.hideSoftInputFromWindow(getWindowToken(), 0); + if (imm != null) + imm.hideSoftInputFromWindow(getWindowToken(), 0); } else { editText.requestFocus(); - imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); + if (imm != null) + imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } editText.setSelection(selectionStart, selectionEnd); }); @@ -398,10 +400,12 @@ public class EditorView extends LinearLayout implements EmojiInputField { editText.setOnClickListener(view -> { if (!emojiKeyboard.isVisible()) { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); - imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); + if (imm != null) + imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } else { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(getWindowToken(), 0); + if (imm != null) + imm.hideSoftInputFromWindow(getWindowToken(), 0); requestEditTextFocus(); } showMarkdown(); diff --git a/app/src/main/res/layout/activity_create_content.xml b/app/src/main/res/layout/activity_create_content.xml index 5c42f68b..279eb871 100644 --- a/app/src/main/res/layout/activity_create_content.xml +++ b/app/src/main/res/layout/activity_create_content.xml @@ -53,7 +53,7 @@ android:layout_below="@id/subject_input" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - app:hint="topic message"/> + app:hint="@string/message"/> Page next last - Quick reply… - Subject… + Subject + Message Submit - Message… Could not connect to thmmy.gr\n\nTap to retry Network error retry