diff --git a/app/schemas/com.github.premnirmal.ticker.repo.QuotesDB/7.json b/app/schemas/com.github.premnirmal.ticker.repo.QuotesDB/7.json new file mode 100644 index 00000000..d7f2bf72 --- /dev/null +++ b/app/schemas/com.github.premnirmal.ticker.repo.QuotesDB/7.json @@ -0,0 +1,296 @@ +{ + "formatVersion": 1, + "database": { + "version": 6, + "identityHash": "4d82fe2e120504e4e5235767c9ef65fe", + "entities": [ + { + "tableName": "QuoteRow", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`symbol` TEXT NOT NULL, `name` TEXT NOT NULL, `last_trade_price` REAL NOT NULL, `change_percent` REAL NOT NULL, `change` REAL NOT NULL, `oth_price` REAL NOT NULL, `oth_change_percent` REAL NOT NULL, `oth_change` REAL NOT NULL, `exchange` TEXT NOT NULL, `currency` TEXT NOT NULL, `is_post_market` INTEGER NOT NULL, `annual_dividend_rate` REAL NOT NULL, `annual_dividend_yield` REAL NOT NULL, `dayHigh` REAL, `dayLow` REAL, `previousClose` REAL NOT NULL, `open` REAL, `regularMarketVolume` REAL, `peRatio` REAL, `fiftyTwoWeekLowChange` REAL, `fiftyTwoWeekLowChangePercent` REAL, `fiftyTwoWeekHighChange` REAL, `fiftyTwoWeekHighChangePercent` REAL, `fiftyTwoWeekLow` REAL, `fiftyTwoWeekHigh` REAL, `dividendDate` REAL, `earningsDate` REAL, `marketCap` REAL, `isTradeable` INTEGER, `isTriggerable` INTEGER, `marketState` TEXT, PRIMARY KEY(`symbol`))", + "fields": [ + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lastTradePrice", + "columnName": "last_trade_price", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "changeInPercent", + "columnName": "change_percent", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "change", + "columnName": "change", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "othPrice", + "columnName": "oth_price", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "othChangeInPercent", + "columnName": "oth_change_percent", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "othChange", + "columnName": "oth_change", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "stockExchange", + "columnName": "exchange", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "currency", + "columnName": "currency", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isPostMarket", + "columnName": "is_post_market", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "annualDividendRate", + "columnName": "annual_dividend_rate", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "annualDividendYield", + "columnName": "annual_dividend_yield", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "dayHigh", + "columnName": "dayHigh", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "dayLow", + "columnName": "dayLow", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "previousClose", + "columnName": "previousClose", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "open", + "columnName": "open", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "regularMarketVolume", + "columnName": "regularMarketVolume", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "peRatio", + "columnName": "peRatio", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekLowChange", + "columnName": "fiftyTwoWeekLowChange", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekLowChangePercent", + "columnName": "fiftyTwoWeekLowChangePercent", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekHighChange", + "columnName": "fiftyTwoWeekHighChange", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekHighChangePercent", + "columnName": "fiftyTwoWeekHighChangePercent", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekLow", + "columnName": "fiftyTwoWeekLow", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "fiftyTwoWeekHigh", + "columnName": "fiftyTwoWeekHigh", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "dividendDate", + "columnName": "dividendDate", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "earningsDate", + "columnName": "earningsDate", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "marketCap", + "columnName": "marketCap", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "isTradeable", + "columnName": "isTradeable", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isTriggerable", + "columnName": "isTriggerable", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "marketState", + "columnName": "marketState", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "symbol" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "HoldingRow", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `quote_symbol` TEXT NOT NULL, `shares` REAL NOT NULL, `price` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "quoteSymbol", + "columnName": "quote_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shares", + "columnName": "shares", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "PropertiesRow", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `properties_quote_symbol` TEXT NOT NULL, `notes` TEXT NOT NULL, `alert_above` REAL NOT NULL, `alert_below` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "quoteSymbol", + "columnName": "properties_quote_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "notes", + "columnName": "notes", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "alertAbove", + "columnName": "alert_above", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "alertBelow", + "columnName": "alert_below", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d82fe2e120504e4e5235767c9ef65fe')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/Extensions.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/Extensions.kt index 6e2f9aa6..4d31e610 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/Extensions.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/Extensions.kt @@ -23,6 +23,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding import com.github.premnirmal.ticker.components.AppClock.AppClockImpl +import com.github.premnirmal.ticker.portfolio.PortfolioVH import com.github.premnirmal.tickerwidget.R import com.robinhood.ticker.TickerView import org.threeten.bp.DayOfWeek @@ -273,4 +274,4 @@ inline fun Fragment.viewBinding( crossinline bindingInflater: (LayoutInflater) -> T) = lazy(LazyThreadSafetyMode.NONE) { bindingInflater.invoke(layoutInflater) - } \ No newline at end of file + } diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/components/AppModule.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/components/AppModule.kt index cd76cd5b..ab2549a7 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/components/AppModule.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/components/AppModule.kt @@ -20,6 +20,7 @@ import com.github.premnirmal.ticker.repo.migrations.MIGRATION_2_3 import com.github.premnirmal.ticker.repo.migrations.MIGRATION_3_4 import com.github.premnirmal.ticker.repo.migrations.MIGRATION_4_5 import com.github.premnirmal.ticker.repo.migrations.MIGRATION_5_6 +import com.github.premnirmal.ticker.repo.migrations.MIGRATION_6_7 import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -64,6 +65,7 @@ class AppModule { .addMigrations(MIGRATION_3_4) .addMigrations(MIGRATION_4_5) .addMigrations(MIGRATION_5_6) + .addMigrations(MIGRATION_6_7) .build() } diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/home/MainActivity.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/home/MainActivity.kt index 9b479f1a..49b8d477 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/home/MainActivity.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/home/MainActivity.kt @@ -193,6 +193,7 @@ class MainActivity : BaseActivity() { } private fun showWhatsNew() { + getString(R.string.error_fetching_whats_new) val dialog = showDialog( getString(R.string.whats_new_in, BuildConfig.VERSION_NAME), getString(R.string.loading) diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/network/StocksApi.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/network/StocksApi.kt index 57e8b297..e4f5de0c 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/network/StocksApi.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/network/StocksApi.kt @@ -173,12 +173,17 @@ class StocksApi @Inject constructor( } private fun YahooQuoteNet.toQuote(): Quote { + val isPreMarket = "PRE" == this.marketState?.uppercase() + val quote = Quote( symbol = this.symbol, name = (this.name ?: this.longName).orEmpty(), lastTradePrice = this.lastTradePrice, changeInPercent = this.changePercent, - change = this.change + change = this.change, + othPrice = if (isPreMarket) this.preMarketPrice else this.postMarketPrice, + othChangeInPercent = if (isPreMarket) this.preMarketChangePercent else this.postMarketChangePercent, + othChange = if (isPreMarket) this.preMarketChange else this.postMarketChange ) quote.stockExchange = this.exchange ?: "" quote.currencyCode = this.currency ?: "USD" diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/Quote.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/Quote.kt index 78773c62..b6b22a11 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/Quote.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/Quote.kt @@ -13,7 +13,10 @@ data class Quote constructor( var name: String = "", var lastTradePrice: Float = 0.toFloat(), var changeInPercent: Float = 0.toFloat(), - var change: Float = 0.toFloat() + var change: Float = 0.toFloat(), + var othPrice: Float = 0.toFloat(), + var othChangeInPercent: Float = 0.toFloat(), + var othChange: Float = 0.toFloat(), ) : Parcelable, Comparable { var isPostMarket: Boolean = false @@ -74,19 +77,35 @@ data class Quote constructor( fun changeString(): String = AppPreferences.SELECTED_DECIMAL_FORMAT.format(change) fun changeStringWithSign(): String { - val changeString = AppPreferences.SELECTED_DECIMAL_FORMAT.format(change) - if (change >= 0) { - return "+$changeString" - } - return changeString + return formatChangeValue(change) + } + + fun othChangeStringWithSign(): String { + return formatChangeValue(othChange) } fun changePercentString(): String = "${AppPreferences.DECIMAL_FORMAT_2DP.format(changeInPercent)}%" fun changePercentStringWithSign(): String { - val changeString = "${AppPreferences.DECIMAL_FORMAT_2DP.format(changeInPercent)}%" - if (changeInPercent >= 0) { + return formatChangePercent(changeInPercent) + } + + fun othChangePercentStringWithSign(): String { + return formatChangePercent(othChangeInPercent) + } + + private fun formatChangeValue(value: Float): String { + val changeString = AppPreferences.SELECTED_DECIMAL_FORMAT.format(value) + if (value >= 0) { + return "+$changeString" + } + return changeString + } + + private fun formatChangePercent(value: Float): String { + val changeString = "${AppPreferences.DECIMAL_FORMAT_2DP.format(value)}%" + if (value >= 0) { return "+$changeString" } return changeString @@ -172,6 +191,9 @@ data class Quote constructor( this.lastTradePrice = data.lastTradePrice this.changeInPercent = data.changeInPercent this.change = data.change + this.othPrice = data.othPrice + this.othChange = data.othChange + this.othChangeInPercent = data.othChangeInPercent this.stockExchange = data.stockExchange this.currencyCode = data.currencyCode this.annualDividendRate = data.annualDividendRate diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/YahooQuoteResponse.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/YahooQuoteResponse.kt index ffeee3d1..8323b821 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/YahooQuoteResponse.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/network/data/YahooQuoteResponse.kt @@ -25,6 +25,18 @@ data class YahooQuoteNet( val longName: String?, @SerializedName("gmtOffSetMilliseconds") val gmtOffSetMilliseconds: Long, + @SerializedName("postMarketChangePercent") + val postMarketChangePercent: Float, + @SerializedName("postMarketChange") + val postMarketChange: Float, + @SerializedName("postMarketPrice") + val postMarketPrice: Float, + @SerializedName("preMarketChangePercent") + val preMarketChangePercent: Float, + @SerializedName("preMarketChange") + val preMarketChange: Float, + @SerializedName("preMarketPrice") + val preMarketPrice: Float, @SerializedName("regularMarketChange") val change: Float, @SerializedName("regularMarketChangePercent") diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/portfolio/PortfolioVH.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/portfolio/PortfolioVH.kt index eeb242b5..0834c12c 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/portfolio/PortfolioVH.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/portfolio/PortfolioVH.kt @@ -66,20 +66,10 @@ abstract class PortfolioVH(itemView: View) : RecyclerView.ViewHolder(itemView), val totalValueText = itemView.findViewById(R.id.totalValue) totalValueText.text = quote.priceFormat.format(quote.lastTradePrice) - val change: Float = quote.change - val changePercent: Float = quote.changeInPercent - val color = when { - (change < 0f || changePercent < 0f) -> { - negativeColor - } - (change == 0f) -> { - neutralColor - } - else -> { - positiveColor - } - } - updateView(quote, color) + val othValueText = itemView.findViewById(R.id.othValue) + othValueText.text = quote.priceFormat.format(quote.othPrice) + + updateView(quote, 1) } override fun onItemSelected() { @@ -99,15 +89,50 @@ abstract class PortfolioVH(itemView: View) : RecyclerView.ViewHolder(itemView), changeValueView.setCharacterLists(TickerUtils.provideNumberList()) val totalValueText = itemView.findViewById(R.id.totalValue) totalValueText.setCharacterLists(TickerUtils.provideNumberList()) + + itemView.findViewById(R.id.othValue).setCharacterLists(TickerUtils.provideNumberList()) + itemView.findViewById(R.id.othChangeValue).setCharacterLists(TickerUtils.provideNumberList()) + itemView.findViewById(R.id.othChangePercent).setCharacterLists(TickerUtils.provideNumberList()) } override fun updateView(quote: Quote, color: Int) { - val changeInPercentView = binding.changePercent - changeInPercentView.text = quote.changePercentStringWithSign() - val changeValueView = binding.changeValue - changeValueView.text = quote.changeStringWithSign() - changeInPercentView.setTextColor(color) - changeValueView.setTextColor(color) + val context = binding.rthText.context; + val rthColor = getColor(quote.change, quote.changeInPercent) + binding.changePercent.text = quote.changePercentStringWithSign() + binding.changePercent.textColor = rthColor + binding.changeValue.text = quote.changeStringWithSign() + binding.changeValue.textColor = rthColor + + if (quote.isMarketOpen) { + binding.rthText.setText(context.getString(R.string.market_state_open)) + binding.othText.setText("") + binding.othValue.setText("") + binding.othChangePercent.setText("") + binding.othChangeValue.setText("") + } else { + binding.rthText.setText(context.getString(R.string.market_state_at_close)) + binding.othText.setText(context.getString(R.string.market_state_closed)) + + val othColor = getColor(quote.othChange, quote.othChangeInPercent) + binding.othChangePercent.text = quote.othChangePercentStringWithSign() + binding.othChangePercent.textColor = othColor + binding.othChangeValue.text = quote.othChangeStringWithSign() + binding.othChangeValue.textColor = othColor + } + } + + fun getColor(valueChange: Float, percentChange: Float) : Int { + return when { + (valueChange < 0f || percentChange < 0f) -> { + negativeColor + } + (valueChange == 0f) -> { + neutralColor + } + else -> { + positiveColor + } + } } } diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/StocksStorage.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/StocksStorage.kt index 654ef10d..45f81942 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/StocksStorage.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/StocksStorage.kt @@ -121,8 +121,9 @@ class StocksStorage @Inject constructor( private fun Quote.toQuoteRow(): QuoteRow { return QuoteRow( - this.symbol, this.name, this.lastTradePrice, this.changeInPercent, - this.change, this.stockExchange, this.currencyCode, + this.symbol, this.name, this.lastTradePrice, this.changeInPercent, this.change, + this.othPrice, this.othChangeInPercent, this.othChange, + this.stockExchange, this.currencyCode, this.isPostMarket, this.annualDividendRate, this.annualDividendYield, this.dayHigh, this.dayLow, this.previousClose, this.open, this.regularMarketVolume?.toFloat(), this.trailingPE, @@ -154,7 +155,10 @@ class StocksStorage @Inject constructor( name = this.name, lastTradePrice = this.lastTradePrice, changeInPercent = this.changeInPercent, - change = this.change + change = this.change, + othPrice = this.othPrice, + othChangeInPercent = this.othChangeInPercent, + othChange = this.othChange ) quote.name = this.name quote.lastTradePrice = this.lastTradePrice diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/data/QuoteRow.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/data/QuoteRow.kt index b3bd43ea..cbf51295 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/data/QuoteRow.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/data/QuoteRow.kt @@ -11,6 +11,9 @@ data class QuoteRow( @ColumnInfo(name = "last_trade_price") val lastTradePrice: Float, @ColumnInfo(name = "change_percent") val changeInPercent: Float, @ColumnInfo(name = "change") val change: Float, + @ColumnInfo(name = "oth_price") val othPrice: Float, + @ColumnInfo(name = "oth_change_percent") val othChangeInPercent: Float, + @ColumnInfo(name = "oth_change") val othChange: Float, @ColumnInfo(name = "exchange") val stockExchange: String, @ColumnInfo(name = "currency") val currency: String, @ColumnInfo(name = "is_post_market") val isPostMarket: Boolean, diff --git a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/migrations/Migrations.kt b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/migrations/Migrations.kt index edb0c76b..a70e3f24 100644 --- a/app/src/main/kotlin/com/github/premnirmal/ticker/repo/migrations/Migrations.kt +++ b/app/src/main/kotlin/com/github/premnirmal/ticker/repo/migrations/Migrations.kt @@ -95,4 +95,13 @@ val MIGRATION_5_6 = object : Migration(5, 6) { val tableName = "QuoteRow" database.execSQL("ALTER TABLE `$tableName` ADD COLUMN `marketState` TEXT;") } +} + +val MIGRATION_6_7 = object : Migration(6, 7) { + override fun migrate(database: SupportSQLiteDatabase) { + val tableName = "QuoteRow" + database.execSQL("ALTER TABLE `$tableName` ADD COLUMN `oth_price` REAL NOT NULL;") + database.execSQL("ALTER TABLE `$tableName` ADD COLUMN `oth_change_percent` REAL NOT NULL;") + database.execSQL("ALTER TABLE `$tableName` ADD COLUMN `oth_change` REAL NOT NULL;") + } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_stock.xml b/app/src/main/res/layout/item_stock.xml index 49c8d999..5f5f0fd8 100644 --- a/app/src/main/res/layout/item_stock.xml +++ b/app/src/main/res/layout/item_stock.xml @@ -11,15 +11,15 @@ android:id="@+id/stockContainer" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="8dp" android:paddingStart="4dp" android:paddingTop="4dp" + android:paddingBottom="8dp" tools:layout_height="150dp" - tools:layout_marginTop="100dp" - > + tools:layout_marginTop="100dp"> + app:layout_constraintTop_toTopOf="parent" + tools:text="GOOG" /> + app:tint="?attr/colorOnSurfaceVariant" /> + app:layout_constraintTop_toBottomOf="@id/ticker" + tools:text="Google Inc" /> + app:layout_constraintStart_toStartOf="@+id/rthText" + app:layout_constraintTop_toBottomOf="@+id/rthText" + tools:text="615,246.28" /> + app:layout_constraintStart_toStartOf="@+id/rthText" + app:layout_constraintTop_toBottomOf="@+id/changeValue" + tools:text="+9999.99%" /> + + + + + + + + + + + app:layout_constraintStart_toEndOf="@+id/rthText" + app:layout_constraintTop_toTopOf="@+id/rthText" /> \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9e8d1a8b..e6e23746 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -184,4 +184,7 @@ Fehler Fehler beim Abrufen der neuen Funktionen Wird geladen - + + Markt geöffnet: + Markt geschlossen: + Am Ende: diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c9e0e2c4..349d7fa1 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -182,4 +182,7 @@ Error Error al obtener las novedades Cargando - + + Mercado abierto: + Mercado cerrado: + Al cierre: diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a64d37e2..09e2a2f1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -183,4 +183,8 @@ Erreur Erreur lors de la récupération des nouveautés Chargement + + Marché ouvert: + Marché fermé: + À la fermeture: diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 44276919..bdb4d2b5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -184,4 +184,8 @@ Errore Errore ottenimento novità Caricamento + + Mercato aperto: + Mercato chiuso: + Alla chiusura: diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6b47e843..0e37ecaf 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -172,4 +172,8 @@ Erro Erro ao buscar novidades Carregando + + Mercado aberto: + Mercado fechado: + De perto: diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 30b25069..1511390c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,4 +225,8 @@ %1$.2f +%1$.2f%% %1$.2f%% + + Market open: + Market closed: + At close: