Move archive mode into a display option (#1477)

This commit is contained in:
Sylvia van Os
2023-08-27 22:55:45 +02:00
committed by GitHub
parent 92802fd467
commit 715df432a9
43 changed files with 259 additions and 407 deletions

View File

@@ -47,25 +47,19 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
finish();
}
// If all cards are archived, bail
if (DBHelper.getArchivedCardsCount(mDatabase) == cardCount) {
Toast.makeText(this, R.string.noUnarchivedCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
final RecyclerView cardList = binding.list;
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
if (layoutManager != null) {
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
}
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this);
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
cardList.setAdapter(mAdapter);
}
private void onClickAction(int position) {
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected);
@@ -89,8 +83,8 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_shown_details) {
mAdapter.showSelectDetailDisplayDialog();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;

View File

@@ -1,7 +1,6 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
@@ -18,14 +17,12 @@ import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
@@ -39,123 +36,34 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
boolean mDarkModeEnabled;
public final Context mContext;
private final CardAdapterListener mListener;
private final LoyaltyCardListDisplayOptionsManager mLoyaltyCardListDisplayOptions;
protected SparseBooleanArray mSelectedItems;
protected SparseBooleanArray mAnimationItemsIndex;
private boolean mReverseAllAnimations = false;
private boolean mShowNameBelowThumbnail;
private boolean mShowNote;
private boolean mShowBalance;
private boolean mShowValidity;
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) {
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Runnable inputSwapCursorCallback) {
super(inputCursor, DBHelper.LoyaltyCardDbIds.ID);
setHasStableIds(true);
mContext = inputContext;
mListener = inputListener;
Runnable refreshCardsCallback = () -> notifyDataSetChanged();
mLoyaltyCardListDisplayOptions = new LoyaltyCardListDisplayOptionsManager(mContext, refreshCardsCallback, inputSwapCursorCallback);
mSelectedItems = new SparseBooleanArray();
mAnimationItemsIndex = new SparseBooleanArray();
mDarkModeEnabled = Utils.isDarkModeEnabled(inputContext);
refreshState();
swapCursor(inputCursor);
}
private void saveDetailState(int stateId, boolean value) {
SharedPreferences cardDetailsPref = mContext.getSharedPreferences(
mContext.getString(R.string.sharedpreference_card_details),
Context.MODE_PRIVATE);
SharedPreferences.Editor cardDetailsPrefEditor = cardDetailsPref.edit();
cardDetailsPrefEditor.putBoolean(mContext.getString(stateId), value);
cardDetailsPrefEditor.apply();
public void showDisplayOptionsDialog() {
mLoyaltyCardListDisplayOptions.showDisplayOptionsDialog();
}
public void refreshState() {
// Retrieve user details preference
SharedPreferences cardDetailsPref = mContext.getSharedPreferences(
mContext.getString(R.string.sharedpreference_card_details),
Context.MODE_PRIVATE);
mShowNameBelowThumbnail = cardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_name_below_thumbnail), false);
mShowNote = cardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_note), true);
mShowBalance = cardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_balance), true);
mShowValidity = cardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_validity), true);
}
public void showNameBelowThumbnail(boolean show) {
mShowNameBelowThumbnail = show;
notifyDataSetChanged();
saveDetailState(R.string.sharedpreference_card_details_show_name_below_thumbnail, show);
}
public boolean showingNameBelowThumbnail() {
return mShowNameBelowThumbnail;
}
public void showNote(boolean show) {
mShowNote = show;
notifyDataSetChanged();
saveDetailState(R.string.sharedpreference_card_details_show_note, show);
}
public boolean showingNote() {
return mShowNote;
}
public void showBalance(boolean show) {
mShowBalance = show;
notifyDataSetChanged();
saveDetailState(R.string.sharedpreference_card_details_show_balance, show);
}
public boolean showingBalance() {
return mShowBalance;
}
public void showValidity(boolean show) {
mShowValidity = show;
notifyDataSetChanged();
saveDetailState(R.string.sharedpreference_card_details_show_validity, show);
}
public boolean showingValidity() {
return mShowValidity;
}
public void showSelectDetailDisplayDialog() {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(mContext);
builder.setTitle(R.string.action_show_details);
builder.setMultiChoiceItems(
new String[]{
mContext.getString(R.string.show_name_below_image_thumbnail),
mContext.getString(R.string.show_note),
mContext.getString(R.string.show_balance),
mContext.getString(R.string.show_validity)
},
new boolean[]{
showingNameBelowThumbnail(),
showingNote(),
showingBalance(),
showingValidity()
},
(dialogInterface, i, b) -> {
switch (i) {
case 0: showNameBelowThumbnail(b); break;
case 1: showNote(b); break;
case 2: showBalance(b); break;
case 3: showValidity(b); break;
default: throw new IndexOutOfBoundsException("No such index exists in LoyaltyCardCursorAdapter show details view");
}
}
);
builder.setPositiveButton(R.string.ok, (dialog, i) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
public boolean showingArchivedCards() {
return mLoyaltyCardListDisplayOptions.showingArchivedCards();
}
@NonNull
@@ -182,33 +90,33 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
Bitmap icon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
if (mShowNameBelowThumbnail && icon != null) {
if (mLoyaltyCardListDisplayOptions.showingNameBelowThumbnail() && icon != null) {
showDivider = true;
inputHolder.setStoreField(loyaltyCard.store);
} else {
inputHolder.setStoreField(null);
}
if (mShowNote && !loyaltyCard.note.isEmpty()) {
if (mLoyaltyCardListDisplayOptions.showingNote() && !loyaltyCard.note.isEmpty()) {
showDivider = true;
inputHolder.setNoteField(loyaltyCard.note);
} else {
inputHolder.setNoteField(null);
}
if (mShowBalance && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
if (mLoyaltyCardListDisplayOptions.showingBalance() && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null, showDivider);
} else {
inputHolder.setExtraField(inputHolder.mBalanceField, null, null, false);
}
if (mShowValidity && loyaltyCard.validFrom != null) {
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.validFrom != null) {
inputHolder.setExtraField(inputHolder.mValidFromField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.validFrom), Utils.isNotYetValid(loyaltyCard.validFrom) ? Color.RED : null, showDivider);
} else {
inputHolder.setExtraField(inputHolder.mValidFromField, null, null, false);
}
if (mShowValidity && loyaltyCard.expiry != null) {
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.expiry != null) {
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null, showDivider);
} else {
inputHolder.setExtraField(inputHolder.mExpiryField, null, null, false);

View File

@@ -0,0 +1,176 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class LoyaltyCardListDisplayOptionsManager {
public static class LoyaltyCardDisplayOption {
public String name;
public boolean value;
public Consumer<Boolean> callback;
LoyaltyCardDisplayOption(String name, boolean value, Consumer<Boolean> callback) {
this.name = name;
this.value = value;
this.callback = callback;
}
}
public final Context mContext;
private final Runnable mRefreshCardsCallback;
private final Runnable mSwapCursorCallback;
protected SharedPreferences mCardDetailsPref;
private boolean mShowNameBelowThumbnail;
private boolean mShowNote;
private boolean mShowBalance;
private boolean mShowValidity;
private boolean mShowArchivedCards;
public LoyaltyCardListDisplayOptionsManager(Context context, @NonNull Runnable refreshCardsCallback, @Nullable Runnable swapCursorCallback) {
mContext = context;
mRefreshCardsCallback = refreshCardsCallback;
mSwapCursorCallback = swapCursorCallback;
// Retrieve user details preference
mCardDetailsPref = mContext.getSharedPreferences(
mContext.getString(R.string.sharedpreference_card_details),
Context.MODE_PRIVATE);
mShowNameBelowThumbnail = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_name_below_thumbnail), false);
mShowNote = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_note), true);
mShowBalance = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_balance), true);
mShowValidity = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_validity), true);
mShowArchivedCards = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_archived_cards), true);
}
void saveDetailState(int stateId, boolean value) {
SharedPreferences.Editor cardDetailsPrefEditor = mCardDetailsPref.edit();
cardDetailsPrefEditor.putBoolean(mContext.getString(stateId), value);
cardDetailsPrefEditor.apply();
}
public void showNameBelowThumbnail(boolean show) {
mShowNameBelowThumbnail = show;
mRefreshCardsCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_name_below_thumbnail, show);
}
public boolean showingNameBelowThumbnail() {
return mShowNameBelowThumbnail;
}
public void showNote(boolean show) {
mShowNote = show;
mRefreshCardsCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_note, show);
}
public boolean showingNote() {
return mShowNote;
}
public void showBalance(boolean show) {
mShowBalance = show;
mRefreshCardsCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_balance, show);
}
public boolean showingBalance() {
return mShowBalance;
}
public void showValidity(boolean show) {
mShowValidity = show;
mRefreshCardsCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_validity, show);
}
public boolean showingValidity() {
return mShowValidity;
}
public void showArchivedCards(boolean show) {
if (mSwapCursorCallback == null) {
throw new IllegalStateException("No swap cursor callback is available, can not manage archive state");
}
mShowArchivedCards = show;
mSwapCursorCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_archived_cards, show);
}
public boolean showingArchivedCards() {
if (mSwapCursorCallback == null) {
throw new IllegalStateException("No swap cursor callback is available, can not manage archive state");
}
return mShowArchivedCards;
}
public void showDisplayOptionsDialog() {
List<LoyaltyCardDisplayOption> displayOptions = new ArrayList<>();
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_name_below_image_thumbnail),
showingNameBelowThumbnail(),
this::showNameBelowThumbnail
));
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_note),
showingNote(),
this::showNote
));
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_balance),
showingBalance(),
this::showBalance
));
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_validity),
showingValidity(),
this::showValidity
));
// Hide "Show archived cards" option unless the callback exists
if (mSwapCursorCallback != null) {
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_archived_cards),
showingArchivedCards(),
this::showArchivedCards
));
}
// We need to convert Boolean[] to boolean[]
boolean[] values = new boolean[displayOptions.size()];
for (int i = 0; i < values.length; i++) values[i] = displayOptions.get(i).value;
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(mContext);
builder.setTitle(R.string.action_display_options);
builder.setMultiChoiceItems(
displayOptions.stream().map(x -> x.name).toArray(String[]::new),
values,
(dialogInterface, i, b) -> displayOptions.get(i).callback.accept(b)
);
builder.setPositiveButton(R.string.ok, (dialog, i) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
}
}

View File

@@ -41,7 +41,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import protect.card_locker.databinding.ArchiveActivityBinding;
import protect.card_locker.databinding.ContentMainBinding;
import protect.card_locker.databinding.MainActivityBinding;
import protect.card_locker.databinding.SortingOptionBinding;
@@ -49,7 +48,6 @@ import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private MainActivityBinding binding;
private ArchiveActivityBinding archiveActivityBinding;
private ContentMainBinding contentMainBinding;
private static final String TAG = "Catima";
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
@@ -72,8 +70,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private View mNoGroupCardsText;
private TabLayout groupsTabLayout;
private boolean mArchiveMode;
public static final String BUNDLE_ARCHIVE_MODE = "archiveMode";
private Runnable mSwapLoyaltyCardListCursor;
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
private ActivityResultLauncher<Intent> mSettingsLauncher;
@@ -229,28 +226,25 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
extractIntentFields(getIntent());
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
if (!mArchiveMode) {
binding = MainActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.app_name);
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
groupsTabLayout = binding.groups;
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot());
} else {
archiveActivityBinding = ArchiveActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.archiveList);
setContentView(archiveActivityBinding.getRoot());
setSupportActionBar(archiveActivityBinding.toolbar);
groupsTabLayout = archiveActivityBinding.groups;
contentMainBinding = ContentMainBinding.bind(archiveActivityBinding.include.getRoot());
}
if(mArchiveMode) {
enableToolbarBackButton();
}
binding = MainActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.app_name);
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
groupsTabLayout = binding.groups;
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot());
mDatabase = new DBHelper(this).getWritableDatabase();
mSwapLoyaltyCardListCursor = () -> {
Group group = null;
if (mGroup != null) {
group = (Group) mGroup;
}
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection, mAdapter.showingArchivedCards() ? DBHelper.LoyaltyCardArchiveFilter.All : DBHelper.LoyaltyCardArchiveFilter.Unarchived));
};
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
@@ -283,7 +277,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
mNoGroupCardsText = contentMainBinding.noGroupCardsText;
mCardList = contentMainBinding.list;
mAdapter = new LoyaltyCardCursorAdapter(this, null, this);
mAdapter = new LoyaltyCardCursorAdapter(this, null, this, mSwapLoyaltyCardListCursor);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
@@ -349,8 +343,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
protected void onResume() {
super.onResume();
mAdapter.refreshState();
if (mCurrentActionMode != null) {
mAdapter.clearSelections();
mCurrentActionMode.finish();
@@ -398,27 +390,25 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
groupsTabLayout.selectTab(tab);
assert tab != null;
mGroup = tab.getTag();
} else if (!mArchiveMode) {
} else {
scaleScreen();
}
updateLoyaltyCardList(true);
// End of active tab logic
if (!mArchiveMode) {
FloatingActionButton addButton = binding.fabAdd;
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
Bundle bundle = new Bundle();
if (selectedTab != 0) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, groupsTabLayout.getTabAt(selectedTab).getText().toString());
}
intent.putExtras(bundle);
mBarcodeScannerLauncher.launch(intent);
});
addButton.bringToFront();
}
addButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
Bundle bundle = new Bundle();
if (selectedTab != 0) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, groupsTabLayout.getTabAt(selectedTab).getText().toString());
}
intent.putExtras(bundle);
mBarcodeScannerLauncher.launch(intent);
});
addButton.bringToFront();
}
@Override
@@ -432,7 +422,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
private void displayCardSetupOptions(Menu menu, boolean shouldShow) {
for (int id : new int[]{R.id.action_search, R.id.action_shown_details, R.id.action_sort}) {
for (int id : new int[]{R.id.action_search, R.id.action_display_options, R.id.action_sort}) {
menu.findItem(id).setVisible(shouldShow);
}
}
@@ -442,12 +432,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
private void updateLoyaltyCardList(boolean updateCount) {
Group group = null;
if (mGroup != null) {
group = (Group) mGroup;
}
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection, mArchiveMode ? DBHelper.LoyaltyCardArchiveFilter.Archived : DBHelper.LoyaltyCardArchiveFilter.Unarchived));
mSwapLoyaltyCardListCursor.run();
if (updateCount) {
updateLoyaltyCardCount();
@@ -478,12 +463,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
}
} else {
if (mArchiveMode) {
// If an user deletes the last card in archive mode, we should close the activity
// This will move us back to the main view
finish();
}
mCardList.setVisibility(View.GONE);
mHelpSection.setVisibility(View.VISIBLE);
@@ -557,8 +536,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
private void extractIntentFields(Intent intent) {
final Bundle b = intent.getExtras();
mArchiveMode = b != null && b.getBoolean(BUNDLE_ARCHIVE_MODE, false);
onSharedIntent(intent);
}
@@ -591,11 +568,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
if (!mArchiveMode) {
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
} else {
getMenuInflater().inflate(R.menu.archive_menu, inputMenu);
}
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
displayCardSetupOptions(inputMenu, mLoyaltyCardCount > 0);
@@ -630,14 +603,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
});
}
if (!mArchiveMode) {
if (DBHelper.getArchivedCardsCount(mDatabase) == 0) {
inputMenu.findItem(R.id.action_archived).setVisible(false);
} else {
inputMenu.findItem(R.id.action_archived).setVisible(true);
}
}
return super.onCreateOptionsMenu(inputMenu);
}
@@ -649,8 +614,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
onBackPressed();
}
if (id == R.id.action_shown_details) {
mAdapter.showSelectDetailDisplayDialog();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
@@ -706,15 +671,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
return true;
}
if (id == R.id.action_archived) {
Intent i = new Intent(getApplicationContext(), MainActivity.class);
Bundle bundle = new Bundle();
bundle.putBoolean("archiveMode", true);
i.putExtras(bundle);
startActivity(i);
return true;
}
if (id == R.id.action_import_export) {
Intent i = new Intent(getApplicationContext(), ImportExportActivity.class);
startActivity(i);
@@ -794,30 +750,31 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
boolean hasStarred = false;
boolean hasUnstarred = false;
if (!mArchiveMode) {
unarchiveItem.setVisible(false);
archiveItem.setVisible(true);
} else {
unarchiveItem.setVisible(true);
archiveItem.setVisible(false);
}
boolean hasArchived = false;
boolean hasUnarchived = false;
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
if (loyaltyCard.starStatus == 1) {
hasStarred = true;
} else {
hasUnstarred = true;
}
if (hasStarred && hasUnstarred) {
hasStarred = true;
hasUnstarred = true;
if (loyaltyCard.archiveStatus == 1) {
hasArchived = true;
} else {
hasUnarchived = true;
}
// We have all types, no need to keep checking
if (hasStarred && hasUnstarred && hasArchived && hasUnarchived) {
break;
}
}
unarchiveItem.setVisible(hasArchived);
archiveItem.setVisible(hasUnarchived);
if (count == 1) {
starItem.setVisible(!hasStarred);
unstarItem.setVisible(!hasUnstarred);

View File

@@ -28,7 +28,6 @@ import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.ActivityManageGroupBinding;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private ActivityManageGroupBinding binding;
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
@@ -100,7 +99,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
}
mGroupNameText.setText(mGroup._id);
setTitle(getString(R.string.editGroup, mGroup._id));
mAdapter = new ManageGroupCursorAdapter(this, null, this, mGroup);
mAdapter = new ManageGroupCursorAdapter(this, null, this, mGroup, null);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
@@ -167,8 +166,8 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_shown_details) {
mAdapter.showSelectDetailDisplayDialog();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;

View File

@@ -16,8 +16,8 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
final private Group mGroup;
final private SQLiteDatabase mDatabase;
public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group) {
super(inputContext, inputCursor, inputListener);
public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group, Runnable inputSwapCursorCallback) {
super(inputContext, inputCursor, inputListener, inputSwapCursorCallback);
mGroup = new Group(group._id, group.order);
mInGroupOverlay = new HashMap<>();
mDatabase = new DBHelper(inputContext).getWritableDatabase();

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
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:fitsSystemWindows="true"
tools:context="protect.card_locker.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
style="?attr/toolbarStyle" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable"
android:visibility="gone"/>
</com.google.android.material.appbar.AppBarLayout>
<include
android:id="@+id/include"
layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -1,24 +0,0 @@
<menu 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"
tools:context="protect.card_locker.MainActivity">
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_search_white"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView"
android:visible="false"/>
<item
android:id="@+id/action_shown_details"
android:title="@string/action_show_details"
android:icon="@drawable/baseline_visibility_24"
app:showAsAction="always"
android:visible="false"/>
<item
android:id="@+id/action_sort"
android:title="@string/sort"
android:icon="@drawable/ic_baseline_sort_24"
app:showAsAction="always"
android:visible="false"/>
</menu>

View File

@@ -1,8 +1,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_shown_details"
android:title="@string/action_show_details"
android:id="@+id/action_display_options"
android:title="@string/action_display_options"
android:icon="@drawable/baseline_visibility_24"
app:showAsAction="always"
android:visible="true"/>

View File

@@ -10,8 +10,8 @@
app:showAsAction="always|collapseActionView"
android:visible="false"/>
<item
android:id="@+id/action_shown_details"
android:title="@string/action_show_details"
android:id="@+id/action_display_options"
android:title="@string/action_display_options"
android:icon="@drawable/baseline_visibility_24"
app:showAsAction="always"
android:visible="false"/>
@@ -26,10 +26,6 @@
android:icon="@drawable/ic_folder_white"
android:title="@string/groups"
app:showAsAction="never"/>
<item
android:id="@+id/action_archived"
android:title="@string/archiveList"
app:showAsAction="never"/>
<item
android:id="@+id/action_import_export"
android:icon="@drawable/ic_import_export_white_24dp"

View File

@@ -150,7 +150,6 @@
<string name="unarchive">أخرج من الأرشيف</string>
<string name="archived">تمت أرشفة البطاقة</string>
<string name="unarchived">البطاقة غير مؤرشفة</string>
<string name="archiveList">أرشيف</string>
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذه المجموعة.</string>
<string name="deleteTitle">مسح بطاقة</string>
@@ -171,7 +170,6 @@
<string name="license">رخصة</string>
<string name="sort_by_name">اسم</string>
<string name="version_history">تاريخ النسخة</string>
<string name="action_hide_details">أخف التفاصيل</string>
<plurals name="groupCardCountWithArchived">
<item quantity="zero"><xliff:g>%1$d</xliff:g> بطاقة ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="one"><xliff:g>%1$d</xliff:g> بطاقة ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
@@ -245,7 +243,6 @@
<string name="on_github">على GitHub</string>
<string name="report_error">الإبلاغ عن خطأ</string>
<string name="sort_by_expiry">انقضاء</string>
<string name="noUnarchivedCardsMessage">لا توجد بطاقات غير مؤرشفة موجودة</string>
<string name="importLoyaltyCardKeychain">الاستيراد من Loyalty Card Keychain</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="importLoyaltyCardKeychainMessage">حدد ملفك <i>LoyaltyCardKeychain.csv</i> التصدير من Loyalty Card Keychain للاستيراد.
@@ -256,7 +253,6 @@
\nلا يتم جمع أي بيانات على الإطلاق ، والتي يمكن لأي شخص تأكيدها لأن تطبيقنا هو برنامج حر.</string>
<string name="failedGeneratingShareURL">تعذر إنشاء عنوان URL قابل للمشاركة. الرجاء الإبلاغ عن هذا.</string>
<string name="help_translate_this_app">ساعد في ترجمة هذا التطبيق</string>
<string name="action_show_details">اظهر التفاصيل</string>
<string name="on_google_play">على Google Play</string>
<string name="settings_theme_color">لون المظهر</string>
<string name="previousCard">السابق</string>

View File

@@ -203,8 +203,6 @@
<string name="selectColor">Избиране на цвят</string>
<string name="group_name_is_empty">Името на списъка не може да е празно</string>
<string name="group_edit">Редактиране на списък</string>
<string name="action_show_details">Подробности под картата</string>
<string name="action_hide_details">По-малко детайли</string>
<string name="noGiftCardsGroup">Създайте карти и ги зачислите към списък от тук.</string>
<string name="translate_platform">в Weblate</string>
<string name="shortcutSelectCard">Избор на карта</string>
@@ -228,8 +226,6 @@
<string name="unarchive">Изваждане от архива</string>
<string name="archived">Картата е архивирана</string>
<string name="unarchived">Карта е извадена от архива</string>
<string name="archiveList">Архив</string>
<string name="noUnarchivedCardsMessage">Няма карти извън архива</string>
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карта (<xliff:g id="archivedCount">%2$d</xliff:g> архивирана)</item>

View File

@@ -197,7 +197,6 @@
\nলয়্যালটি কার্ড কীচেনের আমদানি/রপ্তানি মেনু থেকে প্রথমে সেখানে রপ্তানি টিপে এটি তৈরি করুন।</string>
<string name="selectColor">রঙ নির্বাচন করুন</string>
<string name="unarchived">কার্ড সংরক্ষণাগারমুক্ত করা হয়েছে</string>
<string name="archiveList">সংরক্ষণাগার</string>
<string name="report_error">ভুল প্রতিবেদন</string>
<string name="failedLaunchingPhotoPicker">একটি সমর্থিত গ্যালারি অ্যাপ খুঁজে পাওয়া যায়নি</string>
<plurals name="groupCardCountWithArchived">
@@ -234,8 +233,6 @@
<string name="barcodeLongPressMessage">গ্যালারি অ্যাপে শুধুমাত্র ছবি খোলা যাবে</string>
<string name="translate_platform">Weblate-এ</string>
<string name="on_google_play">Google Play-তে</string>
<string name="action_show_details">বিস্তারিত দেখাও</string>
<string name="action_hide_details">আড়াল বিস্তারিত</string>
<string name="shortcutSelectCard">একটি কার্ড নির্বাচন করুন</string>
<string name="options">অপশন</string>
<string name="starred">তারকাচিহ্নিত</string>
@@ -254,7 +251,6 @@
<string name="archive">সংরক্ষণ করুন</string>
<string name="unarchive">সংরক্ষণাগারমুক্ত করুন</string>
<string name="archived">কার্ড সংরক্ষণাগারভুক্ত</string>
<string name="noUnarchivedCardsMessage">আর্কাইভ করা কোনো কার্ড নেই</string>
<string name="welcome">Catima-তে স্বাগতম</string>
<string name="updateBalanceTitle">আপনি কত খরচ করেছেন\?</string>
<string name="updateBalanceHint">পরিমান লিখুন</string>

View File

@@ -210,8 +210,6 @@
<string name="editGroup">Úprava skupiny: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Zatím nemáte žádné věrnostní karty. Jakmile nějaké přidáte, můžete je zde přiřadit do skupiny.</string>
<string name="shortcutSelectCard">Vybrat kartu</string>
<string name="action_show_details">Zobrazit detaily</string>
<string name="action_hide_details">Skrýt detaily</string>
<string name="translate_platform">na Weblate</string>
<string name="showMoreInfo">Zobrazit podrobnosti</string>
<string name="starred">S hvězdičkou</string>
@@ -228,8 +226,6 @@
<string name="settings_lock_on_opening_orientation">Ponechat orientaci jako při otevření karty</string>
<string name="archive">Archivovat</string>
<string name="unarchive">Vrátit z archivu</string>
<string name="archiveList">Archiv</string>
<string name="noUnarchivedCardsMessage">Nejsou žádné karty vrácené z archivu</string>
<string name="unarchived">Karta vrácena z archivu</string>
<string name="settings_card_orientation">Orientace čárového kódu</string>
<string name="settings_landscape_orientation">Na šířku</string>

View File

@@ -205,8 +205,6 @@
<string name="noGiftCardsGroup">Erstelle einige Karten und ordne sie dann hier der Gruppe zu.</string>
<string name="setIcon">Vorschau setzen</string>
<string name="selectColor">Farbe auswählen</string>
<string name="action_show_details">Details anzeigen</string>
<string name="action_hide_details">Details ausblenden</string>
<string name="translate_platform">auf Weblate</string>
<string name="shortcutSelectCard">Wählen Sie eine Karte</string>
<string name="options">Optionen</string>
@@ -220,8 +218,6 @@
<string name="include_if_asking_support">Wenn Sie Unterstützung anfordern möchten, geben Sie bitte die folgenden Informationen an:</string>
<string name="settings_follow_system_orientation">System folgen</string>
<string name="settings_landscape_orientation">Landschaft</string>
<string name="archiveList">Archiv</string>
<string name="noUnarchivedCardsMessage">Es gibt keine nicht archivierten Karten</string>
<string name="settings_portrait_orientation">Porträt</string>
<string name="duplicateCard">Duplizieren</string>
<string name="unarchive">Archivierung aufheben</string>

View File

@@ -105,7 +105,6 @@
<string name="removeImage">Αφαίρεση εικόνας</string>
<string name="takePhoto">Τραβήξτε μια φωτογραφία</string>
<string name="updateBarcodeQuestionText">Αλλάξατε τον κωδικό. Θέλετε να ενημερώσετε και τον γραμμοκώδικα στην ίδια τιμή;</string>
<string name="action_show_details">Εμφάνιση λεπτομερειών</string>
<string name="options">Επιλογές</string>
<string name="noGroupCards">Αυτή η ομάδα είναι άδεια</string>
<string name="settings_display_barcode_max_brightness">Επιπλέον φωτισμός γραμμοκώδικα</string>
@@ -152,7 +151,6 @@
<string name="app_libraries">Ελεύθερες βιβλιοθήκες τρίτων: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="license">Άδεια</string>
<string name="include_if_asking_support">Αν θέλετε να ζητήσετε υποστήριξη, συμπεριλάβετε τις ακόλουθες πληροφορίες:</string>
<string name="action_hide_details">Απόκρυψη λεπτομερειών</string>
<string name="importSuccessful">Δεδομένα εισήχθησαν</string>
<string name="moveUp">Προχώρα πάνω</string>
<string name="barcodeType">Τύπος γραμμοκώδικα</string>
@@ -233,8 +231,6 @@
<string name="archived">Η κάρτα αρχειοθετήθηκε</string>
<string name="unarchived">Η κάρτα αφαιρέθηκε από το αρχείο</string>
<string name="unarchive">Αφαίρεση από το αρχείο</string>
<string name="archiveList">Αρχείο</string>
<string name="noUnarchivedCardsMessage">Δεν υπάρχουν αρχειοθετημένες κάρτες</string>
<string name="updateBalanceTitle">Πόσα ξοδέψατε;</string>
<string name="cameraPermissionDeniedTitle">Αδύνατη η πρόσβαση στην κάμερα</string>
<string name="failedToRetrieveImageFile">Αποτυχία ανάκτησης αρχείου εικόνας</string>

View File

@@ -211,9 +211,7 @@
<string name="on_github">En GitHub</string>
<string name="on_google_play">en Google Play</string>
<string name="report_error">Informar de un error</string>
<string name="action_hide_details">Ocultar detalles</string>
<string name="translate_platform">en Weblate</string>
<string name="action_show_details">Mostrar detalles</string>
<string name="selectColor">Seleccione el color</string>
<string name="setIcon">Establecer una miniatura</string>
<string name="sort">Ordenar</string>
@@ -240,8 +238,6 @@
<string name="archive">Archivar</string>
<string name="archived">Tarjeta archivada</string>
<string name="unarchived">Tarjeta desarchivada</string>
<string name="archiveList">Archivo</string>
<string name="noUnarchivedCardsMessage">No existen tarjetas sin archivar</string>
<string name="exportPassword">Establezca una contraseña para proteger su exportación (opcional)</string>
<string name="failedLaunchingPhotoPicker">No se ha podido encontrar una aplicación de galería compatible</string>
<plurals name="groupCardCountWithArchived">

View File

@@ -202,8 +202,6 @@
<string name="and_data_usage">ja datan käyttö</string>
<string name="on_google_play">Google Playssa</string>
<string name="report_error">Ilmoita virheestä</string>
<string name="action_show_details">Näytä tiedot</string>
<string name="action_hide_details">Piilota tiedot</string>
<string name="shortcutSelectCard">Valitse kortti</string>
<string name="starred">Tähdellä merkityt</string>
<string name="options">Vaihtoehdot</string>
@@ -222,12 +220,10 @@
<string name="settings_portrait_orientation">Pysty</string>
<string name="settings_landscape_orientation">Vaaka</string>
<string name="unarchived">Kortti on poistettu arkistosta</string>
<string name="noUnarchivedCardsMessage">Arkistoimattomia kortteja ei ole olemassa</string>
<string name="unarchive">Poista arkistosta</string>
<string name="archived">Kortti arkistoitu</string>
<string name="failedLaunchingPhotoPicker">Tuettua galleriasovellusta ei löytynyt</string>
<string name="settings_card_orientation">Viivakoodin suuntaus</string>
<string name="archiveList">Arkisto</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kortti (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> korttia (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>

View File

@@ -209,8 +209,6 @@
<string name="group_name_is_empty">Le nom du groupe ne peut pas être vide</string>
<string name="setIcon">Définir la vignette</string>
<string name="selectColor">Sélectionnez la couleur</string>
<string name="action_show_details">Afficher les détails</string>
<string name="action_hide_details">Masquer les détails</string>
<string name="translate_platform">sur Weblate</string>
<string name="shortcutSelectCard">Sélectionnez une carte</string>
<string name="options">Options</string>
@@ -233,8 +231,6 @@
<string name="unarchive">Désarchiver</string>
<string name="archived">Carte archivée</string>
<string name="unarchived">Carte désarchivée</string>
<string name="archiveList">Archives</string>
<string name="noUnarchivedCardsMessage">Il n\'existe aucune carte non archivée</string>
<string name="failedLaunchingPhotoPicker">Impossible de trouver une application de galerie prise en charge</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> carte (<xliff:g id="archivedCount">%2$d</xliff:g> archivée)</item>

View File

@@ -96,7 +96,6 @@
<string name="importLoyaltyCardKeychainMessage">Odaberi tvoju iz LoyaltyCardKeychain izvezenu <i>LoyaltyCardKeychain.csv</i> datoteku koju želiš uvesti.
\nStvori je putem izbornika „Uvoz/Izvoz” u aplikaciji LoyaltyCardKeychain i tamo najprije pritisni „Izvoz”.</string>
<string name="updateBarcodeQuestionText">Promijenio/la si ID. Želiš li također aktualizirati crtični kod da koristi istu vrijednost\?</string>
<string name="action_hide_details">Sakrij detalje</string>
<string name="importCards">Uvezi kartice</string>
<string name="selectColor">Odaberi boju</string>
<string name="setIcon">Postavi sličicu</string>
@@ -132,7 +131,6 @@
<string name="archived">Kartica je arhivirana</string>
<string name="unarchived">Kartica je dearhivirana</string>
<string name="failedLaunchingPhotoPicker">Nije bilo moguće pronaći aplikaciju za galeriju</string>
<string name="archiveList">Arhiva</string>
<string name="cameraPermissionDeniedTitle">Nije bilo moguće pristupiti kameri</string>
<string name="noCameraPermissionDirectToSystemSetting">Za snimanje crtičnih kodova Catima treba pristup tvojoj kameri. Dodirni ovdje za mijenjanje postavki dozvola.</string>
<string name="app_libraries">Libre biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
@@ -260,9 +258,7 @@
<string name="sort_by_name">Ime</string>
<string name="sort_by_most_recently_used">Nedavno korišteno</string>
<string name="reverse">… u obrnutom redoslijedu</string>
<string name="action_show_details">Prikaži detalje</string>
<string name="shortcutSelectCard">Odaberi karticu</string>
<string name="noUnarchivedCardsMessage">Ne postoje nearhivirane kartice</string>
<string name="previousCard">Prethodna</string>
<string name="nextCard">Sljedeća</string>
<string name="updateBalanceTitle">Koliko si potrošio/la\?</string>

View File

@@ -70,8 +70,6 @@
<string name="settings_grey_theme">Szürke</string>
<string name="sort">Rendezés</string>
<string name="on_google_play">a Google Playen</string>
<string name="action_show_details">Részletek megjelenítése</string>
<string name="action_hide_details">Részletek elrejtése</string>
<string name="and_data_usage">és adathasználat</string>
<string name="translate_platform">a Weblate-en</string>
<string name="sort_by_name">Név</string>
@@ -221,7 +219,6 @@
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
</plurals>
<string name="noUnarchivedCardsMessage">Nincs archiválatlan kártya</string>
<string name="failedToOpenUrl">Először telepítsen egy webböngészőt</string>
<string name="failedLaunchingPhotoPicker">Nem található támogatott galéria alkalmazás</string>
<string name="previousCard">Előző</string>
@@ -235,7 +232,6 @@
<string name="archive">Archiválás</string>
<string name="unarchive">Archiválás megszüntetése</string>
<string name="archived">Kártya archiválva</string>
<string name="archiveList">Archívum</string>
<string name="duplicateCard">Klónozás</string>
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Adja meg az összeget</string>

View File

@@ -206,8 +206,6 @@
<item quantity="other"><xliff:g>%1$d</xliff:g> kartu (<xliff:g id="archivedCount">%2$d</xliff:g> diarsipkan)</item>
</plurals>
<string name="translate_platform">di Weblate</string>
<string name="action_show_details">Tampilkan detail</string>
<string name="action_hide_details">Sembunyikan detail</string>
<string name="welcome">Selamat datang di Catima</string>
<string name="failedToOpenUrl">Install browser web terlebih dahulu</string>
<plurals name="viewArchivedCardsWithCount">
@@ -230,12 +228,10 @@
<string name="duplicateCard">Duplikat</string>
<string name="archive">Arsip</string>
<string name="archived">Kartu diarsipkan</string>
<string name="archiveList">Arsip</string>
<string name="failedToRetrieveImageFile">Gagal mengambil file gambar</string>
<string name="barcodeLongPressMessage">Hanya gambar yang dapat dibuka di aplikasi galeri</string>
<string name="unarchive">Ekstrak</string>
<string name="unarchived">Kartu tidak diarsipkan</string>
<string name="noUnarchivedCardsMessage">Tidak ada kartu yang diekstrak</string>
<string name="options">Opsi</string>
<string name="starred">Berbintang</string>
<string name="importCards">Import kartu</string>

View File

@@ -209,8 +209,6 @@
<string name="group_updated">Gruppo aggiornato</string>
<string name="selectColor">Seleziona il colore</string>
<string name="setIcon">Imposta l\'immagine</string>
<string name="action_show_details">Mostra i dettagli</string>
<string name="action_hide_details">Nascondi i dettagli</string>
<string name="translate_platform">su Weblate</string>
<string name="shortcutSelectCard">Seleziona una tessera</string>
<string name="options">Opzioni</string>
@@ -228,8 +226,6 @@
<string name="duplicateCard">Duplica</string>
<string name="archive">Archivia</string>
<string name="unarchive">Disarchivia</string>
<string name="archiveList">Archivio</string>
<string name="noUnarchivedCardsMessage">Non esistono schede non archiviate</string>
<string name="unarchived">Carta non archiviata</string>
<string name="archived">Carta archiviata</string>
<string name="settings_portrait_orientation">Verticale</string>

View File

@@ -195,8 +195,6 @@
<string name="and_data_usage">and data usage</string>
<string name="group_updated">グループを更新しました</string>
<string name="editGroup">グループ編集: <xliff:g>%s</xliff:g></string>
<string name="action_show_details">詳細を表示</string>
<string name="action_hide_details">詳細を非表示</string>
<string name="selectColor">色を選択</string>
<string name="setIcon">アイコン設定</string>
<string name="group_edit">グループ編集</string>

View File

@@ -123,7 +123,6 @@
<string name="unarchive">보관 취소</string>
<string name="archived">보관된 카드</string>
<string name="unarchived">보관되지 않은 카드</string>
<string name="archiveList">보관소</string>
<string name="failedLaunchingPhotoPicker">지원되는 갤러리 앱을 찾을 수 없습니다</string>
<string name="welcome">Catima 오신 것을 환영합니다</string>
<string name="validFromDate">유효</string>
@@ -171,7 +170,6 @@
<string name="group_name_is_empty">그룹 이름은 비워둘 수 없습니다</string>
<string name="chooseExpiryDate">만료일 선택</string>
<string name="settings_oled_dark">어두운 테마를 위한 검정색 배경</string>
<string name="action_show_details">세부정보 표시</string>
<string name="noGroups">+ 더하기 버튼을 클릭하여 분류할 그룹을 추가합니다.</string>
<string name="deleteConfirmationGroup">그룹을 삭제하시겠습니까\?</string>
<string name="errorReadingImage">이미지를 읽을 수 없습니다</string>
@@ -194,12 +192,10 @@
<string name="turn_flashlight_on">손전등 켜기</string>
<string name="exportPassword">내보내기를 보호하기 위한 암호 설정(선택 사항)</string>
<string name="passwordRequired">비밀번호를 입력해주세요</string>
<string name="action_hide_details">상세정보 표시</string>
<string name="setIcon">썸네일 설정</string>
<string name="show_balance">잔액 표시</string>
<string name="help_translate_this_app">이 앱을 번역하도록 도와주세요</string>
<string name="duplicateCard">복제하다</string>
<string name="noUnarchivedCardsMessage">보관되지 않은 카드가 없습니다</string>
<plurals name="groupCardCountWithArchived">
<item quantity="other"><xliff:g>%1$d</xliff:g> 카드 (<xliff:g id="archivedCount">%2$d</xliff:g> 보관됨)</item>
</plurals>

View File

@@ -209,11 +209,7 @@
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia.</string>
<string name="setIcon">Nustatyti piktogramą</string>
<string name="selectColor">Pasirinkti spalvą</string>
<string name="action_hide_details">Paslėpti informaciją</string>
<string name="action_show_details">Rodyti išsamią informaciją</string>
<string name="settings_card_orientation">Brūkšninio kodo orientacija</string>
<string name="archiveList">Archyvas</string>
<string name="noUnarchivedCardsMessage">Nėra išarchyvuotų kortelių</string>
<string name="failedLaunchingPhotoPicker">Nepavyko rasti palaikomos galerijos programėlės</string>
<string name="previousCard">Ankstesnė</string>
<string name="nextCard">Kita</string>

View File

@@ -105,8 +105,6 @@
<string name="noCardIdError">Numurs nav ievadīts</string>
<string name="about_title_fmt">Par <xliff:g id="app_name">%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Derīguma termiņš beidzās: <xliff:g>%s</xliff:g></string>
<string name="action_hide_details">Slēpt detaļas</string>
<string name="action_show_details">Rādīt detalizēti</string>
<string name="selectColor">Izvēlieties krāsu</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">Rozā</string>
@@ -230,8 +228,6 @@
<string name="unarchive">Atarhivēt</string>
<string name="archived">Karte arhivēta</string>
<string name="unarchived">Karte atarhivēta</string>
<string name="archiveList">Arhīvs</string>
<string name="noUnarchivedCardsMessage">Nav atarhivētu karšu</string>
<string name="failedLaunchingPhotoPicker">Nevarēja atrast atbalstītu galerijas lietotni</string>
<string name="previousCard">Iepriekšējā</string>
<string name="nextCard">Nākamā</string>

View File

@@ -203,8 +203,6 @@
<string name="group_name_is_empty">Gruppenavn kan ikke være tomt</string>
<string name="editGroup">Redigerer gruppe: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Lag noen kort, og legg dem til i en gruppe her.</string>
<string name="action_show_details">Vis detaljer</string>
<string name="action_hide_details">Skjul detaljer</string>
<string name="selectColor">Velg farge</string>
<string name="setIcon">Sett miniatyrbilde</string>
<string name="shortcutSelectCard">velg et kort</string>
@@ -226,8 +224,6 @@
<string name="unarchive">Opphev arkivering</string>
<string name="archived">Kort arkivert</string>
<string name="unarchived">Kort flyttet tilbake fra arkiv</string>
<string name="noUnarchivedCardsMessage">Ingen kort flyttet tilbake fra arkiv finnes</string>
<string name="archiveList">Arkiv</string>
<string name="settings_follow_system_orientation">Følg systemet</string>
<string name="settings_portrait_orientation">Stående</string>
<string name="failedLaunchingPhotoPicker">Fant ikke noe støttet galleriprogram</string>

View File

@@ -205,8 +205,6 @@
<string name="group_edit">Groep bewerken</string>
<string name="setIcon">Miniatuur instellen</string>
<string name="selectColor">Kies een kleur</string>
<string name="action_show_details">Details tonen</string>
<string name="action_hide_details">Details verbergen</string>
<string name="translate_platform">op Weblate</string>
<string name="shortcutSelectCard">Kies een kaart</string>
<string name="options">Opties</string>
@@ -227,9 +225,7 @@
<string name="unarchive">Dearchiveren</string>
<string name="archived">De kaart is gearchiveerd</string>
<string name="unarchived">De kaart is gedearchiveerd</string>
<string name="archiveList">Archief</string>
<string name="settings_landscape_orientation">Horizontaal</string>
<string name="noUnarchivedCardsMessage">Er zijn geen gedearchiveerde kaarten</string>
<string name="failedLaunchingPhotoPicker">Er is geen ondersteunde galerij-app aangetroffen</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kaart (<xliff:g id="archivedCount">%2$d</xliff:g> gearchiveerd)</item>

View File

@@ -187,8 +187,6 @@
<item quantity="other"><xliff:g>%d</xliff:g> zaznaczonych</item>
</plurals>
<string name="shortcutSelectCard">Wybierz kartę</string>
<string name="action_show_details">Pokaż szczegóły</string>
<string name="action_hide_details">Ukryj szczegóły</string>
<string name="sort_by_name">Nazwa</string>
<string name="sort_by_most_recently_used">Ostatnio używane</string>
<string name="sort_by_expiry">Data wygaśnięcia</string>
@@ -238,8 +236,6 @@
<string name="unarchive">Cofnij archiwizację</string>
<string name="archived">Karta zarchiwizowana</string>
<string name="unarchived">Karta niezarchiwizowana</string>
<string name="archiveList">Archiwum</string>
<string name="noUnarchivedCardsMessage">Nie istnieją żadne niezarchiwizowane karty</string>
<string name="failedLaunchingPhotoPicker">Nie można odnaleźć aplikacji galeria</string>
<string name="previousCard">Poprzedni</string>
<string name="nextCard">Następny</string>

View File

@@ -209,8 +209,6 @@
<string name="noGiftCardsGroup">Crie alguns cartões e atribua-os depois ao grupo aqui.</string>
<string name="selectColor">Selecionar cor</string>
<string name="setIcon">Definir miniatura</string>
<string name="action_show_details">Mostrar detalhes</string>
<string name="action_hide_details">Ocultar detalhes</string>
<string name="shortcutSelectCard">Selecione um cartão</string>
<string name="translate_platform">no Weblate</string>
<string name="starred">Estrela</string>
@@ -233,8 +231,6 @@
<string name="unarchive">Desarquivar</string>
<string name="archived">Cartão arquivado</string>
<string name="unarchived">Cartão desarquivado</string>
<string name="archiveList">Arquivar</string>
<string name="noUnarchivedCardsMessage">Não existem cartões desarquivados</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> cartão (<xliff:g id="archivedCount">%2$d</xliff:g> arquivado)</item>
<item quantity="many"><xliff:g>%1$d</xliff:g> cartões (<xliff:g id="archivedCount">%2$d</xliff:g> arquivados)</item>

View File

@@ -94,7 +94,6 @@
<string name="yes">Da</string>
<string name="no">Nu</string>
<string name="archive">Arhivați</string>
<string name="archiveList">Arhivă</string>
<string name="passwordRequired">Vă rugăm, introduceți parola</string>
<string name="unsupportedBarcodeType">Acest tip de cod de bare nu poate fi afișat. Este posibil ca acesta să se poată afișa într-o versiune mai nouă a aplicației.</string>
<string name="photos">Imagini</string>

View File

@@ -213,8 +213,6 @@
<string name="noGiftCardsGroup">Создайте несколько карт, а затем распределите их по группам здесь.</string>
<string name="setIcon">Выбор миниатюры</string>
<string name="selectColor">Выбрать цвет</string>
<string name="action_hide_details">Скрытие подробностей</string>
<string name="action_show_details">Отображение подробностей</string>
<string name="translate_platform">на Weblate</string>
<string name="shortcutSelectCard">Выбор карты</string>
<string name="options">Параметры</string>
@@ -233,8 +231,6 @@
<string name="settings_lock_on_opening_orientation">Фиксировать ориентацию при открытии карты</string>
<string name="archive">Архивировать</string>
<string name="unarchive">Разархивировать</string>
<string name="archiveList">Архив</string>
<string name="noUnarchivedCardsMessage">Нет карт вне архива</string>
<string name="settings_follow_system_orientation">Как в системе</string>
<string name="duplicateCard">Дублировать</string>
<string name="settings_card_orientation">Ориентация штрих-кода</string>

View File

@@ -127,7 +127,6 @@
<string name="settings_theme_color">Farba témy</string>
<string name="app_libraries">Slobodné knižnice tretích strán: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Slobodné zdroje tretích strán: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="action_show_details">Zobraziť detaily</string>
<string name="importCatimaMessage">Vyberte svoj <i>catima.zip</i> export z aplikácie Catima, ktorý chcete importovať.
\nVytvorte ho z ponuky Import/Export inej aplikácie Catima tak, že stlačíte tlačidlo Exportovať.</string>
<string name="accept">Prijať</string>
@@ -146,7 +145,6 @@
<string name="report_error">Nahlásiť chybu</string>
<string name="translate_platform">na Weblate</string>
<string name="showMoreInfo">Zobraziť podrobnosti</string>
<string name="action_hide_details">Skryť detaily</string>
<string name="yes">Áno</string>
<string name="importStocard">Import z aplikácie Stocard</string>
<string name="selectColor">Vybrať farbu</string>
@@ -262,8 +260,6 @@
<string name="copy_to_clipboard_multiple_toast">ID skopírované do schránky</string>
<string name="intent_import_card_from_url_share_multiple_text">Chcem sa s vami zdielať karty</string>
<string name="app_contributors">Podporili: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="archiveList">Archív</string>
<string name="noUnarchivedCardsMessage">Nie sú žiadne karty vrátené z archívu</string>
<string name="newBalanceSentence">Nový zostatok: <xliff:g>%s</xliff:g></string>
<string name="failedLaunchingPhotoPicker">Nepodarilo sa nájsť podporovanú aplikáciu galérie</string>
<string name="show_note">Zobraziť poznámku</string>

View File

@@ -184,7 +184,6 @@
<string name="updateBalance">Posodobi stanje</string>
<string name="failedToRetrieveImageFile">Slikovne datoteke ni bilo mogoče pridobiti</string>
<string name="credits">Zasluge</string>
<string name="action_show_details">Prikaži podrobnosti</string>
<string name="translate_platform">na Weblate-u</string>
<string name="options">Možnosti</string>
<string name="duplicateCard">Podvoji</string>
@@ -192,8 +191,6 @@
<string name="unarchive">Odpakiraj arhiv</string>
<string name="archived">Karta arhivirana</string>
<string name="unarchived">Kartica ni arhivirana</string>
<string name="archiveList">Arhiv</string>
<string name="noUnarchivedCardsMessage">Ne obstajajo ne arhivirane kartice</string>
<string name="failedLaunchingPhotoPicker">Ni mogoče najti podprte aplikacije za gledanje slik</string>
<string name="previousCard">Prejšnje</string>
<string name="nextCard">Naslednje</string>
@@ -254,7 +251,6 @@
<string name="settings_catima_theme">Catima</string>
<string name="app_contributors">Omogočeno od: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeLongPressMessage">V aplikaciji za gledanje slik lahko odpremo samo slike</string>
<string name="action_hide_details">Skrij podrobnosti</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
<item quantity="two"><xliff:g>%1$d</xliff:g> kartici (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirani)</item>

View File

@@ -202,8 +202,6 @@
<string name="editGroup">Redigerar grupp: <xliff:g>%s</xliff:g></string>
<string name="selectColor">Välj färg</string>
<string name="setIcon">Välj ikon</string>
<string name="action_show_details">Visa detaljer</string>
<string name="action_hide_details">Dölj detaljer</string>
<string name="credits">Bidragsgivare</string>
<string name="source_repository">Källkodslager</string>
<string name="noGiftCardsGroup">Skapa några kort och placera dem sedan i den här gruppen.</string>
@@ -225,14 +223,12 @@
<string name="settings_lock_on_opening_orientation">Lås aktuell riktning när kort öppnas</string>
<string name="unarchive">Ta tillbaks från arkiv</string>
<string name="archived">Kort arkiverat</string>
<string name="archiveList">Arkivet</string>
<string name="settings_follow_system_orientation">Spårsystem</string>
<string name="duplicateCard">Kopiera</string>
<string name="unarchived">Kort återläst från arkiv</string>
<string name="nextCard">Nästa</string>
<string name="archive">Arkivera</string>
<string name="previousCard">Föregående</string>
<string name="noUnarchivedCardsMessage">Inga ej arkiverade kort finns</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kort (<xliff:g id="archivedCount">%2$d</xliff:g> arkiverat)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kort (<xliff:g id="archivedCount">%2$d</xliff:g> arkiverade)</item>

View File

@@ -205,8 +205,6 @@
<string name="group_updated">Grup güncellendi</string>
<string name="selectColor">Renk seç</string>
<string name="setIcon">Küçük resim ayarla</string>
<string name="action_show_details">Ayrıntıları göster</string>
<string name="action_hide_details">Ayrıntıları gizle</string>
<string name="translate_platform">Weblate\'de</string>
<string name="shortcutSelectCard">Kart seç</string>
<string name="options">Seçenekler</string>
@@ -224,8 +222,6 @@
<string name="duplicateCard">Çoğalt</string>
<string name="unarchive">Arşivden çıkar</string>
<string name="archived">Kart arşivlendi</string>
<string name="archiveList">Arşiv</string>
<string name="noUnarchivedCardsMessage">Arşivden çıkarılan kart yok</string>
<string name="settings_card_orientation">Barkod yönü</string>
<string name="settings_lock_on_opening_orientation">Kartı açarken kullanılan yönü kilitle</string>
<string name="unarchived">Kart arşivden çıkarıldı</string>

View File

@@ -213,8 +213,6 @@
<string name="noGiftCardsGroup">Створите кілька карток, та призначте їх до групи тут.</string>
<string name="selectColor">Вибір кольору</string>
<string name="setIcon">Вибір мініатюри</string>
<string name="action_show_details">Показати деталі</string>
<string name="action_hide_details">Сховати деталі</string>
<string name="translate_platform">на Weblate</string>
<string name="shortcutSelectCard">Оберіть карту</string>
<string name="options">Параметри</string>
@@ -238,8 +236,6 @@
<string name="settings_lock_on_opening_orientation">Блокування орієнтації при відкритті картки</string>
<string name="archived">Картка архівована</string>
<string name="unarchived">Картка розархівована</string>
<string name="archiveList">Архів</string>
<string name="noUnarchivedCardsMessage">Немає не архівованих карток</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карту (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> карти (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>

View File

@@ -208,8 +208,6 @@
<string name="exportPassword">设置密码来保护导出的内容(可选)</string>
<string name="settings_magenta_theme">紫红</string>
<string name="settings_violet_theme">紫色</string>
<string name="action_show_details">显示详情</string>
<string name="action_hide_details">隐藏详情</string>
<string name="app_contributors">因他们而存在: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="and_data_usage">和数据使用方法</string>
<string name="failedLaunchingPhotoPicker">找不到支持的图库应用</string>
@@ -231,8 +229,6 @@
<string name="unarchive">移出归档</string>
<string name="archived">卡片已归档</string>
<string name="unarchived">卡片未归档</string>
<string name="archiveList">已归档卡</string>
<string name="noUnarchivedCardsMessage">没有未归档卡</string>
<string name="failedToOpenUrl">先安装一个浏览器</string>
<string name="welcome">欢迎使用Catima</string>
<string name="updateBalanceHint">输入金额</string>

View File

@@ -194,7 +194,6 @@
<string name="starImage">收藏標示</string>
<string name="noGiftCardsGroup">建立一些卡片,然後將它們分配到這個群組中。</string>
<string name="showMoreInfo">顯示資訊</string>
<string name="action_show_details">顯示詳情</string>
<string name="shortcutSelectCard">選擇卡片</string>
<string name="starred">已收藏</string>
<plurals name="balancePoints">
@@ -208,7 +207,6 @@
<string name="group_updated">已更新群組</string>
<string name="editGroup">編輯群組中:<xliff:g>%s</xliff:g></string>
<string name="settings_oled_dark">使用深色主題時,使用純黑色背景</string>
<string name="action_hide_details">隱藏詳情</string>
<string name="translate_platform">於 Weblate</string>
<string name="options">選項</string>
<string name="include_if_asking_support">如果您想請求協助,請附上以下訊息:</string>
@@ -227,10 +225,8 @@
<string name="settings_follow_system_orientation">跟隨系統</string>
<string name="settings_landscape_orientation">橫向</string>
<string name="failedToOpenUrl">先安裝網頁瀏覽器</string>
<string name="archiveList">封存</string>
<string name="failedLaunchingPhotoPicker">無法找到支援的圖庫應用程式</string>
<string name="previousCard">上一張</string>
<string name="noUnarchivedCardsMessage">沒有已封存的卡片</string>
<string name="nextCard">下一張</string>
<string name="welcome">歡迎使用 Catima</string>
<plurals name="viewArchivedCardsWithCount">

View File

@@ -275,8 +275,6 @@
<string name="rate_this_app">Rate this app</string>
<string name="on_google_play">on Google Play</string>
<string name="report_error">Report Error</string>
<string name="action_show_details">Show details</string>
<string name="action_hide_details">Hide details</string>
<string name="translate_platform">on Weblate</string>
<string name="shortcutSelectCard">Select a card</string>
<string name="options">Options</string>
@@ -287,9 +285,7 @@
<string name="unarchive">Unarchive</string>
<string name="archived">Card archived</string>
<string name="unarchived">Card unarchived</string>
<string name="archiveList">Archive</string>
<string name="overflowMenu" translatable="false">Overflow menu</string>
<string name="noUnarchivedCardsMessage">No unarchived cards exist</string>
<string name="failedLaunchingPhotoPicker">Could not find a supported gallery app</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
@@ -325,11 +321,14 @@
<string name="show_note">Show note</string>
<string name="show_balance">Show balance</string>
<string name="show_validity">Show validity</string>
<string name="sharedpreference_card_details_show_name_below_thumbnail" translatable="false">sharedpreference_card_details_show_name_below_thumbnail</string>
<string name="sharedpreference_card_details_show_note" translatable="false">sharedpreference_card_details_show_note</string>
<string name="sharedpreference_card_details_show_balance" translatable="false">sharedpreference_card_details_show_balance</string>
<string name="sharedpreference_card_details_show_validity" translatable="false">sharedpreference_card_details_show_validity</string>
<string name="sharedpreference_card_details_show_name_below_thumbnail" translatable="false">sharedpreference_card_details_show_name_below_thumbnail</string>
<string name="sharedpreference_card_details_show_archived_cards" translatable="false">sharedpreference_card_details_show_archived_cards</string>
<string name="settings_category_title_cards">Cards</string>
<string name="settings_category_title_general">General</string>
<string name="settings_category_title_privacy">Privacy</string>
<string name="action_display_options">Display options</string>
<string name="show_archived_cards">Show archived cards</string>
</resources>

View File

@@ -18,13 +18,10 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowLog;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Currency;
import java.util.Date;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.preference.PreferenceManager;
import protect.card_locker.preferences.Settings;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -52,7 +49,7 @@ public class LoyaltyCardCursorAdapterTest {
}
private View createView(Cursor cursor) {
LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(activity.getApplicationContext(), cursor, (MainActivity) activity);
LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(activity.getApplicationContext(), cursor, (MainActivity) activity, null);
LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder viewHolder = adapter.createViewHolder(activity.findViewById(R.id.list), 0);
adapter.bindViewHolder(viewHolder, cursor.getPosition());

View File

@@ -59,12 +59,11 @@ public class MainActivityTest {
assertNotNull(menu);
// The settings, import/export, groups, search and add button should be present
assertEquals(menu.size(), 8);
assertEquals(menu.size(), 7);
assertEquals("Search", menu.findItem(R.id.action_search).getTitle().toString());
assertEquals("Sort", menu.findItem(R.id.action_sort).getTitle().toString());
assertEquals("Show details", menu.findItem(R.id.action_shown_details).getTitle().toString());
assertEquals("Display options", menu.findItem(R.id.action_display_options).getTitle().toString());
assertEquals("Groups", menu.findItem(R.id.action_manage_groups).getTitle().toString());
assertEquals("Archive", menu.findItem(R.id.action_archived).getTitle().toString());
assertEquals("Import/Export", menu.findItem(R.id.action_import_export).getTitle().toString());
assertEquals("About", menu.findItem(R.id.action_about).getTitle().toString());
assertEquals("Settings", menu.findItem(R.id.action_settings).getTitle().toString());