Add "Select all" blacklist action

This commit is contained in:
xynngh 2020-10-23 18:48:06 +04:00
parent a9532d5ba6
commit e06dd5fb97
7 changed files with 59 additions and 8 deletions

View File

@ -105,7 +105,11 @@ public class BlacklistActivity extends AppCompatActivity {
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.menu_delete) {
if (item.getItemId() == R.id.menu_select_all) {
selectionTracker.setItemsSelected(blacklistDataSourceFactory
.getCurrentDataSource().getAllIds(), true);
return true;
} else if (item.getItemId() == R.id.menu_delete) {
new AlertDialog.Builder(BlacklistActivity.this)
.setTitle(R.string.are_you_sure)
.setMessage(R.string.blacklist_delete_confirmation)

View File

@ -8,6 +8,7 @@ import org.greenrobot.greendao.query.QueryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Iterator;
import java.util.List;
import dummydomain.yetanothercallblocker.data.db.BlacklistDao;
@ -26,6 +27,10 @@ public class BlacklistDataSource extends PositionalDataSource<BlacklistItem> {
this.blacklistDao = blacklistDao;
}
public BlacklistDataSource getCurrentDataSource() {
return ds;
}
public void invalidate() {
LOG.debug("invalidate()");
@ -48,6 +53,27 @@ public class BlacklistDataSource extends PositionalDataSource<BlacklistItem> {
this.blacklistDao = blacklistDao;
}
/**
* The iterable must be iterated through
* or the underlying cursor won't be closed.
*
* @return an iterable containing ids of all items this DS would load
*/
public Iterable<Long> getAllIds() {
Iterator<BlacklistItem> iterator = newQueryBuilder().listIterator();
return () -> new Iterator<Long>() {
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Long next() {
return iterator.next().getId();
}
};
}
@Override
public void loadInitial(@NonNull LoadInitialParams params,
@NonNull LoadInitialCallback<BlacklistItem> callback) {
@ -60,7 +86,7 @@ public class BlacklistDataSource extends PositionalDataSource<BlacklistItem> {
Integer totalCount = null;
if (items.isEmpty()) {
totalCount = (int) blacklistDao.countAll();
totalCount = (int) countAll();
if (totalCount > 0) {
LOG.debug("loadInitial() initial range is empty: totalCount={}, offset={}",
totalCount, offset);
@ -78,7 +104,7 @@ public class BlacklistDataSource extends PositionalDataSource<BlacklistItem> {
}
if (params.placeholdersEnabled) {
if (totalCount == null) totalCount = (int) blacklistDao.countAll();
if (totalCount == null) totalCount = (int) countAll();
callback.onResult(items, offset, totalCount);
} else {
@ -103,11 +129,19 @@ public class BlacklistDataSource extends PositionalDataSource<BlacklistItem> {
return blacklistDao.detach(items); // for DiffUtil to work
}
private long countAll() {
return newQueryBuilder().count();
}
private QueryBuilder<BlacklistItem> getQueryBuilder() {
if (queryBuilder == null) {
queryBuilder = blacklistDao.getDefaultQueryBuilder();
queryBuilder = newQueryBuilder();
}
return queryBuilder;
}
private QueryBuilder<BlacklistItem> newQueryBuilder() {
return blacklistDao.getDefaultQueryBuilder();
}
}

View File

@ -82,10 +82,6 @@ public class BlacklistDao {
getBlacklistItemDao().deleteByKeyInTx(keys);
}
public long countAll() {
return getBlacklistItemDao().queryBuilder().count();
}
public long countValid() {
return getBlacklistItemDao().queryBuilder()
.where(BlacklistItemDao.Properties.Invalid.notEq(true)).count();

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z" />
</vector>

View File

@ -2,6 +2,12 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_select_all"
android:icon="@drawable/ic_select_all_24dp"
android:title="@string/blacklist_select_all"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_delete"
android:icon="@drawable/ic_delete_24dp"

View File

@ -141,6 +141,7 @@
<string name="blacklist_item_date_no_info">нет информации</string>
<string name="blacklist_item_no_calls">Никогда не звонил</string>
<string name="blacklist_add">Добавить</string>
<string name="blacklist_select_all">Выделить все</string>
<string name="blacklist_delete">Удалить</string>
<string name="blacklist_delete_confirmation">Удалить выбранные элементы?</string>
<string name="blacklist_export">Экспортировать</string>

View File

@ -158,6 +158,7 @@
<string name="blacklist_item_date_no_info">no info</string>
<string name="blacklist_item_no_calls">Never called</string>
<string name="blacklist_add">Add</string>
<string name="blacklist_select_all">Select all</string>
<string name="blacklist_delete">Delete</string>
<string name="blacklist_delete_confirmation">Delete the selected items?</string>
<string name="blacklist_export">Export</string>