use of email.schaal.ocreader.database.model.Item in project ocreader by schaal.
the class ListActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_list);
setSupportActionBar(binding.toolbarLayout.toolbar);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
binding.swipeRefreshLayout.setColorSchemeResources(R.color.primary);
binding.swipeRefreshLayout.setOnRefreshListener(this);
profileDrawerItem = new ProfileDrawerItem().withName(preferences.getString(Preferences.USERNAME.getKey(), getString(R.string.app_name))).withEmail(Preferences.URL.getString(preferences));
updateUserProfile();
IProfile profileSettingsItem = new ProfileSettingDrawerItem().withName(getString(R.string.account_settings)).withIconTinted(true).withIcon(R.drawable.ic_settings).withTag((Runnable) () -> {
Intent loginIntent = new Intent(ListActivity.this, LoginActivity.class);
startActivityForResult(loginIntent, LoginActivity.REQUEST_CODE);
});
accountHeader = new AccountHeaderBuilder().withActivity(this).withHeaderBackground(R.drawable.header_background).addProfiles(profileDrawerItem, profileSettingsItem).withCurrentProfileHiddenInList(true).withProfileImagesClickable(false).withSavedInstance(savedInstanceState).withOnAccountHeaderListener((view, profile, current) -> {
if (profile instanceof Tagable) {
Tagable tagable = (Tagable) profile;
if (tagable.getTag() instanceof Runnable) {
((Runnable) tagable.getTag()).run();
return false;
}
}
return true;
}).build();
refreshDrawerItem = new PrimaryDrawerItem().withName(getString(R.string.action_sync)).withSelectable(false).withIconTintingEnabled(true).withIcon(R.drawable.ic_refresh).withIdentifier(REFRESH_DRAWER_ITEM_ID).withTag((Runnable) () -> SyncService.startSync(ListActivity.this));
IDrawerItem settingsDrawerItem = new PrimaryDrawerItem().withName(R.string.settings).withIcon(R.drawable.ic_settings).withIconTintingEnabled(true).withSelectable(false).withTag((Runnable) () -> {
startDrawer.closeDrawer();
Intent settingsIntent = new Intent(ListActivity.this, SettingsActivity.class);
startActivity(settingsIntent);
});
DrawerBuilder startDrawerBuilder = new DrawerBuilder().withActivity(this).withAccountHeader(accountHeader).addStickyDrawerItems(settingsDrawerItem, refreshDrawerItem).withOnDrawerListener(new Drawer.OnDrawerListener() {
@Override
public void onDrawerOpened(View drawerView) {
drawerManager.getStartAdapter().updateUnreadCount(getRealm(), isShowOnlyUnread());
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
}).withOnDrawerItemClickListener((view, position, drawerItem) -> {
if (drawerItem.getTag() instanceof TreeItem) {
TreeItem item = (TreeItem) drawerItem.getTag();
onStartDrawerItemClicked(item);
return false;
} else if (drawerItem.getTag() instanceof Runnable) {
((Runnable) drawerItem.getTag()).run();
}
return true;
}).withSavedInstance(savedInstanceState);
DrawerBuilder endDrawerBuilder = new DrawerBuilder().withActivity(this).withDrawerGravity(Gravity.END).withSavedInstance(savedInstanceState).withShowDrawerOnFirstLaunch(true).withOnDrawerListener(new Drawer.OnDrawerListener() {
@Override
public void onDrawerOpened(View drawerView) {
drawerManager.getEndAdapter().updateUnreadCount(getRealm(), isShowOnlyUnread());
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
}).withOnDrawerItemClickListener((view, position, drawerItem) -> {
if (drawerItem.getTag() instanceof Feed) {
Feed feed = (Feed) drawerItem.getTag();
onEndDrawerItemClicked(feed);
return false;
}
return true;
});
startDrawerBuilder.withToolbar(binding.toolbarLayout.toolbar);
startDrawer = startDrawerBuilder.build();
drawerManager = new DrawerManager(this, startDrawer, endDrawerBuilder.append(startDrawer), unreadSwitchListener);
layoutManager = new LinearLayoutManager(this);
adapter = new ErrorAdapter(this, getRealm(), drawerManager.getState(), this, this);
binding.fabMarkAllAsRead.setOnClickListener(new View.OnClickListener() {
private void onCompletion(View view) {
adapter.updateItems(false);
view.setEnabled(true);
binding.fabMarkAllAsRead.toggleSync();
}
@Override
public void onClick(final View view) {
if (binding.fabMarkAllAsRead.isSync()) {
SyncService.startSync(ListActivity.this);
binding.fabMarkAllAsRead.toggleSync();
} else {
Queries.markTemporaryFeedAsRead(getRealm(), () -> onCompletion(view), error -> {
Log.e(TAG, "Failed to mark temporary feed as read", error);
onCompletion(view);
});
}
}
});
binding.fabMarkAllAsRead.setOnLongClickListener(v -> {
Toast.makeText(ListActivity.this, R.string.mark_all_as_read, Toast.LENGTH_SHORT).show();
return true;
});
binding.itemsRecyclerview.setAdapter(adapter);
binding.itemsRecyclerview.setLayoutManager(layoutManager);
if (savedInstanceState == null && getIntent().hasExtra(SyncService.EXTRA_ID)) {
drawerManager.getState().restore(getRealm(), getIntent().getIntExtra(SyncService.EXTRA_ID, -10), null, false);
} else {
drawerManager.getState().restoreInstanceState(getRealm(), getPreferences(MODE_PRIVATE));
}
binding.itemsRecyclerview.addItemDecoration(new DividerItemDecoration(this, R.dimen.divider_inset));
adapter.updateItems(false);
if (savedInstanceState != null) {
layoutManager.onRestoreInstanceState(savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE));
adapter.onRestoreInstanceState(savedInstanceState);
if (adapter.getSelectedItemsCount() > 0) {
actionMode = startActionMode(this);
}
}
drawerManager.reloadAdapters(getRealm(), isShowOnlyUnread());
// noinspection ConstantConditions
getSupportActionBar().setTitle(drawerManager.getState().getTreeItem().getName());
}
use of email.schaal.ocreader.database.model.Item in project ocreader by schaal.
the class ItemTypeAdapter method fromJson.
@Override
public Item fromJson(@NonNull JsonReader in) throws IOException {
if (in.peek() == JsonReader.Token.NULL) {
in.nextNull();
return null;
}
final NullableJsonReader reader = new NullableJsonReader(in);
final Item.Builder builder = new Item.Builder();
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
switch(name) {
case "id":
builder.setId(in.nextLong());
break;
case "guid":
builder.setGuid(in.nextString());
break;
case "guidHash":
builder.setGuidHash(in.nextString());
break;
case "url":
builder.setUrl(reader.nextString());
break;
case "title":
builder.setTitle(StringUtils.cleanString(in.nextString()));
break;
case "author":
builder.setAuthor(StringUtils.emptyToNull(in.nextString()));
break;
case "pubDate":
builder.setPubDate(new Date(in.nextLong() * 1000));
break;
case "body":
builder.setBody(in.nextString());
break;
case "enclosureMime":
if (in.peek() != JsonReader.Token.NULL)
builder.setEnclosureMime(StringUtils.emptyToNull(in.nextString()));
else
in.skipValue();
break;
case "enclosureLink":
if (in.peek() != JsonReader.Token.NULL)
builder.setEnclosureLink(StringUtils.emptyToNull(in.nextString()));
else
in.skipValue();
break;
case "publishedAt":
builder.setPubDate(parseDate(in.nextString()));
break;
case "updatedAt":
builder.setUpdatedAt(parseDate(in.nextString()));
break;
case "enclosure":
parseEnclosure(reader, builder);
break;
case "feedId":
builder.setFeedId(in.nextLong());
break;
case "isUnread":
case "unread":
builder.setUnread(in.nextBoolean());
break;
case "starred":
case "isStarred":
builder.setStarred(in.nextBoolean());
break;
case "lastModified":
builder.setLastModified(in.nextLong());
break;
case "rtl":
in.skipValue();
break;
case "fingerprint":
builder.setFingerprint(reader.nextString());
break;
case "contentHash":
// ignore for now, old items don't have this set yet.
// item.setContentHash(in.nextString());
in.skipValue();
break;
case "updatedDate":
if (in.peek() == JsonReader.Token.NUMBER)
builder.setUpdatedAt(new Date(in.nextLong() * 1000));
else
in.skipValue();
break;
default:
Log.w(TAG, "Unknown value in item json: " + name);
in.skipValue();
break;
}
}
in.endObject();
return builder.build();
}
use of email.schaal.ocreader.database.model.Item in project ocreader by schaal.
the class JsonTest method TestItemToJson.
@Test
public void TestItemToJson() throws IOException {
Moshi moshi = new Moshi.Builder().add(Item.class, new ItemTypeAdapter()).build();
Item item = new Item.Builder().setId(1).setContentHash("oijoijo").setUnreadChanged(true).setUnread(false).build();
String itemJson = moshi.adapter(Item.class).toJson(item);
ReducedItem reducedItem = moshi.adapter(ReducedItem.class).fromJson(itemJson);
ReducedItem expectedReducedItem = new ReducedItem();
expectedReducedItem.id = 1;
expectedReducedItem.contentHash = "oijoijo";
expectedReducedItem.isUnread = false;
expectedReducedItem.isStarred = null;
assertEquals(expectedReducedItem, reducedItem);
}
use of email.schaal.ocreader.database.model.Item in project ocreader by schaal.
the class APIv12 method markItems.
private boolean markItems(@NonNull final MarkAction action, final Realm realm) throws IOException {
final RealmResults<Item> results = realm.where(Item.class).equalTo(action.getChangedKey(), true).equalTo(action.getKey(), action.getValue()).findAll();
if (results.size() == 0) {
// Nothing to do, countdown and return
return true;
}
ItemIds ids = null;
ItemMap itemMap = null;
if (action == MarkAction.MARK_UNREAD || action == MarkAction.MARK_READ) {
ids = new ItemIds(results);
} else {
itemMap = new ItemMap(results);
}
Response<Void> response;
switch(action) {
case MARK_READ:
response = api.markItemsRead(ids).execute();
break;
case MARK_UNREAD:
response = api.markItemsUnread(ids).execute();
break;
case MARK_STARRED:
response = api.markItemsStarred(itemMap).execute();
break;
case MARK_UNSTARRED:
response = api.markItemsUnstarred(itemMap).execute();
break;
default:
throw new IllegalArgumentException("Unkown mark action");
}
if (response.isSuccessful()) {
realm.executeTransaction(realm1 -> {
if (action == MarkAction.MARK_READ || action == MarkAction.MARK_UNREAD) {
for (Item item : results) {
item.setUnreadChanged(false);
}
} else {
for (Item item : results) {
item.setStarredChanged(false);
}
}
});
}
return response.isSuccessful();
}
use of email.schaal.ocreader.database.model.Item in project ocreader by schaal.
the class DatabaseTest method testItemInsert.
@Test
public void testItemInsert() {
Realm realm = null;
try {
Feed feed = getTestFeed();
Item item = getTestItem();
realm = Realm.getDefaultInstance();
Queries.insert(realm, feed);
Queries.insert(realm, item);
item = realm.where(Item.class).findFirst();
assertEquals(item.getId(), 1);
assertEquals(item.getTitle(), ITEM_TITLE);
assertEquals(item.getBody(), BODY);
assertEquals(item.getAuthor(), AUTHOR);
assertNull(item.getEnclosureLink());
} finally {
assertNotNull(realm);
realm.close();
}
}
Aggregations