diff --git a/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java b/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java index 12d4d0e4..9610ad6b 100644 --- a/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java +++ b/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java @@ -8,16 +8,16 @@ import android.view.KeyEvent; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; -import android.widget.AdapterView; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.widget.NestedScrollView; import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -25,15 +25,18 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.textfield.TextInputEditText; import com.mikepenz.fastadapter.FastAdapter; import com.mikepenz.fastadapter.adapters.ItemAdapter; +import com.mikepenz.fastadapter.commons.utils.DiffCallback; +import com.mikepenz.fastadapter.commons.utils.FastAdapterDiffUtil; import com.readrops.app.R; -import com.readrops.app.database.entities.account.Account; +import com.readrops.app.adapters.AccountArrayAdapter; import com.readrops.app.database.entities.Feed; +import com.readrops.app.database.entities.account.Account; import com.readrops.app.utils.FeedInsertionResult; import com.readrops.app.utils.ParsingResult; +import com.readrops.app.utils.ReadropsItemTouchCallback; import com.readrops.app.utils.SharedPreferencesManager; import com.readrops.app.utils.Utils; import com.readrops.app.viewmodels.AddFeedsViewModel; -import com.readrops.app.adapters.AccountArrayAdapter; import java.util.ArrayList; import java.util.List; @@ -61,6 +64,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi private ItemAdapter parseItemsAdapter; private ItemAdapter insertionResultsAdapter; + FastAdapter fastAdapter; private AddFeedsViewModel viewModel; private ArrayList feedsToUpdate; @@ -90,11 +94,10 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi feedInput.setOnTouchListener((v, event) -> { final int DRAWABLE_RIGHT = 2; - if(event.getAction() == MotionEvent.ACTION_UP) { - if(event.getRawX() >= (feedInput.getRight() - feedInput.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) { - feedInput.setText(""); - return true; - } + int drawablePos = (feedInput.getRight() - feedInput.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width()); + if (event.getAction() == MotionEvent.ACTION_UP && event.getRawX() >= drawablePos) { + feedInput.setText(""); + return true; } return false; @@ -103,7 +106,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi viewModel = ViewModelProviders.of(this).get(AddFeedsViewModel.class); parseItemsAdapter = new ItemAdapter<>(); - FastAdapter fastAdapter = FastAdapter.with(parseItemsAdapter); + fastAdapter = FastAdapter.with(parseItemsAdapter); fastAdapter.withSelectable(true); fastAdapter.withOnClickListener((v, adapter, item, position) -> { if (item.isChecked()) { @@ -123,35 +126,19 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); parseResultsRecyclerView.setLayoutManager(layoutManager); - new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { - @Override - public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { - int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; + new ItemTouchHelper(new ReadropsItemTouchCallback(this, + new ReadropsItemTouchCallback.Config.Builder() + .swipeDirs(ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) + .swipeCallback((viewHolder, direction) -> { + parseItemsAdapter.remove(viewHolder.getAdapterPosition()); - return makeMovementFlags(0, swipeFlags); - } - - @Override - public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) { - return false; - } - - @Override - public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) { - parseItemsAdapter.remove(viewHolder.getAdapterPosition()); - - if (parseItemsAdapter.getAdapterItemCount() == 0) { - resultsTextView.setVisibility(View.GONE); - parseResultsRecyclerView.setVisibility(View.GONE); - } - - } - - @Override - public boolean isItemViewSwipeEnabled() { - return true; - } - }).attachToRecyclerView(parseResultsRecyclerView); + if (parseItemsAdapter.getAdapterItemCount() == 0) { + resultsTextView.setVisibility(View.GONE); + parseResultsRecyclerView.setVisibility(View.GONE); + } + }) + .build())) + .attachToRecyclerView(parseResultsRecyclerView); insertionResultsAdapter = new ItemAdapter<>(); RecyclerView.LayoutManager layoutManager1 = new LinearLayoutManager(this); @@ -163,18 +150,6 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); accountSpinner.setAdapter(arrayAdapter); - - accountSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); }); feedsToUpdate = new ArrayList<>(); @@ -190,6 +165,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi } break; case R.id.add_feed_ok: + insertionResultsAdapter.clear(); insertFeeds(); break; } @@ -217,6 +193,15 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi return false; } + private void disableParsingResult(ParsingResult parsingResult) { + for (ParsingResult result : parseItemsAdapter.getAdapterItems()) { + if (result.getUrl().equals(parsingResult.getUrl())) { + result.setChecked(false); + fastAdapter.notifyAdapterItemChanged(parseItemsAdapter.getAdapterPosition(result)); + } + } + } + private void loadFeed() { String url = feedInput.getText().toString().trim(); @@ -244,12 +229,32 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi } private void displayParseResults(List parsingResultList) { - if (parsingResultList.size() > 0) { + if (!parsingResultList.isEmpty()) { parseResultsRecyclerView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); resultsTextView.setVisibility(View.VISIBLE); - parseItemsAdapter.add(parsingResultList); + DiffUtil.DiffResult diffResult = FastAdapterDiffUtil.calculateDiff(parseItemsAdapter, parsingResultList, new DiffCallback() { + @Override + public boolean areItemsTheSame(ParsingResult oldItem, ParsingResult newItem) { + return oldItem.getUrl().equals(newItem.getUrl()); + } + + @Override + public boolean areContentsTheSame(ParsingResult oldItem, ParsingResult newItem) { + return oldItem.getUrl().equals(newItem.getUrl()) && + oldItem.isChecked() == newItem.isChecked(); + } + + @Nullable + @Override + public Object getChangePayload(ParsingResult oldItem, int oldItemPosition, ParsingResult newItem, int newItemPosition) { + newItem.setChecked(oldItem.isChecked()); + return newItem; + } + }, false); + + FastAdapterDiffUtil.set(parseItemsAdapter, diffResult); validate.setEnabled(recyclerViewHasCheckedItems()); } else progressBar.setVisibility(View.GONE); @@ -284,7 +289,6 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi feedInsertionProgressBar.setVisibility(View.GONE); validate.setEnabled(true); Utils.showSnackbar(rootLayout, e.getMessage()); - } }); } @@ -296,6 +300,8 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi for (FeedInsertionResult feedInsertionResult : feedInsertionResults) { if (feedInsertionResult.getFeed() != null) feedsToUpdate.add(feedInsertionResult.getFeed()); + + disableParsingResult(feedInsertionResult.getParsingResult()); } insertionResultsAdapter.add(feedInsertionResults); @@ -303,7 +309,6 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi } - @Override public void onBackPressed() { finish(); @@ -323,7 +328,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi @Override public void finish() { - if (feedsToUpdate.size() > 0) { + if (!feedsToUpdate.isEmpty()) { Intent intent = new Intent(); intent.putParcelableArrayListExtra("feedIds", feedsToUpdate); @@ -339,8 +344,8 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi case KeyEvent.KEYCODE_ENTER: onClick(load); return true; + default: + return super.onKeyUp(keyCode, event); } - - return super.onKeyUp(keyCode, event); } } diff --git a/app/src/main/java/com/readrops/app/utils/ParsingResult.java b/app/src/main/java/com/readrops/app/utils/ParsingResult.java index ee1a97bb..e7eb5936 100644 --- a/app/src/main/java/com/readrops/app/utils/ParsingResult.java +++ b/app/src/main/java/com/readrops/app/utils/ParsingResult.java @@ -1,14 +1,17 @@ package com.readrops.app.utils; -import androidx.annotation.NonNull; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.mikepenz.fastadapter.FastAdapter; import com.mikepenz.fastadapter.items.AbstractItem; import com.readrops.app.R; +import org.jetbrains.annotations.NotNull; + import java.util.List; public class ParsingResult extends AbstractItem { @@ -89,21 +92,31 @@ public class ParsingResult extends AbstractItem payloads) { - if (item.getLabel() != null && !item.getLabel().isEmpty()) - feedLabel.setText(item.getLabel()); - else - feedLabel.setVisibility(View.GONE); + public void bindView(@NotNull ParsingResult item, List payloads) { + if (!payloads.isEmpty()) { + ParsingResult newItem = (ParsingResult) payloads.get(0); + + checkBox.setChecked(newItem.isChecked()); + } else { + if (item.getLabel() != null && !item.getLabel().isEmpty()) + feedLabel.setText(item.getLabel()); + else + feedLabel.setVisibility(View.GONE); + + feedUrl.setText(item.getUrl()); + + checkBox.setChecked(item.isChecked()); + checkBox.setClickable(false); + } - feedUrl.setText(item.getUrl()); - checkBox.setChecked(item.isChecked()); - checkBox.setClickable(false); } @Override - public void unbindView(ParsingResult item) { - + public void unbindView(@NotNull ParsingResult item) { + // not useful } + + } } diff --git a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java index 356fa2c3..634878ff 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java @@ -1,6 +1,7 @@ package com.readrops.app.viewmodels; import android.app.Application; +import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -21,6 +22,8 @@ import io.reactivex.Single; public class AddFeedsViewModel extends AndroidViewModel { + private static final String TAG = AddFeedsViewModel.class.getSimpleName(); + private ARepository repository; private Database database; @@ -36,7 +39,7 @@ public class AddFeedsViewModel extends AndroidViewModel { return repository.addFeeds(results); } catch (Exception e) { - e.printStackTrace(); + Log.d(TAG, e.getMessage()); } return null; diff --git a/app/src/main/res/layout/activity_add_feed.xml b/app/src/main/res/layout/activity_add_feed.xml index 252f692f..5f652dcc 100644 --- a/app/src/main/res/layout/activity_add_feed.xml +++ b/app/src/main/res/layout/activity_add_feed.xml @@ -81,7 +81,9 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/add_feed_results_text_view" - tools:visibility="visible" /> + tools:visibility="visible" + tools:listitem="@layout/add_feed_item" + tools:itemCount="2"/> @@ -92,7 +94,8 @@ android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/add_feed_main_layout" /> + app:layout_constraintTop_toBottomOf="@+id/add_feed_main_layout" + tools:listitem="@layout/account_type_item"/>