1818
1919import android .database .Cursor ;
2020import android .database .sqlite .SQLiteDatabase ;
21+ import android .support .annotation .NonNull ;
2122import android .util .Log ;
2223
23- import androidx .annotation .NonNull ;
24-
25- import com .google .firebase .crashlytics .FirebaseCrashlytics ;
24+ import com .crashlytics .android .Crashlytics ;
2625
2726import org .gnucash .android .R ;
2827import org .gnucash .android .export .ExportParams ;
2928import org .gnucash .android .export .Exporter ;
30- import org .gnucash .android .model .Account ;
3129import org .gnucash .android .model .Split ;
3230import org .gnucash .android .model .Transaction ;
3331import org .gnucash .android .model .TransactionType ;
3836import java .io .IOException ;
3937import java .text .DateFormat ;
4038import java .text .SimpleDateFormat ;
41- import java .util .Arrays ;
39+ import java .util .Collections ;
4240import java .util .Date ;
4341import java .util .HashMap ;
4442import java .util .List ;
5250 */
5351public class CsvTransactionsExporter extends Exporter {
5452
55- private char mCsvSeparator ;
53+ private final char mCsvSeparator ;
5654
57- private DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd" , Locale .US );
55+ private final DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd" , Locale .US );
5856
5957 /**
6058 * Construct a new exporter with export parameters
@@ -87,43 +85,46 @@ public List<String> generateExport() throws ExporterException {
8785 try (CsvWriter csvWriter = new CsvWriter (new FileWriter (outputFile ), "" + mCsvSeparator )) {
8886 generateExport (csvWriter );
8987 } catch (IOException ex ) {
90- FirebaseCrashlytics . getInstance () .log ("Error exporting CSV" );
91- FirebaseCrashlytics . getInstance (). recordException (ex );
88+ Crashlytics .log ("Error exporting CSV" );
89+ Crashlytics . logException (ex );
9290 throw new ExporterException (mExportParams , ex );
9391 }
9492
95- return Arrays . asList (outputFile );
93+ return Collections . singletonList (outputFile );
9694 }
9795
9896 /**
9997 * Write splits to CSV format
10098 *
10199 * @param splits Splits to be written
102100 */
103- private void writeSplitsToCsv (@ NonNull List <Split > splits , @ NonNull CsvWriter writer ) throws IOException {
101+ private void writeSplitsToCsv (@ NonNull List <Split > splits , @ NonNull CsvWriter writer ,
102+ Map <String , String > accountNames , Map <String , String > accountFullNames ) throws IOException {
104103 int index = 0 ;
105104
106- Map <String , Account > uidAccountMap = new HashMap <>();
107-
108105 for (Split split : splits ) {
109106 if (index ++ > 0 ) { // the first split is on the same line as the transactions. But after that, we
110107 writer .write ("" + mCsvSeparator + mCsvSeparator + mCsvSeparator + mCsvSeparator
111108 + mCsvSeparator + mCsvSeparator + mCsvSeparator + mCsvSeparator );
112109 }
113110 writer .writeToken (split .getMemo ());
114111
115- //cache accounts so that we do not have to go to the DB each time
116112 String accountUID = split .getAccountUID ();
117- Account account ;
118- if (uidAccountMap .containsKey (accountUID )) {
119- account = uidAccountMap .get (accountUID );
113+
114+ // Cache account names
115+ String fullName , name ;
116+ if (accountNames .containsKey (accountUID )) {
117+ fullName = accountFullNames .get (accountUID );
118+ name = accountNames .get (accountUID );
120119 } else {
121- account = mAccountsDbAdapter .getRecord (accountUID );
122- uidAccountMap .put (accountUID , account );
120+ fullName = mAccountsDbAdapter .getAccountFullName (accountUID );
121+ name = mAccountsDbAdapter .getAccountName (accountUID );
122+ accountFullNames .put (accountUID , fullName );
123+ accountNames .put (accountUID , name );
123124 }
124125
125- writer .writeToken (account . getFullName () );
126- writer .writeToken (account . getName () );
126+ writer .writeToken (fullName );
127+ writer .writeToken (name );
127128
128129 String sign = split .getType () == TransactionType .CREDIT ? "-" : "" ;
129130 writer .writeToken (sign + split .getQuantity ().formattedString ());
@@ -141,12 +142,14 @@ private void writeSplitsToCsv(@NonNull List<Split> splits, @NonNull CsvWriter wr
141142
142143 private void generateExport (final CsvWriter csvWriter ) throws ExporterException {
143144 try {
144- List < String > names = Arrays . asList ( mContext .getResources ().getStringArray (R .array .csv_transaction_headers ) );
145- for (int i = 0 ; i < names .size () ; i ++) {
146- csvWriter .writeToken (names . get ( i ) );
145+ String [] names = mContext .getResources ().getStringArray (R .array .csv_transaction_headers );
146+ for (int i = 0 ; i < names .length - 1 ; i ++) {
147+ csvWriter .writeToken (names [ i ] );
147148 }
148- csvWriter .newLine ( );
149+ csvWriter .writeEndToken ( names [ names . length - 1 ] );
149150
151+ Map <String , String > nameCache = new HashMap <>();
152+ Map <String , String > fullNameCache = new HashMap <>();
150153
151154 Cursor cursor = mTransactionsDbAdapter .fetchTransactionsModifiedSince (mExportParams .getExportStartTime ());
152155 Log .d (LOG_TAG , String .format ("Exporting %d transactions to CSV" , cursor .getCount ()));
@@ -163,13 +166,13 @@ private void generateExport(final CsvWriter csvWriter) throws ExporterException
163166 csvWriter .writeToken ("CURRENCY::" + transaction .getCurrencyCode ());
164167 csvWriter .writeToken (null ); // Void Reason
165168 csvWriter .writeToken (null ); // Action
166- writeSplitsToCsv (transaction .getSplits (), csvWriter );
169+ writeSplitsToCsv (transaction .getSplits (), csvWriter , nameCache , fullNameCache );
167170 }
168171
169172 PreferencesHelper .setLastExportTime (TimestampHelper .getTimestampFromNow ());
170173 } catch (IOException e ) {
171- FirebaseCrashlytics . getInstance (). recordException (e );
174+ Crashlytics . logException (e );
172175 throw new ExporterException (mExportParams , e );
173176 }
174177 }
175- }
178+ }
0 commit comments