diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index ffab1ed5..a78e40ab 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -18,7 +18,7 @@ @@ -28,8 +28,7 @@ diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index e436a338..0396ff4e 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 162ee545..54302cbd 100644 Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ diff --git a/app/build.gradle b/app/build.gradle index dcf0d93f..d815174c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,4 +55,8 @@ dependencies { implementation 'com.afollestad.material-dialogs:core:0.9.6.0' implementation 'com.github.clans:fab:1.6.4' + + // fastadapter requires androidx after 3.2.9 + implementation 'com.mikepenz:fastadapter:3.2.9' + implementation 'com.mikepenz:fastadapter-commons:3.2.9' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ae009921..3df12b64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ android:theme="@style/AppTheme" android:usesCleartextTraffic="true" tools:ignore="GoogleAppIndexingWarning"> + @@ -24,11 +25,10 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/readrops/app/BasedRepository.java b/app/src/main/java/com/readrops/app/BasedRepository.java index fd6a36e7..101fda91 100644 --- a/app/src/main/java/com/readrops/app/BasedRepository.java +++ b/app/src/main/java/com/readrops/app/BasedRepository.java @@ -3,9 +3,8 @@ package com.readrops.app; import android.app.Application; import android.arch.lifecycle.LiveData; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.entities.Feed; -import com.readrops.app.database.entities.Item; import com.readrops.readropslibrary.ParsingResult; public class BasedRepository extends ARepository { diff --git a/app/src/main/java/com/readrops/app/FeedWithFolderItem.java b/app/src/main/java/com/readrops/app/FeedWithFolderItem.java new file mode 100644 index 00000000..35a59eef --- /dev/null +++ b/app/src/main/java/com/readrops/app/FeedWithFolderItem.java @@ -0,0 +1,80 @@ +package com.readrops.app; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.mikepenz.fastadapter.FastAdapter; +import com.mikepenz.fastadapter.items.AbstractItem; +import com.mikepenz.fastadapter.items.ModelAbstractItem; +import com.readrops.app.database.pojo.FeedWithFolder; +import com.readrops.app.utils.GlideApp; + +import java.util.List; + +public class FeedWithFolderItem extends ModelAbstractItem { + + public FeedWithFolderItem(FeedWithFolder feedWithFolder) { + super(feedWithFolder); + } + + @NonNull + @Override + public ViewHolder getViewHolder(View v) { + return new ViewHolder(v); + } + + @Override + public int getType() { + return R.id.feed_layout; + } + + @Override + public int getLayoutRes() { + return R.layout.feed_layout; + } + + @Override + public void bindView(ViewHolder holder, List payloads) { + super.bindView(holder, payloads); + FeedWithFolder feedWithFolder = getModel(); + + if (feedWithFolder.getFeed().getIconUrl() != null) { + GlideApp.with(holder.itemView.getContext()) + .load(feedWithFolder.getFeed().getIconUrl()) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .placeholder(R.drawable.ic_rss_feed) + .into(holder.feedIcon); + } + + holder.feedName.setText(feedWithFolder.getFeed().getName()); + if (feedWithFolder.getFeed().getDescription() != null) { + holder.feedDescription.setVisibility(View.VISIBLE); + holder.feedDescription.setText(feedWithFolder.getFeed().getDescription()); + } else + holder.feedDescription.setVisibility(View.GONE); + + holder.folderName.setText(feedWithFolder.getFolder().getName()); + } + + protected static class ViewHolder extends RecyclerView.ViewHolder { + + private ImageView feedIcon; + private TextView feedName; + private TextView feedDescription; + private TextView folderName; + + + public ViewHolder(View itemView) { + super(itemView); + + feedIcon = itemView.findViewById(R.id.feed_layout_icon); + feedName = itemView.findViewById(R.id.feed_layout_name); + feedDescription = itemView.findViewById(R.id.feed_layout_description); + folderName = itemView.findViewById(R.id.feed_layout_folder); + } + } +} diff --git a/app/src/main/java/com/readrops/app/ItemActivity.java b/app/src/main/java/com/readrops/app/ItemActivity.java index fb414a68..c15ad441 100644 --- a/app/src/main/java/com/readrops/app/ItemActivity.java +++ b/app/src/main/java/com/readrops/app/ItemActivity.java @@ -18,7 +18,7 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.entities.Item; import com.readrops.app.utils.DateUtils; import com.readrops.app.utils.GlideApp; diff --git a/app/src/main/java/com/readrops/app/ItemViewModel.java b/app/src/main/java/com/readrops/app/ItemViewModel.java index 450bb0a3..9c17ba2d 100644 --- a/app/src/main/java/com/readrops/app/ItemViewModel.java +++ b/app/src/main/java/com/readrops/app/ItemViewModel.java @@ -5,9 +5,7 @@ import android.arch.lifecycle.AndroidViewModel; import android.arch.lifecycle.LiveData; import android.support.annotation.NonNull; -import com.readrops.app.database.Database; -import com.readrops.app.database.ItemWithFeed; -import com.readrops.app.database.entities.Item; +import com.readrops.app.database.pojo.ItemWithFeed; public class ItemViewModel extends AndroidViewModel { diff --git a/app/src/main/java/com/readrops/app/LocalFeedRepository.java b/app/src/main/java/com/readrops/app/LocalFeedRepository.java index 6cd5013f..c343e359 100644 --- a/app/src/main/java/com/readrops/app/LocalFeedRepository.java +++ b/app/src/main/java/com/readrops/app/LocalFeedRepository.java @@ -6,7 +6,7 @@ import android.graphics.Bitmap; import android.support.v7.graphics.Palette; import android.util.Patterns; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.entities.Feed; import com.readrops.app.database.entities.Item; import com.readrops.app.utils.Utils; diff --git a/app/src/main/java/com/readrops/app/MainActivity.java b/app/src/main/java/com/readrops/app/MainActivity.java index 02aef04d..1df2a021 100644 --- a/app/src/main/java/com/readrops/app/MainActivity.java +++ b/app/src/main/java/com/readrops/app/MainActivity.java @@ -26,7 +26,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader; import com.bumptech.glide.util.ViewPreloadSizeProvider; import com.github.clans.fab.FloatingActionMenu; -import com.readrops.app.database.ItemWithFeed; +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; @@ -220,10 +220,13 @@ public class MainActivity extends AppCompatActivity implements SimpleCallback, S public void addFolder(View view) { actionMenu.close(true); + Intent intent = new Intent(this, ManageFeedsActivity.class); + startActivity(intent); } public void insertNewFeed(ParsingResult result) { refreshLayout.setRefreshing(true); viewModel.addFeed(result); + } } diff --git a/app/src/main/java/com/readrops/app/MainItemListAdapter.java b/app/src/main/java/com/readrops/app/MainItemListAdapter.java index 8535df53..74c88286 100644 --- a/app/src/main/java/com/readrops/app/MainItemListAdapter.java +++ b/app/src/main/java/com/readrops/app/MainItemListAdapter.java @@ -1,6 +1,5 @@ package com.readrops.app; -import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; @@ -23,7 +22,7 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.transition.DrawableCrossFadeFactory; import com.bumptech.glide.util.ViewPreloadSizeProvider; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.entities.Item; import com.readrops.app.utils.DateUtils; import com.readrops.app.utils.GlideRequests; diff --git a/app/src/main/java/com/readrops/app/MainViewModel.java b/app/src/main/java/com/readrops/app/MainViewModel.java index abcf45fe..c2b7cc14 100644 --- a/app/src/main/java/com/readrops/app/MainViewModel.java +++ b/app/src/main/java/com/readrops/app/MainViewModel.java @@ -5,7 +5,7 @@ import android.arch.lifecycle.AndroidViewModel; import android.arch.lifecycle.LiveData; import android.support.annotation.NonNull; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.readropslibrary.ParsingResult; import java.util.List; diff --git a/app/src/main/java/com/readrops/app/ManageFeedsActivity.java b/app/src/main/java/com/readrops/app/ManageFeedsActivity.java new file mode 100644 index 00000000..1728c542 --- /dev/null +++ b/app/src/main/java/com/readrops/app/ManageFeedsActivity.java @@ -0,0 +1,34 @@ +package com.readrops.app; + +import android.arch.lifecycle.ViewModelProvider; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +import com.mikepenz.fastadapter.FastAdapter; +import com.mikepenz.fastadapter.adapters.ModelAdapter; +import com.readrops.app.database.pojo.FeedWithFolder; + +public class ManageFeedsActivity extends AppCompatActivity { + + private RecyclerView recyclerView; + private ModelAdapter itemAdapter; + private ManageFeedsViewModel viewModel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_manage_feeds); + + recyclerView = findViewById(R.id.feeds_recyclerview); + recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + itemAdapter = new ModelAdapter<>(FeedWithFolderItem::new); + + FastAdapter fastAdapter = FastAdapter.with(itemAdapter); + recyclerView.setAdapter(fastAdapter); + + viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(ManageFeedsViewModel.class); + viewModel.getFeedsWithFolder().observe(this, feedWithFolders -> itemAdapter.add(feedWithFolders)); + } +} diff --git a/app/src/main/java/com/readrops/app/ManageFeedsViewModel.java b/app/src/main/java/com/readrops/app/ManageFeedsViewModel.java new file mode 100644 index 00000000..acbf044a --- /dev/null +++ b/app/src/main/java/com/readrops/app/ManageFeedsViewModel.java @@ -0,0 +1,29 @@ +package com.readrops.app; + +import android.app.Application; +import android.app.ListActivity; +import android.arch.lifecycle.AndroidViewModel; +import android.arch.lifecycle.LiveData; +import android.support.annotation.NonNull; + +import com.readrops.app.database.Database; +import com.readrops.app.database.pojo.FeedWithFolder; + +import java.util.List; + +public class ManageFeedsViewModel extends AndroidViewModel { + + private Database db; + private LiveData> feedsWithFolder; + + public ManageFeedsViewModel(@NonNull Application application) { + super(application); + db = Database.getInstance(application); + + feedsWithFolder = db.feedDao().getAllFeedsWithFolder(); + } + + public LiveData> getFeedsWithFolder() { + return feedsWithFolder; + } +} diff --git a/app/src/main/java/com/readrops/app/database/dao/FeedDao.java b/app/src/main/java/com/readrops/app/database/dao/FeedDao.java index e34046a3..50ff6a38 100644 --- a/app/src/main/java/com/readrops/app/database/dao/FeedDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/FeedDao.java @@ -1,12 +1,14 @@ package com.readrops.app.database.dao; +import android.arch.lifecycle.LiveData; import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; import android.arch.persistence.room.Query; import android.arch.persistence.room.Update; import com.readrops.app.database.entities.Feed; +import com.readrops.app.database.pojo.FeedWithFolder; import java.util.List; @@ -31,4 +33,8 @@ public interface FeedDao { @Query("Update Feed set folder_id = :folderId Where id = :feedId") void updateFeedFolder(int feedId, int folderId); + @Query("Select Feed.name as feed_name, Feed.id as feed_id, Folder.name as folder_name, Folder.id as folder_id," + + "Feed.description as feed_description, Feed.icon_url as feed_icon_url, Feed.url as feed_url" + + " from Feed Inner Join Folder on Feed.folder_id = Folder.id Order by Feed.name") + LiveData> getAllFeedsWithFolder(); } diff --git a/app/src/main/java/com/readrops/app/database/dao/ItemDao.java b/app/src/main/java/com/readrops/app/database/dao/ItemDao.java index 66cd792e..9563292b 100644 --- a/app/src/main/java/com/readrops/app/database/dao/ItemDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/ItemDao.java @@ -6,7 +6,7 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; import android.arch.persistence.room.Query; -import com.readrops.app.database.ItemWithFeed; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.entities.Item; import java.util.List; diff --git a/app/src/main/java/com/readrops/app/database/pojo/FeedWithFolder.java b/app/src/main/java/com/readrops/app/database/pojo/FeedWithFolder.java new file mode 100644 index 00000000..e5a7ba7e --- /dev/null +++ b/app/src/main/java/com/readrops/app/database/pojo/FeedWithFolder.java @@ -0,0 +1,31 @@ +package com.readrops.app.database.pojo; + +import android.arch.persistence.room.Embedded; + +import com.readrops.app.database.entities.Feed; +import com.readrops.app.database.entities.Folder; + +public class FeedWithFolder { + + @Embedded(prefix = "feed_") + private Feed feed; + + @Embedded(prefix = "folder_") + private Folder folder; + + public Feed getFeed() { + return feed; + } + + public void setFeed(Feed feed) { + this.feed = feed; + } + + public Folder getFolder() { + return folder; + } + + public void setFolder(Folder folder) { + this.folder = folder; + } +} diff --git a/app/src/main/java/com/readrops/app/database/ItemWithFeed.java b/app/src/main/java/com/readrops/app/database/pojo/ItemWithFeed.java similarity index 97% rename from app/src/main/java/com/readrops/app/database/ItemWithFeed.java rename to app/src/main/java/com/readrops/app/database/pojo/ItemWithFeed.java index 3fcf358d..57d98cda 100644 --- a/app/src/main/java/com/readrops/app/database/ItemWithFeed.java +++ b/app/src/main/java/com/readrops/app/database/pojo/ItemWithFeed.java @@ -1,4 +1,4 @@ -package com.readrops.app.database; +package com.readrops.app.database.pojo; import android.arch.persistence.room.ColumnInfo; import android.arch.persistence.room.Embedded; diff --git a/app/src/main/java/com/readrops/app/utils/ReadropsWebView.java b/app/src/main/java/com/readrops/app/utils/ReadropsWebView.java index 9095f111..fc60146f 100644 --- a/app/src/main/java/com/readrops/app/utils/ReadropsWebView.java +++ b/app/src/main/java/com/readrops/app/utils/ReadropsWebView.java @@ -3,24 +3,18 @@ package com.readrops.app.utils; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; -import android.util.Log; import android.webkit.WebSettings; import android.webkit.WebView; import com.readrops.app.R; -import com.readrops.app.database.ItemWithFeed; -import com.readrops.app.database.entities.Item; +import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.readropslibrary.Utils.LibUtils; import org.jsoup.Jsoup; -import org.jsoup.nodes.Attribute; -import org.jsoup.nodes.Attributes; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; -import java.util.Iterator; - public class ReadropsWebView extends WebView { private ItemWithFeed itemWithFeed; diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 00000000..39e64d69 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 00000000..2ab2fb75 --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_open_in_browser.xml b/app/src/main/res/drawable/ic_open_in_browser.xml new file mode 100644 index 00000000..d597c37e --- /dev/null +++ b/app/src/main/res/drawable/ic_open_in_browser.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_manage_feeds.xml b/app/src/main/res/layout/activity_manage_feeds.xml new file mode 100644 index 00000000..f74d451f --- /dev/null +++ b/app/src/main/res/layout/activity_manage_feeds.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/feed_layout.xml b/app/src/main/res/layout/feed_layout.xml new file mode 100644 index 00000000..350133c8 --- /dev/null +++ b/app/src/main/res/layout/feed_layout.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/image_item.xml b/app/src/main/res/layout/image_item.xml index e473120c..23000a80 100644 --- a/app/src/main/res/layout/image_item.xml +++ b/app/src/main/res/layout/image_item.xml @@ -97,23 +97,23 @@ android:id="@+id/item_readtime_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_toLeftOf="@id/item_interpoint" + android:layout_marginStart="6dp" android:layout_marginLeft="6dp" - android:layout_marginStart="6dp"> + android:layout_toLeftOf="@id/item_interpoint"> + android:src="@drawable/ic_read_time" />