diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ff4a675..4c6ad17d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ Change Log =============================================================================== +Version 2.0.2 *(2015-11-20)* +---------------------------- +* Fixed: Exporting to external service does not work in some devices +* Fixed: Bar chart does not display negative amounts +* Fixed: Crash when saving transaction with invalid amount expression +* Fixed: Crash when displaying bar chart legend with accounts of same name +* Fixed: Crashes when importing some GnuCash XML files on some devices +* Improved: Remember last export destination +* Improved: Display current imbalance in split editor +* Improved: Set default commodity to the one used by imported file +* Improved: Add support for unlimited fractional digits in commodities +* Improved: Option to select date from which to export transactions + Version 2.0.1 *(2015-11-05)* ---------------------------- * Feature: Menu options for moving/duplicating transactions diff --git a/app/build.gradle b/app/build.gradle index 402207ba2..3e0644c23 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,8 +5,8 @@ apply plugin: 'io.fabric' def versionMajor = 2 def versionMinor = 0 -def versionPatch = 1 -def versionBuild = 3 +def versionPatch = 2 +def versionBuild = 2 def buildTime() { def df = new SimpleDateFormat("yyyyMMdd HH:mm 'UTC'") diff --git a/app/src/androidTest/java/org/gnucash/android/test/ui/ExportTransactionsTest.java b/app/src/androidTest/java/org/gnucash/android/test/ui/ExportTransactionsTest.java index 5b51bdce7..05c9bbedc 100644 --- a/app/src/androidTest/java/org/gnucash/android/test/ui/ExportTransactionsTest.java +++ b/app/src/androidTest/java/org/gnucash/android/test/ui/ExportTransactionsTest.java @@ -61,6 +61,7 @@ import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.RootMatchers.withDecorView; import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; @@ -69,6 +70,8 @@ import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -192,6 +195,11 @@ public void testExport(ExportFormat format){ DrawerActions.openDrawer(R.id.drawer_layout); onView(withText(R.string.nav_menu_export)).perform(click()); + + onView(withId(R.id.spinner_export_destination)).perform(click()); + String[] destinations = getActivity().getResources().getStringArray(R.array.export_destinations); + + onView(withText(destinations[0])).perform(click()); onView(withText(format.name())).perform(click()); onView(withId(R.id.menu_save)).perform(click()); @@ -243,6 +251,26 @@ public void testShouldCreateExportSchedule(){ assertThat(action.getEndTime()).isEqualTo(0); } + @Test + public void testCreateBackup(){ + DrawerActions.openDrawer(R.id.drawer_layout); + onView(withText(R.string.title_settings)).perform(click()); + onView(withText(R.string.header_backup_and_export_settings)).perform(click()); + + onView(withText(R.string.title_create_backup_pref)).perform(click()); + assertToastDisplayed(R.string.toast_backup_successful); + } + + /** + * Checks that a specific toast message is displayed + * @param toastString String that should be displayed + */ + private void assertToastDisplayed(int toastString) { + onView(withText(toastString)) + .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))) + .check(matches(isDisplayed())); + } + //todo: add testing of export flag to unit test //todo: add test of ignore exported transactions to unit tests @Override diff --git a/app/src/main/java/org/gnucash/android/app/GnuCashApplication.java b/app/src/main/java/org/gnucash/android/app/GnuCashApplication.java index bc0ae2016..8e9985637 100644 --- a/app/src/main/java/org/gnucash/android/app/GnuCashApplication.java +++ b/app/src/main/java/org/gnucash/android/app/GnuCashApplication.java @@ -25,6 +25,7 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; import android.util.Log; import com.crashlytics.android.Crashlytics; @@ -41,6 +42,7 @@ import org.gnucash.android.db.SplitsDbAdapter; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.model.Commodity; +import org.gnucash.android.model.Money; import org.gnucash.android.service.SchedulerService; import java.util.Currency; @@ -124,7 +126,7 @@ public void onCreate(){ mCommoditiesDbAdapter = new CommoditiesDbAdapter(mDb); mPricesDbAdapter = new PricesDbAdapter(mDb); - Commodity.DEFAULT_COMMODITY = mCommoditiesDbAdapter.getCommodity(getDefaultCurrencyCode()); + setDefaultCurrencyCode(getDefaultCurrencyCode()); } public static AccountsDbAdapter getAccountsDbAdapter() { @@ -216,12 +218,21 @@ public static String getDefaultCurrencyCode(){ } /** - * Returns the default commodity - * @return Default commodity of application + * Sets the default currency for the application in all relevant places: + * + * @param currencyCode ISO 4217 currency code * @see #getDefaultCurrencyCode() */ - public static Commodity getDefaultCommodity(){ - return Commodity.DEFAULT_COMMODITY; + public static void setDefaultCurrencyCode(@NonNull String currencyCode){ + PreferenceManager.getDefaultSharedPreferences(getAppContext()).edit() + .putString(getAppContext().getString(R.string.key_default_currency), currencyCode) + .apply(); + Money.DEFAULT_CURRENCY_CODE = currencyCode; + Commodity.DEFAULT_COMMODITY = mCommoditiesDbAdapter.getCommodity(currencyCode); } /** diff --git a/app/src/main/java/org/gnucash/android/db/AccountsDbAdapter.java b/app/src/main/java/org/gnucash/android/db/AccountsDbAdapter.java index 7d1acfbb1..63b189a34 100644 --- a/app/src/main/java/org/gnucash/android/db/AccountsDbAdapter.java +++ b/app/src/main/java/org/gnucash/android/db/AccountsDbAdapter.java @@ -39,6 +39,7 @@ import org.gnucash.android.model.TransactionType; import java.math.BigDecimal; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Currency; import java.util.HashMap; @@ -503,12 +504,11 @@ public List getSimpleAccountList(String where, String[] whereArgs, Stri } /** * Returns a list of accounts which have transactions that have not been exported yet + * @param lastExportTimeStamp Timestamp after which to any transactions created/modified should be exported * @return List of {@link Account}s with unexported transactions - * @deprecated This uses the exported flag in the database which is no longer supported. */ - @Deprecated - public List getExportableAccounts(){ - LinkedList accountsList = new LinkedList(); + public List getExportableAccounts(Timestamp lastExportTimeStamp){ + LinkedList accountsList = new LinkedList<>(); Cursor cursor = mDb.query( TransactionEntry.TABLE_NAME + " , " + SplitEntry.TABLE_NAME + " ON " + TransactionEntry.TABLE_NAME + "." + TransactionEntry.COLUMN_UID + " = " + @@ -517,8 +517,8 @@ public List getExportableAccounts(){ AccountEntry.COLUMN_UID + " = " + SplitEntry.TABLE_NAME + "." + SplitEntry.COLUMN_ACCOUNT_UID, new String[]{AccountEntry.TABLE_NAME + ".*"}, - TransactionEntry.TABLE_NAME + "." + TransactionEntry.COLUMN_EXPORTED + " == 0", - null, + TransactionEntry.TABLE_NAME + "." + TransactionEntry.COLUMN_MODIFIED_AT + " > ?", + new String[]{lastExportTimeStamp.toString()}, AccountEntry.TABLE_NAME + "." + AccountEntry.COLUMN_UID, null, null @@ -787,23 +787,24 @@ private Money computeBalance(String accountUID, long startTimestamp, long endTim } /** - * Returns the absolute balance of account list within the specified time range while taking sub-accounts - * into consideration. The default currency takes as base currency. + * Returns the balance of account list within the specified time range. The default currency + * takes as base currency. * @param accountUIDList list of account UIDs * @param startTimestamp the start timestamp of the time range * @param endTimestamp the end timestamp of the time range - * @return the absolute balance of account list + * @return Money balance of account list */ public Money getAccountsBalance(List accountUIDList, long startTimestamp, long endTimestamp) { String currencyCode = GnuCashApplication.getDefaultCurrencyCode(); Money balance = Money.createZeroInstance(currencyCode); + boolean hasDebitNormalBalance = getAccountType(accountUIDList.get(0)).hasDebitNormalBalance(); SplitsDbAdapter splitsDbAdapter = SplitsDbAdapter.getInstance(); Money splitSum = (startTimestamp == -1 && endTimestamp == -1) - ? splitsDbAdapter.computeSplitBalance(accountUIDList, currencyCode, true) - : splitsDbAdapter.computeSplitBalance(accountUIDList, currencyCode, true, startTimestamp, endTimestamp); + ? splitsDbAdapter.computeSplitBalance(accountUIDList, currencyCode, hasDebitNormalBalance) + : splitsDbAdapter.computeSplitBalance(accountUIDList, currencyCode, hasDebitNormalBalance, startTimestamp, endTimestamp); - return balance.add(splitSum).absolute(); + return balance.add(splitSum); } /** diff --git a/app/src/main/java/org/gnucash/android/db/DatabaseHelper.java b/app/src/main/java/org/gnucash/android/db/DatabaseHelper.java index 5af6e0e97..440e5c7e5 100644 --- a/app/src/main/java/org/gnucash/android/db/DatabaseHelper.java +++ b/app/src/main/java/org/gnucash/android/db/DatabaseHelper.java @@ -212,8 +212,8 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ /* * NOTE: In order to modify the database, create a new static method in the MigrationHelper class * called upgradeDbToVersion<#>, e.g. int upgradeDbToVersion10(SQLiteDatabase) in order to upgrade to version 10. - * The upgrade method should return the current database version as the return value. - * Then all you need to do is incremend the DatabaseSchema.DATABASE_VERSION to the appropriate number. + * The upgrade method should return the upgraded database version as the return value. + * Then all you need to do is increment the DatabaseSchema.DATABASE_VERSION to the appropriate number. */ if (oldVersion > newVersion) { throw new IllegalArgumentException("Database downgrades are not supported at the moment"); diff --git a/app/src/main/java/org/gnucash/android/db/DatabaseSchema.java b/app/src/main/java/org/gnucash/android/db/DatabaseSchema.java index c39568a32..15d7870cc 100644 --- a/app/src/main/java/org/gnucash/android/db/DatabaseSchema.java +++ b/app/src/main/java/org/gnucash/android/db/DatabaseSchema.java @@ -28,7 +28,7 @@ public class DatabaseSchema { * Database version. * With any change to the database schema, this number must increase */ - public static final int DATABASE_VERSION = 9; + public static final int DATABASE_VERSION = 11; /** * Database version where Splits were introduced diff --git a/app/src/main/java/org/gnucash/android/db/MigrationHelper.java b/app/src/main/java/org/gnucash/android/db/MigrationHelper.java index b8039c6b0..f8d91f088 100644 --- a/app/src/main/java/org/gnucash/android/db/MigrationHelper.java +++ b/app/src/main/java/org/gnucash/android/db/MigrationHelper.java @@ -24,6 +24,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; +import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; @@ -31,12 +32,15 @@ import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; +import org.gnucash.android.export.ExportFormat; +import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.importer.CommoditiesXmlHandler; import org.gnucash.android.model.AccountType; import org.gnucash.android.model.BaseModel; import org.gnucash.android.model.Commodity; import org.gnucash.android.model.Money; +import org.gnucash.android.model.ScheduledAction; import org.gnucash.android.model.Transaction; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -52,7 +56,9 @@ import java.nio.channels.FileChannel; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -1058,4 +1064,110 @@ static int upgradeDbToVersion9(SQLiteDatabase db){ } return oldVersion; } + + /** + * Upgrades the database to version 10 + *

This method converts all saved scheduled export parameters to the new format using the + * timestamp of last export

+ * @param db SQLite database + * @return 10 if upgrade was successful, 9 otherwise + */ + static int upgradeDbToVersion10(SQLiteDatabase db){ + Log.i(DatabaseHelper.LOG_TAG, "Upgrading database to version 9"); + int oldVersion = 9; + + db.beginTransaction(); + try { + Cursor cursor = db.query(ScheduledActionEntry.TABLE_NAME, + new String[]{ScheduledActionEntry.COLUMN_UID, ScheduledActionEntry.COLUMN_TAG}, + ScheduledActionEntry.COLUMN_TYPE + " = ?", + new String[]{ScheduledAction.ActionType.BACKUP.name()}, + null, null, null); + + ContentValues contentValues = new ContentValues(); + while (cursor.moveToNext()){ + String paramString = cursor.getString(cursor.getColumnIndexOrThrow(ScheduledActionEntry.COLUMN_TAG)); + String[] tokens = paramString.split(";"); + ExportParams params = new ExportParams(ExportFormat.valueOf(tokens[0])); + params.setExportTarget(ExportParams.ExportTarget.valueOf(tokens[1])); + params.setDeleteTransactionsAfterExport(Boolean.parseBoolean(tokens[3])); + + boolean exportAll = Boolean.parseBoolean(tokens[2]); + if (exportAll){ + params.setExportStartTime(Timestamp.valueOf(Exporter.TIMESTAMP_ZERO)); + } else { + String lastExportTimeStamp = PreferenceManager.getDefaultSharedPreferences(GnuCashApplication.getAppContext()) + .getString(Exporter.PREF_LAST_EXPORT_TIME, Exporter.TIMESTAMP_ZERO); + Timestamp timestamp = Timestamp.valueOf(lastExportTimeStamp); + params.setExportStartTime(timestamp); + } + + String uid = cursor.getString(cursor.getColumnIndexOrThrow(ScheduledActionEntry.COLUMN_UID)); + contentValues.clear(); + contentValues.put(ScheduledActionEntry.COLUMN_UID, uid); + contentValues.put(ScheduledActionEntry.COLUMN_TAG, params.toCsv()); + db.insert(ScheduledActionEntry.TABLE_NAME, null, contentValues); + } + + cursor.close(); + + db.setTransactionSuccessful(); + oldVersion = 10; + } finally { + db.endTransaction(); + } + return oldVersion; + } + + /** + * Upgrade database to version 11 + *

+ * Migrate scheduled backups and update export parameters to the new format + *

+ * @param db SQLite database + * @return 11 if upgrade was successful, 10 otherwise + */ + static int upgradeDbToVersion11(SQLiteDatabase db){ + Log.i(DatabaseHelper.LOG_TAG, "Upgrading database to version 9"); + int oldVersion = 10; + + db.beginTransaction(); + try { + Cursor cursor = db.query(ScheduledActionEntry.TABLE_NAME, null, + ScheduledActionEntry.COLUMN_TYPE + "= ?", + new String[]{ScheduledAction.ActionType.BACKUP.name()}, null, null, null); + + Map uidToTagMap = new HashMap<>(); + while (cursor.moveToNext()) { + String uid = cursor.getString(cursor.getColumnIndexOrThrow(ScheduledActionEntry.COLUMN_UID)); + String tag = cursor.getString(cursor.getColumnIndexOrThrow(ScheduledActionEntry.COLUMN_TAG)); + String[] tokens = tag.split(";"); + try { + Timestamp timestamp = Timestamp.valueOf(tokens[2]); + } catch (IllegalArgumentException ex) { + tokens[2] = PreferenceManager.getDefaultSharedPreferences(GnuCashApplication.getAppContext()) + .getString(Exporter.PREF_LAST_EXPORT_TIME, Exporter.TIMESTAMP_ZERO); + } finally { + tag = TextUtils.join(";", tokens); + } + uidToTagMap.put(uid, tag); + } + + cursor.close(); + + ContentValues contentValues = new ContentValues(); + for (Map.Entry entry : uidToTagMap.entrySet()) { + contentValues.clear(); + contentValues.put(ScheduledActionEntry.COLUMN_TAG, entry.getValue()); + db.update(ScheduledActionEntry.TABLE_NAME, contentValues, + ScheduledActionEntry.COLUMN_UID + " = ?", new String[]{entry.getKey()}); + } + + db.setTransactionSuccessful(); + oldVersion = 11; + } finally { + db.endTransaction(); + } + return oldVersion; + } } diff --git a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java index 1f07600eb..0e17ef283 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java +++ b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java @@ -28,6 +28,7 @@ import android.os.AsyncTask; import android.os.Build; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; import android.util.Log; import android.widget.Toast; @@ -59,13 +60,11 @@ import org.gnucash.android.ui.settings.SettingsActivity; import org.gnucash.android.ui.transaction.TransactionsActivity; -import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -96,6 +95,11 @@ public class ExportAsyncTask extends AsyncTask { */ private ExportParams mExportParams; + // File paths generated by the exporter + private List mExportedFiles; + + private Exporter mExporter; + public ExportAsyncTask(Context context){ this.mContext = context; } @@ -126,7 +130,6 @@ protected void onPreExecute() { protected Boolean doInBackground(ExportParams... params) { mExportParams = params[0]; - Exporter mExporter; switch (mExportParams.getExportFormat()) { case QIF: mExporter = new QifExporter(mExportParams); @@ -140,20 +143,11 @@ protected Boolean doInBackground(ExportParams... params) { default: mExporter = new GncXmlExporter(mExportParams); break; - } + } try { - File file = new File(mExportParams.getTargetFilepath()); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); - try { - // FIXME: detect if there aren't transactions to export and inform the user - mExporter.generateExport(writer); - writer.flush(); - } - finally { - writer.close(); - } - + // FIXME: detect if there aren't transactions to export and inform the user + mExportedFiles = mExporter.generateExport(); } catch (final Exception e) { Log.e(TAG, "Error exporting: " + e.getMessage()); Crashlytics.logException(e); @@ -174,16 +168,16 @@ public void run() { switch (mExportParams.getExportTarget()) { case SHARING: - File output = moveExportToSDCard(); - shareFile(output.getAbsolutePath()); + List sdCardExportedFiles = moveExportToSDCard(); + shareFiles(sdCardExportedFiles); return true; case DROPBOX: - copyExportToDropbox(); + moveExportToDropbox(); return true; case GOOGLE_DRIVE: - copyExportToGoogleDrive(); + moveExportToGoogleDrive(); return true; case SD_CARD: @@ -250,7 +244,7 @@ protected void onPostExecute(Boolean exportResult) { } } - private void copyExportToGoogleDrive(){ + private void moveExportToGoogleDrive(){ Log.i(TAG, "Moving exported file to Google Drive"); final GoogleApiClient googleApiClient = SettingsActivity.getGoogleApiClient(GnuCashApplication.getAppContext()); googleApiClient.blockingConnect(); @@ -258,11 +252,10 @@ private void copyExportToGoogleDrive(){ ResultCallback() { @Override public void onResult(DriveFolder.DriveFileResult result) { - if (!result.getStatus().isSuccess()) { + if (!result.getStatus().isSuccess()) Log.e(TAG, "Error while trying to sync to Google Drive"); - return; - } - Log.i(TAG, "Created a file with content: " + result.getDriveFile().getDriveId()); + else + Log.i(TAG, "Created a file with content: " + result.getDriveFile().getDriveId()); } }; @@ -277,12 +270,11 @@ public void onResult(DriveApi.DriveContentsResult result) { try { // write content to DriveContents OutputStream outputStream = driveContents.getOutputStream(); - List exportedFilePaths = getExportedFiles(); - for (String exportedFilePath : exportedFilePaths) { + for (String exportedFilePath : mExportedFiles) { File exportedFile = new File(exportedFilePath); FileInputStream fileInputStream = new FileInputStream(exportedFile); byte[] buffer = new byte[1024]; - int count = 0; + int count; while ((count = fileInputStream.read(buffer)) >= 0) { outputStream.write(buffer, 0, count); @@ -293,7 +285,7 @@ public void onResult(DriveApi.DriveContentsResult result) { MetadataChangeSet changeSet = new MetadataChangeSet.Builder() .setTitle(exportedFile.getName()) - .setMimeType(getExportMimeType()) + .setMimeType(mExporter.getExportMimeType()) .build(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); @@ -312,22 +304,7 @@ public void onResult(DriveApi.DriveContentsResult result) { }); } - /** - * Returns the mime type for the configured export format - * @return MIME type as string - */ - public String getExportMimeType(){ - switch (mExportParams.getExportFormat()){ - case OFX: - case XML: - return "text/xml"; - case QIF: - default: - return "text/plain"; - } - } - - private void copyExportToDropbox() { + private void moveExportToDropbox() { Log.i(TAG, "Copying exported file to DropBox"); String dropboxAppKey = mContext.getString(R.string.dropbox_app_key, SettingsActivity.DROPBOX_APP_KEY); String dropboxAppSecret = mContext.getString(R.string.dropbox_app_secret, SettingsActivity.DROPBOX_APP_SECRET); @@ -336,8 +313,7 @@ private void copyExportToDropbox() { DbxFile dbExportFile = null; try { DbxFileSystem dbxFileSystem = DbxFileSystem.forAccount(mDbxAcctMgr.getLinkedAccount()); - List exportedFilePaths = getExportedFiles(); - for (String exportedFilePath : exportedFilePaths) { + for (String exportedFilePath : mExportedFiles) { File exportedFile = new File(exportedFilePath); dbExportFile = dbxFileSystem.create(new DbxPath(exportedFile.getName())); dbExportFile.writeFromExistingFile(exportedFile, false); @@ -357,43 +333,35 @@ private void copyExportToDropbox() { } } - /** - * Returns the list of files generated by one export session. - *

Typically it is one file. But QIF export generate multiple files per currency.

- * @return List of paths to exported files - * @throws IOException if the exported files could not be created - */ - private List getExportedFiles() throws IOException { - List exportedFilePaths; - if (mExportParams.getExportFormat() == ExportFormat.QIF) { - String path = mExportParams.getTargetFilepath(); - exportedFilePaths = QifExporter.splitQIF(new File(path)); - } else { - exportedFilePaths = new ArrayList<>(); - exportedFilePaths.add(mExportParams.getTargetFilepath()); - } - return exportedFilePaths; - } /** - * Moves the exported file from the internal storage where it is generated to external storage - * which is accessible to the user. - * @return File to which the export was moved. + * Moves the exported files from the internal storage where they are generated to + * external storage, which is accessible to the user. + * @return The list of files moved to the SD card. */ - private File moveExportToSDCard() { + private List moveExportToSDCard() { Log.i(TAG, "Moving exported file to external storage"); - File src = new File(mExportParams.getTargetFilepath()); - File dst = Exporter.createExportFile(mExportParams.getExportFormat()); + new File(Exporter.EXPORT_FOLDER_PATH).mkdirs(); + List dstFiles = new ArrayList<>(); - try { - copyFile(src, dst); - src.delete(); - return dst; - } catch (IOException e) { - Crashlytics.logException(e); - Log.e(TAG, e.getMessage()); - throw new Exporter.ExporterException(mExportParams, e); + for (String src: mExportedFiles) { + String dst = Exporter.EXPORT_FOLDER_PATH + stripPathPart(src); + try { + moveFile(src, dst); + dstFiles.add(dst); + } catch (IOException e) { + Crashlytics.logException(e); + Log.e(TAG, e.getMessage()); + throw new Exporter.ExporterException(mExportParams, e); + } } + + return dstFiles; + } + + // "/some/path/filename.ext" -> "filename.ext" + private String stripPathPart(String fullPathName) { + return (new File(fullPathName)).getName(); } /** @@ -418,37 +386,26 @@ private void backupAndDeleteTransactions(){ /** * Starts an intent chooser to allow the user to select an activity to receive - * the exported OFX file - * @param path String path to the file on disk + * the exported files. + * @param paths list of full paths of the files to send to the activity. */ - private void shareFile(String path) { - String defaultEmail = PreferenceManager.getDefaultSharedPreferences(mContext) - .getString(mContext.getString(R.string.key_default_export_email), null); + private void shareFiles(List paths) { Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); shareIntent.setType("text/xml"); - ArrayList exportFiles = new ArrayList<>(); - if (mExportParams.getExportFormat() == ExportFormat.QIF) { - try { - List splitFiles = QifExporter.splitQIF(new File(path)); - for (String file : splitFiles) { - exportFiles.add(Uri.parse("file://" + file)); - } - } catch (IOException e) { - Log.e(TAG, "Error split up files in shareFile. " + e.getMessage()); - Crashlytics.logException(e); - return; - } - } else { - exportFiles.add(Uri.parse("file://" + path)); - } - shareIntent.putExtra(Intent.EXTRA_STREAM, exportFiles); + + ArrayList exportFiles = convertFilePathsToUris(paths); +// shareIntent.putExtra(Intent.EXTRA_STREAM, exportFiles); + shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, exportFiles); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, mContext.getString(R.string.title_export_email, mExportParams.getExportFormat().name())); - if (defaultEmail != null && defaultEmail.trim().length() > 0) { + + String defaultEmail = PreferenceManager.getDefaultSharedPreferences(mContext) + .getString(mContext.getString(R.string.key_default_export_email), null); + if (defaultEmail != null && defaultEmail.trim().length() > 0) shareIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{defaultEmail}); - } - SimpleDateFormat formatter = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(); + SimpleDateFormat formatter = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(); ArrayList extraText = new ArrayList<>(); extraText.add(mContext.getString(R.string.description_export_email) + " " + formatter.format(new Date(System.currentTimeMillis()))); @@ -457,7 +414,8 @@ private void shareFile(String path) { if (mContext instanceof Activity) { List activities = mContext.getPackageManager().queryIntentActivities(shareIntent, 0); if (activities != null && !activities.isEmpty()) { - mContext.startActivity(Intent.createChooser(shareIntent, mContext.getString(R.string.title_select_export_destination))); + mContext.startActivity(Intent.createChooser(shareIntent, + mContext.getString(R.string.title_select_export_destination))); } else { Toast.makeText(mContext, R.string.toast_no_compatible_apps_to_receive_export, Toast.LENGTH_LONG).show(); @@ -465,27 +423,47 @@ private void shareFile(String path) { } } + // + + /** + * Convert file paths to URIs by adding the file// prefix + *

e.g. /some/path/file.ext --> file:///some/path/file.ext

+ * @param paths List of file paths to convert + * @return List of file URIs + */ + @NonNull + private ArrayList convertFilePathsToUris(List paths) { + ArrayList exportFiles = new ArrayList<>(); + + for (String path : paths) { + File file = new File(path); + file.setReadable(true, false); + exportFiles.add(Uri.fromFile(file)); +// exportFiles.add(Uri.parse("file://" + file)); + } + return exportFiles; + } + /** - * Copies a file from src to dst + * Moves a file from src to dst * @param src Absolute path to the source file * @param dst Absolute path to the destination file - * @throws IOException if the file could not be copied + * @throws IOException if the file could not be moved. */ - public void copyFile(File src, File dst) throws IOException { - //TODO: Make this asynchronous at some time, t in the future - if (mExportParams.getExportFormat() == ExportFormat.QIF) { - QifExporter.splitQIF(src, dst); - } else { - FileChannel inChannel = new FileInputStream(src).getChannel(); - FileChannel outChannel = new FileOutputStream(dst).getChannel(); - try { - inChannel.transferTo(0, inChannel.size(), outChannel); - } finally { - if (inChannel != null) - inChannel.close(); - outChannel.close(); - } + public void moveFile(String src, String dst) throws IOException { + //TODO: Make this asynchronous at some time, t in the future. + File srcFile = new File(src); + File dstFile = new File(dst); + FileChannel inChannel = new FileInputStream(srcFile).getChannel(); + FileChannel outChannel = new FileOutputStream(dstFile).getChannel(); + try { + inChannel.transferTo(0, inChannel.size(), outChannel); + } finally { + if (inChannel != null) + inChannel.close(); + outChannel.close(); } + srcFile.delete(); } } diff --git a/app/src/main/java/org/gnucash/android/export/ExportParams.java b/app/src/main/java/org/gnucash/android/export/ExportParams.java index 6b23ede19..97232940e 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportParams.java +++ b/app/src/main/java/org/gnucash/android/export/ExportParams.java @@ -16,9 +16,15 @@ package org.gnucash.android.export; +import android.preference.PreferenceManager; + +import org.gnucash.android.BuildConfig; +import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.ui.export.ExportFormFragment; +import java.sql.Timestamp; + /** * Encapsulation of the parameters used for exporting transactions. * The parameters are determined by the user in the export dialog and are then transmitted to the asynchronous task which @@ -42,10 +48,9 @@ public enum ExportTarget {SD_CARD, SHARING, DROPBOX, GOOGLE_DRIVE } private ExportFormat mExportFormat = ExportFormat.QIF; /** - * Flag to determine if all transactions (including previously exported ones) should be exported - * By default only new transactions since the last export will be exported. + * All transactions created after this date will be exported */ - private boolean mExportAllTransactions = false; + private Timestamp mExportStartTime = Timestamp.valueOf(Exporter.TIMESTAMP_ZERO); /** * Flag to determine if all transactions should be deleted after exporting is complete @@ -58,11 +63,6 @@ public enum ExportTarget {SD_CARD, SHARING, DROPBOX, GOOGLE_DRIVE } */ private ExportTarget mExportTarget = ExportTarget.SHARING; - /** - * File path for the internal saving of transactions before determining export destination. - */ - private String mTargetFilepath; - /** * Creates a new set of paramters and specifies the export format * @param format Format to use when exporting the transactions @@ -85,24 +85,23 @@ public ExportFormat getExportFormat() { */ public void setExportFormat(ExportFormat exportFormat) { this.mExportFormat = exportFormat; - this.mTargetFilepath = GnuCashApplication.getAppContext().getFilesDir() + "/" - + Exporter.buildExportFilename(mExportFormat); } /** - * Returns flag whether all transactions should be exported, or only new ones since last export - * @return true if all transactions should be exported, false otherwise + * Return date from which to start exporting transactions + *

Transactions created or modified after this timestamp will be exported

+ * @return Timestamp from which to export */ - public boolean shouldExportAllTransactions() { - return mExportAllTransactions; + public Timestamp getExportStartTime(){ + return mExportStartTime; } /** - * Sets flag for exporting all transactions or only new transactions since last export - * @param exportAll Boolean flag + * Set the timestamp after which all transactions created/modified will be exported + * @param exportStartTime Timestamp */ - public void setExportAllTransactions(boolean exportAll) { - this.mExportAllTransactions = exportAll; + public void setExportStartTime(Timestamp exportStartTime){ + this.mExportStartTime = exportStartTime; } /** @@ -137,19 +136,10 @@ public void setExportTarget(ExportTarget mExportTarget) { this.mExportTarget = mExportTarget; } - /** - * Returns the internal target file path for the exported transactions. - * This file path is not accessible outside the context of the application - * @return String path to exported transactions - */ - public String getTargetFilepath() { - return mTargetFilepath; - } - @Override public String toString() { - return "Export " + mExportFormat.name() + " to " + mExportTarget.name() + " at " - + mTargetFilepath; + return "Export all transactions created since " + mExportStartTime.toString() + + " as "+ mExportFormat.name() + " to " + mExportTarget.name(); } /** @@ -159,11 +149,10 @@ public String toString() { */ public String toCsv(){ String separator = ";"; - String csv = mExportFormat.name() + separator + mExportTarget.name() + separator - + Boolean.toString(mExportAllTransactions) + separator - + Boolean.toString(mDeleteTransactionsAfterExport); - return csv; + return mExportFormat.name() + separator + mExportTarget.name() + separator + + mExportStartTime.toString() + separator + + Boolean.toString(mDeleteTransactionsAfterExport); } /** @@ -175,7 +164,7 @@ public static ExportParams parseCsv(String csvParams){ String[] tokens = csvParams.split(";"); ExportParams params = new ExportParams(ExportFormat.valueOf(tokens[0])); params.setExportTarget(ExportTarget.valueOf(tokens[1])); - params.setExportAllTransactions(Boolean.parseBoolean(tokens[2])); + params.setExportStartTime(Timestamp.valueOf(tokens[2])); params.setDeleteTransactionsAfterExport(Boolean.parseBoolean(tokens[3])); return params; diff --git a/app/src/main/java/org/gnucash/android/export/Exporter.java b/app/src/main/java/org/gnucash/android/export/Exporter.java index 41f041661..9727f1013 100644 --- a/app/src/main/java/org/gnucash/android/export/Exporter.java +++ b/app/src/main/java/org/gnucash/android/export/Exporter.java @@ -35,12 +35,11 @@ import org.gnucash.android.db.TransactionsDbAdapter; import java.io.File; -import java.io.FileFilter; -import java.io.Writer; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Locale; /** @@ -74,7 +73,16 @@ public abstract class Exporter { /** * Export options */ - protected ExportParams mParameters; + protected ExportParams mExportParams; + + /** + * Cache directory to which files will be first exported before moved to final destination. + *

There is a different cache dir per export format, which has the name of the export format.
+ * The cache dir is cleared every time a new {@link Exporter} is instantiated. + * The files created here are only accessible within this application, and should be copied to SD card before they can be shared + *

+ */ + protected File mCacheDir; private static final SimpleDateFormat EXPORT_FILENAME_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US); @@ -92,28 +100,32 @@ public abstract class Exporter { protected TransactionsDbAdapter mTransactionsDbAdapter; protected SplitsDbAdapter mSplitsDbAdapter; protected ScheduledActionDbAdapter mScheduledActionDbAdapter; - protected PricesDbAdapter mPricesDbAdpater; + protected PricesDbAdapter mPricesDbAdapter; protected CommoditiesDbAdapter mCommoditiesDbAdapter; protected Context mContext; public Exporter(ExportParams params, SQLiteDatabase db) { - this.mParameters = params; + this.mExportParams = params; mContext = GnuCashApplication.getAppContext(); if (db == null) { mAccountsDbAdapter = AccountsDbAdapter.getInstance(); mTransactionsDbAdapter = TransactionsDbAdapter.getInstance(); mSplitsDbAdapter = SplitsDbAdapter.getInstance(); mScheduledActionDbAdapter = ScheduledActionDbAdapter.getInstance(); - mPricesDbAdpater = PricesDbAdapter.getInstance(); + mPricesDbAdapter = PricesDbAdapter.getInstance(); mCommoditiesDbAdapter = CommoditiesDbAdapter.getInstance(); } else { mSplitsDbAdapter = new SplitsDbAdapter(db); mTransactionsDbAdapter = new TransactionsDbAdapter(db, mSplitsDbAdapter); mAccountsDbAdapter = new AccountsDbAdapter(db, mTransactionsDbAdapter); mScheduledActionDbAdapter = new ScheduledActionDbAdapter(db); - mPricesDbAdpater = new PricesDbAdapter(db); + mPricesDbAdapter = new PricesDbAdapter(db); mCommoditiesDbAdapter = new CommoditiesDbAdapter(db); } + + mCacheDir = new File(mContext.getCacheDir(), params.getExportFormat().name()); + mCacheDir.mkdir(); + purgeDirectory(mCacheDir); } /** @@ -121,10 +133,8 @@ public Exporter(ExportParams params, SQLiteDatabase db) { * @return String containing the file name */ public static String buildExportFilename(ExportFormat format) { - String filename = EXPORT_FILENAME_DATE_FORMAT.format( - new Date(System.currentTimeMillis())) + return EXPORT_FILENAME_DATE_FORMAT.format(new Date(System.currentTimeMillis())) + "_gnucash_export" + format.getExtension(); - return filename; } /** @@ -149,59 +159,44 @@ public static long getExportTime(String filename){ } /** - * Builds a file (creating folders where necessary) for saving the exported data - * @param format Export format which determines the file extension - * @return File for export - * @see #EXPORT_FOLDER_PATH + * Generates the export output + * @throws ExporterException if an error occurs during export */ - public static File createExportFile(ExportFormat format){ - new File(EXPORT_FOLDER_PATH).mkdirs(); - return new File(EXPORT_FOLDER_PATH + buildExportFilename(format)); - } + public abstract List generateExport() throws ExporterException; /** - * Builds a file for backups of the database (in XML) format. - * Backups are usually zipped and have extension ".zip" - * @return File for saving backups - * @see #BACKUP_FOLDER_PATH + * Recursively delete all files in a directory + * @param directory File descriptor for directory */ - public static File buildBackupFile(){ - new File(BACKUP_FOLDER_PATH).mkdirs(); - return new File(BACKUP_FOLDER_PATH + buildExportFilename(ExportFormat.XML) + ".zip"); + private void purgeDirectory(File directory){ + for (File file : directory.listFiles()) { + if (file.isDirectory()) + purgeDirectory(file); + else + file.delete(); + } } /** - * Returns the most recent backup file from the backup folder - * @return Last modified file from backup folder - * @see #BACKUP_FOLDER_PATH + * Returns the path to the file where the exporter should save the export during generation + *

This path is a temporary cache file whose file extension matches the export format.
+ * This file is deleted every time a new export is started

+ * @return Absolute path to file */ - public static File getMostRecentBackupFile(){ - File backupFolder = new File(BACKUP_FOLDER_PATH); - if (!backupFolder.exists()) - return null; - - File[] files = backupFolder.listFiles(new FileFilter() { - public boolean accept(File file) { - return file.isFile(); - } - }); - long lastMod = Long.MIN_VALUE; - File backupFile = null; - for (File file : files) { - if (file.lastModified() > lastMod) { - backupFile = file; - lastMod = file.lastModified(); - } - } - return backupFile; + protected String getExportCacheFilePath(){ + String cachePath = mCacheDir.getAbsolutePath(); + if (!cachePath.endsWith("/")) + cachePath += "/"; + return cachePath + buildExportFilename(mExportParams.getExportFormat()); } /** - * Generates the export output - * @param writer A Writer to export result to - * @throws ExporterException if an error occurs during export + * Returns the MIME type for this exporter. + * @return MIME type as string */ - public abstract void generateExport(Writer writer) throws ExporterException; + public String getExportMimeType(){ + return "text/plain"; + } public static class ExporterException extends RuntimeException{ diff --git a/app/src/main/java/org/gnucash/android/export/ofx/OfxExporter.java b/app/src/main/java/org/gnucash/android/export/ofx/OfxExporter.java index ff9b144ea..c29e426bd 100644 --- a/app/src/main/java/org/gnucash/android/export/ofx/OfxExporter.java +++ b/app/src/main/java/org/gnucash/android/export/ofx/OfxExporter.java @@ -34,10 +34,15 @@ import org.w3c.dom.Node; import org.w3c.dom.ProcessingInstruction; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; @@ -99,7 +104,7 @@ private void generateOfx(Document doc, Element parent){ //add account details (transactions) to the XML document - account.toOfx(doc, statementTransactionResponse, mParameters.shouldExportAllTransactions()); + account.toOfx(doc, statementTransactionResponse, mExportParams.getExportStartTime()); //mark as exported accountsDbAdapter.markAsExported(account.getUID()); @@ -107,9 +112,9 @@ private void generateOfx(Document doc, Element parent){ } } - public String generateExport() throws ExporterException { - mAccountsList = mParameters.shouldExportAllTransactions() ? - mAccountsDbAdapter.getAllRecords() : mAccountsDbAdapter.getExportableAccounts(); + // FIXME: Move code to generateExport() + private String generateOfxExport() throws ExporterException { + mAccountsList = mAccountsDbAdapter.getExportableAccounts(mExportParams.getExportStartTime()); DocumentBuilderFactory docFactory = DocumentBuilderFactory .newInstance(); @@ -117,7 +122,7 @@ public String generateExport() throws ExporterException { try { docBuilder = docFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { - throw new ExporterException(mParameters, e); + throw new ExporterException(mExportParams, e); } Document document = docBuilder.newDocument(); @@ -142,25 +147,36 @@ public String generateExport() throws ExporterException { return stringWriter.toString(); } else { Node ofxNode = document.getElementsByTagName("OFX").item(0); - write(ofxNode, stringWriter, true); - - StringBuffer stringBuffer = new StringBuffer(OfxHelper.OFX_SGML_HEADER); - stringBuffer.append('\n'); - stringBuffer.append(stringWriter.toString()); PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(Exporter.PREF_LAST_EXPORT_TIME, timeStamp).apply(); - return stringBuffer.toString(); + return OfxHelper.OFX_SGML_HEADER + '\n' + stringWriter.toString(); } } @Override - public void generateExport(Writer writer) throws ExporterException { + public List generateExport() throws ExporterException { + BufferedWriter writer = null; + try { - writer.write(generateExport()); - } - catch (IOException e) { - throw new ExporterException(mParameters, e); + File file = new File(getExportCacheFilePath()); + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + writer.write(generateOfxExport()); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } + } } + + List exportedFiles = new ArrayList<>(); + exportedFiles.add(getExportCacheFilePath()); + + return exportedFiles; } /** @@ -189,4 +205,12 @@ private void write(Node node, Writer outputWriter, boolean omitXmlDeclaration){ Crashlytics.logException(tfException); } } + + /** + * Returns the MIME type for this exporter. + * @return MIME type as string + */ + public String getExportMimeType(){ + return "text/xml"; + } } diff --git a/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java b/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java index ac5ca01cc..6c1fcfde6 100644 --- a/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java +++ b/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java @@ -21,19 +21,18 @@ import android.preference.PreferenceManager; import org.gnucash.android.db.AccountsDbAdapter; -import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; -import org.gnucash.android.model.Transaction; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.Writer; +import java.io.OutputStreamWriter; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.ArrayList; @@ -57,11 +56,11 @@ public QifExporter(ExportParams params){ } @Override - public void generateExport(Writer writer) throws ExporterException { + public List generateExport() throws ExporterException { final String newLine = "\n"; TransactionsDbAdapter transactionsDbAdapter = mTransactionsDbAdapter; try { - String lastExportTimeStamp = PreferenceManager.getDefaultSharedPreferences(mContext).getString(Exporter.PREF_LAST_EXPORT_TIME, Exporter.TIMESTAMP_ZERO); + String lastExportTimeStamp = mExportParams.getExportStartTime().toString(); Cursor cursor = transactionsDbAdapter.fetchTransactionsWithSplitsWithTransactionAccount( new String[]{ TransactionEntry.TABLE_NAME + "_" + TransactionEntry.COLUMN_UID + " AS trans_uid", @@ -88,15 +87,17 @@ public void generateExport(Writer writer) throws ExporterException { // or if the transaction has only one split (the whole transaction would be lost if it is not selected) "trans_split_count == 1 )" + ( - mParameters.shouldExportAllTransactions() ? - //"" : " AND " + TransactionEntry.TABLE_NAME + "_" + TransactionEntry.COLUMN_EXPORTED + "== 0" - "" : " AND " + TransactionEntry.TABLE_NAME + "_" + DatabaseSchema.CommonColumns.COLUMN_MODIFIED_AT + " > \"" + lastExportTimeStamp + "\"" + " AND " + TransactionEntry.TABLE_NAME + "_" + TransactionEntry.COLUMN_MODIFIED_AT + " > \"" + lastExportTimeStamp + "\"" ), null, // trans_time ASC : put transactions in time order // trans_uid ASC : put splits from the same transaction together "acct1_currency ASC, trans_time ASC, trans_uid ASC" ); + + File file = new File(getExportCacheFilePath()); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + try { String currentCurrencyCode = ""; String currentAccountUID = ""; @@ -189,7 +190,7 @@ public void generateExport(Writer writer) throws ExporterException { precision = 3; break; default: - throw new ExporterException(mParameters, "split quantity has illegal denominator: "+ quantity_denom); + throw new ExporterException(mExportParams, "split quantity has illegal denominator: "+ quantity_denom); } Double quantity = 0.0; if (quantity_denom != 0) { @@ -204,22 +205,23 @@ public void generateExport(Writer writer) throws ExporterException { // end last transaction writer.append(QifHelper.ENTRY_TERMINATOR).append(newLine); } - } - finally { + writer.flush(); + } finally { cursor.close(); + writer.close(); } + ContentValues contentValues = new ContentValues(); contentValues.put(TransactionEntry.COLUMN_EXPORTED, 1); transactionsDbAdapter.updateTransaction(contentValues, null, null); - } - catch (IOException e) - { - throw new ExporterException(mParameters, e); - } - /// export successful - String timeStamp = new Timestamp(System.currentTimeMillis()).toString(); - PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(Exporter.PREF_LAST_EXPORT_TIME, timeStamp).apply(); + /// export successful + String timeStamp = new Timestamp(System.currentTimeMillis()).toString(); + PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(Exporter.PREF_LAST_EXPORT_TIME, timeStamp).apply(); + return splitQIF(file); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } } /** @@ -229,16 +231,12 @@ public void generateExport(Writer writer) throws ExporterException { * @return a list of paths of the newly created Qif files. * @throws IOException if something went wrong while splitting the file. */ - public static List splitQIF(File file) throws IOException { - return splitQIF(file, file); - } - - public static List splitQIF(File src, File dst) throws IOException { + public List splitQIF(File file) throws IOException { // split only at the last dot - String[] pathParts = dst.getPath().split("(?=\\.[^\\.]+$)"); + String[] pathParts = file.getPath().split("(?=\\.[^\\.]+$)"); ArrayList splitFiles = new ArrayList<>(); String line; - BufferedReader in = new BufferedReader(new FileReader(src)); + BufferedReader in = new BufferedReader(new FileReader(file)); BufferedWriter out = null; try { while ((line = in.readLine()) != null) { @@ -252,7 +250,7 @@ public static List splitQIF(File src, File dst) throws IOException { out = new BufferedWriter(new FileWriter(newFileName)); } else { if (out == null) { - throw new IllegalArgumentException(src.getPath() + " format is not correct"); + throw new IllegalArgumentException(file.getPath() + " format is not correct"); } out.append(line).append('\n'); } @@ -265,4 +263,12 @@ public static List splitQIF(File src, File dst) throws IOException { } return splitFiles; } + + /** + * Returns the mime type for this Exporter. + * @return MIME type as string + */ + public String getExportMimeType(){ + return "text/plain"; + } } diff --git a/app/src/main/java/org/gnucash/android/export/xml/GncXmlExporter.java b/app/src/main/java/org/gnucash/android/export/xml/GncXmlExporter.java index 6d8179ebd..407d65ad8 100644 --- a/app/src/main/java/org/gnucash/android/export/xml/GncXmlExporter.java +++ b/app/src/main/java/org/gnucash/android/export/xml/GncXmlExporter.java @@ -41,6 +41,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.BufferedOutputStream; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; @@ -53,7 +54,6 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import java.util.UUID; import java.util.zip.GZIPOutputStream; import static org.gnucash.android.db.DatabaseSchema.ScheduledActionEntry; @@ -426,7 +426,7 @@ private void exportTransactions(XmlSerializer xmlSerializer, boolean exportTempl // account guid xmlSerializer.startTag(null, GncXmlHelper.TAG_SPLIT_ACCOUNT); xmlSerializer.attribute(null, GncXmlHelper.ATTR_KEY_TYPE, GncXmlHelper.ATTR_VALUE_GUID); - String splitAccountUID = null; + String splitAccountUID; if (exportTemplates){ //get the UID of the template account splitAccountUID = mTransactionToTemplateAccountMap.get(curTrxUID).getUID(); @@ -636,7 +636,7 @@ private void exportCommodity(XmlSerializer xmlSerializer, List currenc private void exportPrices(XmlSerializer xmlSerializer) throws IOException { xmlSerializer.startTag(null, GncXmlHelper.TAG_PRICEDB); xmlSerializer.attribute(null, GncXmlHelper.ATTR_KEY_VERSION, "1"); - Cursor cursor = mPricesDbAdpater.fetchAllRecords(); + Cursor cursor = mPricesDbAdapter.fetchAllRecords(); try { while(cursor.moveToNext()) { xmlSerializer.startTag(null, GncXmlHelper.TAG_PRICE); @@ -650,7 +650,7 @@ private void exportPrices(XmlSerializer xmlSerializer) throws IOException { xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_SPACE); xmlSerializer.text("ISO4217"); xmlSerializer.endTag(null, GncXmlHelper.TAG_COMMODITY_SPACE); - xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_ID);; + xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_ID); xmlSerializer.text(mCommoditiesDbAdapter.getCurrencyCode(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.PriceEntry.COLUMN_COMMODITY_UID)))); xmlSerializer.endTag(null, GncXmlHelper.TAG_COMMODITY_ID); xmlSerializer.endTag(null, GncXmlHelper.TAG_PRICE_COMMODITY); @@ -659,7 +659,7 @@ private void exportPrices(XmlSerializer xmlSerializer) throws IOException { xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_SPACE); xmlSerializer.text("ISO4217"); xmlSerializer.endTag(null, GncXmlHelper.TAG_COMMODITY_SPACE); - xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_ID);; + xmlSerializer.startTag(null, GncXmlHelper.TAG_COMMODITY_ID); xmlSerializer.text(mCommoditiesDbAdapter.getCurrencyCode(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.PriceEntry.COLUMN_CURRENCY_UID)))); xmlSerializer.endTag(null, GncXmlHelper.TAG_COMMODITY_ID); xmlSerializer.endTag(null, GncXmlHelper.TAG_PRICE_CURRENCY); @@ -695,16 +695,49 @@ private void exportPrices(XmlSerializer xmlSerializer) throws IOException { } @Override - public void generateExport(Writer writer) throws ExporterException{ + public List generateExport() throws ExporterException { + OutputStreamWriter writer = null; + String outputFile = getExportCacheFilePath(); try { - String[] namespaces = new String[] {"gnc", "act", "book", "cd", "cmdty", "price", "slot", + FileOutputStream fileOutputStream = new FileOutputStream(outputFile); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); + writer = new OutputStreamWriter(bufferedOutputStream); + + generateExport(writer); + } catch (IOException ex){ + Crashlytics.log("Error exporting XML"); + Crashlytics.logException(ex); + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } + } + } + + List exportedFiles = new ArrayList<>(); + exportedFiles.add(outputFile); + + return exportedFiles; + } + + /** + * Generates an XML export of the database and writes it to the {@code writer} output stream + * @param writer Output stream + * @throws ExporterException + */ + public void generateExport(Writer writer) throws ExporterException { + try { + String[] namespaces = new String[]{"gnc", "act", "book", "cd", "cmdty", "price", "slot", "split", "trn", "ts", "sx", "recurrence"}; XmlSerializer xmlSerializer = XmlPullParserFactory.newInstance().newSerializer(); xmlSerializer.setOutput(writer); xmlSerializer.startDocument("utf-8", true); // root tag xmlSerializer.startTag(null, GncXmlHelper.TAG_ROOT); - for(String ns : namespaces) { + for (String ns : namespaces) { xmlSerializer.attribute(null, "xmlns:" + ns, "http://www.gnucash.org/XML/" + ns); } // book count @@ -722,7 +755,7 @@ public void generateExport(Writer writer) throws ExporterException{ xmlSerializer.endTag(null, GncXmlHelper.TAG_BOOK_ID); //commodity count List currencies = mAccountsDbAdapter.getCurrenciesInUse(); - for (int i = 0; i< currencies.size();i++) { + for (int i = 0; i < currencies.size(); i++) { if (currencies.get(i).getCurrencyCode().equals("XXX")) { currencies.remove(i); } @@ -742,7 +775,7 @@ public void generateExport(Writer writer) throws ExporterException{ xmlSerializer.text(mTransactionsDbAdapter.getRecordsCount() + ""); xmlSerializer.endTag(null, GncXmlHelper.TAG_COUNT_DATA); //price count - long priceCount = mPricesDbAdpater.getRecordsCount(); + long priceCount = mPricesDbAdapter.getRecordsCount(); if (priceCount > 0) { xmlSerializer.startTag(null, GncXmlHelper.TAG_COUNT_DATA); xmlSerializer.attribute(null, GncXmlHelper.ATTR_KEY_CD_TYPE, "price"); @@ -772,29 +805,50 @@ public void generateExport(Writer writer) throws ExporterException{ xmlSerializer.endTag(null, GncXmlHelper.TAG_BOOK); xmlSerializer.endTag(null, GncXmlHelper.TAG_ROOT); xmlSerializer.endDocument(); + xmlSerializer.flush(); } catch (Exception e) { Crashlytics.logException(e); - throw new ExporterException(mParameters, e); + throw new ExporterException(mExportParams, e); } } + + /** + * Returns the MIME type for this exporter. + * @return MIME type as string + */ + public String getExportMimeType(){ + return "text/xml"; + } + /** - * Creates a backup of current database contents to the default backup location + * Creates a backup of current database contents to the directory {@link Exporter#BACKUP_FOLDER_PATH} * @return {@code true} if backup was successful, {@code false} otherwise */ public static boolean createBackup(){ - ExportParams params = new ExportParams(ExportFormat.XML); try { - FileOutputStream fileOutputStream = new FileOutputStream(Exporter.buildBackupFile()); + new File(BACKUP_FOLDER_PATH).mkdirs(); + FileOutputStream fileOutputStream = new FileOutputStream(getBackupFilePath()); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(bufferedOutputStream); - OutputStreamWriter outputStreamWriter = new OutputStreamWriter(gzipOutputStream); - new GncXmlExporter(params).generateExport(outputStreamWriter); - outputStreamWriter.close(); + OutputStreamWriter writer = new OutputStreamWriter(gzipOutputStream); + + ExportParams params = new ExportParams(ExportFormat.XML); + new GncXmlExporter(params).generateExport(writer); return true; - } catch (IOException e) { + } catch (IOException | ExporterException e) { Crashlytics.logException(e); - Log.e("GncXmlExporter", "Error creating backup", e); + Log.e("GncXmlExporter", "Error creating XML backup", e); return false; } } + + /** + * Returns the full path of a file to make database backup. + * Backups are done in XML format and are zipped (with ".zip" extension). + * @return the file path for backups of the database. + * @see #BACKUP_FOLDER_PATH + */ + private static String getBackupFilePath(){ + return BACKUP_FOLDER_PATH + buildExportFilename(ExportFormat.XML) + ".zip"; + } } diff --git a/app/src/main/java/org/gnucash/android/importer/GncXmlHandler.java b/app/src/main/java/org/gnucash/android/importer/GncXmlHandler.java index 40be52aac..b4ac1235f 100644 --- a/app/src/main/java/org/gnucash/android/importer/GncXmlHandler.java +++ b/app/src/main/java/org/gnucash/android/importer/GncXmlHandler.java @@ -23,6 +23,7 @@ import com.crashlytics.android.Crashlytics; +import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.db.PricesDbAdapter; @@ -230,6 +231,8 @@ public class GncXmlHandler extends DefaultHandler { private PricesDbAdapter mPricesDbAdapter; + private Map mCurrencyCount; + /** * Creates a handler for handling XML stream events when parsing the XML backup file */ @@ -275,6 +278,7 @@ private void init(@Nullable SQLiteDatabase db) { mAutoBalanceSplits = new ArrayList<>(); mPriceList = new ArrayList<>(); + mCurrencyCount = new HashMap<>(); } @Override @@ -372,6 +376,11 @@ public void endElement(String uri, String localName, String qualifiedName) throw String currencyCode = mISO4217Currency ? characterString : NO_CURRENCY_CODE; if (mAccount != null) { mAccount.setCurrencyCode(currencyCode); + if (mCurrencyCount.containsKey(currencyCode)) { + mCurrencyCount.put(currencyCode, mCurrencyCount.get(currencyCode) + 1); + } else { + mCurrencyCount.put(currencyCode, 1); + } } if (mTransaction != null) { mTransaction.setCurrencyCode(currencyCode); @@ -844,6 +853,18 @@ public void endDocument() throws SAXException { } finally { mAccountsDbAdapter.endTransaction(); } + + String mostAppearedCurrency = ""; + int mostCurrencyAppearance = 0; + for (Map.Entry entry : mCurrencyCount.entrySet()) { + if (entry.getValue() > mostCurrencyAppearance) { + mostCurrencyAppearance = entry.getValue(); + mostAppearedCurrency = entry.getKey(); + } + } + if (mostCurrencyAppearance > 0) { + GnuCashApplication.setDefaultCurrencyCode(mostAppearedCurrency); + } } /** @@ -857,7 +878,7 @@ private Commodity getCommodityForAccount(String accountUID){ return mAccountMap.get(accountUID).getCommodity(); } catch (Exception e) { Crashlytics.logException(e); - return Commodity.getInstance(Money.DEFAULT_CURRENCY_CODE); + return Commodity.DEFAULT_COMMODITY; } } diff --git a/app/src/main/java/org/gnucash/android/importer/ImportAsyncTask.java b/app/src/main/java/org/gnucash/android/importer/ImportAsyncTask.java index a0232003a..8619362db 100644 --- a/app/src/main/java/org/gnucash/android/importer/ImportAsyncTask.java +++ b/app/src/main/java/org/gnucash/android/importer/ImportAsyncTask.java @@ -18,6 +18,7 @@ import android.annotation.TargetApi; import android.app.Activity; import android.app.ProgressDialog; +import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.util.Log; @@ -35,17 +36,17 @@ * Imports a GnuCash (desktop) account file and displays a progress dialog. * The AccountsActivity is opened when importing is done. */ -public class ImportAsyncTask extends AsyncTask { - private final Activity context; +public class ImportAsyncTask extends AsyncTask { + private final Activity mContext; private TaskDelegate mDelegate; - private ProgressDialog progressDialog; + private ProgressDialog mProgressDialog; public ImportAsyncTask(Activity context){ - this.context = context; + this.mContext = context; } public ImportAsyncTask(Activity context, TaskDelegate delegate){ - this.context = context; + this.mContext = context; this.mDelegate = delegate; } @@ -53,34 +54,36 @@ public ImportAsyncTask(Activity context, TaskDelegate delegate){ @Override protected void onPreExecute() { super.onPreExecute(); - progressDialog = new ProgressDialog(context); - progressDialog.setTitle(R.string.title_progress_importing_accounts); - progressDialog.setIndeterminate(true); - progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - progressDialog.show(); + mProgressDialog = new ProgressDialog(mContext); + mProgressDialog.setTitle(R.string.title_progress_importing_accounts); + mProgressDialog.setIndeterminate(true); + mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + mProgressDialog.show(); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB){ //these methods must be called after progressDialog.show() - progressDialog.setProgressNumberFormat(null); - progressDialog.setProgressPercentFormat(null); + mProgressDialog.setProgressNumberFormat(null); + mProgressDialog.setProgressPercentFormat(null); } } @Override - protected Boolean doInBackground(InputStream... inputStreams) { + protected Boolean doInBackground(Uri... uris) { try { - GncXmlImporter.parse(inputStreams[0]); + InputStream accountInputStream = mContext.getContentResolver().openInputStream(uris[0]); + GncXmlImporter.parse(accountInputStream); } catch (Exception exception){ Log.e(ImportAsyncTask.class.getName(), "" + exception.getMessage()); Crashlytics.logException(exception); exception.printStackTrace(); final String err_msg = exception.getLocalizedMessage(); - context.runOnUiThread(new Runnable() { + Crashlytics.log(err_msg); + mContext.runOnUiThread(new Runnable() { @Override public void run() { - Toast.makeText(context, - context.getString(R.string.toast_error_importing_accounts) + "\n" + err_msg, + Toast.makeText(mContext, + mContext.getString(R.string.toast_error_importing_accounts) + "\n" + err_msg, Toast.LENGTH_LONG).show(); } }); @@ -96,18 +99,18 @@ protected void onPostExecute(Boolean importSuccess) { mDelegate.onTaskComplete(); try { - if (progressDialog != null && progressDialog.isShowing()) - progressDialog.dismiss(); + if (mProgressDialog != null && mProgressDialog.isShowing()) + mProgressDialog.dismiss(); } catch (IllegalArgumentException ex){ //TODO: This is a hack to catch "View not attached to window" exceptions //FIXME by moving the creation and display of the progress dialog to the Fragment } finally { - progressDialog = null; + mProgressDialog = null; } int message = importSuccess ? R.string.toast_success_importing_accounts : R.string.toast_error_importing_accounts; - Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); - AccountsActivity.start(context); + AccountsActivity.start(mContext); } } diff --git a/app/src/main/java/org/gnucash/android/model/Account.java b/app/src/main/java/org/gnucash/android/model/Account.java index 84dc317eb..6df050366 100644 --- a/app/src/main/java/org/gnucash/android/model/Account.java +++ b/app/src/main/java/org/gnucash/android/model/Account.java @@ -472,8 +472,9 @@ public static OfxAccountType convertToOfxAccountType(AccountType accountType){ * Converts this account's transactions into XML and adds them to the DOM document * @param doc XML DOM document for the OFX data * @param parent Parent node to which to add this account's transactions in XML + * @param exportStartTime Time from which to export transactions which are created/modified after */ - public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ + public void toOfx(Document doc, Element parent, Timestamp exportStartTime){ Element currency = doc.createElement(OfxHelper.TAG_CURRENCY_DEF); currency.appendChild(doc.createTextNode(mCommodity.getCurrencyCode())); @@ -529,9 +530,8 @@ public void toOfx(Document doc, Element parent, boolean exportAllTransactions){ bankTransactionsList.appendChild(dtstart); bankTransactionsList.appendChild(dtend); - Timestamp lastExportedTimestamp = Timestamp.valueOf(PreferenceManager.getDefaultSharedPreferences(GnuCashApplication.getAppContext()).getString(Exporter.PREF_LAST_EXPORT_TIME, Exporter.TIMESTAMP_ZERO)); for (Transaction transaction : mTransactionsList) { - if (!exportAllTransactions && /*transaction.isExported()*/ transaction.getModifiedTimestamp().before(lastExportedTimestamp)) + if (transaction.getModifiedTimestamp().before(exportStartTime)) continue; bankTransactionsList.appendChild(transaction.toOFX(doc, getUID())); } diff --git a/app/src/main/java/org/gnucash/android/model/Commodity.java b/app/src/main/java/org/gnucash/android/model/Commodity.java index 8169f4179..f60b787e3 100644 --- a/app/src/main/java/org/gnucash/android/model/Commodity.java +++ b/app/src/main/java/org/gnucash/android/model/Commodity.java @@ -15,6 +15,7 @@ */ package org.gnucash.android.model; +import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.CommoditiesDbAdapter; /** @@ -29,6 +30,8 @@ public enum Namespace { ISO4217 } //Namespace for commodities /** * Default commodity for device locale + *

This value is set when a new application instance is created in {@link GnuCashApplication#onCreate()}. + * The value initialized here is just a placeholder for unit tests

*/ public static Commodity DEFAULT_COMMODITY = new Commodity("US Dollars", "USD", 100); //this value is a stub. Will be overwritten when the app is launched @@ -161,17 +164,10 @@ public int getSmallestFraction() { * @see #getSmallestFraction() */ public int getSmallestFractionDigits(){ - switch (mSmallestFraction) { - case 1: return 0; - case 10: return 1; - case 100: return 2; - case 1000: return 3; - case 10000: return 4; - case 100000: return 5; - case 1000000: return 6; - default: - return 2; - //throw new UnsupportedOperationException("Invalid fraction digits in commodity with fraction: " + mSmallestFraction); + if (mSmallestFraction == 0){ + return 0; + } else { + return Integer.numberOfTrailingZeros(mSmallestFraction); } } @@ -183,12 +179,7 @@ public int getSmallestFractionDigits(){ * @throws IllegalArgumentException if the smallest fraction is not a power of 10 */ public void setSmallestFraction(int smallestFraction) { - if (smallestFraction != 1 && smallestFraction != 10 && smallestFraction != 100 - && smallestFraction != 1000 && smallestFraction != 10000 - && smallestFraction != 1000000 ) //make sure we are not getting digits - this.mSmallestFraction = 100; - else - this.mSmallestFraction = smallestFraction; + this.mSmallestFraction = smallestFraction; } public int getQuoteFlag() { diff --git a/app/src/main/java/org/gnucash/android/model/Money.java b/app/src/main/java/org/gnucash/android/model/Money.java index a30b5675b..02c6930ca 100644 --- a/app/src/main/java/org/gnucash/android/model/Money.java +++ b/app/src/main/java/org/gnucash/android/model/Money.java @@ -90,19 +90,19 @@ public static Money getZeroInstance(){ return sDefaultZero; } + /** + * Returns the {@link BigDecimal} from the {@code numerator} and {@code denominator} + * @param numerator Number of the fraction + * @param denominator Denominator of the fraction + * @return BigDecimal representation of the number + */ public static BigDecimal getBigDecimal(long numerator, long denominator) { int scale; if (numerator == 0 && denominator == 0) { denominator = 1; } - switch ((int)denominator) { - case 1: scale = 0; break; - case 10: scale = 1; break; - case 100: scale = 2; break; - case 1000: scale = 3; break; - default: - throw new InvalidParameterException("invalid denominator " + denominator); - } + + scale = Integer.numberOfTrailingZeros((int)denominator); return new BigDecimal(BigInteger.valueOf(numerator), scale); } @@ -112,8 +112,8 @@ public static BigDecimal getBigDecimal(long numerator, long denominator) { * @param commodity Commodity of the money */ public Money(BigDecimal amount, Commodity commodity){ - this.mAmount = amount; this.mCommodity = commodity; + setAmount(amount); //commodity has to be set first. Because we use it's scale } /** @@ -123,8 +123,9 @@ public Money(BigDecimal amount, Commodity commodity){ * @param currencyCode Currency code as specified by ISO 4217 */ public Money(String amount, String currencyCode){ + //commodity has to be set first mCommodity = Commodity.getInstance(currencyCode); - setAmount(amount); + setAmount(new BigDecimal(amount)); } /** @@ -226,22 +227,13 @@ public long getNumerator() { * @return GnuCash format denominator */ public long getDenominator() { - switch (getScale()) { - case 0: return 1; - case 1: return 10; - case 2: return 100; - case 3: return 1000; - case 4: return 10000; - case 5: return 100000; - case 6: return 1000000; //I think GnuCash XML can have gold and silver with this denom - - } - throw new RuntimeException("Unsupported number of fraction digits " + getScale()); + int scale = getScale(); + return BigDecimal.ONE.scaleByPowerOfTen(scale).longValueExact(); } /** * Returns the scale (precision) used for the decimal places of this amount. - *

The scale used depends on the currency

+ *

The scale used depends on the commodity

* @return Scale of amount as integer */ private int getScale() { @@ -287,15 +279,14 @@ public String asString(){ * @return String containing formatted Money representation */ public String formattedString(Locale locale){ -/* -//todo: enable this code for 2.1 release. Test better too + NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale); Currency currency = Currency.getInstance(mCommodity.getCurrencyCode()); String symbol; if (mCommodity.equals(Commodity.USD) && !locale.equals(Locale.US)) { symbol = "US$"; - } else if (mCommodity.equals(Commodity.EUR) { + } else if (mCommodity.equals(Commodity.EUR)) { symbol = currency.getSymbol(Locale.GERMANY); //euro currency is pretty unique around the world } else { symbol = currency.getSymbol(Locale.US); // US locale has the best symbol formatting table. @@ -307,13 +298,14 @@ public String formattedString(Locale locale){ currencyFormat.setMaximumFractionDigits(mCommodity.getSmallestFractionDigits()); return currencyFormat.format(asDouble()); -*/ - +/* +// old currency formatting code NumberFormat formatter = NumberFormat.getInstance(locale); formatter.setMinimumFractionDigits(mCommodity.getSmallestFractionDigits()); formatter.setMaximumFractionDigits(mCommodity.getSmallestFractionDigits()); Currency currency = Currency.getInstance(mCommodity.getCurrencyCode()); return formatter.format(asDouble()) + " " + currency.getSymbol(locale); +*/ } /** @@ -340,16 +332,7 @@ public Money negate(){ private void setAmount(@NonNull BigDecimal amount) { mAmount = amount.setScale(mCommodity.getSmallestFractionDigits(), ROUNDING_MODE); } - - /** - * Sets the amount value of this Money object - * The amount is parsed by the {@link BigDecimal} constructor - * @param amount {@link String} amount to be set - */ - private void setAmount(String amount){ - setAmount(parseToDecimal(amount)); - } - + /** * Returns a new Money object whose value is the sum of the values of * this object and addend. @@ -511,27 +494,6 @@ public int compareTo(@NonNull Money another) { return mAmount.compareTo(another.mAmount); } - /** - * Parses a Locale specific string into a number using format for {@link Locale#US} - * @param amountString Formatted String amount - * @return String amount formatted in the default locale - */ - public static BigDecimal parseToDecimal(String amountString){ - char separator = new DecimalFormatSymbols(Locale.US).getGroupingSeparator(); - amountString = amountString.replace(Character.toString(separator), ""); - NumberFormat formatter = NumberFormat.getInstance(Locale.US); - if (formatter instanceof DecimalFormat) { - ((DecimalFormat)formatter).setParseBigDecimal(true); - } - BigDecimal result = new BigDecimal(0); - try { - result = (BigDecimal) formatter.parse(amountString); - } catch (ParseException e) { - Crashlytics.logException(e); - } - return result; - } - /** * Returns a new instance of {@link Money} object with the absolute value of the current object * @return Money object with absolute value of this instance diff --git a/app/src/main/java/org/gnucash/android/model/Split.java b/app/src/main/java/org/gnucash/android/model/Split.java index 39b619064..5e19936c5 100644 --- a/app/src/main/java/org/gnucash/android/model/Split.java +++ b/app/src/main/java/org/gnucash/android/model/Split.java @@ -336,11 +336,11 @@ public static Split parseSplit(String splitCsvString) { } return split; } else { - int valueNum = Integer.parseInt(tokens[1]); - int valueDenom = Integer.parseInt(tokens[2]); + long valueNum = Long.parseLong(tokens[1]); + long valueDenom = Long.parseLong(tokens[2]); String valueCurrencyCode = tokens[3]; - int quantityNum = Integer.parseInt(tokens[4]); - int quantityDenom = Integer.parseInt(tokens[5]); + long quantityNum = Long.parseLong(tokens[4]); + long quantityDenom = Long.parseLong(tokens[5]); String qtyCurrencyCode = tokens[6]; Money value = new Money(valueNum, valueDenom, valueCurrencyCode); diff --git a/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java b/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java index 0108312fc..b83b0288f 100644 --- a/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java @@ -328,7 +328,6 @@ public void onClick(View view) { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - Cursor cursor = CommoditiesDbAdapter.getInstance().fetchAllRecords(); CommoditiesCursorAdapter commoditiesAdapter = new CommoditiesCursorAdapter( getActivity(), android.R.layout.simple_spinner_item); commoditiesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); diff --git a/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java b/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java index 6a1915a61..494d817ba 100644 --- a/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java +++ b/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java @@ -42,7 +42,7 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; @@ -65,7 +65,6 @@ import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.export.xml.GncXmlExporter; import org.gnucash.android.importer.ImportAsyncTask; -import org.gnucash.android.model.Money; import org.gnucash.android.ui.common.BaseDrawerActivity; import org.gnucash.android.ui.common.FormActivity; import org.gnucash.android.ui.common.UxArgument; @@ -77,7 +76,6 @@ import java.io.FileNotFoundException; import java.io.InputStream; -import java.util.ArrayList; import butterknife.Bind; import butterknife.ButterKnife; @@ -152,12 +150,12 @@ public class AccountsActivity extends BaseDrawerActivity implements OnAccountCli /** * Configuration for rating the app */ - public static RateThisApp.Config rateAppConfig = new RateThisApp.Config(14, 100); + public static RateThisApp.Config rateAppConfig = new RateThisApp.Config(30, 100); /** * Adapter for managing the sub-account and transaction fragment pages in the accounts view */ - private class AccountViewPagerAdapter extends FragmentStatePagerAdapter { + private class AccountViewPagerAdapter extends FragmentPagerAdapter { public AccountViewPagerAdapter(FragmentManager fm){ super(fm); @@ -297,18 +295,9 @@ private void handleOpenFileIntent(Intent intent) { Uri data = intent.getData(); if (data != null){ GncXmlExporter.createBackup(); - intent.setData(null); - InputStream accountInputStream = null; - try { - accountInputStream = getContentResolver().openInputStream(data); - new ImportAsyncTask(this).execute(accountInputStream); - } catch (FileNotFoundException e) { - Crashlytics.logException(e); - Log.e(LOG_TAG, "Error opening file for import - " + e.getMessage()); - } finally { - removeFirstRunFlag(); - } + new ImportAsyncTask(this).execute(data); + removeFirstRunFlag(); } } @@ -380,8 +369,6 @@ public void setTab(int index){ private void init() { PreferenceManager.setDefaultValues(this, R.xml.fragment_transaction_preferences, false); - Money.DEFAULT_CURRENCY_CODE = GnuCashApplication.getDefaultCurrencyCode(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean firstRun = prefs.getBoolean(getString(R.string.key_first_run), true); @@ -495,12 +482,13 @@ public static void createDefaultAccounts(final String currencyCode, final Activi @Override public void onTaskComplete() { AccountsDbAdapter.getInstance().updateAllAccounts(DatabaseSchema.AccountEntry.COLUMN_CURRENCY, currencyCode); + GnuCashApplication.setDefaultCurrencyCode(currencyCode); } }; } - InputStream accountFileInputStream = activity.getResources().openRawResource(R.raw.default_accounts); - new ImportAsyncTask(activity, delegate).execute(accountFileInputStream); + Uri uri = Uri.parse("android.resource://" + BuildConfig.APPLICATION_ID + "/" + R.raw.default_accounts); + new ImportAsyncTask(activity, delegate).execute(uri); } /** @@ -539,14 +527,8 @@ public static void startXmlFileChooser(Activity activity) { * @param data Intent data containing the XML uri */ public static void importXmlFileFromIntent(Activity context, Intent data) { - try { - GncXmlExporter.createBackup(); - InputStream accountInputStream = context.getContentResolver().openInputStream(data.getData()); - new ImportAsyncTask(context).execute(accountInputStream); - } catch (FileNotFoundException e) { - Crashlytics.logException(e); - Toast.makeText(context, R.string.toast_error_importing_accounts, Toast.LENGTH_SHORT).show(); - } + GncXmlExporter.createBackup(); + new ImportAsyncTask(context).execute(data.getData()); } /** diff --git a/app/src/main/java/org/gnucash/android/ui/account/AccountsListFragment.java b/app/src/main/java/org/gnucash/android/ui/account/AccountsListFragment.java index 74deec211..a1623f233 100644 --- a/app/src/main/java/org/gnucash/android/ui/account/AccountsListFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/account/AccountsListFragment.java @@ -49,6 +49,7 @@ import android.widget.TextView; import org.gnucash.android.R; +import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.DatabaseCursorLoader; import org.gnucash.android.db.DatabaseSchema; @@ -256,8 +257,9 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { else { inflater.inflate(R.menu.account_actions, menu); // Associate searchable configuration with the SearchView + SearchManager searchManager = - (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); + (SearchManager) GnuCashApplication.getAppContext().getSystemService(Context.SEARCH_SERVICE); mSearchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search)); if (mSearchView == null) diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index 0303fde47..410b48a76 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; @@ -28,6 +29,7 @@ import android.support.v4.app.FragmentManager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.SwitchCompat; import android.text.format.Time; import android.util.Log; import android.view.LayoutInflater; @@ -39,13 +41,18 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.Spinner; import android.widget.TextView; +import com.codetroopers.betterpickers.calendardatepicker.CalendarDatePickerDialog; +import com.codetroopers.betterpickers.radialtimepicker.RadialTimePickerDialog; import com.codetroopers.betterpickers.recurrencepicker.EventRecurrence; import com.codetroopers.betterpickers.recurrencepicker.EventRecurrenceFormatter; import com.codetroopers.betterpickers.recurrencepicker.RecurrencePickerDialog; +import com.crashlytics.android.Crashlytics; import com.dropbox.sync.android.DbxAccountManager; import org.gnucash.android.R; @@ -54,26 +61,37 @@ import org.gnucash.android.export.ExportAsyncTask; import org.gnucash.android.export.ExportFormat; import org.gnucash.android.export.ExportParams; +import org.gnucash.android.export.Exporter; import org.gnucash.android.model.BaseModel; import org.gnucash.android.model.ScheduledAction; import org.gnucash.android.ui.account.AccountsActivity; import org.gnucash.android.ui.common.UxArgument; import org.gnucash.android.ui.settings.SettingsActivity; +import org.gnucash.android.ui.transaction.TransactionFormFragment; import org.gnucash.android.ui.util.RecurrenceParser; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; + /** * Dialog fragment for exporting accounts and transactions in various formats *

The dialog is used for collecting information on the export options and then passing them * to the {@link org.gnucash.android.export.Exporter} responsible for exporting

* @author Ngewi Fet */ -public class - ExportFormFragment extends Fragment implements RecurrencePickerDialog.OnRecurrenceSetListener { +public class ExportFormFragment extends Fragment implements + RecurrencePickerDialog.OnRecurrenceSetListener, + CalendarDatePickerDialog.OnDateSetListener, + RadialTimePickerDialog.OnTimeSetListener { /** * Spinner for selecting destination for the exported file. @@ -82,12 +100,6 @@ */ @Bind(R.id.spinner_export_destination) Spinner mDestinationSpinner; - /** - * Checkbox indicating that all transactions should be exported, - * regardless of whether they have been exported previously or not - */ - @Bind(R.id.checkbox_export_all) CheckBox mExportAllCheckBox; - /** * Checkbox for deleting all transactions after exporting them */ @@ -103,6 +115,24 @@ */ @Bind(R.id.input_recurrence) TextView mRecurrenceTextView; + /** + * Text view displaying start date to export from + */ + @Bind(R.id.export_start_date) TextView mExportStartDate; + + @Bind(R.id.export_start_time) TextView mExportStartTime; + + /** + * Switch toggling whether to export all transactions or not + */ + @Bind(R.id.switch_export_all) SwitchCompat mExportAllSwitch; + + @Bind(R.id.export_date_layout) LinearLayout mExportDateLayout; + + @Bind(R.id.radio_ofx_format) RadioButton mOfxRadioButton; + @Bind(R.id.radio_qif_format) RadioButton mQifRadioButton; + @Bind(R.id.radio_xml_format) RadioButton mXmlRadioButton; + /** * Event recurrence options */ @@ -113,6 +143,8 @@ */ String mRecurrenceRule; + Calendar mExportStartCalendar = Calendar.getInstance(); + /** * Tag for logging */ @@ -126,7 +158,7 @@ private ExportParams.ExportTarget mExportTarget = ExportParams.ExportTarget.SD_CARD; - public void onRadioButtonClicked(View view){ + public void onRadioButtonClicked(View view){ switch (view.getId()){ case R.id.radio_ofx_format: mExportFormat = ExportFormat.OFX; @@ -136,6 +168,7 @@ public void onRadioButtonClicked(View view){ } else { mExportWarningTextView.setVisibility(View.GONE); } + mExportDateLayout.setVisibility(View.VISIBLE); break; case R.id.radio_qif_format: @@ -147,12 +180,13 @@ public void onRadioButtonClicked(View view){ } else { mExportWarningTextView.setVisibility(View.GONE); } + mExportDateLayout.setVisibility(View.VISIBLE); break; case R.id.radio_xml_format: mExportFormat = ExportFormat.XML; mExportWarningTextView.setText(R.string.export_warning_xml); - + mExportDateLayout.setVisibility(View.GONE); break; } } @@ -161,15 +195,13 @@ public void onRadioButtonClicked(View view){ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_export_form, container, false); + ButterKnife.bind(this, view); - return view; - } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } + bindViewListeners(); + return view; + } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.default_save_actions, menu); @@ -196,7 +228,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - bindViews(); + ActionBar supportActionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); assert supportActionBar != null; supportActionBar.setTitle(R.string.title_export_dialog); @@ -233,7 +265,13 @@ private void getSDWritePermission(){ */ private void startExport(){ ExportParams exportParameters = new ExportParams(mExportFormat); - exportParameters.setExportAllTransactions(mExportAllCheckBox.isChecked()); + + if (mExportAllSwitch.isChecked()){ + exportParameters.setExportStartTime(Timestamp.valueOf(Exporter.TIMESTAMP_ZERO)); + } else { + exportParameters.setExportStartTime(new Timestamp(mExportStartCalendar.getTimeInMillis())); + } + exportParameters.setExportTarget(mExportTarget); exportParameters.setDeleteTransactionsAfterExport(mDeleteAllCheckBox.isChecked()); @@ -248,12 +286,18 @@ private void startExport(){ Log.i(TAG, "Commencing async export of transactions"); new ExportAsyncTask(getActivity()).execute(exportParameters); + int position = mDestinationSpinner.getSelectedItemPosition(); + PreferenceManager.getDefaultSharedPreferences(getActivity()) + .edit().putInt(getString(R.string.key_last_export_destination), position) + .apply(); + // finish the activity will cause the progress dialog to be leaked // which would throw an exception //getActivity().finish(); } - private void bindViews(){ + private void bindViewListeners(){ + // export destination bindings ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.export_destinations, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -300,9 +344,80 @@ public void onNothingSelected(AdapterView parent) { } }); + + int position = PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getInt(getString(R.string.key_last_export_destination), 0); + mDestinationSpinner.setSelection(position); + + //**************** export start time bindings ****************** + String lastExportTimeStamp = PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(Exporter.PREF_LAST_EXPORT_TIME, Exporter.TIMESTAMP_ZERO); + Timestamp timestamp = Timestamp.valueOf(lastExportTimeStamp); + mExportStartCalendar.setTimeInMillis(timestamp.getTime()); + + Date date = new Date(timestamp.getTime()); + mExportStartDate.setText(TransactionFormFragment.DATE_FORMATTER.format(date)); + mExportStartTime.setText(TransactionFormFragment.TIME_FORMATTER.format(date)); + + mExportStartDate.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + long dateMillis = 0; + try { + Date date = TransactionFormFragment.DATE_FORMATTER.parse(mExportStartDate.getText().toString()); + dateMillis = date.getTime(); + } catch (ParseException e) { + Log.e(getTag(), "Error converting input time to Date object"); + } + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(dateMillis); + + int year = calendar.get(Calendar.YEAR); + int monthOfYear = calendar.get(Calendar.MONTH); + int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); + CalendarDatePickerDialog datePickerDialog = CalendarDatePickerDialog.newInstance( + ExportFormFragment.this, + year, monthOfYear, dayOfMonth); + datePickerDialog.show(getFragmentManager(), "date_picker_fragment"); + } + }); + + mExportStartTime.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + long timeMillis = 0; + try { + Date date = TransactionFormFragment.TIME_FORMATTER.parse(mExportStartTime.getText().toString()); + timeMillis = date.getTime(); + } catch (ParseException e) { + Log.e(getTag(), "Error converting input time to Date object"); + } + + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(timeMillis); + + RadialTimePickerDialog timePickerDialog = RadialTimePickerDialog.newInstance( + ExportFormFragment.this, calendar.get(Calendar.HOUR_OF_DAY), + calendar.get(Calendar.MINUTE), true); + timePickerDialog.show(getFragmentManager(), "time_picker_dialog_fragment"); + } + }); + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - mExportAllCheckBox.setChecked(sharedPrefs.getBoolean(getString(R.string.key_export_all_transactions), false)); - + mExportAllSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mExportStartDate.setEnabled(!isChecked); + mExportStartTime.setEnabled(!isChecked); + int color = isChecked ? android.R.color.darker_gray : android.R.color.black; + mExportStartDate.setTextColor(getResources().getColor(color)); + mExportStartTime.setTextColor(getResources().getColor(color)); + } + }); + + mExportAllSwitch.setChecked(sharedPrefs.getBoolean(getString(R.string.key_export_all_transactions), false)); mDeleteAllCheckBox.setChecked(sharedPrefs.getBoolean(getString(R.string.key_delete_transactions_after_export), false)); mRecurrenceTextView.setOnClickListener(new View.OnClickListener() { @@ -334,7 +449,7 @@ public void onClick(View view) { String defaultExportFormat = sharedPrefs.getString(getString(R.string.key_default_export_format), ExportFormat.QIF.name()); mExportFormat = ExportFormat.valueOf(defaultExportFormat); - View.OnClickListener clickListener = new View.OnClickListener() { + View.OnClickListener radioClickListener = new View.OnClickListener() { @Override public void onClick(View view) { onRadioButtonClicked(view); @@ -344,28 +459,21 @@ public void onClick(View view) { View v = getView(); assert v != null; - RadioButton ofxRadioButton = (RadioButton) v.findViewById(R.id.radio_ofx_format); - ofxRadioButton.setOnClickListener(clickListener); - if (defaultExportFormat.equalsIgnoreCase(ExportFormat.OFX.name())) { - ofxRadioButton.performClick(); - } - - RadioButton qifRadioButton = (RadioButton) v.findViewById(R.id.radio_qif_format); - qifRadioButton.setOnClickListener(clickListener); - if (defaultExportFormat.equalsIgnoreCase(ExportFormat.QIF.name())){ - qifRadioButton.performClick(); - } + mOfxRadioButton.setOnClickListener(radioClickListener); + mQifRadioButton.setOnClickListener(radioClickListener); + mXmlRadioButton.setOnClickListener(radioClickListener); - RadioButton xmlRadioButton = (RadioButton) v.findViewById(R.id.radio_xml_format); - xmlRadioButton.setOnClickListener(clickListener); - if (defaultExportFormat.equalsIgnoreCase(ExportFormat.XML.name())){ - xmlRadioButton.performClick(); + ExportFormat defaultFormat = ExportFormat.valueOf(defaultExportFormat.toUpperCase()); + switch (defaultFormat){ + case QIF: mQifRadioButton.performClick(); break; + case OFX: mOfxRadioButton.performClick(); break; + case XML: mXmlRadioButton.performClick(); break; } if (GnuCashApplication.isDoubleEntryEnabled()){ - ofxRadioButton.setVisibility(View.GONE); + mOfxRadioButton.setVisibility(View.GONE); } else { - xmlRadioButton.setVisibility(View.GONE); + mXmlRadioButton.setVisibility(View.GONE); } } @@ -393,5 +501,21 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } } + @Override + public void onDateSet(CalendarDatePickerDialog dialog, int year, int monthOfYear, int dayOfMonth) { + Calendar cal = new GregorianCalendar(year, monthOfYear, dayOfMonth); + mExportStartDate.setText(TransactionFormFragment.DATE_FORMATTER.format(cal.getTime())); + mExportStartCalendar.set(Calendar.YEAR, year); + mExportStartCalendar.set(Calendar.MONTH, monthOfYear); + mExportStartCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); + } + + @Override + public void onTimeSet(RadialTimePickerDialog dialog, int hourOfDay, int minute) { + Calendar cal = new GregorianCalendar(0, 0, 0, hourOfDay, minute); + mExportStartTime.setText(TransactionFormFragment.TIME_FORMATTER.format(cal.getTime())); + mExportStartCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + mExportStartCalendar.set(Calendar.MINUTE, minute); + } } diff --git a/app/src/main/java/org/gnucash/android/ui/report/BarChartFragment.java b/app/src/main/java/org/gnucash/android/ui/report/BarChartFragment.java index 2942a2b52..0cd2f3dd9 100644 --- a/app/src/main/java/org/gnucash/android/ui/report/BarChartFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/report/BarChartFragment.java @@ -148,6 +148,7 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { // mChart.setDrawValuesForWholeStack(false); mChart.getXAxis().setDrawGridLines(false); mChart.getAxisRight().setEnabled(false); + mChart.getAxisLeft().setStartAtZero(false); mChart.getAxisLeft().enableGridDashedLine(4.0f, 4.0f, 0); mChart.getAxisLeft().setValueFormatter(new LargeValueFormatter(mCurrency.getSymbol(Locale.getDefault()))); Legend chartLegend = mChart.getLegend(); @@ -209,6 +210,22 @@ private BarData getData() { double balance = mAccountsDbAdapter.getAccountsBalance( Collections.singletonList(account.getUID()), start, end).asDouble(); if (balance != 0) { + stack.add((float) balance); + + String accountName = account.getName(); + while (labels.contains(accountName)) { + if (!accountToColorMap.containsKey(account.getUID())) { + for (String label : labels) { + if (label.equals(accountName)) { + accountName += " "; + } + } + } else { + break; + } + } + labels.add(accountName); + if (!accountToColorMap.containsKey(account.getUID())) { Integer color; if (mUseAccountColor) { @@ -220,10 +237,8 @@ private BarData getData() { } accountToColorMap.put(account.getUID(), color); } - - stack.add((float) balance); - labels.add(account.getName()); colors.add(accountToColorMap.get(account.getUID())); + Log.d(TAG, mAccountType + tmpDate.toString(" MMMM yyyy ") + account.getName() + " = " + stack.get(stack.size() - 1)); } } @@ -438,7 +453,9 @@ public boolean onOptionsItemSelected(MenuItem item) { Legend legend = mChart.getLegend(); if (!legend.isLegendCustom()) { Toast.makeText(getActivity(), R.string.toast_legend_too_long, Toast.LENGTH_LONG).show(); + item.setChecked(false); } else { + item.setChecked(!mChart.getLegend().isEnabled()); legend.setEnabled(!mChart.getLegend().isEnabled()); mChart.invalidate(); } @@ -464,9 +481,16 @@ public void onValueSelected(Entry e, int dataSetIndex, Highlight h) { String stackLabels = entry.getData().toString(); String label = mChart.getData().getXVals().get(entry.getXIndex()) + ", " + stackLabels.substring(1, stackLabels.length() - 1).split(",")[index]; - double value = entry.getVals()[index]; - double sum = mTotalPercentageMode ? mChart.getData().getDataSetByIndex(dataSetIndex).getYValueSum() : entry.getVal(); - selectedValueTextView.setText(String.format(SELECTED_VALUE_PATTERN, label, value, value / sum * 100)); + double value = Math.abs(entry.getVals()[index]); + double sum = 0; + if (mTotalPercentageMode) { + for (BarEntry barEntry : mChart.getData().getDataSetByIndex(dataSetIndex).getYVals()) { + sum += barEntry.getNegativeSum() + barEntry.getPositiveSum(); + } + } else { + sum = entry.getNegativeSum() + entry.getPositiveSum(); + } + selectedValueTextView.setText(String.format(SELECTED_VALUE_PATTERN, label.trim(), value, value / sum * 100)); } @Override diff --git a/app/src/main/java/org/gnucash/android/ui/report/PieChartFragment.java b/app/src/main/java/org/gnucash/android/ui/report/PieChartFragment.java index 64334bedd..f4b4ea5e9 100644 --- a/app/src/main/java/org/gnucash/android/ui/report/PieChartFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/report/PieChartFragment.java @@ -33,8 +33,6 @@ import android.widget.TextView; import com.github.mikephil.charting.charts.PieChart; -import com.github.mikephil.charting.components.Legend.LegendForm; -import com.github.mikephil.charting.components.Legend.LegendPosition; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; @@ -57,6 +55,9 @@ import butterknife.Bind; import butterknife.ButterKnife; +import static com.github.mikephil.charting.components.Legend.LegendForm; +import static com.github.mikephil.charting.components.Legend.LegendPosition; + /** * Activity used for drawing a pie chart * @@ -132,8 +133,10 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { mChart.setCenterTextSize(CENTER_TEXT_SIZE); mChart.setDescription(""); - mChart.getLegend().setWordWrapEnabled(true); mChart.setOnChartValueSelectedListener(this); + mChart.getLegend().setForm(LegendForm.CIRCLE); + mChart.getLegend().setWordWrapEnabled(true); + mChart.getLegend().setPosition(LegendPosition.BELOW_CHART_CENTER); ReportsActivity reportsActivity = (ReportsActivity) getActivity(); mReportStartTime = reportsActivity.getReportStartTime(); @@ -193,8 +196,8 @@ private PieData getData() { && account.getCurrency() == Currency.getInstance(mCurrencyCode)) { double balance = mAccountsDbAdapter.getAccountsBalance(Collections.singletonList(account.getUID()), - mReportStartTime, mReportEndTime).absolute().asDouble(); - if (balance != 0) { + mReportStartTime, mReportEndTime).asDouble(); + if (balance > 0) { dataSet.addEntry(new Entry((float) balance, dataSet.getEntryCount())); colors.add(mUseAccountColor && account.getColorHexCode() != null ? Color.parseColor(account.getColorHexCode()) @@ -278,7 +281,6 @@ private void bubbleSort() { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.chart_actions, menu); - menu.findItem(R.id.menu_toggle_legend).setChecked(false); } @Override @@ -303,8 +305,6 @@ public boolean onOptionsItemSelected(MenuItem item) { } case R.id.menu_toggle_legend: { mChart.getLegend().setEnabled(!mChart.getLegend().isEnabled()); - mChart.getLegend().setForm(LegendForm.CIRCLE); - mChart.getLegend().setPosition(LegendPosition.RIGHT_OF_CHART_CENTER); mChart.notifyDataSetChanged(); mChart.invalidate(); return true; @@ -366,7 +366,7 @@ public void onValueSelected(Entry e, int dataSetIndex, Highlight h) { if (e == null) return; String label = mChart.getData().getXVals().get(e.getXIndex()); float value = e.getVal(); - float percent = value / mChart.getYValueSum() * 100; + float percent = value / mChart.getData().getYValueSum() * 100; mSelectedValueTextView.setText(String.format(SELECTED_VALUE_PATTERN, label, value, percent)); } diff --git a/app/src/main/java/org/gnucash/android/ui/report/ReportSummaryFragment.java b/app/src/main/java/org/gnucash/android/ui/report/ReportSummaryFragment.java index f41a2ae56..88d2257a7 100644 --- a/app/src/main/java/org/gnucash/android/ui/report/ReportSummaryFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/report/ReportSummaryFragment.java @@ -34,7 +34,7 @@ import android.widget.TextView; import com.github.mikephil.charting.charts.PieChart; -import com.github.mikephil.charting.components.Legend; +import com.github.mikephil.charting.components.Legend.LegendForm; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; @@ -57,6 +57,8 @@ import butterknife.Bind; import butterknife.ButterKnife; +import static com.github.mikephil.charting.components.Legend.LegendPosition; + /** * Shows a summary of reports * @author Ngewi Fet @@ -138,8 +140,11 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { mChart.setCenterTextSize(PieChartFragment.CENTER_TEXT_SIZE); mChart.setDescription(""); + mChart.setDrawSliceText(false); mChart.getLegend().setEnabled(true); - mChart.getLegend().setPosition(Legend.LegendPosition.RIGHT_OF_CHART_CENTER); + mChart.getLegend().setWordWrapEnabled(true); + mChart.getLegend().setForm(LegendForm.CIRCLE); + mChart.getLegend().setPosition(LegendPosition.RIGHT_OF_CHART_CENTER); mChart.getLegend().setTextSize(LEGEND_TEXT_SIZE); ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{getResources().getColor(R.color.account_green)}); @@ -191,8 +196,9 @@ private PieData getData() { long start = new LocalDate().minusMonths(2).dayOfMonth().withMinimumValue().toDate().getTime(); long end = new LocalDate().plusDays(1).toDate().getTime(); - double balance = mAccountsDbAdapter.getAccountsBalance(Collections.singletonList(account.getUID()), start, end).absolute().asDouble(); - if (balance != 0) { + double balance = mAccountsDbAdapter.getAccountsBalance( + Collections.singletonList(account.getUID()), start, end).asDouble(); + if (balance > 0) { dataSet.addEntry(new Entry((float) balance, dataSet.getEntryCount())); colors.add(account.getColorHexCode() != null ? Color.parseColor(account.getColorHexCode()) @@ -224,6 +230,9 @@ private void displayChart() { mChart.setTouchEnabled(true); } else { mChart.setData(getEmptyData()); + mChart.setCenterText(getResources().getString(R.string.label_chart_no_data)); + mChart.getLegend().setEnabled(false); + mChart.setTouchEnabled(false); } mChart.invalidate(); diff --git a/app/src/main/java/org/gnucash/android/ui/settings/AccountPreferencesFragment.java b/app/src/main/java/org/gnucash/android/ui/settings/AccountPreferencesFragment.java index 81804ccce..5242df81a 100644 --- a/app/src/main/java/org/gnucash/android/ui/settings/AccountPreferencesFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/settings/AccountPreferencesFragment.java @@ -20,18 +20,24 @@ import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; -import android.content.SharedPreferences; +import android.database.Cursor; import android.os.Bundle; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; import org.gnucash.android.R; +import org.gnucash.android.app.GnuCashApplication; +import org.gnucash.android.db.CommoditiesDbAdapter; +import org.gnucash.android.db.DatabaseSchema; +import org.gnucash.android.model.Commodity; import org.gnucash.android.model.Money; import org.gnucash.android.ui.account.AccountsActivity; +import java.util.ArrayList; +import java.util.List; + /** * Account settings fragment inside the Settings activity * @@ -41,7 +47,10 @@ @TargetApi(11) public class AccountPreferencesFragment extends PreferenceFragment { - private Activity activity; + private Activity mActivity; + + List mCurrencyEntries = new ArrayList<>(); + List mCurrencyEntryValues = new ArrayList<>(); @Override public void onCreate(Bundle savedInstanceState) { @@ -53,17 +62,32 @@ public void onCreate(Bundle savedInstanceState) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(R.string.title_account_preferences); - activity = getActivity(); + mActivity = getActivity(); + + Cursor cursor = CommoditiesDbAdapter.getInstance().fetchAllRecords(DatabaseSchema.CommodityEntry.COLUMN_MNEMONIC + " ASC"); + while(cursor.moveToNext()){ + String code = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.CommodityEntry.COLUMN_MNEMONIC)); + String name = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.CommodityEntry.COLUMN_FULLNAME)); + mCurrencyEntries.add(code + " - " + name); + mCurrencyEntryValues.add(code); + } + cursor.close(); } @Override public void onResume() { super.onResume(); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); - String defaultCurrency = sharedPreferences.getString(getString(R.string.key_default_currency), Money.DEFAULT_CURRENCY_CODE); + + String defaultCurrency = GnuCashApplication.getDefaultCurrencyCode(); Preference pref = findPreference(getString(R.string.key_default_currency)); - pref.setSummary(defaultCurrency); - pref.setOnPreferenceChangeListener((SettingsActivity)getActivity()); + String currencyName = CommoditiesDbAdapter.getInstance().getCommodity(defaultCurrency).getFullname(); + pref.setSummary(currencyName); + pref.setOnPreferenceChangeListener((SettingsActivity) getActivity()); + + CharSequence[] entries = new CharSequence[mCurrencyEntries.size()]; + CharSequence[] entryValues = new CharSequence[mCurrencyEntryValues.size()]; + ((ListPreference) pref).setEntries(mCurrencyEntries.toArray(entries)); + ((ListPreference) pref).setEntryValues(mCurrencyEntryValues.toArray(entryValues)); Preference preference = findPreference(getString(R.string.key_import_accounts)); preference.setOnPreferenceClickListener((SettingsActivity)getActivity()); @@ -88,7 +112,7 @@ public boolean onPreferenceClick(Preference preference) { .setPositiveButton(R.string.btn_create_accounts, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - AccountsActivity.createDefaultAccounts(Money.DEFAULT_CURRENCY_CODE, activity); + AccountsActivity.createDefaultAccounts(Money.DEFAULT_CURRENCY_CODE, mActivity); } }) .setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/org/gnucash/android/ui/settings/BackupPreferenceFragment.java b/app/src/main/java/org/gnucash/android/ui/settings/BackupPreferenceFragment.java index 0f222e714..32ff184f3 100644 --- a/app/src/main/java/org/gnucash/android/ui/settings/BackupPreferenceFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/settings/BackupPreferenceFragment.java @@ -24,10 +24,9 @@ import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; import org.gnucash.android.R; -import org.gnucash.android.model.Money; +import org.gnucash.android.app.GnuCashApplication; /** @@ -96,7 +95,7 @@ public void onResume() { public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(newValue.toString()); if (preference.getKey().equals(getString(R.string.key_default_currency))){ - Money.DEFAULT_CURRENCY_CODE = newValue.toString(); + GnuCashApplication.setDefaultCurrencyCode(newValue.toString()); } if (preference.getKey().equals(getString(R.string.key_default_export_email))){ diff --git a/app/src/main/java/org/gnucash/android/ui/settings/SettingsActivity.java b/app/src/main/java/org/gnucash/android/ui/settings/SettingsActivity.java index 2e1e6247a..250a799c0 100644 --- a/app/src/main/java/org/gnucash/android/ui/settings/SettingsActivity.java +++ b/app/src/main/java/org/gnucash/android/ui/settings/SettingsActivity.java @@ -26,9 +26,12 @@ import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceManager; @@ -51,12 +54,12 @@ import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.AccountsDbAdapter; +import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.db.TransactionsDbAdapter; import org.gnucash.android.export.Exporter; import org.gnucash.android.export.xml.GncXmlExporter; import org.gnucash.android.importer.ImportAsyncTask; -import org.gnucash.android.model.Money; import org.gnucash.android.model.Transaction; import org.gnucash.android.ui.account.AccountsActivity; import org.gnucash.android.ui.common.UxArgument; @@ -66,7 +69,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -249,8 +251,9 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference.getKey().equals(getString(R.string.key_default_currency))){ - Money.DEFAULT_CURRENCY_CODE = newValue.toString(); - preference.setSummary(newValue.toString()); + GnuCashApplication.setDefaultCurrencyCode(newValue.toString()); + String fullname = CommoditiesDbAdapter.getInstance().getCommodity(newValue.toString()).getFullname(); + preference.setSummary(fullname); } else if (preference.getKey().equals(getString(R.string.key_enable_passcode))) { if ((Boolean) newValue) { startActivityForResult(new Intent(this, PasscodePreferenceActivity.class), @@ -276,6 +279,10 @@ protected boolean isValidFragment(String fragmentName) { || AboutPreferenceFragment.class.getName().equals(fragmentName); } + /** + * Hide all imbalance accounts when double-entry mode is disabled + * @param useDoubleEntry flag if double entry is enabled or not + */ public void setImbalanceAccountsHidden(boolean useDoubleEntry) { String isHidden = useDoubleEntry ? "0" : "1"; AccountsDbAdapter accountsDbAdapter = AccountsDbAdapter.getInstance(); @@ -288,13 +295,34 @@ public void setImbalanceAccountsHidden(boolean useDoubleEntry) { } } + /** + * Load the commodities from the database and set the options on the list preference + * Also sets this activity as a listener for preference changes + */ private void setDefaultCurrencyListener() { - SharedPreferences manager = PreferenceManager.getDefaultSharedPreferences(this); - String defaultCurrency = manager.getString(getString(R.string.key_default_currency), Money.DEFAULT_CURRENCY_CODE); + CommoditiesDbAdapter commoditiesDbAdapter = CommoditiesDbAdapter.getInstance(); + List currencyEntries = new ArrayList<>((int)commoditiesDbAdapter.getRecordsCount()); + List currencyEntryValues = new ArrayList<>((int)commoditiesDbAdapter.getRecordsCount()); + Cursor cursor = commoditiesDbAdapter.fetchAllRecords(DatabaseSchema.CommodityEntry.COLUMN_MNEMONIC + " ASC"); + while(cursor.moveToNext()){ + String code = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.CommodityEntry.COLUMN_MNEMONIC)); + String name = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseSchema.CommodityEntry.COLUMN_FULLNAME)); + + currencyEntries.add(code + " - " + name); + currencyEntryValues.add(code); + } + cursor.close(); + + CharSequence[] entries = new CharSequence[currencyEntries.size()]; + CharSequence[] entryValues = new CharSequence[currencyEntryValues.size()]; + @SuppressWarnings("deprecation") Preference pref = findPreference(getString(R.string.key_default_currency)); - pref.setSummary(defaultCurrency); + pref.setSummary(GnuCashApplication.getDefaultCurrencyCode()); pref.setOnPreferenceChangeListener(this); + + ((ListPreference) pref).setEntries(currencyEntries.toArray(entries)); + ((ListPreference) pref).setEntryValues(currencyEntryValues.toArray(entryValues)); } @Override @@ -538,15 +566,7 @@ public void onClick(DialogInterface dialog, int which) { @Override public void onClick(DialogInterface dialog, int which) { File backupFile = sortedBackupFiles[which]; - - try { - FileInputStream inputStream = new FileInputStream(backupFile); - new ImportAsyncTask(SettingsActivity.this).execute(inputStream); - } catch (FileNotFoundException e) { - Crashlytics.logException(e); - Log.e(LOG_TAG, "Error restoring backup: " + backupFile.getName()); - Toast.makeText(SettingsActivity.this, R.string.toast_error_importing_accounts, Toast.LENGTH_LONG).show(); - } + new ImportAsyncTask(SettingsActivity.this).execute(Uri.fromFile(backupFile)); } }); diff --git a/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java b/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java index f4500c7f0..0b6416069 100644 --- a/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java @@ -25,6 +25,8 @@ import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -32,6 +34,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; @@ -41,6 +44,7 @@ import org.gnucash.android.R; import org.gnucash.android.db.AccountsDbAdapter; +import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.model.AccountType; import org.gnucash.android.model.BaseModel; @@ -60,7 +64,6 @@ import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Currency; import java.util.List; import butterknife.Bind; @@ -75,12 +78,14 @@ public class SplitEditorFragment extends Fragment { @Bind(R.id.split_list_layout) LinearLayout mSplitsLinearLayout; @Bind(R.id.calculator_keyboard) KeyboardView mKeyboardView; + @Bind(R.id.imbalance_textview) TextView mImbalanceTextView; private AccountsDbAdapter mAccountsDbAdapter; private Cursor mCursor; private SimpleCursorAdapter mCursorAdapter; private List mSplitItemViewList; private String mAccountUID; + private Commodity mCommodity; private BigDecimal mBaseAmount = BigDecimal.ZERO; @@ -88,6 +93,8 @@ public class SplitEditorFragment extends Fragment { CalculatorKeyboard mCalculatorKeyboard; + BalanceTextWatcher mImbalanceWatcher = new BalanceTextWatcher(); + /** * Create and return a new instance of the fragment with the appropriate paramenters * @param args Arguments to be set to the fragment.
@@ -143,6 +150,8 @@ public void onActivityCreated(Bundle savedInstanceState) { view.findViewById(R.id.input_accounts_spinner).setEnabled(false); view.findViewById(R.id.btn_remove_split).setVisibility(View.GONE); } + + TransactionsActivity.displayBalance(mImbalanceTextView, new Money(mBaseAmount.negate(), mCommodity)); } @Override @@ -214,6 +223,7 @@ private void initArgs() { + DatabaseSchema.AccountEntry.COLUMN_PLACEHOLDER + " = 0" + ")"; mCursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(conditions, null); + mCommodity = CommoditiesDbAdapter.getInstance().getCommodity(mAccountsDbAdapter.getCurrencyCode(mAccountUID)); } /** @@ -226,7 +236,7 @@ class SplitViewHolder implements OnTransferFundsListener{ @Bind(R.id.input_accounts_spinner) Spinner accountsSpinner; @Bind(R.id.split_currency_symbol) TextView splitCurrencyTextView; @Bind(R.id.split_uid) TextView splitUidTextView; - @Bind(R.id.btn_split_type) TransactionTypeSwitch splitTypeButton; + @Bind(R.id.btn_split_type) TransactionTypeSwitch splitTypeSwitch; View splitView; Money quantity; @@ -253,31 +263,37 @@ public void onClick(View view) { mRemovedSplitUIDs.add(splitUidTextView.getText().toString()); mSplitsLinearLayout.removeView(splitView); mSplitItemViewList.remove(splitView); + mImbalanceWatcher.afterTextChanged(null); } }); updateTransferAccountsList(accountsSpinner); - Currency accountCurrency = Currency.getInstance(mAccountsDbAdapter.getCurrencyCode(mAccountUID)); - splitCurrencyTextView.setText(accountCurrency.getSymbol()); - splitTypeButton.setAmountFormattingListener(splitAmountEditText, splitCurrencyTextView); - splitTypeButton.setChecked(mBaseAmount.signum() > 0); + splitCurrencyTextView.setText(mCommodity.getSymbol()); + splitTypeSwitch.setAmountFormattingListener(splitAmountEditText, splitCurrencyTextView); + splitTypeSwitch.setChecked(mBaseAmount.signum() > 0); splitUidTextView.setText(BaseModel.generateUID()); if (split != null) { - splitAmountEditText.setCurrency(split.getValue().getCurrency()); + splitAmountEditText.setCommodity(split.getValue().getCommodity()); splitAmountEditText.setValue(split.getFormattedValue().asBigDecimal()); splitCurrencyTextView.setText(split.getValue().getCurrency().getSymbol()); splitMemoEditText.setText(split.getMemo()); splitUidTextView.setText(split.getUID()); String splitAccountUID = split.getAccountUID(); setSelectedTransferAccount(mAccountsDbAdapter.getID(splitAccountUID), accountsSpinner); - splitTypeButton.setAccountType(mAccountsDbAdapter.getAccountType(splitAccountUID)); - splitTypeButton.setChecked(split.getType()); + splitTypeSwitch.setAccountType(mAccountsDbAdapter.getAccountType(splitAccountUID)); + splitTypeSwitch.setChecked(split.getType()); } - accountsSpinner.setOnItemSelectedListener(new SplitAccountListener(splitTypeButton, this)); - + accountsSpinner.setOnItemSelectedListener(new SplitAccountListener(splitTypeSwitch, this)); + splitTypeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mImbalanceWatcher.afterTextChanged(null); + } + }); + splitAmountEditText.addTextChangedListener(mImbalanceWatcher); } } @@ -360,7 +376,7 @@ private List extractSplitsFromView(){ String accountUID = mAccountsDbAdapter.getUID(viewHolder.accountsSpinner.getSelectedItemId()); Split split = new Split(valueAmount, accountUID); split.setMemo(viewHolder.splitMemoEditText.getText().toString()); - split.setType(viewHolder.splitTypeButton.getTransactionType()); + split.setType(viewHolder.splitTypeSwitch.getTransactionType()); split.setUID(viewHolder.splitUidTextView.getText().toString().trim()); if (viewHolder.quantity != null) split.setQuantity(viewHolder.quantity.absolute()); @@ -369,6 +385,43 @@ private List extractSplitsFromView(){ return splitList; } + /** + * Updates the displayed balance of the accounts when the amount of a split is changed + */ + private class BalanceTextWatcher implements TextWatcher { + + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + //nothing to see here, move along + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + //nothing to see here, move along + } + + @Override + public void afterTextChanged(Editable editable) { + BigDecimal imbalance = BigDecimal.ZERO; + + for (View splitItem : mSplitItemViewList) { + SplitViewHolder viewHolder = (SplitViewHolder) splitItem.getTag(); + viewHolder.splitAmountEditText.removeTextChangedListener(this); + BigDecimal amount = viewHolder.splitAmountEditText.getValue(); + if (amount != null) { + if (viewHolder.splitTypeSwitch.isChecked()) { + imbalance = imbalance.subtract(amount); + } else { + imbalance = imbalance.add(amount); + } + } + viewHolder.splitAmountEditText.addTextChangedListener(this); + } + + TransactionsActivity.displayBalance(mImbalanceTextView, new Money(imbalance.negate(), mCommodity)); + } + } + /** * Listens to changes in the transfer account and updates the currency symbol, the label of the * transaction type and if neccessary diff --git a/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java b/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java index dd2520453..6cd8d00b3 100644 --- a/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java @@ -39,6 +39,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AutoCompleteTextView; @@ -57,6 +58,7 @@ import com.codetroopers.betterpickers.recurrencepicker.RecurrencePickerDialog; import org.gnucash.android.R; +import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.AccountsDbAdapter; import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.db.DatabaseSchema; @@ -354,6 +356,8 @@ public void onNothingSelected(AdapterView adapterView) { initializeViewsWithTransaction(); mEditMode = true; } + + getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } /** @@ -533,7 +537,7 @@ private void initalizeViews() { String typePref = PreferenceManager.getDefaultSharedPreferences(getActivity()).getString(getString(R.string.key_default_transaction_type), "DEBIT"); mTransactionTypeSwitch.setChecked(TransactionType.valueOf(typePref)); - String code = Money.DEFAULT_CURRENCY_CODE; + String code = GnuCashApplication.getDefaultCurrencyCode(); if (mAccountUID != null){ code = mTransactionsDbAdapter.getAccountCurrencyCode(mAccountUID); } @@ -725,6 +729,12 @@ private void saveNewTransaction() { String notes = mNotesEditText.getText().toString(); BigDecimal amountBigd = mAmountEditText.getValue(); + if (amountBigd == null){ //if for whatever reason we cannot process the amount + Toast.makeText(getActivity(), R.string.toast_transanction_amount_required, + Toast.LENGTH_SHORT).show(); + return; + } + Currency currency = Currency.getInstance(mTransactionsDbAdapter.getAccountCurrencyCode(mAccountUID)); Money amount = new Money(amountBigd, Commodity.getInstance(currency.getCurrencyCode())).absolute(); diff --git a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java index d58de4a4a..cad60a0b6 100644 --- a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java +++ b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java @@ -37,14 +37,12 @@ import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.model.Commodity; import org.gnucash.android.ui.common.FormActivity; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; -import java.util.Currency; import java.util.Locale; /** @@ -55,7 +53,8 @@ */ public class CalculatorEditText extends EditText { CalculatorKeyboard mCalculatorKeyboard; - private Currency mCurrency = Currency.getInstance(GnuCashApplication.getDefaultCurrencyCode()); + + private Commodity mCommodity = Commodity.DEFAULT_COMMODITY; private Context mContext; /** @@ -238,17 +237,17 @@ public void setCalculatorKeyboard(CalculatorKeyboard keyboard){ * Returns the currency used for computations * @return ISO 4217 currency */ - public Currency getCurrency() { - return mCurrency; + public Commodity getCommodity() { + return mCommodity; } /** - * Sets the currency to use for calculations - * The currency determines the number of decimal places used - * @param currency ISO 4217 currency + * Sets the commodity to use for calculations + * The commodity determines the number of decimal places used + * @param commodity ISO 4217 currency */ - public void setCurrency(Currency currency) { - this.mCurrency = currency; + public void setCommodity(Commodity commodity) { + this.mCommodity = commodity; } /** @@ -321,7 +320,7 @@ public BigDecimal getValue(){ return null; try { //catch any exceptions in the conversion e.g. if a string with only "-" is entered return new BigDecimal(amountString); - } catch (Exception e){ + } catch (NumberFormatException e){ String msg = "Error parsing amount string " + amountString + " from CalculatorEditText"; Log.i(getClass().getSimpleName(), msg, e); Crashlytics.log(msg); @@ -337,12 +336,11 @@ public BigDecimal getValue(){ * @param amount BigDecimal amount */ public void setValue(BigDecimal amount){ - Commodity commodity = CommoditiesDbAdapter.getInstance().getCommodity(mCurrency.getCurrencyCode()); - BigDecimal newAmount = amount.setScale(commodity.getSmallestFractionDigits(), BigDecimal.ROUND_HALF_EVEN); + BigDecimal newAmount = amount.setScale(mCommodity.getSmallestFractionDigits(), BigDecimal.ROUND_HALF_EVEN); DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.getDefault()); formatter.setMinimumFractionDigits(0); - formatter.setMaximumFractionDigits(commodity.getSmallestFractionDigits()); + formatter.setMaximumFractionDigits(mCommodity.getSmallestFractionDigits()); formatter.setGroupingUsed(false); String resultString = formatter.format(newAmount.doubleValue()); diff --git a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorKeyboard.java b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorKeyboard.java index 64bd15014..563685653 100644 --- a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorKeyboard.java +++ b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorKeyboard.java @@ -77,6 +77,10 @@ public void onKey(int primaryCode, int[] keyCodes) { return; */ + if (!(focusCurrent instanceof CalculatorEditText)){ + return; + } + CalculatorEditText calculatorEditText = (CalculatorEditText) focusCurrent; Editable editable = calculatorEditText.getText(); int start = calculatorEditText.getSelectionStart(); diff --git a/app/src/main/java/org/gnucash/android/ui/wizard/FirstRunWizardActivity.java b/app/src/main/java/org/gnucash/android/ui/wizard/FirstRunWizardActivity.java index 83c274002..850d80329 100644 --- a/app/src/main/java/org/gnucash/android/ui/wizard/FirstRunWizardActivity.java +++ b/app/src/main/java/org/gnucash/android/ui/wizard/FirstRunWizardActivity.java @@ -154,10 +154,9 @@ public void onClick(View view) { } } + GnuCashApplication.setDefaultCurrencyCode(mCurrencyCode); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(FirstRunWizardActivity.this); SharedPreferences.Editor preferenceEditor = preferences.edit(); - preferenceEditor.putString(getString(R.string.key_default_currency), mCurrencyCode); - if (feedbackOption.equals(getString(R.string.wizard_option_auto_send_crash_reports))){ preferenceEditor.putBoolean(getString(R.string.key_enable_crashlytics), true); diff --git a/app/src/main/res/layout/activity_transaction_detail.xml b/app/src/main/res/layout/activity_transaction_detail.xml index 70af78a26..f04f239a8 100644 --- a/app/src/main/res/layout/activity_transaction_detail.xml +++ b/app/src/main/res/layout/activity_transaction_detail.xml @@ -64,6 +64,7 @@ android:gravity="bottom" android:layout_gravity="bottom" android:maxLines="1" + android:singleLine="true" android:ellipsize="start" android:textStyle="italic" android:textColor="@android:color/white" @@ -132,27 +133,25 @@ style="@style/TransactionInfo" /> - - + android:src="@drawable/ic_action_sort_by_size"/> - - - + + android:src="@drawable/ic_action_rotate_right"/> - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_export_form.xml b/app/src/main/res/layout/fragment_export_form.xml index 3fafbc43d..0d2944c3f 100644 --- a/app/src/main/res/layout/fragment_export_form.xml +++ b/app/src/main/res/layout/fragment_export_form.xml @@ -17,8 +17,10 @@ + android:layout_height="match_parent" + tools:context=".ui.common.FormActivity"> - + - + android:layout_width="wrap_content" + style="@style/TextAppearance.EditTransaction_Small" /> + + + + + - - diff --git a/app/src/main/res/layout/fragment_split_editor.xml b/app/src/main/res/layout/fragment_split_editor.xml index 884d8aebe..ebc5337ab 100644 --- a/app/src/main/res/layout/fragment_split_editor.xml +++ b/app/src/main/res/layout/fragment_split_editor.xml @@ -21,9 +21,37 @@ limitations under the License. android:layout_height="match_parent" tools:context=".ui.FormActivity"> + + + + + + + + + android:textSize="22sp"> + + @@ -63,6 +66,7 @@ android:layout_height="wrap_content" android:hint="@string/label_transaction_amount" android:inputType="none" + android:singleLine="true" android:nextFocusDown="@+id/input_description" android:background="@android:color/transparent" android:textColor="@color/debit_red" diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index c68c7e3c1..54aa639ba 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index a20a0ecc5..107153ca9 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index 372981249..7b935d0bc 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -85,183 +85,6 @@ Display account Crea els comptes Seleccioneu els comptes a crear - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version Llicència diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index e9bb88a3e..92c01bd4b 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml deleted file mode 100644 index 7cea47001..000000000 --- a/app/src/main/res/values-da-rDK/strings.xml +++ /dev/null @@ -1,579 +0,0 @@ - - - - - Create Account - Edit Account - Info - Export… - Add a new transaction to an account - No accounts to display - Account name - Cancel - Save - Enter Passcode - Wrong passcode, please try again - Passcode set - Please confirm your passcode - Invalid passcode confirmation. Please try again - Description - Amount - New transaction - No transactions to display - DATE & TIME - Account - DEBIT - CREDIT - Accounts - Transactions - Delete - Delete - Cancel - Account deleted - Confirm delete - All transactions in this account will also be deleted - Edit Transaction - Add note - MOVE - %1$d selected - Balance: - Export To: - Export Transactions - Export all transactions - By default, only new transactions since last export will be exported. Check this option to export all transactions - Error exporting %1$s file - Export - Delete after export - All exported transactions will be deleted when exporting is completed - Settings - - SD Card - DropBox - Google Drive - Send to… - - Move - Move %1$d transaction(s) - Destination Account - Access SD Card - Cannot move transactions.\nThe destination account uses a different currency from origin account - General - About - Choose default currency - Default currency - Default currency to assign to new accounts - Enables recording transactions in GnuCash for Android - Enables creation of accounts in GnuCash for Android - Your GnuCash data - Read and modify GnuCash data - Record transactions in GnuCash - Create accounts in GnuCash - Display account - Create Accounts - Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - - No accounts exist in GnuCash.\nCreate an account before adding a widget - Build version - License - Apache License v2.0. Click for details - General Preferences - Select Account - There are no transactions available to export - Passcode - Passcode Preferences - Passcode Turned On - Passcode Turned Off - Change Passcode - About GnuCash - A mobile finance management and expense-tracker designed for Android - About - %1$s file exported to:\n - GnuCash Android %1$s export - GnuCash Android Export from - Transactions - Transaction Preferences - Account Preferences - Default Transaction Type - The type of transaction to use by default, CREDIT or DEBIT - - CREDIT - DEBIT - - Are you sure you want to delete ALL transactions? - Are you sure you want to delete this transaction? - Export - Export all transactions - Delete exported transactions - Default export email - The default email address to send exports to. You can still change this when you export. - Transfer Account - All transactions will be a transfer from one account to another - Activate Double Entry - Balance - Enter an account name to create an account - Currency - Parent account - Use XML OFX header - Enable this option when exporting to third-party application other than GnuCash for desktop - What\'s New - - - New Material app design \n - - Multi-currency transactions\n - - Calculator to transaction amounts\n - - Better reporting options\n - - New help & feedback section\n - - Multiple bug fixes and improvements\n - - Dismiss - Enter an amount to save the transaction - Multi-currency transactions cannot be modified - Import GnuCash Accounts - Import Accounts - An error occurred while importing the GnuCash accounts - GnuCash Accounts successfully imported - Import account structure exported from GnuCash desktop - Import GnuCash XML - Delete all accounts in the database. All transactions will be deleted as - well. - - Delete all accounts - Accounts - All accounts have been successfully deleted - Are you sure you want to delete all accounts and transactions?\n\nThis - operation cannot be undone! - - Account Type - All transactions in all accounts will be deleted! - Delete all transactions - All transactions successfully deleted! - Importing accounts - Tap again to confirm. ALL entries will be deleted!! - Transactions - Sub-Accounts - Search - Default Export Format - File format to use by default when exporting transactions - Export transactions… - Recurrence - - Imbalance - Exporting transactions - No recurring transactions to display. - Successfully deleted recurring transaction - Placeholder account - Default Transfer Account - - %d sub-account - %d sub-accounts - - - CASH - BANK - CREDIT CARD - ASSET - LIABILITY - INCOME - EXPENSE - PAYABLE - RECEIVABLE - EQUITY - CURRENCY - STOCK - MUTUAL FUND - TRADING - - - QIF - OFX - XML - - - Select a Color - - Color %1$d - - Color %1$d selected - Account Color & Type - Delete sub-accounts - Recent - Favorites - All - Creates default GnuCash commonly-used account structure - Create default accounts - All existing accounts and transactions on the device will be deleted.\n\nAre you sure you want to proceed? - Scheduled Transactions - Welcome to GnuCash Android! \nYou can either create - a hierarchy of commonly-used accounts, or import your own GnuCash account structure. \n\nBoth options are also - available in app Settings so you can decide later. - - Transactions - Select destination for export - Memo - Spend - Receive - Withdrawal - Deposit - Payment - Charge - Decrease - Increase - Income - Rebate - Expense - Bill - Invoice - Buy - Sell - Repeats - No recent backup found - Opening Balances - Equity - Enable to save the current account balance (before deleting transactions) as new opening balance after deleting transactions - - Save account opening balances - OFX does not support double-entry transactions - Generates separate QIF files per currency - Transaction splits - Imbalance: - Add split - Favorite - Navigation drawer opened - Navigation drawer closed - Reports - Pie Chart - Line Chart - Bar Chart - Report Preferences - Select currency - Account color in reports - Use account color in the bar/pie chart - Reports - Order by size - Show legend - Show labels - Show percentage - Show average lines - Group Smaller Slices - No chart data available - Overall - Total - Other - The percentage of selected value calculated from the total amount - The percentage of selected value calculated from the current stacked bar amount - Save as template - This account contains transactions. \nWhat would you like to do with these transactions - This account contains sub-accounts. \nWhat would you like to do with these sub-accounts - Delete transactions - Create and specify a transfer account OR disable double-entry in settings to save the transaction - Tap to create schedule - Restore Backup… - Backup & export - DropBox Sync - Backup - Enable to sync to DropBox - Select GnuCash XML file - Backup Preferences - Create Backup - By default backups are saved to the SDCARD - Select a specific backup to restore - Backup successful - Backup failed - Exports all accounts and transactions - Google Drive Sync - Enable to sync to Google Drive - Install a file manager to select files - Select backup to restore - Favorites - Open… - Reports - Scheduled Transactions - Export… - Settings - - Daily - Every %d days - - - Weekly - Every %d weeks - - - Monthly - Every %d months - - - Yearly - Every %d years - - Enable Crash Logging - Automatically send information about app malfunction to the developers. - Format - Backup folder cannot be found. Make sure the SD Card is mounted! - Enter your old passcode - Enter your new passcode - Scheduled Exports - Exports - No scheduled exports to display - Create export schedule - Exported to: %1$s - The legend is too long - Account description - No recent accounts - No favorite accounts - Scheduled Actions - "Ended, last executed on %1$s" - Select a bar to view details - Next - Done - Default Currency - Account Setup - Select Currency - Feedback Options - Create default accounts - Import my accounts - Let me handle it - Other… - Automatically send crash reports - Disable crash reports - Back - Setup GnuCash - Welcome to GnuCash - Before you dive in, \nlet\'s setup a few things first\n\nTo continue, press Next - Split Editor - Check that all splits have valid amounts before saving! - Invalid expression! - Scheduled recurring transaction - An exchange rate is required - The converted amount is required - Transfer Funds - - Select a slice to see details - Period: - From: - To: - Provide either the converted amount or exchange rate in order to transfer funds - Exchange rate - Fetch quote - Converted Amount - Sheet - Expenses for last 3 months - Total Assets - Total Liabilities - Net Worth - Assets - Liabilities - Equity - - Move to: - Group By - Month - Quarter - Year - Balance Sheet - Total: - Google+ Community - Translate GnuCash - Share ideas, discuss changes or report problems - Translate or proof-read on CrowdIn - No compatible apps to receive the exported transactions! - Move... - Duplicate - - Current month - Last 3 months - Last 6 months - Last 12 months - All time - Custom range… - - diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 385b3bba5..b16e201b2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -85,183 +85,6 @@ Konto anzeigen Konten erstellen Zu erstellende Konten auswählen - - Afghani - Algerischer Dinar - Argentinischer Peso - Armenischer Dram - Aruban Florin - Australischer Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brasilianischer Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Kanadische Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Kolumbianischer Peso - Comoro Franc - Kongolesischer Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Kroatische Kuna - Cuban Convertible Peso - Kubanischer Peso - Tschechische Krone - Dalasi - Dänische Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indische Rupie - Iranischer Rial - Irakischer Dinar - Jamaican Dollar - Jordanischer Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberianischer Dollar - Libyscher Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexikanischer Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Keine Konten vorhanden.\nSie müssen ein Konto erstellen um Widgets anfügen zu können. Version Lizenz diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 1eb4bb06a..9b033a1bd 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -85,183 +85,6 @@ Εμφάνιση λογαριασμού Δημιουργία Λογαριασμών Επιλογή λογαριασμών για δημιουργία - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Δοκιμαστικό νόμισμα - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Ευρώ - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - Χωρίς νόμισμα - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - US Dolar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Δεν υπάρχουν λογαριασμοί στο GnuCash.\nΔημιουργήστε ενα λογαριασμό πριν προσθέσετε ένα γραφικό στοιχείο Έκδοση diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index c68c7e3c1..54aa639ba 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index dadd5fb70..276b7d0e6 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -85,183 +85,6 @@ Mostrar cuentas Crear Cuentas Seleccionar cuentas a crear - - Afgani - Dinar Argelino - Peso Argentino - Dram Armenio - Florin Arubeño - Dolar Australiano - Manat Azerí - Dolar Bahameño - Dinar Bareiní - Baht Tailandés - Balboa Panameño - Dolar Barbadense - Rublo Bieloruso - Dolar Beliceño - Dolar Bermudeño - Bolivar Fuerte - Boliviano - Real Brasileño - Dolar Bruneano - Lev Búlgaro - Franco Burundés - Dolar Canadiense - Escudo caboverdiano - Dolar de las Íslas Caimán - Franco CFA de África Occidental - Franco CFA de África Central - Franco CFP - Peso Chileno - Moneda de prueba - Peso Colombiano - Franco Comorono - Franco Congolés - Marco Bosnioherzegovino - Córdoba Nicaragüense - Colón Costarricense - Kuna Croata - Peso convertible - Peso Cubano - Corona Checa - Dalasi - Corona Danesa - Denar Macedonio - Franco Yibutiano - Dobra santotomense - Peso dominicano - Dong vietnamita - Dólar del Caribe Oriental - Libra egipcia - Colón salvadoreño - Birr etíope - Euro - Libra malvinense - Dólar fiyiano - Forinto húngaro - Cedi - Libra gibraltareña - Oro - Gourde - Guaraní - Franco guineano - Dólar guyanés - Dólar de Hong Kong - Grivna - Corona islandesa - Rupia india - Rial iraní - Dinar iraquí - Dólar jamaiquino - Dinar jodano - Chelín keniano - Kina - Kip - Dinar kuwaití - Kwacha - Kwanza angoleño - Kyat birmano - Lari georgiano - Lats letón - Libra libanesa - Lek albanés - Lempira hondureña - Leone - Dólar liberiano - Dinar libio - Lilangeni suazi - Litas lituana - Loti - Ariary malgache - Ringgit malayo - Rupia de Mauricio - Peso mexicano - Unidad de Inversión Mexicana (UDI) - Leu moldavo - Dírham marroquí - Metical mozambiqueño - Mvdol - Naira nigeriana - Nakfa - Dólar namibio - Rupia nepalí - Florín antillano neerlandés - Nuevo shéquel israelí - Nuevo leu rumano - Nuevo dólar taiwanés - Dólar neozelandés - Ngultrum butanés - Won norcoreano - Corona noruega - Nuevo Sol - Uguiya - Dólar tongano - Rupia pakistaní - Palladium - Pataca - Peso filipino - Platino - Libra esterlina - Pula - Riyal catarí - Quetzal - Rand sudafricano - Rial omaní - Riel - Rupia de Maldivas - Rupia indonesia - Rublo ruso - Franco ruandés - Libra de Santa Elena - Riyal saudí - Derechos Especiales de Giro (SDR) - Dinar serbio - Rupia de Seychelles - Plata - Dólar de Singapur - Dólar de las Islas Salomón - Som - Chelín somalí - Somoni tayiko - Libra sursudanesa - Rupia de Sri Lanka - Sucre - Libra sudanesa - Dólar surinamés - Corona sueca - Franco suizo - Libra siria - Taka - Tala samoana - Chelín tanzano - Tenge kazajo - Sin moneda - Dólar trinitense - Tugrik mongol - Dinar tunecino - Lira turca - Manat turkmeno - Dírham de los Emiratos Árabes Unidos - Chelín ugandés - Franco UIC - Unidad de Valor Real - Unidades de fomento - Peso uruguayo en Unidades Indexadas (URUIURUI) - Peso uruguayo - Dólar Estadounidense - Som uzbeko - Vatu - Euro WIR - Franco WIR - Won surcoreano - Rail yemení - Yen japonés - Yuan chino - Kwacha zambiano - Dólar zimbabuense - Zloty polaco - No hay cuentas en Gnucash.\nCree una cuenta antes de añadir un widget Versión de compilación Licencia diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 48e4feae8..d0f5da332 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -85,183 +85,6 @@ Mostrar cuentas Crear Cuentas Seleccionar cuentas a crear - - Afgani - Dinar Argelino - Peso Argentino - Dram Armenio - Florin Arubeño - Dolar Australiano - Manat Azerí - Dolar Bahameño - Dinar Bareiní - Baht Tailandés - Balboa Panameño - Dolar Barbadense - Rublo Bieloruso - Dolar Beliceño - Dolar Bermudeño - Bolívar Fuerte - Boliviano - Real Brasileño - Dolar Bruneano - Lev Búlgaro - Franco Burundés - Dolar Canadiense - Escudo caboverdiano - Dolar de las Íslas Caimán - Franco CFA de África Occidental - Franco CFA de África Central - Franco CFP - Peso Chileno - Moneda de prueba - Peso Colombiano - Franco Comorono - Franco Congolés - Marco Bosnioherzegovino - Córdoba Nicaragüense - Colón Costarricense - Kuna Croata - Peso convertible - Peso Cubano - Corona Checa - Dalasi - Corona Danesa - Denar Macedonio - Franco Yibutiano - Dobra santotomense - Peso dominicano - Dong vietnamita - Dólar del Caribe Oriental - Libra egipcia - Colón salvadoreño - Birr etíope - Euro - Libra malvinense - Dólar fiyiano - Forinto húngaro - Cedi - Libra gibraltareña - Oro - Gourde - Guaraní - Franco guineano - Dólar guyanés - Dólar de Hong Kong - Grivna - Corona islandesa - Rupia india - Rial iraní - Dinar iraquí - Dólar jamaiquino - Dinar jodano - Chelín keniano - Kina - Kip - Dinar kuwaití - Kwacha - Kwanza angoleño - Kyat birmano - Lari georgiano - Lats letón - Libra libanesa - Lek albanés - Lempira hondureña - Leone - Dólar liberiano - Dinar libio - Lilangeni suazi - Litas lituana - Loti - Ariary malgache - Ringgit malayo - Rupia de Mauricio - Peso mexicano - Unidad de Inversión Mexicana (UDI) - Leu moldavo - Dírham marroquí - Metical mozambiqueño - Mvdol - Naira nigeriana - Nakfa - Dólar namibio - Rupia nepalí - Florín antillano neerlandés - Nuevo shéquel israelí - Nuevo leu rumano - Nuevo dólar taiwanés - Dólar neozelandés - Ngultrum butanés - Won norcoreano - Corona noruega - Nuevo Sol - Uguiya - Dólar tongano - Rupia pakistaní - Palladium - Pataca - Peso filipino - Platino - Libra esterlina - Pula - Riyal catarí - Quetzal - Rand sudafricano - Rial omaní - Riel - Rupia de Maldivas - Rupia indonesia - Rublo ruso - Franco ruandés - Libra de Santa Elena - Riyal saudí - Derechos Especiales de Giro (SDR) - Dinar serbio - Rupia de Seychelles - Plata - Dólar de Singapur - Dólar de las Islas Salomón - Som - Chelín somalí - Somoni tayiko - Libra sursudanesa - Rupia de Sri Lanka - Sucre - Libra sudanesa - Dólar surinamés - Corona sueca - Franco suizo - Libra siria - Taka - Tala samoana - Chelín tanzano - Tenge kazajo - Sin moneda - Dólar trinitense - Tugrik mongol - Dinar tunecino - Lira turca - Manat turkmeno - Dírham de los Emiratos Árabes Unidos - Chelín ugandés - Franco UIC - Unidad de Valor Real - Unidades de fomento - Peso uruguayo en Unidades Indexadas (URUIURUI) - Peso uruguayo - Dólar Estadounidense - Som uzbeko - Vatu - Euro WIR - Franco WIR - Won surcoreano - Rail yemení - Yen japonés - Yuan chino - Kwacha zambiano - Dólar zimbabuense - Zloty polaco - No hay cuentas en Gnucash.\nCree una cuenta antes de añadir un widget Versión de compilación Licencia diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index c68c7e3c1..54aa639ba 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 10ac0756c..547ffb19c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -85,183 +85,6 @@ Afficher le compte Créer les comptes Choisisez les comptes à créés - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Aucun compte éxistant dans GnuCash.\nCréez un compte avant d\'ajouter un widget Version logiciel Licence diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index d16cedb1f..f6e4e0ffa 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 93f5e8086..313ddee27 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -85,183 +85,6 @@ Visualizza conto Crea conti Selezione dei conti da creare - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Non esiste alcun conto in GnuCash.\nCreare un conto prima di aggiungere il widget Versione build Licenza diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index c68c7e3c1..54aa639ba 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index f57b1ddae..52fe7ce51 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 462514032..1656ad737 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index e3ac6da33..05ee7407b 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -85,183 +85,6 @@ Vis konto Opprett konto Velg kontoer å opprette - - Afghanske - Algeriske dinarer - Argentinsk Peso - Armensk Dram - Arubiske gylden - Australske Dollar - Aserbajdsjanske Manat - Bahamian Dollar - Bahraini dinarer - Baht - Balboa - Barbados Dollar - Hviterussiske rubler - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brasilianske Real - Brunei Dollar - Bulgarske Lev - Burundi Franc - Kanadiske Dollar - Kapp Verde Escudo - Caymanøyene Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilenske pesos - Testing valuta - Colombianske Peso - Comoro Franc - Kongolesiske Franc - Konvertible Mark - Cordoba Oro - Costa Rica kolon - Kroatiske Kuna - Cubansk konvertibel Peso - Cubansk Peso - Tsjekkiske Koruna - Dalasi - Dansk Krone - Denar - Djibouti Franc - Dobra - Dominikanske pesos - Dong - Østkaribiske Dollar - Egyptisk pund - El Salvador kolon - Ethiopian Birr - Euro - Falklandske pund - Fiji Dollar - Forint - Ghana Cedi - Gibraltarske pund - Gull - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Islandske kroner - Indiske rupi - Iranske Rial - Irakiske dinarer - Jamaicanske Dollar - Jordanske dinarer - Kenyanske Shilling - Kina - Kip - Kuwaitiske dinarer - Kwacha - Kwanza - Kyat - Lari - Latviske Lats - Libanesiske pund - Lek - Lempira - Leone - Liberiske Dollar - Libyske dinarer - Lilangeni - Litauisk Litas - Loti - Gassiske Ariary - Malaysiske Ringgit - Mauritius rupi - Meksikansk Peso - Meksikansk Unidad de inversjon (UDI) - Moldova Leu - Marokkanske Dirham - Mosambik Metical - Mvdol - Naira - Nakfa - Namibiske Dollar - Nepalske rupi - Nederlandske antillegylden - Israelske shekel - Nye rumenske Leu - Nye taiwanske Dollar - Newzealandske Dollar - Ngultrum - Nordkoreanske Won - Norske kroner - Nuevo Sol - Ouguiya - Pa\'anga - Pakistanske rupi - Palladium - Pataca - Filippinske Peso - Platina - Pund Sterling - Pula - Qatari Rial - Quetzal - Rand - Omansk Rial - Riel - Rufiyaa - Rupiah - Russisk rubel - Rwanda Franc - Sankthelenske pund - Saudiarabiske Riyal - SDR (spesielle tegning rett) - Serbiske dinarer - Seychellene rupi - Sølv - Singapor Dollar - Salomonøyene Dollar - Som - Somaliske Shilling - Somoni - Sør Sudanske pund - Srilankiske rupi - Sucre - Sudanske pund - Surinam Dollar - Svenske kroner - Sveitsiske Franc - Syriske pund - Taka - Tala - Tanzanianske Shilling - Tenge - Ingen valuta - Trinidad og Tobagos Dollar - Tugrik - Tunisiske dinarer - Tyrkiske Lira - Turkmensk nye Manat - UAE Dirham - Ugandiske Shilling - UIC Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso no Unidades Indexadas (URUIURUI) - Uruguayanske peso - US Dollar - Usbekiske Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambiske Kwacha - Zimbabwiske Dollar - Zloty - Det finnes ingen kontoer i GnuCash.\nOpprett en konto før du legger til en widget Byggversjon Lisens diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 92b7a0758..6654dae56 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -85,183 +85,6 @@ Rekening tonen Rekeningen aanmaken Standaard rekeningen selecteren - - Afghani - Algerijnse dinar - Argentijnse peso - Armeense dram - Arubaanse florin - Australische dollar - Azerbeidzjaanse manat - Bahamaanse dollar - Bahreinse dinar - Baht - Balboa - Barbadaanse dollar - Wit-Russische Roebel - Belizaanse Dollar - Bermuda Dollar - Bolivar Fuerte - Boliviano - Braziliaanse Real - Bruneise Dollar - Bulgaarse Lev - Burundese Frank - Canadese dollar - Kaapverdische Escudo - Caymaneilandse Dollar - CFA-Frank BCEAO - CFA-Frank BEAC - CFP-Frank - Chileense Peso - Testen van valuta - Colombiaanse Peso - Comorese Frank - Congolese frank - Converteerbare Mark - Cordoba Oro - Costaricaanse colón - Kroatische kuna - Cubaanse Convertibele Peso - Cubaanse peso - Tsjechische kroon - Dalasi - Deense kroon - Denar - Djiboutiaanse Frank - Dobra - Dominicaanse Peso - Dong - Oost-Caribische Dollar - Egyptische pond - Salvadoraanse colón - Ethiopische Birr - Euro - Falklandeilands pond - Fiji Dollar - Forint - Ghanese Cedi - Gibraltarees pond - Goud - Gourde - Guaraní - Guinese Frank - Guyaanse Dollar - Hongkongse dollar - Hryvnia - Ijslandse kroon - Indiase roepie - Iraanse rial - Iraakse dinar - Jamaicaanse dollar - Jordaanse dinar - Keniaanse shilling - Kina - Kip - Koeweitse Dinar - Kwacha - Kwanza - Kyat - Lari - Letse Lats - Libanees pond - Lek - Lempira - Leone - Liberiaanse dollar - Libische Dinar - Lilangeni - Litouwse Litas - Loti - Malagasi Ariary - Maleisische Ringgit - Mauritiaanse Rupee - Mexicaanse peso - Mexicaanse Unidad de Inversion (UDI) - Moldavische Leu - Marokkaanse Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibische Dollar - Nepalese Rupee - Antilliaanse gulden - Israëlische nieuwe shekel - Nieuwe Roemeense Leu - Taiwanese nieuwe Dollar - Nieuw-Zeelandse dollar - Ngultrum - Noord-Koreaanse Won - Noorse kroon - Nuevo Sol - Ouguiya - Pa\'anga - Pakistaanse Rupee - Palladium - Pataca - Filippijnse peso - Platina - Pond sterling - Pula - Qatarese Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Roepie - Russische roebel - Rwanda Frank - Sint-Heleense pond - Saoedi-Arabische Riyal - SDR (bijzonder trekkingsrecht) - Servische Dinar - Seychelse Roepie - Zilver - Singaporese Dollar - Salomonseilandse Dollar - Som - Somalische Shilling - Somoni - Zuid Soedanese pond - Srilankaanse Rupee - Sucre - Soedanese pond - Surinaamse Dollar - Zweedse kroon - Zwitserse Frank - Syrisch pond - Taka - Tala - Tanzaniaanse Shilling - Tenge - Geen valuta - Trinidad en Tobago-Dollar - Tugrik - Tunesische dinar - Turkse lire - Turkmenistan nieuwe Manat - UAE Dirham - Oeganda Shilling - UIC-Frank - Unidad de Valor Real - Unidades de fomento - Uruguay Peso nl Unidades Indexadas (URUIURUI) - Uruguayan Peso - Amerikaanse Dollar - Oezbekistaanse Sum - Vatu - WIR Euro - WIR Frank - Won - Jemenitische Rial - Yen - Yuan Renminbi - Zambiaanse Kwacha - Zimbabwaanse Dollar - Zloty - Geen rekeningen beschikbaar.\nU moet een rekening aanmaken alvorens een widget toe te voegen Versie Licentie diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index e3ac6da33..05ee7407b 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -85,183 +85,6 @@ Vis konto Opprett konto Velg kontoer å opprette - - Afghanske - Algeriske dinarer - Argentinsk Peso - Armensk Dram - Arubiske gylden - Australske Dollar - Aserbajdsjanske Manat - Bahamian Dollar - Bahraini dinarer - Baht - Balboa - Barbados Dollar - Hviterussiske rubler - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brasilianske Real - Brunei Dollar - Bulgarske Lev - Burundi Franc - Kanadiske Dollar - Kapp Verde Escudo - Caymanøyene Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilenske pesos - Testing valuta - Colombianske Peso - Comoro Franc - Kongolesiske Franc - Konvertible Mark - Cordoba Oro - Costa Rica kolon - Kroatiske Kuna - Cubansk konvertibel Peso - Cubansk Peso - Tsjekkiske Koruna - Dalasi - Dansk Krone - Denar - Djibouti Franc - Dobra - Dominikanske pesos - Dong - Østkaribiske Dollar - Egyptisk pund - El Salvador kolon - Ethiopian Birr - Euro - Falklandske pund - Fiji Dollar - Forint - Ghana Cedi - Gibraltarske pund - Gull - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Islandske kroner - Indiske rupi - Iranske Rial - Irakiske dinarer - Jamaicanske Dollar - Jordanske dinarer - Kenyanske Shilling - Kina - Kip - Kuwaitiske dinarer - Kwacha - Kwanza - Kyat - Lari - Latviske Lats - Libanesiske pund - Lek - Lempira - Leone - Liberiske Dollar - Libyske dinarer - Lilangeni - Litauisk Litas - Loti - Gassiske Ariary - Malaysiske Ringgit - Mauritius rupi - Meksikansk Peso - Meksikansk Unidad de inversjon (UDI) - Moldova Leu - Marokkanske Dirham - Mosambik Metical - Mvdol - Naira - Nakfa - Namibiske Dollar - Nepalske rupi - Nederlandske antillegylden - Israelske shekel - Nye rumenske Leu - Nye taiwanske Dollar - Newzealandske Dollar - Ngultrum - Nordkoreanske Won - Norske kroner - Nuevo Sol - Ouguiya - Pa\'anga - Pakistanske rupi - Palladium - Pataca - Filippinske Peso - Platina - Pund Sterling - Pula - Qatari Rial - Quetzal - Rand - Omansk Rial - Riel - Rufiyaa - Rupiah - Russisk rubel - Rwanda Franc - Sankthelenske pund - Saudiarabiske Riyal - SDR (spesielle tegning rett) - Serbiske dinarer - Seychellene rupi - Sølv - Singapor Dollar - Salomonøyene Dollar - Som - Somaliske Shilling - Somoni - Sør Sudanske pund - Srilankiske rupi - Sucre - Sudanske pund - Surinam Dollar - Svenske kroner - Sveitsiske Franc - Syriske pund - Taka - Tala - Tanzanianske Shilling - Tenge - Ingen valuta - Trinidad og Tobagos Dollar - Tugrik - Tunisiske dinarer - Tyrkiske Lira - Turkmensk nye Manat - UAE Dirham - Ugandiske Shilling - UIC Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso no Unidades Indexadas (URUIURUI) - Uruguayanske peso - US Dollar - Usbekiske Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambiske Kwacha - Zimbabwiske Dollar - Zloty - Det finnes ingen kontoer i GnuCash.\nOpprett en konto før du legger til en widget Byggversjon Lisens diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 037c42413..aa7366017 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -85,183 +85,6 @@ Wyświetl konto Utwórz konta Wybierz konta do utworzenia - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Brak kont w GnuCash.\nUtwórz konto zanim dodasz widżet Wersja builda Licencja diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b65554aea..443b85b81 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -85,183 +85,6 @@ Mostrar conta Criar Contas Escolha as contas a criar - - Afegane - Dinar Argelino - Peso Argentino - Dram Armeniano - Florim de Aruba - Dólar Australiano - Manat Azerbaijão - Dólar Bahamas - Dinar de Bahrein - Bath Tailandez - Balboa - Dólar de Barbados - Rublo Belarus - Dólar de Belize - Dólar de Bermudas - Bolivar Forte - Boliviano - Real Brasileiro - Dólar de Brunei - Lev Búlgaro - Franco de Burundi - Dólar Canadense - Escudo de Cabo Verde - Dólar das Ilhas Cayman - Franco CFA BCEAO - Franco CFA BEAC - Franco CFP - Peso Chileno - Cotação de teste - Peso Colombiano - Franco de Comores - Franco Congoles - Marco Conversível - Ouro Cordoba - Colon de Costa Rica - Kuna Croata - Peso conversível Cubano - Peso Cubano - Coroa Tcheca - Dalassi - Coroa da Dinamarca - Dinar Macedonia - Franco de Djibuti - Dobra de São Tome e Principe - Peso Dominicano - Dongue - Dólar do Caribe Oriental - Libra Egípcia - Colon de El Salvador - Birr da Etiopia - Euro - Libra das Ilhas Falkland - Dólar Fiji - Florim Húngaro - Cedi de Gana - Libra de Gibraltar - Ouro - Gourde Haitiano - Guarani - Franco de Guine - Dólar da Guiana - Dólar de Hong Kong - Grívnia - Coroa da Islandia - Rupia Indiana - Rial Iraniano - Dinar Iraquiano - Dólar Jamaicano - Dinar Jordaniano - Xelim do Quenia - Kina - Quipe - Dinar Kwait - Quacha - Kwanza - Quiate - Lari - Lat da Letonia - Libra do Líbano - Lek - Lempira - Leone - Dólar Liberiano - Dinar Libia - Lilangeni - Lita da Lituania - Loti - Ariary de Madagascar - Ringgit da Malasia - Rupia de Mauricio - Peso Mexicano - Unidade Mexicana de Inversão - Leu da Moldávia - Dirham de Marrocos - Nova Metical de Moçambique - Boliviano - Naira - Nakfa - Dólar da Namíbia - Rupia do Nepal - Florim das Antilhas Holandesas - Shequl Israelense - Novo Leu Romeno - Novo Dólar Taiwanes - Dólar Neozelandês - Ngultrume butanes - Won Norte Koreano - Krone Noruegues - Novo Sol - Uguia - Paanga - Rupia do Paquistão - Paladio - Pataca - Peso Filipino - Platina - Libra Esterlina - Pula - Rial do Catar - Quetzal - Rande - Rial de Omã - Riel - Rufia - Rupia da Indonesia - Rublo Russo - Franco de Ruanda - Libra de Santa Helena - Rial da Arábia Saudita - Direito especial - Dinar Sérvio - Rupia de Seycheles - Prata - Dólar de Cingapura - Dólar das Ilhas Salomão - Som Quirguistão - Xelim da Somália - Somoni - Libra Sul Sudanesa - Rupia do Sri Lanka - Sucre - Nova Libra Sudanesa - Dólar do Suriname - Coroa Sueca - Franco Suiço - Libra Siria - Taca - Tala - Xelim da Tanzania - Tenge - Sem moeda - Dólar de Trinidad e Tobago - Tugrik - Dinar Tunisiano - Nova Lira Turca - Novo Manat Turcomenistão - Dirham EAU - Xelim de Uganda - UIC-Franc - Unidade de Valor Real - unidades de fomento - Uruguai Peso em Unidades Indexadas - Peso Uruguaio - Dólar dos EUA - Som do Uzbequistão - Vatu - WIR Euro - WIR Franc - Won Sul Coreano - Rial de Iemen - Iene - Renmimbi de Iuan - Quacha do Zambia - Dólar do Zimbabue - Zloty - Não existem contas no GnuCash.\nCrie uma conta antes de adicionar um widget Versão Licensa diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 8a053eaf4..ce055634b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -85,183 +85,6 @@ Mostrar conta Criar Contas Escolha as contas a criar - - Afegão - Dinar argelino - Peso argentino - Dram armênio - Florin de Aruba - Dólar australiano - Manat do Arzebeijão - Dólar das Bahamas - Dinar do Bahrein - Baht - Balboa - Dólar de Barbados - Ruble de Bielorrussia - Dólar de Belize - Dólar das Bermudas - Bolivar Fuerte - Boliviano - Real brasileiro - Dólar de Brunei - Lev Búlgaro - Franco de Burundi - Dólar canadiano - Escudo de Cabo Verde - Dólar das Ilhas Caimão - Franco CFA BCEAO - Franco CFA BEAC - Franco do CFP - Peso chileno - Moeda de teste - Peso colombiano - Franco das Comoros - Franco congolês - Marco conversível - Córdoba de ouro - Colon da Costa Rica - Kuna Croata - Peso cubano convertível - Peso cubano - Coroa Checa - Dalasi - Coroa dinamarquesa - Denar - Franco do Djibuti - Dobra - Peso dominicano - Dong - Dólar das Caraíbas Orientais - Libra egípcia - Colon de El Salvador - Birr etíope - Euro - Libra das Malvinas - Dólar das Fiji - Forint húngaro - Cedi Gana - Libra de Gibraltar - Ouro - Gourde - Guarani - Franco do Guinea - Dólar da Guiana - Dólar de Hong Kong - Hryvnia - Coroa islandesa - Rupia indiana - Rial iraniano - Dinar iraquiano - Dólar jamaicano - Dinar jordaniano - Xelim queniano - Kina - Kip - Dinar do Kuwait - Kwacha - Kwanza - Kyat - Lari - Lats Letão - Libra libanesa - Lek - Lempira - Leoa - Dólar da Libéria - Dinar Líbio - Lilangeni - Litas lituana - Loti - Ariary malgaxe - Ringgit da Malásia - Rupia das Maurícias - Peso mexicano - Unidade de inversão mexicana (UDI) - Leu da Moldávia - Dirham marroquino - Metical de Moçambique - Mvdol - Naira - Nakfa - Dólar de Namíbia - Rupia nepalesa - Florim das Antilhas Holandesas - Novo Shequel israelita - Novo Leu romeno - Novo Dólar de Taiwan - Dólar da Nova Zelândia - Ngultrum - Won norte-coreano - Coroa norueguesa - Novo Sol - Ouguiya - Pa\'anga - Rupia paquistanesa - Paládio - Pataca - Peso filipino - Platina - Libra Esterlina - Pula - Rial do Qatar - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupia - Rublo Russo - Franco de Rwanda - Libra de Santa Helena - Rial saudita - SDR (direito especial de saque) - Dinar sérvio - Rupia das Seychelles - Prata - Dólar de Singapura - Dólar das Ilhas Salomão - Som - Xelim somali - Somoni - Libra do Sudão do Sul - Rúpia do Sri Lanka - Açúcar - Libra sudanesa - Dólar de Surinam - Coroa Sueca - Franco suíço - Libra Síria - Taka - Tala - Xelim da Tanzânia - Tenge - Nenhuma moeda - Dólar de Trinidad e Tobago - Tugrik da Mongólia - Dinar tunisino - Lira turca - Novo Manat do Turcomenistão - Dirham dos UAE - Xelim de Uganda - UIC-Franco - Unidade de Valor Real - Unidade de fomento - Peso do uruguai em unidades indexadas (URUIURUI) - Peso uruguaio - Dólar dos USA - Sum do Usbequistão - Vatu - Euro WIR - Franco WIR - Won - Rial iemenita - Iene - Yuan Renminbi - Kwacha da Zâmbia - Dólar de Zimbabwe - Zloty - Não existem contas no GnuCash.\nCrie uma conta antes de adicionar um widget Versão Licensa diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index e9bb88a3e..92c01bd4b 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5049bae9d..764b17f0d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -85,183 +85,6 @@ Показать счёт Создать счета Выберите счета для создания - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Белорусский рубль - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Гривна - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Российский рубль - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - Нет валюты - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - Доллар США - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - Нет счетов в Gnucash.\nСначала создайте счета, а потом добавляйте виджет. Версия сборки Лицензия diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index 6dfa1c6c3..c92cb1056 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index c68c7e3c1..54aa639ba 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index a9ade4bde..a9c761986 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index 9c123a97a..0f8436621 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -85,183 +85,6 @@ Показати рахунок Створити рахунки Оберіть рахунки для створення - - Афгані - Алжирський динар - Аргентинський песо - Вірменський драм - Арубанскій флорин - Австралійський долар - Азербайджанський Манат - Багамський долар - Бахрейнський динар - Бат - Бальбоа - Барбадос долар - Білоруський рубль - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Канадський долар - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Чеська крона - Dalasi - Данська крона - Динар - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Єгипетський фунт - El Salvador Colon - Ethiopian Birr - Євро - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Золото - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Гривня - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Латвійський лат - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Мексиканський песо - Mexican Unidad de Inversion (UDI) - Молдовський лей - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - Новий ізраїльський шекель - Новий румунський лей - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Паладій - Pataca - Philippine Peso - Платина - Фунт стерлінгів - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Російський рубль - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Срібло - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Шведська крона - Швейцарський франк - Syrian Pound - Taka - Tala - Tanzanian Shilling - Тенге - Немає валюти - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Турецька ліра - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - Долар США - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Єна - Юань - Zambian Kwacha - Zimbabwe Dollar - Злотий - Немає рахунків в Gnucash.\nСтворіть рахунки перед додаваням віджета. Версія збірки Ліцензія diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 462514032..1656ad737 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f5010cc0e..83f48ddfb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -85,183 +85,6 @@ 显示科目 创建科目 选择要创建的科目 - - 阿富汗尼 - 阿尔及利亚第纳尔 - 阿根廷比索 - 亚美尼亚德拉姆 - 阿鲁巴弗罗林 - 澳元 - 阿塞拜疆马纳特 - 巴哈马元 - 巴林第纳尔 - 泰铢 - 巴尔博亚 - 巴巴多斯元 - 白俄罗斯卢布 - 伯利兹元 - 百慕大元 - 博利瓦 - 玻利维亚诺 - 巴西雷亚尔 - 文莱元 - 保加利亚列弗 - 布隆迪法郎 - 加拿大元 - 佛得角埃斯库多 - 开曼群岛元 - 西非法郎 - 中非法郎 - 太平洋金融共同体法郎 - 智利比索 - 测试 - 哥伦比亚比索 - 科摩罗法郎 - 刚果法郎 - 可兑换马克 - 科多巴 - 哥斯达黎加科朗 - 克罗地亚库纳 - Cuban Convertible Peso - 古巴比索 - 捷克克朗 - 达拉斯 - 丹麦克朗 - 代纳尔 - 吉布提法郎 - 多布拉 - 多米尼加比索 - 越南盾 - 东加勒比元 - 埃及镑 - 萨尔瓦多科朗 - 埃塞俄比亚比尔 - 欧元 - 福克兰镑 - 斐济元 - 匈牙利福林 - 加纳塞地 - 直布罗陀庞德 - 黄金 - 海地古德 - 瓜拉尼 - 几内亚法郎 - 圭亚那元 - 港币 - 赫夫纳 - 冰岛克朗 - 印度卢布 - 伊朗里亚尔 - 伊拉克第纳尔 - 牙买加元 - 约旦第纳尔 - 肯尼亚先令 - 巴布亚新几内亚Kina - 老挝基普 - 科威特第纳尔 - 赞比亚克瓦查 - 安哥拉宽扎 - 缅甸元 - 格鲁吉亚拉里 - 拉脱维亚拉特 - 黎巴嫩镑 - 阿尔巴尼亚Lek - 洪都拉斯伦皮拉 - 塞拉利昂 - 利比里亚元 - 利比亚第纳尔 - 马兰吉尼 - 立陶宛立特 - 洛蒂 - 阿里亚 - 马来西亚林吉特 - 毛里求斯卢比 - 墨西哥比索 - Mexican Unidad de Inversion (UDI) - 摩尔多瓦列伊 - 摩洛哥迪拉姆 - 莫桑比克的梅蒂卡尔 - Mvdol - Naira - Nakfa - 纳米比亚元 - 尼泊尔卢比 - 荷兰安的列斯荷兰盾 - 以色列新谢克尔 - 新罗马尼亚列伊 - 新台币 - 新西兰元 - Ngultrum - 北韩元 - 挪威克朗 - 秘鲁 索尔 - Ouguiya - Pa’anga - 巴基斯坦卢比 - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - 俄罗斯卢布 - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - 白银 - 新加坡元 - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - 瑞典克朗 - 瑞士法郎 - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - 美元 - Uzbekistan Sum - Vatu - “世界投资报告”欧元 - “世界投资报告”法郎 - 韩元 - Yemeni Rial - 日元 - 人民币 - Zambian Kwacha - 津巴布韦元 - Zloty - GnuCash里还没有科目信息。\n使用小部件前需要添加科目 版本号 授权许可 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index becfd7de5..fc5f6b5d7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -85,183 +85,6 @@ 显示科目 创建科目 选择要创建的科目 - - 阿富汗尼 - 阿尔及利亚第纳尔 - 阿根廷比索 - 亚美尼亚德拉姆 - 阿鲁巴弗罗林 - 澳元 - 阿塞拜疆马纳特 - 巴哈马元 - 巴林第纳尔 - 泰铢 - 巴尔博亚 - 巴巴多斯元 - 白俄罗斯卢布 - 伯利兹元 - 百慕大元 - 博利瓦 - 玻利维亚诺 - 巴西雷亚尔 - 文莱元 - 保加利亚列弗 - 布隆迪法郎 - 加拿大元 - 佛得角埃斯库多 - 开曼群岛元 - 西非法郎 - 中非法郎 - 太平洋金融共同体法郎 - 智利比索 - 测试 - 哥伦比亚比索 - 科摩罗法郎 - 刚果法郎 - 可兑换马克 - 科多巴 - 哥斯达黎加科朗 - 克罗地亚库纳 - 古巴可兌換披索 - 古巴比索 - 捷克克朗 - 达拉斯 - 丹麦克朗 - 代纳尔 - 吉布提法郎 - 多布拉 - 多米尼加比索 - 越南盾 - 东加勒比元 - 埃及镑 - 萨尔瓦多科朗 - 埃塞俄比亚比尔 - 欧元 - 福克兰镑 - 斐济元 - 匈牙利福林 - 加纳塞地 - 直布罗陀庞德 - 黄金 - 海地古德 - 瓜拉尼 - 几内亚法郎 - 圭亚那元 - 港币 - 赫夫纳 - 冰岛克朗 - 印度卢布 - 伊朗里亚尔 - 伊拉克第纳尔 - 牙买加元 - 约旦第纳尔 - 肯尼亚先令 - 巴布亚新几内亚Kina - 老挝基普 - 科威特第纳尔 - 赞比亚克瓦查 - 安哥拉宽扎 - 缅甸元 - 格鲁吉亚拉里 - 拉脱维亚拉特 - 黎巴嫩镑 - 阿尔巴尼亚Lek - 洪都拉斯伦皮拉 - 塞拉利昂 - 利比里亚元 - 利比亚第纳尔 - 马兰吉尼 - 立陶宛立特 - 洛蒂 - 阿里亚 - 马来西亚林吉特 - 毛里求斯卢比 - 墨西哥比索 - Mexican Unidad de Inversion (MXV) - 摩尔多瓦列伊 - 摩洛哥迪拉姆 - 莫桑比克的梅蒂卡尔 - Mvdol - 尼日利亞奈拉 - 厄立特里亞奈克法 - 纳米比亚元 - 尼泊尔卢比 - 荷兰安的列斯荷兰盾 - 以色列新谢克尔 - 新罗马尼亚列伊 - 新台币 - 新西兰元 - 不丹魯姆 - 北韩元 - 挪威克朗 - 秘鲁 索尔 - 毛里塔尼亞烏吉亞 - 東加潘加 - 巴基斯坦卢比 - - 澳門幣 - 菲律賓披索 - 白金 - 英鎊 - 波茨華拿普拉 - 卡塔爾里亞爾 - 危地馬拉格查爾 - 南非蘭特 - 阿曼里亞爾 - 柬埔寨瑞爾 - 馬爾代夫拉菲亞 - 印尼盾 - 俄罗斯卢布 - 盧旺達法郎 - 聖海倫娜鎊 - 沙地阿拉伯里亞爾 - SDR(特別提款權) - 塞爾維亞第納爾 - 塞席爾盧比 - 白银 - 新加坡元 - 所羅門群島元 - 吉爾吉斯索姆 - 索馬里先令 - 塔吉克莫尼 - 南蘇丹鎊 - 斯里蘭卡盧比 - 厄瓜多爾蘇克雷 - 蘇丹鎊 - 蘇里南元 - 瑞典克朗 - 瑞士法郎 - 敘利亞鎊 - 孟加拉塔卡 - 薩摩亞塔拉 - 坦桑尼亞先令 - 哈薩克堅戈 - - 千里達和多巴哥元 - 蒙古圖格里克 - 突尼西亞第納爾 - 土耳其里拉 - 土庫曼馬納特 - 阿聯迪拉姆 - 烏干達先令 - 國際鐵路聯盟法郎 - 哥倫比亞Unidad de Valor Real - 智利Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan Peso - 美元 - 烏茲別克索姆 - 瓦努阿圖瓦圖 - “世界投资报告”欧元 - “世界投资报告”法郎 - 韩元 - 也門里亞爾 - 日元 - 人民币 - 贊比亞克瓦查 - 津巴布韦元 - 波蘭茲羅提 - GnuCash里还没有科目信息。\n使用小部件前需要添加科目 版本号 授权许可 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 41b865484..21340b271 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -29,6 +29,7 @@ report_currency enable_crashlytics use_account_color + last_export_destination CREDIT diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 948ec1b40..3f0394ec5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,7 @@ By default, only new transactions since last export will be exported. Check this option to export all transactions Error exporting %1$s file Export - Delete after export + Delete transactions after export All exported transactions will be deleted when exporting is completed Settings @@ -85,183 +85,6 @@ Display account Create Accounts Select accounts to create - - Afghani - Algerian Dinar - Argentine Peso - Armenian Dram - Aruban Florin - Australian Dollar - Azerbaijanian Manat - Bahamian Dollar - Bahraini Dinar - Baht - Balboa - Barbados Dollar - Belarussian Ruble - Belize Dollar - Bermudian Dollar - Bolivar Fuerte - Boliviano - Brazilian Real - Brunei Dollar - Bulgarian Lev - Burundi Franc - Canadian Dollar - Cape Verde Escudo - Cayman Islands Dollar - CFA Franc BCEAO - CFA Franc BEAC - CFP Franc - Chilean Peso - Testing currency - Colombian Peso - Comoro Franc - Congolese Franc - Convertible Mark - Cordoba Oro - Costa Rican Colon - Croatian Kuna - Cuban Convertible Peso - Cuban Peso - Czech Koruna - Dalasi - Danish Krone - Denar - Djibouti Franc - Dobra - Dominican Peso - Dong - East Caribbean Dollar - Egyptian Pound - El Salvador Colon - Ethiopian Birr - Euro - Falkland Islands Pound - Fiji Dollar - Forint - Ghana Cedi - Gibraltar Pound - Gold - Gourde - Guarani - Guinea Franc - Guyana Dollar - Hong Kong Dollar - Hryvnia - Iceland Krona - Indian Rupee - Iranian Rial - Iraqi Dinar - Jamaican Dollar - Jordanian Dinar - Kenyan Shilling - Kina - Kip - Kuwaiti Dinar - Kwacha - Kwanza - Kyat - Lari - Latvian Lats - Lebanese Pound - Lek - Lempira - Leone - Liberian Dollar - Libyan Dinar - Lilangeni - Lithuanian Litas - Loti - Malagasy Ariary - Malaysian Ringgit - Mauritius Rupee - Mexican Peso - Mexican Unidad de Inversion (UDI) - Moldovan Leu - Moroccan Dirham - Mozambique Metical - Mvdol - Naira - Nakfa - Namibia Dollar - Nepalese Rupee - Netherlands Antillean Guilder - New Israeli Sheqel - New Romanian Leu - New Taiwan Dollar - New Zealand Dollar - Ngultrum - North Korean Won - Norwegian Krone - Nuevo Sol - Ouguiya - Pa’anga - Pakistan Rupee - Palladium - Pataca - Philippine Peso - Platinum - Pound Sterling - Pula - Qatari Rial - Quetzal - Rand - Rial Omani - Riel - Rufiyaa - Rupiah - Russian Ruble - Rwanda Franc - Saint Helena Pound - Saudi Riyal - SDR (Special Drawing Right) - Serbian Dinar - Seychelles Rupee - Silver - Singapore Dollar - Solomon Islands Dollar - Som - Somali Shilling - Somoni - South Sudanese Pound - Sri Lanka Rupee - Sucre - Sudanese Pound - Surinam Dollar - Swedish Krona - Swiss Franc - Syrian Pound - Taka - Tala - Tanzanian Shilling - Tenge - No currency - Trinidad and Tobago Dollar - Tugrik - Tunisian Dinar - Turkish Lira - Turkmenistan New Manat - UAE Dirham - Uganda Shilling - UIC-Franc - Unidad de Valor Real - Unidades de fomento - Uruguay Peso en Unidades Indexadas (URUIURUI) - Uruguayan peso - US Dollar - Uzbekistan Sum - Vatu - WIR Euro - WIR Franc - Won - Yemeni Rial - Yen - Yuan Renminbi - Zambian Kwacha - Zimbabwe Dollar - Zloty - No accounts exist in GnuCash.\nCreate an account before adding a widget Build version License diff --git a/app/src/main/res/xml-v11/fragment_account_preferences.xml b/app/src/main/res/xml-v11/fragment_account_preferences.xml index d2f360a99..8c3179e4a 100644 --- a/app/src/main/res/xml-v11/fragment_account_preferences.xml +++ b/app/src/main/res/xml-v11/fragment_account_preferences.xml @@ -5,7 +5,7 @@ android:key="@string/key_default_currency" android:dialogTitle="@string/title_choose_currency" android:title="@string/title_default_currency" - android:entries="@array/currency_names" + android:entries="@array/key_currency_codes" android:entryValues="@array/key_currency_codes"/> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gnucash.android.test.unit.export; + +import org.gnucash.android.BuildConfig; +import org.gnucash.android.export.ExportFormat; +import org.gnucash.android.export.ExportParams; +import org.gnucash.android.export.Exporter; +import org.gnucash.android.export.xml.GncXmlExporter; +import org.gnucash.android.test.unit.db.AccountsDbAdapterTest; +import org.gnucash.android.test.unit.util.GnucashTestRunner; +import org.gnucash.android.test.unit.util.ShadowCrashlytics; +import org.gnucash.android.test.unit.util.ShadowUserVoice; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import java.io.File; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test backup and restore functionality + */ +@RunWith(GnucashTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 21, packageName = "org.gnucash.android", shadows = {ShadowCrashlytics.class, ShadowUserVoice.class}) +public class BackupTest { + + @Before + public void setUp(){ + AccountsDbAdapterTest.loadDefaultAccounts(); + } + + @Test + public void shouldCreateBackup(){ + boolean backupResult = GncXmlExporter.createBackup(); + assertThat(backupResult).isTrue(); + } + + @Test + public void shouldCreateBackupFileName(){ + Exporter exporter = new GncXmlExporter(new ExportParams(ExportFormat.XML)); + List xmlFiles = exporter.generateExport(); + + assertThat(xmlFiles).hasSize(1); + assertThat(new File(xmlFiles.get(0))) + .exists() + .hasExtension(ExportFormat.XML.getExtension().substring(1)); + + } +} diff --git a/app/src/test/java/org/gnucash/android/test/unit/export/GncXmlHelperTest.java b/app/src/test/java/org/gnucash/android/test/unit/export/GncXmlHelperTest.java index 0e4c811f1..320b218bd 100644 --- a/app/src/test/java/org/gnucash/android/test/unit/export/GncXmlHelperTest.java +++ b/app/src/test/java/org/gnucash/android/test/unit/export/GncXmlHelperTest.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2014 - 2015 Ngewi Fet + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.gnucash.android.test.unit.export; import org.gnucash.android.export.xml.GncXmlHelper; diff --git a/app/src/test/java/org/gnucash/android/test/unit/model/CommodityTest.java b/app/src/test/java/org/gnucash/android/test/unit/model/CommodityTest.java index 14d82b9b5..28195340d 100644 --- a/app/src/test/java/org/gnucash/android/test/unit/model/CommodityTest.java +++ b/app/src/test/java/org/gnucash/android/test/unit/model/CommodityTest.java @@ -27,7 +27,7 @@ public class CommodityTest { @Test public void setSmallestFraction_shouldNotUseDigits(){ - Commodity commodity = new Commodity("Test", "USD", 4); + Commodity commodity = new Commodity("Test", "USD", 100); assertThat(commodity.getSmallestFraction()).isEqualTo(100); commodity.setSmallestFraction(1000); @@ -36,7 +36,7 @@ public void setSmallestFraction_shouldNotUseDigits(){ @Test public void testSmallestFractionDigits(){ - Commodity commodity = new Commodity("Test", "USD", 4); + Commodity commodity = new Commodity("Test", "USD", 100); assertThat(commodity.getSmallestFractionDigits()).isEqualTo(2); commodity.setSmallestFraction(10); diff --git a/app/src/test/java/org/gnucash/android/test/unit/model/MoneyTest.java b/app/src/test/java/org/gnucash/android/test/unit/model/MoneyTest.java index 1340dc208..fd5eb6a81 100644 --- a/app/src/test/java/org/gnucash/android/test/unit/model/MoneyTest.java +++ b/app/src/test/java/org/gnucash/android/test/unit/model/MoneyTest.java @@ -57,18 +57,15 @@ public void testCreation(){ Money temp = new Money(amount, CURRENCY_CODE); assertThat("12.25").isEqualTo(temp.toPlainString()); + assertThat(temp.getNumerator()).isEqualTo(1225L); + assertThat(temp.getDenominator()).isEqualTo(100L); Commodity commodity = Commodity.getInstance(CURRENCY_CODE); temp = new Money(BigDecimal.TEN, commodity); - assertEquals("10", temp.asBigDecimal().toPlainString()); + assertEquals("10.00", temp.asBigDecimal().toPlainString()); //decimal places for EUR currency assertEquals(commodity, temp.getCommodity()); - - //test only Locale.US parsing even under different locale - Locale.setDefault(Locale.GERMANY); - amount = "12,25"; - temp = new Money(amount, CURRENCY_CODE); - assertEquals("1225.00", temp.toPlainString()); + assertThat("10").isNotEqualTo(temp.asBigDecimal().toPlainString()); } @Test @@ -134,6 +131,24 @@ public void testNegation(){ validateImmutability(); } + @Test + public void testFractionParts(){ + Money money = new Money("14.15", "USD"); + assertThat(money.getNumerator()).isEqualTo(1415L); + assertThat(money.getDenominator()).isEqualTo(100L); + + money = new Money("125", "JPY"); + assertThat(money.getNumerator()).isEqualTo(125L); + assertThat(money.getDenominator()).isEqualTo(1L); + } + + @Test + public void nonMatchingCommodityFraction_shouldThrowException(){ + Money money = new Money("12.345", "JPY"); + assertThat(money.getNumerator()).isEqualTo(12L); + assertThat(money.getDenominator()).isEqualTo(1); + } + @Test public void testPrinting(){ assertEquals(mMoneyInEur.asString(), mMoneyInEur.toPlainString()); @@ -145,9 +160,9 @@ public void testPrinting(){ String actualOuputDE = mMoneyInEur.formattedString(Locale.GERMANY); assertThat(actualOuputDE).isEqualTo("15,75 " + symbol); - symbol = Currency.getInstance("EUR").getSymbol(Locale.US); + symbol = Currency.getInstance("EUR").getSymbol(Locale.GERMANY); String actualOuputUS = mMoneyInEur.formattedString(Locale.US); - assertThat(actualOuputUS).isEqualTo("15.75 " + symbol); + assertThat(actualOuputUS).isEqualTo(symbol + "15.75"); //always prints with 2 decimal places only Money some = new Money("9.7469", CURRENCY_CODE);