diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-12-27 19:50:39 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-12-27 19:50:39 +0300 |
commit | f0e6f36ad5cbb7391d4e6333ec19a60198750520 (patch) | |
tree | 4fa39d27ba8aa7608886ae054727b47df78fcea0 /News-Android-App/src/main/java | |
parent | 3f8032247e5367ec28e8174191bb1e334f07b04c (diff) |
Use ViewBinding instead of ButterKnife
Diffstat (limited to 'News-Android-App/src/main/java')
14 files changed, 433 insertions, 581 deletions
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastArrayAdapter.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastArrayAdapter.java index 09efbe57..5e9b45b7 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastArrayAdapter.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastArrayAdapter.java @@ -5,16 +5,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.FrameLayout; -import android.widget.ProgressBar; -import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; + import org.greenrobot.eventbus.EventBus; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.databinding.PodcastRowBinding; import de.luhmer.owncloudnewsreader.events.podcast.AudioPodcastClicked; import de.luhmer.owncloudnewsreader.events.podcast.StartDownloadPodcast; import de.luhmer.owncloudnewsreader.helper.NewsFileUtils; @@ -38,15 +36,16 @@ public class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> { if (view != null) { holder = (ViewHolder) view.getTag(); } else { - view = inflater.inflate(R.layout.podcast_row, parent, false); - holder = new ViewHolder(view); + PodcastRowBinding binding = PodcastRowBinding.inflate(inflater, parent, false); + view = binding.getRoot(); + holder = new ViewHolder(binding); view.setTag(holder); } final PodcastItem podcastItem = getItem(position); - holder.tvTitle.setText(podcastItem.title); - holder.tvBody.setText(podcastItem.mimeType); + holder.binding.tvTitle.setText(podcastItem.title); + holder.binding.tvBody.setText(podcastItem.mimeType); view.setOnClickListener(new View.OnClickListener() { @Override @@ -56,10 +55,10 @@ public class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> { }); - holder.flDownloadPodcast.setOnClickListener(new View.OnClickListener() { + holder.binding.flDownloadPodcastWrapper.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - holder.flDownloadPodcast.setVisibility(View.GONE); + holder.binding.flDownloadPodcastWrapper.setVisibility(View.GONE); Toast.makeText(getContext(), "Starting download.. Please wait", Toast.LENGTH_SHORT).show(); @@ -67,14 +66,14 @@ public class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> { } }); - holder.flPlayPodcast.setOnClickListener(new View.OnClickListener() { + holder.binding.flPlayPodcastWrapper.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { playPodcast(position); } }); - holder.flDeletePodcast.setOnClickListener(new View.OnClickListener() { + holder.binding.flDeletePodcastWrapper.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(NewsFileUtils.deletePodcastFile(getContext(), podcastItem.link)) { @@ -86,25 +85,25 @@ public class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> { }); - holder.pbDownloadPodcast.setProgress(podcastItem.downloadProgress); + holder.binding.pbDownloadPodcast.setProgress(podcastItem.downloadProgress); if(podcastItem.downloadProgress >= 0) { - holder.tvDownloadPodcastProgress.setVisibility(View.VISIBLE); - holder.pbDownloadPodcast.setVisibility(View.VISIBLE); - holder.tvDownloadPodcastProgress.setText(podcastItem.downloadProgress + "%"); + holder.binding.tvDownloadPodcastProgress.setVisibility(View.VISIBLE); + holder.binding.pbDownloadPodcast.setVisibility(View.VISIBLE); + holder.binding.tvDownloadPodcastProgress.setText(podcastItem.downloadProgress + "%"); } else { - holder.tvDownloadPodcastProgress.setVisibility(View.GONE); - holder.pbDownloadPodcast.setVisibility(View.GONE); + holder.binding.tvDownloadPodcastProgress.setVisibility(View.GONE); + holder.binding.pbDownloadPodcast.setVisibility(View.GONE); } if(podcastItem.downloadProgress.equals(PodcastItem.DOWNLOAD_NOT_STARTED)) { - holder.flDownloadPodcast.setVisibility(View.VISIBLE); + holder.binding.flDownloadPodcastWrapper.setVisibility(View.VISIBLE); } else { - holder.flDownloadPodcast.setVisibility(View.GONE); + holder.binding.flDownloadPodcastWrapper.setVisibility(View.GONE); } - holder.flDeletePodcast.setVisibility((podcastItem.downloadProgress.equals(PodcastItem.DOWNLOAD_COMPLETED)) ? View.VISIBLE : View.GONE ); + holder.binding.flDeletePodcastWrapper.setVisibility((podcastItem.downloadProgress.equals(PodcastItem.DOWNLOAD_COMPLETED)) ? View.VISIBLE : View.GONE ); /* File podcastFile = new File(PodcastDownloadService.getUrlToPodcastFile(getContext(), podcastItem.link, true)); @@ -132,18 +131,10 @@ public class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> { static class ViewHolder { - @BindView(R.id.tv_title) TextView tvTitle; - @BindView(R.id.tv_body) TextView tvBody; - @BindView(R.id.fl_downloadPodcastWrapper) FrameLayout flDownloadPodcast; - @BindView(R.id.fl_PlayPodcastWrapper) FrameLayout flPlayPodcast; - @BindView(R.id.fl_deletePodcastWrapper) FrameLayout flDeletePodcast; - @BindView(R.id.pbDownloadPodcast) ProgressBar pbDownloadPodcast; - @BindView(R.id.tvDownloadPodcastProgress) TextView tvDownloadPodcastProgress; - - + @NonNull final PodcastRowBinding binding; - public ViewHolder(View view) { - ButterKnife.bind(this, view); + public ViewHolder(@NonNull PodcastRowBinding binding) { + this.binding = binding; } } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastFeedArrayAdapter.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastFeedArrayAdapter.java index ff993dde..f30dd4e9 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastFeedArrayAdapter.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastFeedArrayAdapter.java @@ -7,11 +7,12 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; +import androidx.annotation.NonNull; + import org.greenrobot.eventbus.EventBus; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.databinding.PodcastFeedRowBinding; import de.luhmer.owncloudnewsreader.events.podcast.PodcastFeedClicked; import de.luhmer.owncloudnewsreader.model.PodcastFeedItem; @@ -32,15 +33,16 @@ public class PodcastFeedArrayAdapter extends ArrayAdapter<PodcastFeedItem> { if (view != null) { holder = (ViewHolder) view.getTag(); } else { - view = inflater.inflate(R.layout.podcast_feed_row, parent, false); - holder = new ViewHolder(view); - view.setTag(holder); + PodcastFeedRowBinding binding = PodcastFeedRowBinding.inflate(inflater, parent, false); + view = binding.getRoot(); + holder = new ViewHolder(binding); + binding.getRoot().setTag(holder); } final PodcastFeedItem feedItem = getItem(position); - holder.tvTitle.setText(feedItem.mFeed.getFeedTitle()); - holder.tvBody.setText(feedItem.mPodcastCount + " Podcasts available"); + holder.binding.tvTitle.setText(feedItem.mFeed.getFeedTitle()); + holder.binding.tvBody.setText(feedItem.mPodcastCount + " Podcasts available"); view.setOnClickListener(new View.OnClickListener() { @Override @@ -56,11 +58,10 @@ public class PodcastFeedArrayAdapter extends ArrayAdapter<PodcastFeedItem> { static class ViewHolder { - @BindView(R.id.tv_title) TextView tvTitle; - @BindView(R.id.tv_body) TextView tvBody; + @NonNull final PodcastFeedRowBinding binding; - public ViewHolder(View view) { - ButterKnife.bind(this, view); + public ViewHolder(@NonNull PodcastFeedRowBinding binding) { + this.binding = binding; } } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/SubscriptionExpandableListAdapter.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/SubscriptionExpandableListAdapter.java index 7495f74e..de94ffb9 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/SubscriptionExpandableListAdapter.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/SubscriptionExpandableListAdapter.java @@ -25,7 +25,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; -import android.preference.PreferenceManager; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; @@ -34,23 +33,21 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; -import android.widget.ImageButton; -import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.TextView; import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; import androidx.core.view.ViewCompat; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.R; import de.luhmer.owncloudnewsreader.SettingsActivity; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.Feed; import de.luhmer.owncloudnewsreader.database.model.Folder; +import de.luhmer.owncloudnewsreader.databinding.SubscriptionListItemBinding; +import de.luhmer.owncloudnewsreader.databinding.SubscriptionListSubItemBinding; import de.luhmer.owncloudnewsreader.helper.FavIconHandler; import de.luhmer.owncloudnewsreader.helper.StopWatch; import de.luhmer.owncloudnewsreader.helper.ThemeChooser; @@ -150,8 +147,9 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter viewHolder = (ChildHolder) convertView.getTag(); } else { LinearLayout view = new LinearLayout(mContext); - convertView = inflater.inflate(R.layout.subscription_list_sub_item, view, true); - viewHolder = new ChildHolder(convertView); + SubscriptionListSubItemBinding binding = SubscriptionListSubItemBinding.inflate(LayoutInflater.from(mContext), view, true); + convertView = binding.getRoot(); + viewHolder = new ChildHolder(binding); convertView.setTag(viewHolder); } @@ -159,7 +157,7 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter if(item != null) { String headerText = (item.header != null) ? item.header : ""; - viewHolder.tV_HeaderText.setText(headerText); + viewHolder.binding.summary.setText(headerText); String unreadCount; @@ -170,30 +168,27 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter } if(unreadCount != null) - viewHolder.tV_UnreadCount.setText(unreadCount); + viewHolder.binding.tvUnreadCount.setText(unreadCount); else - viewHolder.tV_UnreadCount.setText(""); + viewHolder.binding.tvUnreadCount.setText(""); - favIconHandler.loadFavIconForFeed(item.favIcon, viewHolder.imgView_FavIcon); + favIconHandler.loadFavIconForFeed(item.favIcon, viewHolder.binding.iVFavicon); } else { - viewHolder.tV_HeaderText.setText(mContext.getString(R.string.login_dialog_text_something_went_wrong)); - viewHolder.tV_UnreadCount.setText(""); - viewHolder.imgView_FavIcon.setImageDrawable(null); + viewHolder.binding.summary.setText(mContext.getString(R.string.login_dialog_text_something_went_wrong)); + viewHolder.binding.tvUnreadCount.setText(""); + viewHolder.binding.iVFavicon.setImageDrawable(null); } return convertView; } static class ChildHolder { - @BindView(R.id.list_item_layout) View listItemLayout; - @BindView(R.id.summary) TextView tV_HeaderText; - @BindView(R.id.tv_unreadCount) TextView tV_UnreadCount; - @BindView(R.id.iVFavicon) ImageView imgView_FavIcon; + @NonNull final SubscriptionListSubItemBinding binding; - public ChildHolder(View view) { - ButterKnife.bind(this, view); + public ChildHolder(@NonNull SubscriptionListSubItemBinding binding) { + this.binding = binding; } } @@ -242,16 +237,16 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter final AbstractItem group = (AbstractItem) getGroup(groupPosition); if (convertView == null) { - LinearLayout view = new LinearLayout(mContext); - convertView = inflater.inflate(R.layout.subscription_list_item, view, true); - viewHolder = new GroupHolder(convertView); - view.setTag(viewHolder); + SubscriptionListItemBinding binding = SubscriptionListItemBinding.inflate(LayoutInflater.from(mContext), new LinearLayout(mContext), true); + viewHolder = new GroupHolder(binding); + convertView = binding.getRoot(); + binding.getRoot().setTag(viewHolder); } else { viewHolder = (GroupHolder) convertView.getTag(); } - viewHolder.txt_Summary.setText(group.header); - viewHolder.listItemLayout.setOnClickListener(new OnClickListener() { + viewHolder.binding.summary.setText(group.header); + viewHolder.binding.listItemLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -269,7 +264,7 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter } }); - viewHolder.listItemLayout.setOnLongClickListener(new View.OnLongClickListener() { + viewHolder.binding.listItemLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -286,12 +281,12 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter }); - viewHolder.txt_UnreadCount.setText(""); + viewHolder.binding.tVFeedsCount.setText(""); boolean skipGetUnread = false; if(group.idFolder != null && group.idFolder == ITEMS_WITHOUT_FOLDER.getValue()) { String unreadCount = unreadCountFeeds.get((int) group.id_database); if(unreadCount != null) { - viewHolder.txt_UnreadCount.setText(unreadCount); + viewHolder.binding.tVFeedsCount.setText(unreadCount); } skipGetUnread = true; @@ -300,7 +295,7 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter if(!skipGetUnread) { String unreadCount = unreadCountFolders.get((int) group.id_database); if(unreadCount != null) - viewHolder.txt_UnreadCount.setText(unreadCount); + viewHolder.binding.tVFeedsCount.setText(unreadCount); } @@ -310,25 +305,25 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter if(group.idFolder != null) { - viewHolder.imgView.setVisibility(View.GONE); + viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE); if(group.idFolder == ITEMS_WITHOUT_FOLDER.getValue()) { ConcreteFeedItem concreteFeedItem = ((ConcreteFeedItem) group); - favIconHandler.loadFavIconForFeed(concreteFeedItem.favIcon, viewHolder.faviconView); + favIconHandler.loadFavIconForFeed(concreteFeedItem.favIcon, viewHolder.binding.imgViewFavicon); } } else { if(group.id_database == ALL_STARRED_ITEMS.getValue()) { - viewHolder.imgView.setVisibility(View.GONE); - viewHolder.faviconView.setVisibility(View.VISIBLE); + viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE); + viewHolder.binding.imgViewFavicon.setVisibility(View.VISIBLE); rotation = 0; - viewHolder.faviconView.setImageResource(getBtn_rating_star_off_normal_holo_light()); + viewHolder.binding.imgViewFavicon.setImageResource(getBtn_rating_star_off_normal_holo_light()); } else if (getChildrenCount( groupPosition ) == 0 ) { - viewHolder.imgView.setVisibility(View.GONE); - viewHolder.faviconView.setVisibility(View.INVISIBLE); + viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE); + viewHolder.binding.imgViewFavicon.setVisibility(View.INVISIBLE); } else { - viewHolder.imgView.setVisibility(View.VISIBLE); - viewHolder.faviconView.setVisibility(View.INVISIBLE); - viewHolder.imgView.setImageResource(R.drawable.ic_action_expand_less); + viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.VISIBLE); + viewHolder.binding.imgViewFavicon.setVisibility(View.INVISIBLE); + viewHolder.binding.imgViewExpandableIndicator.setImageResource(R.drawable.ic_action_expand_less); if(isExpanded) { rotation = 180; @@ -342,7 +337,7 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter contentDescriptionId = R.string.content_desc_expand; } - viewHolder.imgView.setOnClickListener(new OnClickListener() { + viewHolder.binding.imgViewExpandableIndicator.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(isExpanded) @@ -354,8 +349,8 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter } } - viewHolder.imgView.setRotation(rotation); - viewHolder.imgView.setContentDescription(viewHolder.imgView.getContext().getString(contentDescriptionId)); + viewHolder.binding.imgViewExpandableIndicator.setRotation(rotation); + viewHolder.binding.imgViewExpandableIndicator.setContentDescription(viewHolder.binding.imgViewExpandableIndicator.getContext().getString(contentDescriptionId)); return convertView; } @@ -373,14 +368,10 @@ public class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter } static class GroupHolder { - @BindView(R.id.list_item_layout) View listItemLayout; - @BindView(R.id.summary) TextView txt_Summary; - @BindView(R.id.tV_feedsCount) TextView txt_UnreadCount; - @BindView(R.id.img_View_expandable_indicator) ImageButton imgView; - @BindView(R.id.img_view_favicon) ImageView faviconView; - - public GroupHolder(View view) { - ButterKnife.bind(this, view); + @NonNull final SubscriptionListItemBinding binding; + + public GroupHolder(@NonNull SubscriptionListItemBinding binding) { + this.binding = binding; } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java index 29b6ce7a..da8feb32 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java @@ -66,10 +66,8 @@ import java.net.URL; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; +import de.luhmer.owncloudnewsreader.databinding.ActivityLoginDialogBinding; import de.luhmer.owncloudnewsreader.di.ApiProvider; import de.luhmer.owncloudnewsreader.model.NextcloudNewsVersion; import de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager; @@ -106,15 +104,7 @@ public class LoginDialogActivity extends AppCompatActivity { private String mOc_root_path; // UI references. - protected @BindView(R.id.username) EditText mUsernameView; - protected @BindView(R.id.password) EditText mPasswordView; - protected @BindView(R.id.password_container) TextInputLayout mPasswordContainerView; - protected @BindView(R.id.edt_owncloudRootPath) EditText mOc_root_path_View; - protected @BindView(R.id.cb_AllowAllSSLCertificates) CheckBox mCbDisableHostnameVerificationView; - protected @BindView(R.id.imgView_ShowPassword) ImageView mImageViewShowPwd; - protected @BindView(R.id.tv_manual_login) TextView mTvManualLogin; - protected @BindView(R.id.old_login_wrapper) RelativeLayout mOldLoginWrapper; - + protected ActivityLoginDialogBinding binding; private SingleSignOnAccount importedAccount = null; private boolean mPasswordVisible = false; @@ -124,13 +114,17 @@ public class LoginDialogActivity extends AppCompatActivity { public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this); - setContentView(R.layout.activity_login_dialog); - ButterKnife.bind(this); + + binding = ActivityLoginDialogBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.btnSingleSignOn.setOnClickListener((v) -> startSingleSignOn()); + binding.btnLogin.setOnClickListener((v) -> startManualLogin()); + binding.tvManualLogin.setOnClickListener((v) -> manualLogin()); // Manual Login - mImageViewShowPwd.setOnClickListener(ImgViewShowPasswordListener); - mPasswordView.addTextChangedListener(PasswordTextChangedListener); + binding.imgViewShowPassword.setOnClickListener(ImgViewShowPasswordListener); + binding.password.addTextChangedListener(PasswordTextChangedListener); mUsername = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, ""); mPassword = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, ""); @@ -138,16 +132,16 @@ public class LoginDialogActivity extends AppCompatActivity { boolean mCbDisableHostnameVerification = mPrefs.getBoolean(SettingsActivity.CB_DISABLE_HOSTNAME_VERIFICATION_STRING, false); if(!mPassword.isEmpty()) { - mImageViewShowPwd.setVisibility(View.GONE); + binding.imgViewShowPassword.setVisibility(View.GONE); } // Set up the login form. - mUsernameView.setText(mUsername); - mPasswordView.setText(mPassword); - mOc_root_path_View.setText(mOc_root_path); + binding.username.setText(mUsername); + binding.password.setText(mPassword); + binding.edtOwncloudRootPath.setText(mOc_root_path); - mCbDisableHostnameVerificationView.setChecked(mCbDisableHostnameVerification); - mCbDisableHostnameVerificationView.setOnCheckedChangeListener(new OnCheckedChangeListener() { + binding.cbAllowAllSSLCertificates.setChecked(mCbDisableHostnameVerification); + binding.cbAllowAllSSLCertificates.setOnCheckedChangeListener(new OnCheckedChangeListener() { @SuppressLint("ApplySharedPref") @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -181,14 +175,13 @@ public class LoginDialogActivity extends AppCompatActivity { super.onStop(); } - @OnClick(R.id.btnSingleSignOn) public void startSingleSignOn() { if (!VersionCheckHelper.verifyMinVersion(LoginDialogActivity.this, MIN_NEXTCLOUD_FILES_APP_VERSION_CODE)) { // Dialog will be shown automatically return; } - mOldLoginWrapper.setVisibility(View.GONE); + binding.oldLoginWrapper.setVisibility(View.GONE); try { AccountImporter.pickNewAccount(LoginDialogActivity.this); @@ -199,14 +192,12 @@ public class LoginDialogActivity extends AppCompatActivity { } } - @OnClick(R.id.btnLogin) public void startManualLogin() { attemptLogin(); } - @OnClick(R.id.tv_manual_login) public void manualLogin() { - mOldLoginWrapper.setVisibility(View.VISIBLE); + binding.oldLoginWrapper.setVisibility(View.VISIBLE); } private TextWatcher PasswordTextChangedListener = new TextWatcher() { @@ -223,7 +214,7 @@ public class LoginDialogActivity extends AppCompatActivity { @Override public void afterTextChanged(Editable s) { if(s.toString().isEmpty()) { - mImageViewShowPwd.setVisibility(View.VISIBLE); + binding.imgViewShowPassword.setVisibility(View.VISIBLE); } } }; @@ -234,9 +225,9 @@ public class LoginDialogActivity extends AppCompatActivity { mPasswordVisible = !mPasswordVisible; if(mPasswordVisible) { - mPasswordView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + binding.password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { - mPasswordView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + binding.password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } } }; @@ -285,40 +276,40 @@ public class LoginDialogActivity extends AppCompatActivity { */ public void attemptLogin() { // Reset errors. - mUsernameView.setError(null); - mPasswordView.setError(null); - mOc_root_path_View.setError(null); + binding.username.setError(null); + binding.password.setError(null); + binding.edtOwncloudRootPath.setError(null); // Append "https://" is url doesn't contain it already - mOc_root_path = mOc_root_path_View.getText().toString().trim(); + mOc_root_path = binding.edtOwncloudRootPath.getText().toString().trim(); if(!mOc_root_path.startsWith("http")) { - mOc_root_path_View.setText("https://" + mOc_root_path); + binding.edtOwncloudRootPath.setText("https://" + mOc_root_path); } // Store values at the time of the login attempt. - mUsername = mUsernameView.getText().toString().trim(); - mPassword = mPasswordView.getText().toString(); - mOc_root_path = mOc_root_path_View.getText().toString().trim(); + mUsername = binding.username.getText().toString().trim(); + mPassword = binding.password.getText().toString(); + mOc_root_path = binding.edtOwncloudRootPath.getText().toString().trim(); boolean cancel = false; View focusView = null; // Check for a valid password. if (TextUtils.isEmpty(mPassword)) { - mPasswordView.setError(getString(R.string.error_field_required)); - focusView = mPasswordView; + binding.password.setError(getString(R.string.error_field_required)); + focusView = binding.password; cancel = true; } // Check for a valid email address. if (TextUtils.isEmpty(mUsername)) { - mUsernameView.setError(getString(R.string.error_field_required)); - focusView = mUsernameView; + binding.username.setError(getString(R.string.error_field_required)); + focusView = binding.username; cancel = true; } if (TextUtils.isEmpty(mOc_root_path)) { - mOc_root_path_View.setError(getString(R.string.error_field_required)); - focusView = mOc_root_path_View; + binding.edtOwncloudRootPath.setError(getString(R.string.error_field_required)); + focusView = binding.edtOwncloudRootPath; cancel = true; } else { try { @@ -331,8 +322,8 @@ public class LoginDialogActivity extends AppCompatActivity { getString(R.string.login_dialog_text_security_warning), this); } } catch (MalformedURLException e) { - mOc_root_path_View.setError(getString(R.string.error_invalid_url)); - focusView = mOc_root_path_View; + binding.edtOwncloudRootPath.setError(getString(R.string.error_invalid_url)); + focusView = binding.edtOwncloudRootPath; cancel = true; } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewFeedActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewFeedActivity.java index 29e2adc9..d114fc8c 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewFeedActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewFeedActivity.java @@ -17,15 +17,11 @@ import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.Spinner; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -54,12 +50,10 @@ import java.util.Map; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.Feed; import de.luhmer.owncloudnewsreader.database.model.Folder; +import de.luhmer.owncloudnewsreader.databinding.ActivityNewFeedBinding; import de.luhmer.owncloudnewsreader.di.ApiProvider; import de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper; import de.luhmer.owncloudnewsreader.helper.OpmlXmlParser; @@ -79,12 +73,7 @@ public class NewFeedActivity extends AppCompatActivity { private final static int REQUEST_CODE_OPML_IMPORT = 2; // UI references. - protected @BindView(R.id.et_feed_url) EditText mFeedUrlView; - protected @BindView(R.id.sp_folder) Spinner mFolderView; - protected @BindView(R.id.new_feed_progress) View mProgressView; - protected @BindView(R.id.new_feed_form) View mLoginFormView; - protected @BindView(R.id.btn_addFeed) Button mAddFeedButton; - protected @BindView(R.id.toolbar) Toolbar toolbar; + protected ActivityNewFeedBinding binding; private List<Folder> folders; protected @Inject ApiProvider mApi; @@ -96,13 +85,16 @@ public class NewFeedActivity extends AppCompatActivity { ThemeChooser.chooseTheme(this); super.onCreate(savedInstanceState); ThemeChooser.afterOnCreate(this); - setContentView(R.layout.activity_new_feed); - ButterKnife.bind(this); + binding = ActivityNewFeedBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.btnAddFeed.setOnClickListener((v) -> btnAddFeedClick()); + binding.btnImportOpml.setOnClickListener((v) -> importOpml()); + binding.btnExportOpml.setOnClickListener((v) -> exportOpml()); - if (toolbar != null) { - setSupportActionBar(toolbar); + if (binding.toolbarLayout.toolbar != null) { + setSupportActionBar(binding.toolbarLayout.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @@ -118,7 +110,7 @@ public class NewFeedActivity extends AppCompatActivity { } ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, folderNames); - mFolderView.setAdapter(spinnerArrayAdapter); + binding.spFolder.setAdapter(spinnerArrayAdapter); Intent intent = getIntent(); String action = intent.getAction(); @@ -140,22 +132,20 @@ public class NewFeedActivity extends AppCompatActivity { //Uri uri = intent.getData(); Log.v("tag" , "Content intent detected: " + action + " : " + url); - mFeedUrlView.setText(url); + binding.etFeedUrl.setText(url); } } - @OnClick(R.id.btn_addFeed) public void btnAddFeedClick() { //Hide keyboard InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(mFeedUrlView.getWindowToken(), 0); + imm.hideSoftInputFromWindow(binding.etFeedUrl.getWindowToken(), 0); attemptAddNewFeed(); } - @OnClick(R.id.btn_import_opml) public void importOpml() { String permission = Manifest.permission.READ_EXTERNAL_STORAGE; @@ -181,9 +171,6 @@ public class NewFeedActivity extends AppCompatActivity { .start(); } - - - @OnClick(R.id.btn_export_opml) public void exportOpml() { String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; @@ -348,13 +335,13 @@ public class NewFeedActivity extends AppCompatActivity { * errors are presented and no actual login attempt is made. */ public void attemptAddNewFeed() { - Folder folder = folders.get(mFolderView.getSelectedItemPosition()); + Folder folder = folders.get(binding.spFolder.getSelectedItemPosition()); // Reset errors. - mFeedUrlView.setError(null); + binding.etFeedUrl.setError(null); // Store values at the time of the login attempt. - String urlToFeed = mFeedUrlView.getText().toString(); + String urlToFeed = binding.etFeedUrl.getText().toString(); boolean cancel = false; View focusView = null; @@ -362,12 +349,12 @@ public class NewFeedActivity extends AppCompatActivity { // Check for a valid email address. if (TextUtils.isEmpty(urlToFeed)) { - mFeedUrlView.setError(getString(R.string.error_field_required)); - focusView = mFeedUrlView; + binding.etFeedUrl.setError(getString(R.string.error_field_required)); + focusView = binding.etFeedUrl; cancel = true; } else if (!isUrlValid(urlToFeed)) { - mFeedUrlView.setError(getString(R.string.error_invalid_url)); - focusView = mFeedUrlView; + binding.etFeedUrl.setError(getString(R.string.error_invalid_url)); + focusView = binding.etFeedUrl; cancel = true; } @@ -403,13 +390,13 @@ public class NewFeedActivity extends AppCompatActivity { } catch (JSONException e) { Log.e(TAG, "Extracting error message failed: " + errorMessage, e); } - mFeedUrlView.setError(errorMessage); + binding.etFeedUrl.setError(errorMessage); Log.e(TAG, errorMessage); } catch (IOException e) { Log.e(TAG, "IOException", e); - mFeedUrlView.setError(getString(R.string.login_dialog_text_something_went_wrong)); + binding.etFeedUrl.setError(getString(R.string.login_dialog_text_something_went_wrong)); } - mFeedUrlView.requestFocus(); + binding.etFeedUrl.requestFocus(); } }); } @@ -419,8 +406,8 @@ public class NewFeedActivity extends AppCompatActivity { runOnUiThread(() -> { showProgress(false); - mFeedUrlView.setError(getString(R.string.login_dialog_text_something_went_wrong) + " - " + OkHttpSSLClient.HandleExceptions((Exception) t).getMessage()); - mFeedUrlView.requestFocus(); + binding.etFeedUrl.setError(getString(R.string.login_dialog_text_something_went_wrong) + " - " + OkHttpSSLClient.HandleExceptions((Exception) t).getMessage()); + binding.etFeedUrl.requestFocus(); }); } }); @@ -451,21 +438,21 @@ public class NewFeedActivity extends AppCompatActivity { public void showProgress(final boolean show) { int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - mLoginFormView.animate().setDuration(shortAnimTime).alpha( + binding.newFeedForm.setVisibility(show ? View.GONE : View.VISIBLE); + binding.newFeedForm.animate().setDuration(shortAnimTime).alpha( show ? 0 : 1).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + binding.newFeedForm.setVisibility(show ? View.GONE : View.VISIBLE); } }); - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mProgressView.animate().setDuration(shortAnimTime).alpha( + binding.newFeedProgress.setVisibility(show ? View.VISIBLE : View.GONE); + binding.newFeedProgress.animate().setDuration(shortAnimTime).alpha( show ? 1 : 0).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + binding.newFeedProgress.setVisibility(show ? View.VISIBLE : View.GONE); } }); } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java index 86878af3..16859f1c 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java @@ -36,10 +36,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.ProgressBar; -import androidx.appcompat.widget.AppCompatImageButton; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -54,14 +51,14 @@ import java.util.Set; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm.SORT_DIRECTION; import de.luhmer.owncloudnewsreader.database.model.RssItem; +import de.luhmer.owncloudnewsreader.databinding.ActivityNewsDetailBinding; import de.luhmer.owncloudnewsreader.helper.ThemeUtils; import de.luhmer.owncloudnewsreader.model.PodcastItem; import de.luhmer.owncloudnewsreader.model.TTSItem; +import de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout; import de.luhmer.owncloudnewsreader.widget.WidgetProvider; @@ -79,18 +76,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { * {@link FragmentStatePagerAdapter}. */ private SectionsPagerAdapter mSectionsPagerAdapter; - protected @BindView(R.id.toolbar) Toolbar toolbar; - // protected @BindView(R.id.bottomAppBar) BottomAppBar bottomAppBar; - protected @BindView(R.id.progressIndicator) ProgressBar progressIndicator; - //protected @BindView(R.id.btn_disable_incognito) ImageButton mBtnDisableIncognito; - protected @BindView(R.id.fa_detail_bar) View fastActionDetailBar; - protected @BindView(R.id.fa_collapse_layout) View fastActionCollapseLayout; - protected @BindView(R.id.fa_star) AppCompatImageButton fastActionStar; - protected @BindView(R.id.fa_mark_as_read) AppCompatImageButton fastActionRead; - protected @BindView(R.id.fa_toggle) AppCompatImageButton fastActionToggle; - protected @BindView(R.id.fa_open_in_browser) AppCompatImageButton fastActionOpenInBrowser; - protected @BindView(R.id.fa_share) AppCompatImageButton fastActionShare; - + protected ActivityNewsDetailBinding binding; /** * The {@link ViewPager} that will host the section contents. @@ -116,6 +102,9 @@ public class NewsDetailActivity extends PodcastFragmentActivity { super.onCreate(savedInstanceState); + binding = ActivityNewsDetailBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + /* //make full transparent statusBar if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { @@ -144,10 +133,6 @@ public class NewsDetailActivity extends PodcastFragmentActivity { } */ - - - setContentView(R.layout.activity_news_detail); - /* // For Debugging the WebView using Chrome Remote Debugging if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -155,10 +140,8 @@ public class NewsDetailActivity extends PodcastFragmentActivity { } */ - ButterKnife.bind(this); - - if (toolbar != null) { - setSupportActionBar(toolbar); + if (binding.toolbarLayout.toolbar != null) { + setSupportActionBar(binding.toolbarLayout.toolbar); } /* if (bottomAppBar != null) { @@ -200,7 +183,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - progressIndicator.setMax(mSectionsPagerAdapter.getCount()); + binding.progressIndicator.setMax(mSectionsPagerAdapter.getCount()); // Set up the ViewPager with the sections adapter. mViewPager = findViewById(R.id.pager); @@ -232,7 +215,12 @@ public class NewsDetailActivity extends PodcastFragmentActivity { updateActionBarIcons(); } - /** + @Override + protected PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout() { + return binding.slidingLayout; + } + + /** * Init fast action bar based on user settings. * Only show if user selected setting CB_SHOW_FAST_ACTIONS. Otherwise hide. * @@ -243,18 +231,18 @@ public class NewsDetailActivity extends PodcastFragmentActivity { if (mShowFastActions) { // Set click listener for buttons on action bar - fastActionOpenInBrowser.setOnClickListener(v -> this.openInBrowser(currentPosition)); - fastActionToggle.setOnClickListener(v -> this.toggleFastActionBar()); // toggle expand / collapse - fastActionStar.setOnClickListener(v -> NewsDetailActivity.this.toggleRssItemStarredState()); - fastActionRead.setOnClickListener(v -> NewsDetailActivity.this.markRead(currentPosition)); - fastActionShare.setOnClickListener(v -> this.share(currentPosition)); + binding.faDetailBar.faOpenInBrowser.setOnClickListener(v -> this.openInBrowser(currentPosition)); + binding.faDetailBar.faToggle.setOnClickListener(v -> this.toggleFastActionBar()); // toggle expand / collapse + binding.faDetailBar.faStar.setOnClickListener(v -> NewsDetailActivity.this.toggleRssItemStarredState()); + binding.faDetailBar.faMarkAsRead.setOnClickListener(v -> NewsDetailActivity.this.markRead(currentPosition)); + binding.faDetailBar.faShare.setOnClickListener(v -> this.share(currentPosition)); - fastActionDetailBar.setVisibility(View.VISIBLE); + binding.faDetailBar.getRoot().setVisibility(View.VISIBLE); // initially the bar should be opened in the expanded state this.toggleFastActionBar(); } else { - fastActionDetailBar.setVisibility(View.INVISIBLE); + binding.faDetailBar.getRoot().setVisibility(View.INVISIBLE); } } @@ -262,21 +250,21 @@ public class NewsDetailActivity extends PodcastFragmentActivity { * Expands or shrinks the fast action bar to show/hide secondary functions */ private void toggleFastActionBar() { - int currentState = fastActionCollapseLayout.getVisibility(); + int currentState = binding.faDetailBar.faCollapseLayout.getVisibility(); switch (currentState) { case View.GONE: - fastActionToggle.setImageResource(R.drawable.ic_fa_expand); - fastActionCollapseLayout.setVisibility(View.VISIBLE); + binding.faDetailBar.faToggle.setImageResource(R.drawable.ic_fa_expand); + binding.faDetailBar.faCollapseLayout.setVisibility(View.VISIBLE); break; case View.VISIBLE: - fastActionToggle.setImageResource(R.drawable.ic_fa_shrink); - fastActionCollapseLayout.setVisibility(View.GONE); + binding.faDetailBar.faToggle.setImageResource(R.drawable.ic_fa_shrink); + binding.faDetailBar.faCollapseLayout.setVisibility(View.GONE); break; default: break; } //((Animatable)fastActionToggle.getDrawable()).start(); - fastActionToggle.setScaleX(-1); + binding.faDetailBar.faToggle.setScaleX(-1); } private void toggleIncognitoMode() { @@ -369,7 +357,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { stopVideoOnCurrentPage(); currentPosition = position; resumeVideoPlayersOnCurrentPage(); - progressIndicator.setProgress(position + 1); + binding.progressIndicator.setProgress(position + 1); if(rssItems.get(position).getFeed() != null) { // Try getting the feed title and use it for the action bar title @@ -429,10 +417,10 @@ public class NewsDetailActivity extends PodcastFragmentActivity { if(menuItem_Starred != null) { if (isStarred) { menuItem_Starred.setIcon(R.drawable.ic_action_star_dark); - fastActionStar.setImageResource(R.drawable.ic_action_star_dark); + binding.faDetailBar.faStar.setImageResource(R.drawable.ic_action_star_dark); } else { menuItem_Starred.setIcon(R.drawable.ic_action_star_border_dark); - fastActionStar.setImageResource(R.drawable.ic_action_star_border_dark); + binding.faDetailBar.faStar.setImageResource(R.drawable.ic_action_star_border_dark); } } @@ -440,11 +428,11 @@ public class NewsDetailActivity extends PodcastFragmentActivity { if (isRead) { menuItem_Read.setIcon(R.drawable.ic_check_box_white); menuItem_Read.setChecked(true); - fastActionRead.setImageResource(R.drawable.ic_check_box_white); + binding.faDetailBar.faMarkAsRead.setImageResource(R.drawable.ic_check_box_white); } else { menuItem_Read.setIcon(R.drawable.ic_check_box_outline_blank_white); menuItem_Read.setChecked(false); - fastActionRead.setImageResource(R.drawable.ic_check_box_outline_blank_white); + binding.faDetailBar.faMarkAsRead.setImageResource(R.drawable.ic_check_box_outline_blank_white); } } } @@ -552,8 +540,8 @@ public class NewsDetailActivity extends PodcastFragmentActivity { NewsDetailFragment newsDetailFragment = getNewsDetailFragmentAtPosition(currentPosition); String link = "about:blank"; - if(newsDetailFragment != null && newsDetailFragment.mWebView != null) { - link = newsDetailFragment.mWebView.getUrl(); + if(newsDetailFragment != null && newsDetailFragment.binding.webview != null) { + link = newsDetailFragment.binding.webview.getUrl(); } if("about:blank".equals(link)) { @@ -578,9 +566,9 @@ public class NewsDetailActivity extends PodcastFragmentActivity { NewsDetailFragment fragment = getNewsDetailFragmentAtPosition(currentPosition); if(fragment != null) { // could be null if not instantiated yet - if(!fragment.mWebView.getUrl().equals("about:blank") && !fragment.mWebView.getUrl().trim().equals("")) { - content = fragment.mWebView.getUrl(); - title = fragment.mWebView.getTitle(); + if(!fragment.binding.webview.getUrl().equals("about:blank") && !fragment.binding.webview.getUrl().trim().equals("")) { + content = fragment.binding.webview.getUrl(); + title = fragment.binding.webview.getTitle(); } } @@ -667,7 +655,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { public void initIncognitoMode() { int color = getResources().getColor(isIncognitoEnabled() ? R.color.material_grey_900 : R.color.colorPrimary); - ThemeUtils.colorizeToolbar(toolbar, color); + ThemeUtils.colorizeToolbar(binding.toolbarLayout.toolbar, color); //ThemeUtils.colorizeToolbar(bottomAppBar, color); //ThemeUtils.changeStatusBarColor(this, color); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailFragment.java index 8b8090fb..2c2e1920 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailFragment.java @@ -38,8 +38,6 @@ import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.widget.ProgressBar; -import android.widget.TextView; import androidx.annotation.Nullable; import androidx.browser.customtabs.CustomTabsIntent; @@ -60,11 +58,10 @@ import java.util.Map; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.adapter.ProgressBarWebChromeClient; import de.luhmer.owncloudnewsreader.async_tasks.RssItemToHtmlTask; import de.luhmer.owncloudnewsreader.database.model.RssItem; +import de.luhmer.owncloudnewsreader.databinding.FragmentNewsDetailBinding; import de.luhmer.owncloudnewsreader.helper.AdBlocker; import de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper; import de.luhmer.owncloudnewsreader.helper.ColorHelper; @@ -77,10 +74,7 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li public final String TAG = getClass().getCanonicalName(); - protected @BindView(R.id.webview) WebView mWebView; - protected @BindView(R.id.progressBarLoading) ProgressBar mProgressBarLoading; - protected @BindView(R.id.progressbar_webview) ProgressBar mProgressbarWebView; - protected @BindView(R.id.tv_offline_version) TextView mTvOfflineVersion; + protected FragmentNewsDetailBinding binding; protected @Inject SharedPreferences mPrefs; @@ -109,7 +103,7 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li super.onResume(); resumeCurrentPage(); - registerForContextMenu(mWebView); + registerForContextMenu(binding.webview); } @Override @@ -121,23 +115,23 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li @Override public void onDestroy() { super.onDestroy(); - if(mWebView != null) { - mWebView.destroy(); + if(binding.webview != null) { + binding.webview.destroy(); } } public void pauseCurrentPage() { - if(mWebView != null) { - mWebView.onPause(); - mWebView.pauseTimers(); + if(binding.webview != null) { + binding.webview.onPause(); + binding.webview.pauseTimers(); } } public void resumeCurrentPage() { - if(mWebView != null) { - mWebView.onResume(); - mWebView.resumeTimers(); + if(binding.webview != null) { + binding.webview.onResume(); + binding.webview.resumeTimers(); } } @@ -157,47 +151,45 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li */ public void navigateBack() { if (isLastPageRssItem()) { - mWebView.clearHistory(); + binding.webview.clearHistory(); startLoadRssItemToWebViewTask(); } else if (!isCurrentPageRssItem()){ - mWebView.goBack(); + binding.webview.goBack(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_news_detail, container, false); + binding = FragmentNewsDetailBinding.inflate(inflater, container, false); section_number = (Integer) getArguments().get(ARG_SECTION_NUMBER); - ButterKnife.bind(this, rootView); - // Do not reload webview if retained if(savedInstanceState == null) { startLoadRssItemToWebViewTask(); } else { - mWebView.restoreState(savedInstanceState); - mProgressBarLoading.setVisibility(View.GONE); + binding.webview.restoreState(savedInstanceState); + binding.progressBarLoading.setVisibility(View.GONE); // Make sure to sync the incognitio on retained views syncIncognitoState(); - this.addBottomPaddingForFastActions(mWebView); + this.addBottomPaddingForFastActions(binding.webview); } // setUpGestureDetector(); - return rootView; + return binding.getRoot(); } protected void syncIncognitoState() { NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity()); boolean isIncognito = ndActivity.isIncognitoEnabled(); - mWebView.getSettings().setBlockNetworkLoads(isIncognito); - mWebView.getSettings().setBlockNetworkImage(isIncognito); + binding.webview.getSettings().setBlockNetworkLoads(isIncognito); + binding.webview.getSettings().setBlockNetworkImage(isIncognito); } @Override public void onSaveInstanceState(Bundle outState) { - mWebView.saveState(outState); + binding.webview.saveState(outState); } /** @@ -240,14 +232,14 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li protected void startLoadRssItemToWebViewTask() { Log.d(TAG, "startLoadRssItemToWebViewTask() called"); - mWebView.setVisibility(View.GONE); - mProgressBarLoading.setVisibility(View.VISIBLE); + binding.webview.setVisibility(View.GONE); + binding.progressBarLoading.setVisibility(View.VISIBLE); NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity()); assert ndActivity != null; int backgroundColor = ContextCompat.getColor(ndActivity, R.color.news_detail_background_color); - mWebView.setBackgroundColor(backgroundColor); + binding.webview.setBackgroundColor(backgroundColor); ndActivity.setBackgroundColorOfViewPager(backgroundColor); init_webView(); @@ -258,13 +250,13 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li @Override public void onRssItemParsed(String htmlPage) { - mWebView.setVisibility(View.VISIBLE); - mProgressBarLoading.setVisibility(View.GONE); + binding.webview.setVisibility(View.VISIBLE); + binding.progressBarLoading.setVisibility(View.GONE); - setSoftwareRenderModeForWebView(htmlPage, mWebView); + setSoftwareRenderModeForWebView(htmlPage, binding.webview); html = htmlPage; - mWebView.loadDataWithBaseURL("file:///android_asset/", htmlPage, "text/html", "UTF-8", RSS_ITEM_PAGE_URL); + binding.webview.loadDataWithBaseURL("file:///android_asset/", htmlPage, "text/html", "UTF-8", RSS_ITEM_PAGE_URL); } /** @@ -295,9 +287,9 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li private void init_webView() { int backgroundColor = ColorHelper.getColorFromAttribute(getContext(), R.attr.news_detail_background_color); - mWebView.setBackgroundColor(backgroundColor); + binding.webview.setBackgroundColor(backgroundColor); - WebSettings webSettings = mWebView.getSettings(); + WebSettings webSettings = binding.webview.getSettings(); //webSettings.setPluginState(WebSettings.PluginState.ON); webSettings.setJavaScriptEnabled(true); webSettings.setAllowContentAccess(true); @@ -311,9 +303,9 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li syncIncognitoState(); - mWebView.setWebChromeClient(new ProgressBarWebChromeClient(mProgressbarWebView)); + binding.webview.setWebChromeClient(new ProgressBarWebChromeClient(binding.progressbarWebview)); - mWebView.setWebViewClient(new WebViewClient() { + binding.webview.setWebViewClient(new WebViewClient() { private Map<String, Boolean> loadedUrls = new HashMap<>(); @@ -345,7 +337,7 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li }); /* - mWebView.setOnTouchListener((v, event) -> { + binding.webview.setOnTouchListener((v, event) -> { mGestureDetector.onTouchEvent(event); return false; }); @@ -387,10 +379,10 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li File webArchiveFile = DownloadWebPageService.getWebPageArchiveFileForUrl(getActivity(), url); if(webArchiveFile.exists()) { // Test if WebArchive exists for url - mTvOfflineVersion.setVisibility(View.VISIBLE); - mWebView.loadUrl("file://" + webArchiveFile.getAbsolutePath()); + binding.tvOfflineVersion.setVisibility(View.VISIBLE); + binding.webview.loadUrl("file://" + webArchiveFile.getAbsolutePath()); } else { - mTvOfflineVersion.setVisibility(View.GONE); + binding.tvOfflineVersion.setVisibility(View.GONE); switch (selectedBrowser) { case 0: // Custom Tabs CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder() @@ -406,7 +398,7 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li startActivity(browserIntent); break; case 2: // Built in - mWebView.loadUrl(url); + binding.webview.loadUrl(url); break; default: throw new IllegalStateException("Unknown selection!"); @@ -504,7 +496,7 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li * the original rss item page */ private boolean isLastPageRssItem() { - WebBackForwardList list = mWebView.copyBackForwardList(); + WebBackForwardList list = binding.webview.copyBackForwardList(); WebHistoryItem lastItem = list.getItemAtIndex(list.getCurrentIndex() - 1); return lastItem != null && lastItem.getUrl().equals(RSS_ITEM_PAGE_URL); } @@ -514,8 +506,8 @@ public class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Li * the original rss item page */ private boolean isCurrentPageRssItem() { - if(mWebView.copyBackForwardList().getCurrentItem() != null) { - String currentPageUrl = mWebView.copyBackForwardList().getCurrentItem().getOriginalUrl(); + if(binding.webview.copyBackForwardList().getCurrentItem() != null) { + String currentPageUrl = binding.webview.copyBackForwardList().getCurrentItem().getOriginalUrl(); return currentPageUrl.equals("data:text/html;charset=utf-8;base64,"); } return true; diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java index 4d31498b..26c1f033 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java @@ -44,7 +44,6 @@ import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; -import android.widget.ProgressBar; import android.widget.Toast; import androidx.core.content.ContextCompat; @@ -62,14 +61,13 @@ import java.util.List; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter; import de.luhmer.owncloudnewsreader.adapter.ViewHolder; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm.SORT_DIRECTION; import de.luhmer.owncloudnewsreader.database.model.RssItem; import de.luhmer.owncloudnewsreader.database.model.RssItemDao; +import de.luhmer.owncloudnewsreader.databinding.FragmentNewsreaderDetailBinding; import de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper; import de.luhmer.owncloudnewsreader.helper.PostDelayHandler; import de.luhmer.owncloudnewsreader.helper.Search; @@ -94,14 +92,7 @@ public class NewsReaderDetailFragment extends Fragment { protected final String TAG = getClass().getCanonicalName(); - @BindView(R.id.pb_loading) - ProgressBar pbLoading; - @BindView(R.id.tv_no_items_available) - View tvNoItemsAvailable; - @BindView(R.id.list) - RecyclerView recyclerView; - @BindView(R.id.swipeRefresh) - SwipeRefreshLayout swipeRefresh; + FragmentNewsreaderDetailBinding binding; private Long idFeed; private Drawable leftSwipeDrawable; @@ -152,7 +143,7 @@ public class NewsReaderDetailFragment extends Fragment { @Override public void onError(Throwable e) { - pbLoading.setVisibility(View.GONE); + binding.pbLoading.setVisibility(View.GONE); Toast.makeText(mActivity, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } @@ -233,7 +224,7 @@ public class NewsReaderDetailFragment extends Fragment { } protected void notifyDataSetChangedOnAdapter() { - NewsListRecyclerAdapter nca = (NewsListRecyclerAdapter) recyclerView.getAdapter(); + NewsListRecyclerAdapter nca = (NewsListRecyclerAdapter) binding.list.getAdapter(); if (nca != null) { nca.notifyDataSetChanged(); } @@ -244,14 +235,14 @@ public class NewsReaderDetailFragment extends Fragment { */ protected void refreshCurrentRssView() { Log.v(TAG, "refreshCurrentRssView"); - NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) recyclerView.getAdapter()); + NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) binding.list.getAdapter()); if (nra != null) { nra.refreshAdapterDataAsync(() -> { - pbLoading.setVisibility(View.GONE); + binding.pbLoading.setVisibility(View.GONE); if (layoutManagerSavedState != null) { - recyclerView.getLayoutManager().onRestoreInstanceState(layoutManagerSavedState); + binding.list.getLayoutManager().onRestoreInstanceState(layoutManagerSavedState); layoutManagerSavedState = null; } }); @@ -282,20 +273,20 @@ public class NewsReaderDetailFragment extends Fragment { } public RecyclerView getRecyclerView() { - return recyclerView; + return binding.list; } public LinearLayoutManager getLayoutManager() { - if (recyclerView == null) return null; - return (LinearLayoutManager) recyclerView.getLayoutManager(); + if (binding.list == null) return null; + return (LinearLayoutManager) binding.list.getLayoutManager(); } protected List<RssItem> performSearch(String searchString) { Handler mainHandler = new Handler(mActivity.getMainLooper()); Runnable myRunnable = () -> { - pbLoading.setVisibility(View.VISIBLE); - tvNoItemsAvailable.setVisibility(View.GONE); + binding.pbLoading.setVisibility(View.VISIBLE); + binding.tvNoItemsAvailable.setVisibility(View.GONE); }; mainHandler.post(myRunnable); @@ -305,21 +296,21 @@ public class NewsReaderDetailFragment extends Fragment { void loadRssItemsIntoView(List<RssItem> rssItems) { previousFirstVisibleItem = -1; try { - NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) recyclerView.getAdapter()); + NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) binding.list.getAdapter()); if (nra == null) { - nra = new NewsListRecyclerAdapter(mActivity, recyclerView, mActivity, mPostDelayHandler, mPrefs); - recyclerView.setAdapter(nra); + nra = new NewsListRecyclerAdapter(mActivity, binding.list, mActivity, mPostDelayHandler, mPrefs); + binding.list.setAdapter(nra); } nra.updateAdapterData(rssItems); - pbLoading.setVisibility(View.GONE); + binding.pbLoading.setVisibility(View.GONE); if (nra.getItemCount() <= 0) { - tvNoItemsAvailable.setVisibility(View.VISIBLE); + binding.tvNoItemsAvailable.setVisibility(View.VISIBLE); } else { - tvNoItemsAvailable.setVisibility(View.GONE); + binding.tvNoItemsAvailable.setVisibility(View.GONE); } - recyclerView.scrollToPosition(0); + binding.list.scrollToPosition(0); } catch (Exception ex) { ex.printStackTrace(); @@ -329,16 +320,14 @@ public class NewsReaderDetailFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_newsreader_detail, container, false); + binding = FragmentNewsreaderDetailBinding.inflate(inflater, container, false); - ButterKnife.bind(this, rootView); - - recyclerView.setHasFixedSize(true); - recyclerView.setLayoutManager(new LinearLayoutManager(mActivity, RecyclerView.VERTICAL, false)); - recyclerView.setItemAnimator(new DefaultItemAnimator()); + binding.list.setHasFixedSize(true); + binding.list.setLayoutManager(new LinearLayoutManager(mActivity, RecyclerView.VERTICAL, false)); + binding.list.setItemAnimator(new DefaultItemAnimator()); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new NewsReaderItemTouchHelperCallback()); - itemTouchHelper.attachToRecyclerView(recyclerView); + itemTouchHelper.attachToRecyclerView(binding.list); //recyclerView.addItemDecoration(new DividerItemDecoration(mActivity)); // Enable divider line /* @@ -351,10 +340,10 @@ public class NewsReaderDetailFragment extends Fragment { }); */ - swipeRefresh.setColorSchemeColors(accentColor); - swipeRefresh.setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) mActivity); + binding.swipeRefresh.setColorSchemeColors(accentColor); + binding.swipeRefresh.setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) mActivity); - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + binding.list.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (dy > 0) { //check for scroll down @@ -384,12 +373,12 @@ public class NewsReaderDetailFragment extends Fragment { } }; - return rootView; + return binding.getRoot(); } private void handleMarkAsReadScrollEvent() { - LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); - NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) recyclerView.getAdapter(); + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) binding.list.getLayoutManager(); + NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) binding.list.getAdapter(); int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(); int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); @@ -414,7 +403,7 @@ public class NewsReaderDetailFragment extends Fragment { for (int i = firstVisibleItem; i < firstVisibleItem + numberItemsAhead; i++) { //Log.v(TAG, "Mark item as read: " + i); - ViewHolder vh = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(i); + ViewHolder vh = (ViewHolder) binding.list.findViewHolderForLayoutPosition(i); if (vh != null && !vh.shouldStayUnread()) { adapter.changeReadStateOfItem(vh, true); } @@ -422,10 +411,10 @@ public class NewsReaderDetailFragment extends Fragment { //Check if Listview is scrolled to bottom if (reachedBottom && visibleItemCount != 0 && //Check if list is empty - recyclerView.getChildAt(visibleItemCount).getBottom() <= recyclerView.getHeight()) { + binding.list.getChildAt(visibleItemCount).getBottom() <= binding.list.getHeight()) { for (int i = firstVisibleItem; i <= lastVisibleItem; i++) { - RecyclerView.ViewHolder vhTemp = recyclerView.findViewHolderForLayoutPosition(i); + RecyclerView.ViewHolder vhTemp = binding.list.findViewHolderForLayoutPosition(i); if (vhTemp instanceof ViewHolder) { //Check for ViewHolder instance because of ProgressViewHolder ViewHolder vh = (ViewHolder) vhTemp; @@ -502,7 +491,7 @@ public class NewsReaderDetailFragment extends Fragment { } public int getFirstVisibleScrollPosition() { - LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager()); + LinearLayoutManager layoutManager = ((LinearLayoutManager) binding.list.getLayoutManager()); return layoutManager.findFirstVisibleItemPosition(); } @@ -510,8 +499,8 @@ public class NewsReaderDetailFragment extends Fragment { @Override protected void onPreExecute() { - pbLoading.setVisibility(View.VISIBLE); - tvNoItemsAvailable.setVisibility(View.GONE); + binding.pbLoading.setVisibility(View.VISIBLE); + binding.tvNoItemsAvailable.setVisibility(View.GONE); super.onPreExecute(); } @@ -562,10 +551,10 @@ public class NewsReaderDetailFragment extends Fragment { if (rssItem.size() < 10) { // Less than 10 items in the list (usually 3-5 items fit on one screen) // There is no API to check, if this listener has already been added. We don't want to // add it multiple times, so we take the safe route here by removing it before adding it. - recyclerView.removeOnItemTouchListener(itemTouchListener); - recyclerView.addOnItemTouchListener(itemTouchListener); + binding.list.removeOnItemTouchListener(itemTouchListener); + binding.list.addOnItemTouchListener(itemTouchListener); } else { - recyclerView.removeOnItemTouchListener(itemTouchListener); + binding.list.removeOnItemTouchListener(itemTouchListener); } } } @@ -618,7 +607,7 @@ public class NewsReaderDetailFragment extends Fragment { @Override public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int direction) { - final NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) recyclerView.getAdapter(); + final NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) binding.list.getAdapter(); String swipeAction; if (direction == ItemTouchHelper.LEFT) @@ -643,14 +632,14 @@ public class NewsReaderDetailFragment extends Fragment { break; } // Hack to reset view, see https://code.google.com/p/android/issues/detail?id=175798 - recyclerView.removeView(viewHolder.itemView); + binding.list.removeView(viewHolder.itemView); } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); - // swipeRefresh cancels swiping left/right when accidentally moving in the y direction; - swipeRefresh.setEnabled(!isCurrentlyActive); + // binding.swipeRefresh cancels swiping left/right when accidentally moving in the y direction; + binding.swipeRefresh.setEnabled(!isCurrentlyActive); if (isCurrentlyActive) { Rect viewRect = new Rect(); viewHolder.itemView.getDrawingRect(viewRect); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java index 3f7a2b19..7d6feae7 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java @@ -44,17 +44,14 @@ import android.widget.SearchView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.view.GravityCompat; import androidx.customview.widget.ViewDragHelper; -import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -89,8 +86,6 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Named; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; import de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter; import de.luhmer.owncloudnewsreader.adapter.RecyclerItemClickListener; @@ -99,6 +94,7 @@ import de.luhmer.owncloudnewsreader.authentication.AccountGeneral; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.Feed; import de.luhmer.owncloudnewsreader.database.model.RssItem; +import de.luhmer.owncloudnewsreader.databinding.ActivityNewsreaderBinding; import de.luhmer.owncloudnewsreader.events.podcast.FeedPanelSlideEvent; import de.luhmer.owncloudnewsreader.helper.DatabaseUtils; import de.luhmer.owncloudnewsreader.helper.ThemeChooser; @@ -111,6 +107,7 @@ import de.luhmer.owncloudnewsreader.services.events.SyncFailedEvent; import de.luhmer.owncloudnewsreader.services.events.SyncFinishedEvent; import de.luhmer.owncloudnewsreader.services.events.SyncStartedEvent; import de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient; +import de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout; import io.reactivex.Completable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Action; @@ -147,12 +144,10 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements private static MenuItem menuItemDownloadMoreItems; - protected @BindView(R.id.toolbar) Toolbar toolbar; + protected ActivityNewsreaderBinding binding; //private ServiceConnection mConnection = null; - @VisibleForTesting @Nullable @BindView(R.id.drawer_layout) public DrawerLayout drawerLayout; - private ActionBarDrawerToggle drawerToggle; private SearchView mSearchView; private String mSearchString; @@ -183,13 +178,13 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements PreferenceManager.setDefaultValues(this, sharedPreferencesFileName, Context.MODE_PRIVATE, R.xml.pref_notification, true); } - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_newsreader); + super.onCreate(savedInstanceState); - ButterKnife.bind(this); + binding = ActivityNewsreaderBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - if (toolbar != null) { - setSupportActionBar(toolbar); + if (binding.toolbarLayout.toolbar != null) { + setSupportActionBar(binding.toolbarLayout.toolbar); } initAccountManager(); @@ -212,8 +207,8 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements .replace(R.id.left_drawer, newsReaderListFragment) .commit(); - if (drawerLayout != null) { - drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.news_list_drawer_text, R.string.news_list_drawer_text) { + if (binding.drawerLayout != null) { + drawerToggle = new ActionBarDrawerToggle(this, binding.drawerLayout, binding.toolbarLayout.toolbar, R.string.news_list_drawer_text, R.string.news_list_drawer_text) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); @@ -233,11 +228,11 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements } }; - drawerLayout.addDrawerListener(drawerToggle); + binding.drawerLayout.addDrawerListener(drawerToggle); adjustEdgeSizeOfDrawer(); } - setSupportActionBar(toolbar); + setSupportActionBar(binding.toolbarLayout.toolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); if (drawerToggle != null) { drawerToggle.syncState(); @@ -332,7 +327,7 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements savedInstanceState.containsKey(IS_FOLDER_BOOLEAN) && savedInstanceState.containsKey(OPTIONAL_FOLDER_ID)) { - NewsListRecyclerAdapter adapter = new NewsListRecyclerAdapter(this, getNewsReaderDetailFragment().recyclerView, this, mPostDelayHandler, mPrefs); + NewsListRecyclerAdapter adapter = new NewsListRecyclerAdapter(this, getNewsReaderDetailFragment().binding.list, this, mPostDelayHandler, mPrefs); adapter.setTotalItemCount(savedInstanceState.getInt(LIST_ADAPTER_TOTAL_COUNT)); adapter.setCachedPages(savedInstanceState.getInt(LIST_ADAPTER_PAGE_COUNT)); @@ -358,9 +353,9 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements try { // increase the size of the drag margin to prevent starting a star swipe when // trying to open the drawer. - Field mDragger = drawerLayout.getClass().getDeclaredField("mLeftDragger"); + Field mDragger = binding.drawerLayout.getClass().getDeclaredField("mLeftDragger"); mDragger.setAccessible(true); - ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(drawerLayout); + ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(binding.drawerLayout); Field mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize"); mEdgeSize.setAccessible(true); int edge = mEdgeSize.getInt(draggerObj); @@ -372,9 +367,9 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements public int getEdgeSizeOfDrawer() { try { - Field mDragger = drawerLayout.getClass().getDeclaredField("mLeftDragger"); + Field mDragger = binding.drawerLayout.getClass().getDeclaredField("mLeftDragger"); mDragger.setAccessible(true); - ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(drawerLayout); + ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(binding.drawerLayout); Field mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize"); mEdgeSize.setAccessible(true); return mEdgeSize.getInt(draggerObj); @@ -501,9 +496,9 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements config.setDelay(300); // half second between each showcase view MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(this, "SWIPE_LEFT_RIGHT_AND_PTR"); sequence.setConfig(config); - sequence.addSequenceItem(getNewsReaderDetailFragment().pbLoading, + sequence.addSequenceItem(getNewsReaderDetailFragment().binding.pbLoading, "Pull-to-Refresh to sync with server", "GOT IT", true); - sequence.addSequenceItem(getNewsReaderDetailFragment().pbLoading, + sequence.addSequenceItem(getNewsReaderDetailFragment().binding.pbLoading, "Swipe Left/Right to mark article as read", "GOT IT", true); sequence.start(); @@ -551,6 +546,11 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements } @Override + protected PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout() { + return binding.slidingLayout; + } + + @Override public void onRefresh() { startSync(); } @@ -574,16 +574,16 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements */ @Override public void onTopItemClicked(long idFeed, boolean isFolder, Long optional_folder_id) { - if (drawerLayout != null) - drawerLayout.closeDrawer(GravityCompat.START); + if (binding.drawerLayout != null) + binding.drawerLayout.closeDrawer(GravityCompat.START); updateDetailFragment(idFeed, isFolder, optional_folder_id, true); } @Override public void onChildItemClicked(long idFeed, Long optional_folder_id) { - if (drawerLayout != null) - drawerLayout.closeDrawer(GravityCompat.START); + if (binding.drawerLayout != null) + binding.drawerLayout.closeDrawer(GravityCompat.START); updateDetailFragment(idFeed, false, optional_folder_id, true); } @@ -704,7 +704,7 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements if(newsReaderListFragment != null && newsReaderDetailFragment != null) { boolean isSyncRunning = OwnCloudSyncService.isSyncRunning(); newsReaderListFragment.setRefreshing(isSyncRunning); - newsReaderDetailFragment.swipeRefresh.setRefreshing(isSyncRunning); + newsReaderDetailFragment.binding.swipeRefresh.setRefreshing(isSyncRunning); } } @@ -771,11 +771,11 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements @Override public void onBackPressed() { if(!handlePodcastBackPressed()) { - if (drawerLayout != null) { - if (drawerLayout.isDrawerOpen(GravityCompat.START)) + if (binding.drawerLayout != null) { + if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) super.onBackPressed(); else - drawerLayout.openDrawer(GravityCompat.START); + binding.drawerLayout.openDrawer(GravityCompat.START); } else { super.onBackPressed(); } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListDialogFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListDialogFragment.java index 7d384616..62c71275 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListDialogFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListDialogFragment.java @@ -12,12 +12,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.RelativeLayout; -import android.widget.TextView; import android.widget.Toast; import androidx.fragment.app.DialogFragment; @@ -29,11 +23,10 @@ import java.util.Map; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.Feed; import de.luhmer.owncloudnewsreader.database.model.Folder; +import de.luhmer.owncloudnewsreader.databinding.FragmentDialogFeedoptionsBinding; import de.luhmer.owncloudnewsreader.di.ApiProvider; import de.luhmer.owncloudnewsreader.helper.FavIconHandler; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -55,26 +48,7 @@ public class NewsReaderListDialogFragment extends DialogFragment { private LinkedHashMap<String, MenuAction> mMenuItems; private NewsReaderListActivity parentActivity; - protected @BindView(R.id.lv_menu_list) ListView mListView; - protected @BindView(R.id.folder_list) ListView mFolderList; - - protected @BindView(R.id.tv_menu_title) TextView tvTitle; - protected @BindView(R.id.tv_menu_text) TextView tvText; - - protected @BindView(R.id.ic_menu_feedicon) ImageView imgTitle; - - protected @BindView(R.id.remove_feed_dialog) RelativeLayout mRemoveFeedDialogView; - protected @BindView(R.id.rename_feed_dialog) RelativeLayout mRenameFeedDialogView; - protected @BindView(R.id.move_feed_dialog) RelativeLayout mMoveFeedDialogView; - - protected @BindView(R.id.progressView) RelativeLayout mProgressView; - - protected @BindView(R.id.button_remove_confirm) Button mButtonRemoveConfirm; - protected @BindView(R.id.button_remove_cancel) Button mButtonRemoveCancel; - protected @BindView(R.id.button_rename_confirm) Button mButtonRenameConfirm; - protected @BindView(R.id.button_rename_cancel) Button mButtonRenameCancel; - - protected @BindView(R.id.renamefeed_feedname) EditText mFeedName; + protected FragmentDialogFeedoptionsBinding binding; static NewsReaderListDialogFragment newInstance(long feedId, String dialogTitle, String iconurl, String feedurl) { @@ -131,17 +105,15 @@ public class NewsReaderListDialogFragment extends DialogFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_dialog_feedoptions, container, false); - - ButterKnife.bind(this, v); + binding = FragmentDialogFeedoptionsBinding.inflate(inflater, container, false); FavIconHandler favIconHandler = new FavIconHandler(getContext()); - favIconHandler.loadFavIconForFeed(mDialogIconUrl, imgTitle); + favIconHandler.loadFavIconForFeed(mDialogIconUrl, binding.icMenuFeedicon); - tvTitle.setText(mDialogTitle); - tvText.setText(mDialogText); + binding.tvMenuTitle.setText(mDialogTitle); + binding.tvMenuText.setText(mDialogText); - tvText.setOnClickListener(new View.OnClickListener() { + binding.tvMenuText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mDialogText != null) { @@ -159,9 +131,9 @@ public class NewsReaderListDialogFragment extends DialogFragment { R.layout.fragment_dialog_listviewitem, menuItemsList); - mListView.setAdapter(arrayAdapter); + binding.lvMenuList.setAdapter(arrayAdapter); - mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + binding.lvMenuList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { String key = arrayAdapter.getItem(i); @@ -169,7 +141,7 @@ public class NewsReaderListDialogFragment extends DialogFragment { mAction.execute(); } }); - return v; + return binding.getRoot(); } @@ -182,24 +154,24 @@ public class NewsReaderListDialogFragment extends DialogFragment { public void showProgress(final boolean show) { int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); - mRenameFeedDialogView.setVisibility(show ? View.GONE : View.VISIBLE); - mRemoveFeedDialogView.setVisibility(show ? View.GONE : View.VISIBLE); + binding.renameFeedDialog.setVisibility(show ? View.GONE : View.VISIBLE); + binding.removeFeedDialog.setVisibility(show ? View.GONE : View.VISIBLE); - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mProgressView.animate().setDuration(shortAnimTime).alpha( + binding.progressView.setVisibility(show ? View.VISIBLE : View.GONE); + binding.progressView.animate().setDuration(shortAnimTime).alpha( show ? 1 : 0).setListener(new AnimatorListenerAdapter() { }); } private void showRenameFeedView(final long feedId, final String feedName) { - mFeedName.setText(feedName); - mButtonRenameConfirm.setEnabled(false); + binding.renamefeedFeedname.setText(feedName); + binding.buttonRenameConfirm.setEnabled(false); - mListView.setVisibility(View.GONE); - mRenameFeedDialogView.setVisibility(View.VISIBLE); + binding.lvMenuList.setVisibility(View.GONE); + binding.renameFeedDialog.setVisibility(View.VISIBLE); - mFeedName.addTextChangedListener(new TextWatcher() { + binding.renamefeedFeedname.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) {} @@ -211,20 +183,20 @@ public class NewsReaderListDialogFragment extends DialogFragment { public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().equals(feedName) || s.length() == 0) { - mButtonRenameConfirm.setEnabled(false); + binding.buttonRenameConfirm.setEnabled(false); } else { - mButtonRenameConfirm.setEnabled(true); + binding.buttonRenameConfirm.setEnabled(true); } } }); - mButtonRenameCancel.setOnClickListener(new View.OnClickListener() { + binding.buttonRenameCancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dismiss(); } }); - mButtonRenameConfirm.setOnClickListener(new View.OnClickListener() { + binding.buttonRenameConfirm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showProgress(true); setCancelable(false); @@ -232,7 +204,7 @@ public class NewsReaderListDialogFragment extends DialogFragment { Map<String, String> paramMap = new LinkedHashMap<>(); - paramMap.put("feedTitle", mFeedName.getText().toString()); + paramMap.put("feedTitle", binding.renamefeedFeedname.getText().toString()); mApi.getNewsAPI().renameFeed(feedId, paramMap) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) @@ -240,7 +212,7 @@ public class NewsReaderListDialogFragment extends DialogFragment { @Override public void run() throws Exception { DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext()); - dbConn.renameFeedById(mFeedId, mFeedName.getText().toString()); + dbConn.renameFeedById(mFeedId, binding.renamefeedFeedname.getText().toString()); parentActivity.getSlidingListFragment().reloadAdapter(); parentActivity.startSync(); @@ -260,16 +232,16 @@ public class NewsReaderListDialogFragment extends DialogFragment { private void showRemoveFeedView(final long feedId) { - mListView.setVisibility(View.GONE); - mRemoveFeedDialogView.setVisibility(View.VISIBLE); + binding.lvMenuList.setVisibility(View.GONE); + binding.removeFeedDialog.setVisibility(View.VISIBLE); - mButtonRemoveCancel.setOnClickListener(new View.OnClickListener() { + binding.buttonRemoveCancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dismiss(); } }); - mButtonRemoveConfirm.setOnClickListener(new View.OnClickListener() { + binding.buttonRemoveConfirm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showProgress(true); setCancelable(false); @@ -311,10 +283,10 @@ public class NewsReaderListDialogFragment extends DialogFragment { * @param mFeedId Feed to move */ private void showMoveFeedView(final long mFeedId) { - mListView.setVisibility(View.GONE); - mMoveFeedDialogView.setVisibility(View.VISIBLE); + binding.lvMenuList.setVisibility(View.GONE); + binding.moveFeedDialog.setVisibility(View.VISIBLE); - tvText.setText(getString(R.string.feed_move_list_description)); + binding.tvMenuText.setText(getString(R.string.feed_move_list_description)); DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext()); final List<Folder> folders = dbConn.getListOfFolders(); @@ -326,8 +298,8 @@ public class NewsReaderListDialogFragment extends DialogFragment { } ArrayAdapter<String> folderAdapter = new ArrayAdapter<> (getActivity(), R.layout.dialog_list_folder, android.R.id.text1, folderNames); - mFolderList.setAdapter(folderAdapter); - mFolderList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + binding.folderList.setAdapter(folderAdapter); + binding.folderList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Folder folder = folders.get(position); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java index dd11c4bf..13733a71 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java @@ -55,10 +55,9 @@ import java.io.Serializable; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; +import de.luhmer.owncloudnewsreader.databinding.FragmentNewsreaderListBinding; import de.luhmer.owncloudnewsreader.di.ApiProvider; import de.luhmer.owncloudnewsreader.interfaces.ExpListTextClicked; import de.luhmer.owncloudnewsreader.model.AbstractItem; @@ -90,12 +89,13 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM private SubscriptionExpandableListAdapter lvAdapter; - @BindView(R.id.expandableListView) protected ExpandableListView eListView; - @BindView(R.id.urlTextView) protected TextView urlTextView; - @BindView(R.id.userTextView) protected TextView userTextView; - @BindView(R.id.header_view) protected ViewGroup headerView; - @BindView(R.id.header_logo) protected ImageView headerLogo; - @BindView(R.id.header_logo_progress) protected View headerLogoProgress; + protected FragmentNewsreaderListBinding binding; +// @BindView(R.id.expandableListView) protected ExpandableListView eListView; +// @BindView(R.id.urlTextView) protected TextView urlTextView; +// @BindView(R.id.userTextView) protected TextView userTextView; +// @BindView(R.id.header_view) protected ViewGroup headerView; +// @BindView(R.id.header_logo) protected ImageView headerLogo; +// @BindView(R.id.header_logo_progress) protected View headerLogoProgress; /** * The fragment's current callback object, which is notified of list item @@ -118,12 +118,12 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM public void setRefreshing(boolean isRefreshing) { if(isRefreshing) { //headerLogo.setImageResource(R.drawable.ic_launcher_background); - headerLogo.setVisibility(View.INVISIBLE); - headerLogoProgress.setVisibility(View.VISIBLE); + binding.headerLogo.setVisibility(View.INVISIBLE); + binding.headerLogoProgress.setVisibility(View.VISIBLE); } else { //headerLogo.setImageResource(R.drawable.ic_launcher); - headerLogo.setVisibility(View.VISIBLE); - headerLogoProgress.setVisibility(View.INVISIBLE); + binding.headerLogo.setVisibility(View.VISIBLE); + binding.headerLogoProgress.setVisibility(View.INVISIBLE); } } @@ -158,25 +158,23 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_newsreader_list, container, false); - - ButterKnife.bind(this, view); + binding = FragmentNewsreaderListBinding.inflate(requireActivity().getLayoutInflater(), container, false); loadOwncloudOrNextcloudBanner(); - lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), new DatabaseConnectionOrm(getActivity()), eListView, mPrefs); + lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), new DatabaseConnectionOrm(getActivity()), binding.expandableListView, mPrefs); lvAdapter.setHandlerListener(expListTextClickedListener); - eListView.setGroupIndicator(null); + binding.expandableListView.setGroupIndicator(null); - eListView.setOnChildClickListener(onChildClickListener); - eListView.setOnItemLongClickListener(onItemLongClickListener); + binding.expandableListView.setOnChildClickListener(onChildClickListener); + binding.expandableListView.setOnItemLongClickListener(onItemLongClickListener); - eListView.setClickable(true); - eListView.setLongClickable(true); - eListView.setAdapter(lvAdapter); + binding.expandableListView.setClickable(true); + binding.expandableListView.setLongClickable(true); + binding.expandableListView.setAdapter(lvAdapter); - headerView.setOnClickListener(new View.OnClickListener() { + binding.headerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((NewsReaderListActivity) getActivity()).startSync(); @@ -186,9 +184,9 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM lvAdapter.notifyDataSetChanged(); reloadAdapter(); - bindNavigationMenu(view, inflater); + bindNavigationMenu(binding.getRoot(), inflater); - return view; + return binding.getRoot(); } @Override @@ -214,7 +212,7 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM protected void loadOwncloudOrNextcloudBanner() { if(!Constants.isNextCloud(mPrefs)) { // Set ownCloud view - headerView.setBackgroundResource(R.drawable.left_drawer_header_background); + binding.headerView.setBackgroundResource(R.drawable.left_drawer_header_background); } } @@ -321,13 +319,13 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM public ExpandableListView getListView() { - return eListView; + return binding.expandableListView; } protected void showTapLogoToSyncShowcaseView() { new MaterialShowcaseView.Builder(getActivity()) - .setTarget(headerLogo) + .setTarget(binding.headerLogo) .setDismissText("GOT IT") .setContentText("Tap this logo to sync with server") .setDelay(300) // optional but starting animations immediately in onCreate can make them choppy @@ -392,8 +390,8 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM String mOc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null); String mOc_root_path_without_protocol = mOc_root_path.replace("http://", "").replace("https://", ""); //Remove http:// or https:// - userTextView.setText(mUsername); - urlTextView.setText(mOc_root_path_without_protocol); + binding.userTextView.setText(mUsername); + binding.urlTextView.setText(mOc_root_path_without_protocol); String uInfo = mPrefs.getString(USER_INFO_STRING, null); if(uInfo == null) { @@ -403,7 +401,7 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM try { OcsUser userInfo = (OcsUser) fromString(uInfo); if (userInfo.getDisplayName() != null) - userTextView.setText(userInfo.getDisplayName()); + binding.userTextView.setText(userInfo.getDisplayName()); final int placeHolder = R.mipmap.ic_launcher; DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder() .displayer(new CircleBitmapDisplayer()) @@ -416,7 +414,7 @@ public class NewsReaderListFragment extends Fragment implements OnCreateContextM if(userInfo.getId() != null) { String avatarUrl = mOc_root_path + "/index.php/avatar/" + Uri.encode(userInfo.getId()) + "/64"; - ImageLoader.getInstance().displayImage(avatarUrl, this.headerLogo, displayImageOptions); + ImageLoader.getInstance().displayImage(avatarUrl, binding.headerLogo, displayImageOptions); } } catch (Exception ex) { ex.printStackTrace(); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java index b91185d6..037d1882 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java @@ -24,17 +24,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.NumberPicker; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.SeekBar; -import android.widget.TextView; -import android.widget.ViewSwitcher; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; @@ -49,11 +40,9 @@ import java.util.Arrays; import java.util.Locale; import androidx.fragment.app.Fragment; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import de.luhmer.owncloudnewsreader.ListView.PodcastArrayAdapter; import de.luhmer.owncloudnewsreader.ListView.PodcastFeedArrayAdapter; +import de.luhmer.owncloudnewsreader.databinding.FragmentPodcastBinding; import de.luhmer.owncloudnewsreader.events.podcast.CollapsePodcastView; import de.luhmer.owncloudnewsreader.events.podcast.ExpandPodcastView; import de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast; @@ -90,33 +79,7 @@ public class PodcastFragment extends Fragment { private long currentPositionInMillis = 0; private long maxPositionInMillis = 100000; - protected @BindView(R.id.btn_playPausePodcast) ImageButton btnPlayPausePodcast; - protected @BindView(R.id.btn_playPausePodcastSlider) ImageButton btnPlayPausePodcastSlider; - protected @BindView(R.id.btn_nextPodcastSlider) ImageButton btnNextPodcastSlider; - protected @BindView(R.id.btn_previousPodcastSlider) ImageButton btnPreviousPodcastSlider; - protected @BindView(R.id.btn_podcastSpeed) ImageButton btnPlaybackSpeed; - - protected @BindView(R.id.img_feed_favicon) ImageView imgFavIcon; - - protected @BindView(R.id.tv_title) TextView tvTitle; - protected @BindView(R.id.tv_titleSlider) TextView tvTitleSlider; - - protected @BindView(R.id.tv_from) TextView tvFrom; - protected @BindView(R.id.tv_to) TextView tvTo; - protected @BindView(R.id.tv_fromSlider) TextView tvFromSlider; - protected @BindView(R.id.tv_ToSlider) TextView tvToSlider; - - protected @BindView(R.id.sb_progress) SeekBar sb_progress; - protected @BindView(R.id.pb_progress) ProgressBar pb_progress; - protected @BindView(R.id.pb_progress2) ProgressBar pb_progress2; - - protected @BindView(R.id.podcastFeedList) ListView /* CardGridView CardListView*/ podcastFeedList; - protected @BindView(R.id.rlPodcast) RelativeLayout rlPodcast; - protected @BindView(R.id.ll_podcast_header) LinearLayout rlPodcastHeader; - protected @BindView(R.id.fl_playPausePodcastWrapper) FrameLayout playPausePodcastWrapper; - protected @BindView(R.id.podcastTitleGrid) ListView /*CardGridView*/ podcastTitleGrid; - - protected @BindView(R.id.viewSwitcherProgress) ViewSwitcher /*CardGridView*/ viewSwitcherProgress; + protected FragmentPodcastBinding binding; /** * Use this factory method to create a new instance of @@ -206,9 +169,9 @@ public class PodcastFragment extends Fragment { @Subscribe public void onEvent(PodcastDownloadService.DownloadProgressUpdate downloadProgress) { - PodcastArrayAdapter podcastArrayAdapter = (PodcastArrayAdapter) podcastTitleGrid.getAdapter(); + PodcastArrayAdapter podcastArrayAdapter = (PodcastArrayAdapter) binding.podcastTitleGrid.getAdapter(); - for(int i = 0; i < podcastTitleGrid.getCount(); i++) { + for(int i = 0; i < binding.podcastTitleGrid.getCount(); i++) { if(podcastArrayAdapter.getItem(i).link.equals(downloadProgress.podcast.link)) { if(!podcastArrayAdapter.getItem(i).downloadProgress.equals(downloadProgress.podcast.downloadProgress)) { //If Progress changed @@ -220,7 +183,7 @@ public class PodcastFragment extends Fragment { pItem.offlineCached = file.exists(); } else pItem.downloadProgress = downloadProgress.podcast.downloadProgress; - podcastTitleGrid.invalidateViews(); + binding.podcastTitleGrid.invalidateViews(); } return; @@ -228,29 +191,24 @@ public class PodcastFragment extends Fragment { } } - @OnClick(R.id.fl_playPausePodcastWrapper) protected void playPause() { eventBus.post(new TogglePlayerStateEvent()); } - @OnClick(R.id.btn_playPausePodcastSlider) protected void playPauseSlider() { playPause(); } - @OnClick(R.id.btn_nextPodcastSlider) protected void windForward() { eventBus.post(new WindPodcast(30000)); //Toast.makeText(getActivity(), "This feature is not supported yet :(", Toast.LENGTH_SHORT).show(); } - @OnClick(R.id.btn_previousPodcastSlider) protected void windBack() { eventBus.post(new WindPodcast(-10000)); } - @OnClick(R.id.btn_podcastSpeed) protected void openSpeedMenu() { showPlaybackSpeedPicker(); } @@ -263,18 +221,23 @@ public class PodcastFragment extends Fragment { //LayoutInflater localInflater = inflater.cloneInContext(context); // inflate using the cloned inflater, not the passed in default //View view = localInflater.inflate(R.layout.fragment_podcast, container, false); - View view = inflater.inflate(R.layout.fragment_podcast, container, false); + binding = FragmentPodcastBinding.inflate(inflater, container, false); + + binding.flPlayPausePodcastWrapper.setOnClickListener((v) -> playPause()); + binding.btnPlayPausePodcastSlider.setOnClickListener((v) -> playPauseSlider()); + binding.btnNextPodcastSlider.setOnClickListener((v) -> windForward()); + binding.btnPreviousPodcastSlider.setOnClickListener((v) -> windBack()); + binding.btnPodcastSpeed.setOnClickListener((v) -> openSpeedMenu()); //View view = inflater.inflate(R.layout.fragment_podcast, container, false); - ButterKnife.bind(this, view); if(getActivity() instanceof PodcastFragmentActivity) { sliding_layout = ((PodcastFragmentActivity) getActivity()).getSlidingLayout(); } if(sliding_layout != null) { - sliding_layout.setSlideableView(rlPodcast); - sliding_layout.setDragView(rlPodcastHeader); + sliding_layout.setSlideableView(binding.rlPodcast); + sliding_layout.setDragView(binding.llPodcastHeader); //sliding_layout.setEnableDragViewTouchEvents(true); sliding_layout.setPanelSlideListener(onPanelSlideListener); @@ -283,15 +246,15 @@ public class PodcastFragment extends Fragment { PodcastFeedArrayAdapter mArrayAdapter = new PodcastFeedArrayAdapter(getActivity(), new PodcastFeedItem[0]); if(mArrayAdapter.getCount() > 0) { - view.findViewById(R.id.tv_no_podcasts_available).setVisibility(View.GONE); + binding.tvNoPodcastsAvailable.setVisibility(View.GONE); } - podcastTitleGrid.setVisibility(View.GONE); - podcastFeedList.setVisibility(View.VISIBLE); + binding.podcastTitleGrid.setVisibility(View.GONE); + binding.podcastFeedList.setVisibility(View.VISIBLE); - sb_progress.setOnSeekBarChangeListener(onSeekBarChangeListener); + binding.sbProgress.setOnSeekBarChangeListener(onSeekBarChangeListener); - return view; + return binding.getRoot(); } @@ -303,15 +266,15 @@ public class PodcastFragment extends Fragment { @Override public void onPanelCollapsed(View view) { if(sliding_layout != null) - sliding_layout.setDragView(rlPodcastHeader); - viewSwitcherProgress.setDisplayedChild(0); + sliding_layout.setDragView(binding.llPodcastHeader); + binding.viewSwitcherProgress.setDisplayedChild(0); } @Override public void onPanelExpanded(View view) { if(sliding_layout != null) - sliding_layout.setDragView(viewSwitcherProgress); - viewSwitcherProgress.setDisplayedChild(1); + sliding_layout.setDragView(binding.viewSwitcherProgress); + binding.viewSwitcherProgress.setDisplayedChild(1); } @Override public void onPanelAnchored(View view) { } @@ -409,19 +372,19 @@ public class PodcastFragment extends Fragment { } private MediaControllerCompat.Callback controllerCallback = - new MediaControllerCompat.Callback() { - @Override - public void onMetadataChanged(MediaMetadataCompat metadata) { - Log.v(TAG, "onMetadataChanged() called with: metadata = [" + metadata + "]"); - displayMetadata(metadata); - } + new MediaControllerCompat.Callback() { + @Override + public void onMetadataChanged(MediaMetadataCompat metadata) { + Log.v(TAG, "onMetadataChanged() called with: metadata = [" + metadata + "]"); + displayMetadata(metadata); + } - @Override - public void onPlaybackStateChanged(PlaybackStateCompat stateCompat) { - Log.v(TAG, "onPlaybackStateChanged() called with: state = [" + stateCompat + "]"); - displayPlaybackState(stateCompat); - } - }; + @Override + public void onPlaybackStateChanged(PlaybackStateCompat stateCompat) { + Log.v(TAG, "onPlaybackStateChanged() called with: state = [" + stateCompat + "]"); + displayPlaybackState(stateCompat); + } + }; private void displayMetadata(MediaMetadataCompat metadata) { @@ -430,8 +393,8 @@ public class PodcastFragment extends Fragment { if(author != null) { title += " - " + author; } - tvTitle.setText(title); - tvTitleSlider.setText(title); + binding.tvTitle.setText(title); + binding.tvTitleSlider.setText(title); String favIconUrl = metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI); if(favIconUrl != null) { @@ -441,7 +404,7 @@ public class PodcastFragment extends Fragment { showImageForEmptyUri(R.drawable.default_feed_icon_light). showImageOnFail(R.drawable.default_feed_icon_light). build(); - ImageLoader.getInstance().displayImage(favIconUrl, imgFavIcon, displayImageOptions); + ImageLoader.getInstance().displayImage(favIconUrl, binding.imgFeedFavicon, displayImageOptions); } PlaybackService.VideoType mediaType = PlaybackService.VideoType.valueOf(metadata.getString(CURRENT_PODCAST_MEDIA_TYPE)); @@ -482,9 +445,9 @@ public class PodcastFragment extends Fragment { // If attached to context.. if(mActivity != null) { - btnPlayPausePodcast.setImageResource(drawableId); - btnPlayPausePodcast.setContentDescription(getString(contentDescriptionId)); - btnPlayPausePodcastSlider.setImageResource(drawableId); + binding.btnPlayPausePodcast.setImageResource(drawableId); + binding.btnPlayPausePodcast.setContentDescription(getString(contentDescriptionId)); + binding.btnPlayPausePodcastSlider.setImageResource(drawableId); } currentPositionInMillis = stateCompat.getPosition(); @@ -497,32 +460,32 @@ public class PodcastFragment extends Fragment { int minutes = (int)(currentPositionInMillis % (1000*60*60)) / (1000*60); int seconds = (int) ((currentPositionInMillis % (1000*60*60)) % (1000*60) / 1000); minutes += hours * 60; - tvFrom.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); - tvFromSlider.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); + binding.tvFrom.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); + binding.tvFromSlider.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); hours = (int)(maxPositionInMillis / (1000*60*60)); minutes = (int)(maxPositionInMillis % (1000*60*60)) / (1000*60); seconds = (int) ((maxPositionInMillis % (1000*60*60)) % (1000*60) / 1000); minutes += hours * 60; - tvTo.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); - tvToSlider.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); + binding.tvTo.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); + binding.tvToSlider.setText(String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)); if(state == PlaybackStateCompat.STATE_CONNECTING) { - sb_progress.setVisibility(View.INVISIBLE); - pb_progress2.setVisibility(View.VISIBLE); + binding.sbProgress.setVisibility(View.INVISIBLE); + binding.pbProgress2.setVisibility(View.VISIBLE); - pb_progress.setIndeterminate(true); + binding.pbProgress.setIndeterminate(true); } else { double progress = ((double) currentPositionInMillis / (double) maxPositionInMillis) * 100d; if(!blockSeekbarUpdate) { - sb_progress.setVisibility(View.VISIBLE); - pb_progress2.setVisibility(View.INVISIBLE); - sb_progress.setProgress((int) progress); + binding.sbProgress.setVisibility(View.VISIBLE); + binding.pbProgress2.setVisibility(View.INVISIBLE); + binding.sbProgress.setProgress((int) progress); } - pb_progress.setIndeterminate(false); - pb_progress.setProgress((int) progress); + binding.pbProgress.setIndeterminate(false); + binding.pbProgress.setProgress((int) progress); } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java index d189ea7c..4c264e0c 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java @@ -23,14 +23,11 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.io.File; -import java.lang.reflect.Proxy; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.RssItem; @@ -52,7 +49,7 @@ import de.luhmer.owncloudnewsreader.widget.WidgetProvider; import static de.luhmer.owncloudnewsreader.Constants.MIN_NEXTCLOUD_FILES_APP_VERSION_CODE; -public class PodcastFragmentActivity extends AppCompatActivity implements IPlayPausePodcastClicked { +public abstract class PodcastFragmentActivity extends AppCompatActivity implements IPlayPausePodcastClicked { private static final String TAG = PodcastFragmentActivity.class.getCanonicalName(); @@ -64,11 +61,6 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP private EventBus eventBus; private PodcastFragment mPodcastFragment; - @BindView(R.id.sliding_layout) - protected PodcastSlidingUpPanelLayout sliding_layout; - - - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { //Log.v(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]"); @@ -94,8 +86,6 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP eventBus = EventBus.getDefault(); - ButterKnife.bind(this); - updatePodcastView(); } @@ -125,7 +115,7 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP if (hasWindowFocus) { int currentOrientation = getResources().getConfiguration().orientation; if (currentOrientation != lastOrientation) { - sliding_layout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); lastOrientation = currentOrientation; } } @@ -210,12 +200,12 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP */ public PodcastSlidingUpPanelLayout getSlidingLayout() { - return sliding_layout; + return getPodcastSlidingUpPanelLayout(); } public boolean handlePodcastBackPressed() { - if(mPodcastFragment != null && sliding_layout.getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) { - sliding_layout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + if(mPodcastFragment != null && getPodcastSlidingUpPanelLayout().getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) { + getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); return true; } return false; @@ -253,17 +243,17 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP private void collapsePodcastView() { - sliding_layout.setPanelHeight(0); + getPodcastSlidingUpPanelLayout().setPanelHeight(0); } private void expandPodcastView() { - sliding_layout.setPanelHeight((int) dipToPx(68)); + getPodcastSlidingUpPanelLayout().setPanelHeight((int) dipToPx(68)); } @Subscribe public void onEvent(PodcastCompletedEvent podcastCompletedEvent) { collapsePodcastView(); - sliding_layout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); //currentlyPlaying = false; } @@ -353,4 +343,6 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP } return videoId; } + + protected abstract PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout(); } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java index 6b55e3ec..3a363d7b 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java @@ -16,14 +16,12 @@ import android.widget.ListView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; import de.luhmer.owncloudnewsreader.authentication.AccountGeneral; +import de.luhmer.owncloudnewsreader.databinding.ActivitySyncIntervalSelectorBinding; import de.luhmer.owncloudnewsreader.helper.ThemeChooser; @@ -31,7 +29,7 @@ public class SyncIntervalSelectorActivity extends AppCompatActivity { private PlaceholderFragment mFragment; private String[] items_values; - protected @BindView(R.id.toolbar) Toolbar toolbar; + protected ActivitySyncIntervalSelectorBinding binding; protected @Inject SharedPreferences mPrefs; @Override @@ -42,12 +40,11 @@ public class SyncIntervalSelectorActivity extends AppCompatActivity { super.onCreate(savedInstanceState); ThemeChooser.afterOnCreate(this); - setContentView(R.layout.activity_sync_interval_selector); + binding = ActivitySyncIntervalSelectorBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - ButterKnife.bind(this); - - if (toolbar != null) { - setSupportActionBar(toolbar); + if (binding.toolbarLayout.toolbar != null) { + setSupportActionBar(binding.toolbarLayout.toolbar); } items_values = getResources().getStringArray(R.array.array_sync_interval_values); |