Fix Folder entity usage as its foreign key is now nullable

This commit is contained in:
Shinokuni 2019-06-23 16:50:53 +02:00
parent 75a0ee4d97
commit 44f58a8aba
8 changed files with 70 additions and 81 deletions

View File

@ -1,16 +1,10 @@
package com.readrops.app.activities; package com.readrops.app.activities;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Color; import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -18,6 +12,13 @@ import android.widget.ImageView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.readrops.app.R; import com.readrops.app.R;
import com.readrops.app.database.entities.Item; import com.readrops.app.database.entities.Item;
import com.readrops.app.database.pojo.ItemWithFeed; import com.readrops.app.database.pojo.ItemWithFeed;
@ -123,7 +124,7 @@ public class ItemActivity extends AppCompatActivity {
else else
toolbarLayout.setTitle(itemWithFeed.getFeedName()); toolbarLayout.setTitle(itemWithFeed.getFeedName());
if (itemWithFeed.getFolder().getId() != 1) { if (itemWithFeed.getFolder() != null) {
toolbar.setSubtitle(itemWithFeed.getFolder().getName()); toolbar.setSubtitle(itemWithFeed.getFolder().getName());
toolbar.setSubtitleTextColor(Color.WHITE); toolbar.setSubtitleTextColor(Color.WHITE);
} }

View File

@ -1,30 +1,28 @@
package com.readrops.app.activities; package com.readrops.app.activities;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Vibrator; import android.os.Vibrator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentTransaction;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.ItemTouchHelper;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.readrops.app.R;
import com.readrops.app.database.entities.Folder; import com.readrops.app.database.entities.Folder;
import com.readrops.app.database.pojo.FeedWithFolder;
import com.readrops.app.viewmodels.ManageFeedsViewModel;
import com.readrops.app.views.EditFeedDialog; import com.readrops.app.views.EditFeedDialog;
import com.readrops.app.views.FeedsAdapter; import com.readrops.app.views.FeedsAdapter;
import com.readrops.app.viewmodels.ManageFeedsViewModel;
import com.readrops.app.R;
import com.readrops.app.database.pojo.FeedWithFolder;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.observers.DisposableCompletableObserver; import io.reactivex.observers.DisposableCompletableObserver;
@ -137,6 +135,8 @@ public class ManageFeedsActivity extends AppCompatActivity {
.positiveText(R.string.validate) .positiveText(R.string.validate)
.input(R.string.folder, 0, (dialog, input) -> { .input(R.string.folder, 0, (dialog, input) -> {
Folder folder = new Folder(input.toString()); Folder folder = new Folder(input.toString());
folder.setAccountId(1); // TODO add account support for creating folders
viewModel.addFolder(folder) viewModel.addFolder(folder)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())

View File

@ -12,8 +12,8 @@ public class ItemsListQueryBuilder {
"read_changed", "read_it_later", "Feed.name", "text_color", "background_color", "icon_url", "read_time", "read_changed", "read_it_later", "Feed.name", "text_color", "background_color", "icon_url", "read_time",
"Feed.id as feedId", "Feed.account_id", "Folder.id as folder_id", "Folder.name as folder_name"}; "Feed.id as feedId", "Feed.account_id", "Folder.id as folder_id", "Folder.name as folder_name"};
private String SELECT_ALL_JOIN = "Item Inner Join Feed, Folder on Item.feed_id = " + private String SELECT_ALL_JOIN = "Item, Feed LEFT JOIN Folder on Folder.id = Feed.folder_id " +
"Feed.id And Folder.id = Feed.folder_id"; "And Item.feed_id = Feed.id";
private String ORDER_BY_ASC = "Item.id DESC"; private String ORDER_BY_ASC = "Item.id DESC";

View File

@ -14,8 +14,8 @@ import java.util.List;
@Dao @Dao
public interface FeedDao { public interface FeedDao {
@Query("Select * from Feed order by name ASC") @Query("Select * from Feed Where account_id = :accountId order by name ASC")
List<Feed> getAllFeeds(); List<Feed> getAllFeeds(int accountId);
@Insert @Insert
long insert(Feed feed); long insert(Feed feed);
@ -48,17 +48,17 @@ public interface FeedDao {
void updateHeaders(String etag, String lastModified, int feedId); void updateHeaders(String etag, String lastModified, int feedId);
@Query("Update Feed set folder_id = :folderId Where id = :feedId") @Query("Update Feed set folder_id = :folderId Where id = :feedId")
void updateFeedFolder(int feedId, int folderId); void updateFeedFolder(int feedId, Integer folderId);
@Query("Update Feed set name = :feedName, url = :feedUrl, folder_id = :folderId Where id = :feedId") @Query("Update Feed set name = :feedName, url = :feedUrl, folder_id = :folderId Where id = :feedId")
void updateFeedFields(int feedId, String feedName, String feedUrl, int folderId); void updateFeedFields(int feedId, String feedName, String feedUrl, Integer folderId);
@Query("Update Feed set text_color = :textColor, background_color = :bgColor Where id = :feedId") @Query("Update Feed set text_color = :textColor, background_color = :bgColor Where id = :feedId")
void updateColors(int feedId, int textColor, int bgColor); void updateColors(int feedId, int textColor, int bgColor);
@Query("Select Feed.name as feed_name, Feed.id as feed_id, Folder.name as folder_name, Folder.id as folder_id," + @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, Feed.folder_id as feed_folder_id" + "Feed.description as feed_description, Feed.icon_url as feed_icon_url, Feed.url as feed_url, Feed.folder_id as feed_folder_id" +
", Feed.siteUrl as feed_siteUrl from Feed Inner Join Folder on Feed.folder_id = Folder.id Order by Feed.name") ", Feed.siteUrl as feed_siteUrl from Feed Left Join Folder on Feed.folder_id = Folder.id Order by Feed.name")
LiveData<List<FeedWithFolder>> getAllFeedsWithFolder(); LiveData<List<FeedWithFolder>> getAllFeedsWithFolder();
@Query("Select * From Feed Where id in (:ids)") @Query("Select * From Feed Where id in (:ids)")

View File

@ -22,8 +22,8 @@ public interface ItemDao {
@RawQuery(observedEntities = {Item.class, Folder.class, Feed.class}) @RawQuery(observedEntities = {Item.class, Folder.class, Feed.class})
PageKeyedDataSource.Factory<Integer, ItemWithFeed> selectAll(SupportSQLiteQuery query); PageKeyedDataSource.Factory<Integer, ItemWithFeed> selectAll(SupportSQLiteQuery query);
@Query("Select case When :guid In (Select guid from Item) Then 'true' else 'false' end") @Query("Select case When :guid In (Select guid From Item Inner Join Feed on Item.feed_id = Feed.id and account_id = :accountId) Then 1 else 0 end")
String guidExist(String guid); boolean itemExists(String guid, int accountId);
@Query("Select case When :remoteId In (Select remoteId from Item) And :feedId In (Select feed_id From Item) Then 1 else 0 end") @Query("Select case When :remoteId In (Select remoteId from Item) And :feedId In (Select feed_id From Item) Then 1 else 0 end")
boolean remoteItemExists(int remoteId, int feedId); boolean remoteItemExists(int remoteId, int feedId);
@ -58,8 +58,7 @@ public interface ItemDao {
@Query("Select title, Item.description, content, link, pub_date, image_link, author, read, text_color, " + @Query("Select title, Item.description, content, link, pub_date, image_link, author, read, text_color, " +
"background_color, read_time, Feed.name, Feed.id as feedId, siteUrl, Folder.id as folder_id, " + "background_color, read_time, Feed.name, Feed.id as feedId, siteUrl, Folder.id as folder_id, " +
"Folder.name as folder_name from Item Inner Join Feed, Folder on Item.feed_id = Feed.id And Item.id = :id " + "Folder.name as folder_name from Item, Feed Left Join Folder on Folder.id = Feed.folder_id And Item.feed_id = Feed.id Where Item.id = :id")
"And Folder.id = Feed.folder_id")
LiveData<ItemWithFeed> getItemById(int id); LiveData<ItemWithFeed> getItemById(int id);
@Query("Select remoteId From Item Where read_changed = 1 And read = 1") @Query("Select remoteId From Item Where read_changed = 1 And read = 1")

View File

@ -2,18 +2,18 @@ package com.readrops.app.views;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.textfield.TextInputEditText;
import androidx.fragment.app.DialogFragment;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Spinner; import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProviders;
import com.google.android.material.textfield.TextInputEditText;
import com.readrops.app.R; import com.readrops.app.R;
import com.readrops.app.database.entities.Feed; import com.readrops.app.database.entities.Feed;
import com.readrops.app.database.entities.Folder; import com.readrops.app.database.entities.Folder;
@ -60,11 +60,10 @@ public class EditFeedDialog extends DialogFragment implements AdapterView.OnItem
viewModel.getFolders().observe(this, folders -> { viewModel.getFolders().observe(this, folders -> {
values = new TreeMap<>(String::compareTo); values = new TreeMap<>(String::compareTo);
values.put(getString(R.string.no_folder), 0);
for (Folder folder : folders) { for (Folder folder : folders) {
if (folder.getId() != 1) values.put(folder.getName(), folder.getId());
values.put(folder.getName(), folder.getId());
else
values.put(getString(R.string.no_folder), 1);
} }
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
@ -74,7 +73,7 @@ public class EditFeedDialog extends DialogFragment implements AdapterView.OnItem
folder.setAdapter(adapter); folder.setAdapter(adapter);
folder.setOnItemSelectedListener(this); folder.setOnItemSelectedListener(this);
if (!feedWithFolder.getFolder().getName().equals("reserved")) if (feedWithFolder.getFolder() != null)
folder.setSelection(adapter.getPosition(feedWithFolder.getFolder().getName())); folder.setSelection(adapter.getPosition(feedWithFolder.getFolder().getName()));
else else
folder.setSelection(adapter.getPosition(getString(R.string.no_folder))); folder.setSelection(adapter.getPosition(getString(R.string.no_folder)));
@ -95,7 +94,9 @@ public class EditFeedDialog extends DialogFragment implements AdapterView.OnItem
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String folderName = (String)parent.getAdapter().getItem(position); String folderName = (String)parent.getAdapter().getItem(position);
feedWithFolder.getFeed().setFolderId(values.get(folderName)); int folderId = values.get(folderName);
feedWithFolder.getFeed().setFolderId(folderId == 0 ? null : folderId);
} }
@Override @Override

View File

@ -1,19 +1,17 @@
package com.readrops.app.views; package com.readrops.app.views;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.AsyncListDiffer;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.readrops.app.R; import com.readrops.app.R;
import com.readrops.app.database.pojo.FeedWithFolder; import com.readrops.app.database.pojo.FeedWithFolder;
@ -23,9 +21,6 @@ import java.util.List;
public class FeedsAdapter extends ListAdapter<FeedWithFolder, FeedsAdapter.ViewHolder> { public class FeedsAdapter extends ListAdapter<FeedWithFolder, FeedsAdapter.ViewHolder> {
public static final String FEED_NAME_KEY = "name";
public static final String FOLDER_NAME_KEY = "folderName";
private ManageFeedsListener listener; private ManageFeedsListener listener;
private static final DiffUtil.ItemCallback<FeedWithFolder> DIFF_CALLBACK = new DiffUtil.ItemCallback<FeedWithFolder>() { private static final DiffUtil.ItemCallback<FeedWithFolder> DIFF_CALLBACK = new DiffUtil.ItemCallback<FeedWithFolder>() {
@ -36,26 +31,18 @@ public class FeedsAdapter extends ListAdapter<FeedWithFolder, FeedsAdapter.ViewH
@Override @Override
public boolean areContentsTheSame(@NonNull FeedWithFolder feedWithFolder, @NonNull FeedWithFolder t1) { public boolean areContentsTheSame(@NonNull FeedWithFolder feedWithFolder, @NonNull FeedWithFolder t1) {
boolean folder = false;
if (feedWithFolder.getFolder() != null && t1.getFolder() != null)
folder = feedWithFolder.getFolder().getName().equals(t1.getFolder().getName());
return feedWithFolder.getFeed().getName().equals(t1.getFeed().getName()) return feedWithFolder.getFeed().getName().equals(t1.getFeed().getName())
&& feedWithFolder.getFolder().getName().equals(t1.getFolder().getName()); && folder;
} }
@Nullable @Nullable
@Override @Override
public Object getChangePayload(@NonNull FeedWithFolder oldItem, @NonNull FeedWithFolder newItem) { public Object getChangePayload(@NonNull FeedWithFolder oldItem, @NonNull FeedWithFolder newItem) {
Bundle bundle = new Bundle(); return newItem;
if (!oldItem.getFeed().getName().equals(newItem.getFeed().getName()))
bundle.putString(FeedsAdapter.FEED_NAME_KEY, newItem.getFeed().getName());
if (!oldItem.getFolder().getName().equals(newItem.getFolder().getName()))
bundle.putString(FeedsAdapter.FOLDER_NAME_KEY, newItem.getFolder().getName());
if (bundle.size() > 0)
return bundle;
else
return null;
} }
}; };
@ -97,7 +84,7 @@ public class FeedsAdapter extends ListAdapter<FeedWithFolder, FeedsAdapter.ViewH
} else } else
viewHolder.feedDescription.setVisibility(View.GONE); viewHolder.feedDescription.setVisibility(View.GONE);
if (feedWithFolder.getFolder().getId() != 1) if (feedWithFolder.getFolder() != null)
viewHolder.folderName.setText(feedWithFolder.getFolder().getName()); viewHolder.folderName.setText(feedWithFolder.getFolder().getName());
else else
viewHolder.folderName.setText(viewHolder.itemView.getResources().getString(R.string.no_folder)); viewHolder.folderName.setText(viewHolder.itemView.getResources().getString(R.string.no_folder));
@ -113,18 +100,15 @@ public class FeedsAdapter extends ListAdapter<FeedWithFolder, FeedsAdapter.ViewH
@Override @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) { public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
if (!payloads.isEmpty()) { if (!payloads.isEmpty()) {
Bundle bundle = (Bundle) payloads.get(0); FeedWithFolder feedWithFolder = (FeedWithFolder) payloads.get(0);
if (bundle.getString(FEED_NAME_KEY) != null) { holder.feedName.setText(feedWithFolder.getFeed().getName());
holder.feedName.setText(bundle.getString(FEED_NAME_KEY));
} if (feedWithFolder.getFolder() != null)
holder.folderName.setText(feedWithFolder.getFolder().getName());
else
holder.folderName.setText(holder.itemView.getContext().getString(R.string.no_folder));
if (bundle.getString(FOLDER_NAME_KEY) != null) {
if (getItem(position).getFolder().getId() != 1)
holder.folderName.setText(bundle.getString(FOLDER_NAME_KEY));
else
holder.folderName.setText(holder.itemView.getContext().getString(R.string.no_folder));
}
} else } else
onBindViewHolder(holder, position); onBindViewHolder(holder, position);
} }

View File

@ -67,9 +67,13 @@ public class MainItemListAdapter extends PagedListAdapter<ItemWithFeed, MainItem
Item item = itemWithFeed.getItem(); Item item = itemWithFeed.getItem();
Item item1 = t1.getItem(); Item item1 = t1.getItem();
boolean folder = false;
if (itemWithFeed.getFolder() != null && t1.getFolder() != null)
folder = itemWithFeed.getFolder().getName().equals(t1.getFolder().getName());
return item.getTitle().equals(item1.getTitle()) && return item.getTitle().equals(item1.getTitle()) &&
itemWithFeed.getFeedName().equals(t1.getFeedName()) && itemWithFeed.getFeedName().equals(t1.getFeedName()) &&
itemWithFeed.getFolder().getName().equals(t1.getFolder().getName()) && folder &&
item.isRead() == item1.isRead() && item.isRead() == item1.isRead() &&
item.isReadItLater() == item1.isReadItLater() && item.isReadItLater() == item1.isReadItLater() &&
itemWithFeed.getColor() == t1.getColor() && itemWithFeed.getColor() == t1.getColor() &&
@ -155,7 +159,7 @@ public class MainItemListAdapter extends PagedListAdapter<ItemWithFeed, MainItem
else else
viewHolder.itemReadTime.setText(resources.getString(R.string.read_time_one_minute)); viewHolder.itemReadTime.setText(resources.getString(R.string.read_time_one_minute));
if (itemWithFeed.getFolder().getId() != 1) if (itemWithFeed.getFolder() != null)
viewHolder.itemFolderName.setText(itemWithFeed.getFolder().getName()); viewHolder.itemFolderName.setText(itemWithFeed.getFolder().getName());
else else
viewHolder.itemFolderName.setText(resources.getString(R.string.no_folder)); viewHolder.itemFolderName.setText(resources.getString(R.string.no_folder));