Add edit feed activity

This commit is contained in:
Shinokuni 2019-03-10 15:19:02 +01:00
parent 4ce966febe
commit 18e626a303
15 changed files with 358 additions and 46 deletions

View File

@ -16,10 +16,9 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".activities.ManageFeedsActivity"
android:parentActivityName=".activities.MainActivity">
</activity>
<activity
android:name=".activities.ManageFeedsActivity"
android:parentActivityName=".activities.MainActivity"></activity>
<activity
android:name=".activities.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
@ -33,6 +32,10 @@
android:name=".activities.ItemActivity"
android:parentActivityName=".activities.MainActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>
<activity android:name=".activities.AddFeedActivity"
android:parentActivityName=".activities.MainActivity">
</activity>
</application>
</manifest>

View File

@ -0,0 +1,170 @@
package com.readrops.app.activities;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Patterns;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import com.mikepenz.fastadapter.FastAdapter;
import com.mikepenz.fastadapter.IAdapter;
import com.mikepenz.fastadapter.adapters.ItemAdapter;
import com.mikepenz.fastadapter.listeners.OnClickListener;
import com.readrops.app.R;
import com.readrops.app.utils.HtmlParser;
import com.readrops.app.utils.Utils;
import com.readrops.app.utils.ParsingResult;
import com.readrops.readropslibrary.localfeed.RSSNetwork;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.SingleOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class AddFeedActivity extends AppCompatActivity implements View.OnClickListener {
private TextInputEditText feedInput;
private Button load;
private ProgressBar progressBar;
private Button validate;
private RecyclerView recyclerView;
private ItemAdapter<ParsingResult> itemAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_feed);
feedInput = findViewById(R.id.add_feed_text_input);
load = findViewById(R.id.add_feed_load);
validate = findViewById(R.id.add_feed_ok);
progressBar = findViewById(R.id.fadd_feed_loading);
recyclerView = findViewById(R.id.add_feed_results);
load.setOnClickListener(this);
validate.setOnClickListener(this);
itemAdapter = new ItemAdapter<>();
FastAdapter<ParsingResult> fastAdapter = FastAdapter.with(itemAdapter);
fastAdapter.withSelectable(true);
fastAdapter.withOnClickListener((v, adapter, item, position) -> {
return true;
});
recyclerView.setAdapter(fastAdapter);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
DividerItemDecoration decoration = new DividerItemDecoration(this, ((LinearLayoutManager) layoutManager).getOrientation());
recyclerView.addItemDecoration(decoration);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_feed_load:
if (isValidUrl()) {
progressBar.setVisibility(View.VISIBLE);
loadFeed();
}
break;
case R.id.add_feed_ok:
exit();
break;
}
}
private boolean isValidUrl() {
String url = feedInput.getText().toString().trim();
if (url.isEmpty()) {
feedInput.setError(getString(R.string.add_feed_empty_field));
return false;
} else if (!Patterns.WEB_URL.matcher(url).matches()) {
feedInput.setError(getString(R.string.add_feed_wrong_url));
return false;
} else
return true;
}
private void exit() {
}
private void loadFeed() {
String url = feedInput.getText().toString().trim();
final String finalUrl;
if (!(url.contains(Utils.HTTP_PREFIX) || url.contains(Utils.HTTPS_PREFIX)))
finalUrl = Utils.HTTPS_PREFIX + url;
else
finalUrl = url;
Single.create((SingleOnSubscribe<List<ParsingResult>>) emitter -> {
RSSNetwork rssApi = new RSSNetwork();
List<ParsingResult> results = new ArrayList<>();
if (rssApi.isUrlFeedLink(finalUrl)) {
ParsingResult parsingResult = new ParsingResult(finalUrl, null);
results.add(parsingResult);
} else
results.addAll(HtmlParser.getFeedLink(finalUrl));
emitter.onSuccess(results);
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<ParsingResult>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(List<ParsingResult> parsingResultList) {
displayResults(parsingResultList);
}
@Override
public void onError(Throwable e) {
}
});
}
private void displayResults(List<ParsingResult> parsingResultList) {
recyclerView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
itemAdapter.add(parsingResultList);
}
@Override
public void onBackPressed() {
finish();
super.onBackPressed();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -34,7 +34,7 @@ import com.readrops.app.views.SimpleCallback;
import com.readrops.app.database.pojo.ItemWithFeed;
import com.readrops.app.database.entities.Item;
import com.readrops.app.utils.GlideApp;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import org.joda.time.LocalDateTime;
@ -239,8 +239,10 @@ public class MainActivity extends AppCompatActivity implements SimpleCallback, S
public void displayAddFeedDialog(View view) {
actionMenu.close(true);
Dialog dialog = new AddFeedDialog(this, R.layout.add_feed_layout);
dialog.show();
//Dialog dialog = new AddFeedDialog(this, R.layout.add_feed_layout);
//dialog.show();
Intent intent = new Intent(this, AddFeedActivity.class);
startActivity(intent);
}
public void addFolder(View view) {

View File

@ -9,7 +9,7 @@ import com.readrops.app.views.SimpleCallback;
import com.readrops.app.database.Database;
import com.readrops.app.database.entities.Feed;
import com.readrops.app.database.entities.Folder;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

View File

@ -1,6 +1,5 @@
package com.readrops.app.repositories;
import android.annotation.SuppressLint;
import android.app.Application;
import android.arch.lifecycle.LiveData;
import android.graphics.Bitmap;
@ -14,7 +13,7 @@ import com.readrops.app.database.entities.Feed;
import com.readrops.app.database.entities.Item;
import com.readrops.app.utils.Utils;
import com.readrops.app.utils.HtmlParser;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import com.readrops.readropslibrary.QueryCallback;
import com.readrops.readropslibrary.Utils.LibUtils;
import com.readrops.readropslibrary.localfeed.AFeed;

View File

@ -2,7 +2,6 @@ package com.readrops.app.utils;
import android.util.Log;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.readropslibrary.Utils.LibUtils;
import org.jsoup.Connection;

View File

@ -0,0 +1,89 @@
package com.readrops.app.utils;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.TextView;
import com.mikepenz.fastadapter.FastAdapter;
import com.mikepenz.fastadapter.items.AbstractItem;
import com.readrops.app.R;
import java.util.List;
public class ParsingResult extends AbstractItem<ParsingResult, ParsingResult.ParsingResultViewHolder> {
private String url;
private String label;
public ParsingResult(String url, String label) {
this.url = url;
this.label = label;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
@Override
public boolean isSelectable() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@NonNull
@Override
public ParsingResultViewHolder getViewHolder(View v) {
return new ParsingResultViewHolder(v);
}
@Override
public int getType() {
return R.id.add_feed_main_layout;
}
@Override
public int getLayoutRes() {
return R.layout.add_feed_item;
}
class ParsingResultViewHolder extends FastAdapter.ViewHolder<ParsingResult> {
private TextView feedLabel;
private TextView feedUrl;
public ParsingResultViewHolder(View itemView) {
super(itemView);
feedLabel = itemView.findViewById(R.id.add_feed_item_label);
feedUrl = itemView.findViewById(R.id.add_feed_item_url);
}
@Override
public void bindView(ParsingResult item, List<Object> payloads) {
feedLabel.setText(item.getLabel());
feedUrl.setText(item.getUrl());
}
@Override
public void unbindView(ParsingResult item) {
}
}
}

View File

@ -8,7 +8,7 @@ import android.support.annotation.NonNull;
import com.readrops.app.database.pojo.ItemWithFeed;
import com.readrops.app.repositories.LocalFeedRepository;
import com.readrops.app.views.SimpleCallback;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import java.util.List;

View File

@ -22,7 +22,7 @@ import com.readrops.app.R;
import com.readrops.app.activities.MainActivity;
import com.readrops.app.utils.Utils;
import com.readrops.app.utils.HtmlParser;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import com.readrops.readropslibrary.localfeed.RSSNetwork;
import java.net.UnknownHostException;
@ -54,7 +54,7 @@ public class AddFeedDialog extends Dialog implements View.OnClickListener {
button = findViewById(R.id.add_feed_validate);
button.setOnClickListener(this);
textInputEditText = findViewById(R.id.add_feed_edit_text);
textInputEditText = findViewById(R.id.add_feed_text_input);
progressBar = findViewById(R.id.add_feed_progressbar);
errorTextView = findViewById(R.id.add_feed_error);
}

View File

@ -8,7 +8,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.readrops.app.R;
import com.readrops.readropslibrary.ParsingResult;
import com.readrops.app.utils.ParsingResult;
import java.util.List;

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
tools:context=".activities.AddFeedActivity">
<android.support.constraint.ConstraintLayout
android:id="@+id/add_feed_main_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
android:id="@+id/add_feed_input_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<android.support.design.widget.TextInputEditText
android:id="@+id/add_feed_text_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/feed_url" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/add_feed_load"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/load"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_feed_input_layout" />
<ProgressBar
android:id="@+id/fadd_feed_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_feed_load"
tools:visibility="gone" />
<android.support.v7.widget.RecyclerView
android:id="@+id/add_feed_results"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fadd_feed_loading"
tools:visibility="gone" />
</android.support.constraint.ConstraintLayout>
<Button
android:id="@+id/add_feed_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/validate"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_feed_main_layout"
android:enabled="false"/>
</android.support.constraint.ConstraintLayout>

View File

@ -28,7 +28,7 @@
app:layout_constraintTop_toBottomOf="@+id/add_feed_title">
<android.support.design.widget.TextInputEditText
android:id="@+id/add_feed_edit_text"
android:id="@+id/add_feed_text_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/feed_url" />

View File

@ -30,5 +30,6 @@
<string name="no_folder">Pas de dossier</string>
<string name="cancel">Retour</string>
<string name="delete_feed">Supprimer le flux ?</string>
<string name="load">Charger</string>
</resources>

View File

@ -1,6 +1,6 @@
<resources>
<string name="app_name" translatable="false">Readrops</string>
<string name="to_read">To read</string>
<string name="non_read_articles">Non read articles</string>
<string name="open_nav_drawer">Open menu</string>
@ -32,4 +32,5 @@
<string name="no_folder">No folder</string>
<string name="cancel">Cancel</string>
<string name="delete_feed">Delete feed ?</string>
<string name="load">Load</string>
</resources>

View File

@ -1,29 +0,0 @@
package com.readrops.readropslibrary;
public class ParsingResult {
private String url;
private String label;
public ParsingResult(String url, String label) {
this.url = url;
this.label = label;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}