Improve addFeedActivity behaviour when listing or adding feeds to parse
This commit is contained in:
parent
5813025b1b
commit
e51b9e8a7e
@ -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<ParsingResult> parseItemsAdapter;
|
||||
private ItemAdapter<FeedInsertionResult> insertionResultsAdapter;
|
||||
FastAdapter<ParsingResult> fastAdapter;
|
||||
|
||||
private AddFeedsViewModel viewModel;
|
||||
private ArrayList<Feed> 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<ParsingResult> 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<ParsingResult> 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<ParsingResult>() {
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
@ -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<ParsingResult, ParsingResult.ParsingResultViewHolder> {
|
||||
@ -89,21 +92,31 @@ public class ParsingResult extends AbstractItem<ParsingResult, ParsingResult.Par
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(ParsingResult item, List<Object> payloads) {
|
||||
if (item.getLabel() != null && !item.getLabel().isEmpty())
|
||||
feedLabel.setText(item.getLabel());
|
||||
else
|
||||
feedLabel.setVisibility(View.GONE);
|
||||
public void bindView(@NotNull ParsingResult item, List<Object> 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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@ -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"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/add_feed_ok"
|
||||
@ -127,7 +130,9 @@
|
||||
app:layout_constraintHorizontal_bias="0.6"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/add_feed_insert_progressbar"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"
|
||||
tools:listitem="@layout/feed_insertion_result"
|
||||
tools:itemCount="2"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user