Skip to content

Commit

Permalink
πŸš€[Release v2.12.4 20241130] Merge into Main (#285)
Browse files Browse the repository at this point in the history
* πŸš€[Release v2.11.1 071024] Merge into Develop (#245)

* replaced the control in PeerManager.c

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* reverted BRBitcoinAmount

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Cleaning up the files

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Removed Pusher remnants

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Added Fiat feature, and FCM for push notifications (#247)

* Added fiat feature based on language user chose

* added fcm for push notifications

* Update PushNotificationService.kt

* Added new Icon, removed duplicate fcm library, added in app messaging

* Added new Icon, removed duplicate fcm library, added in app messaging

* Tech debt/add af sdk (#248)

* Recent newline

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* AF added

Refactored cruft

- AF working

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Techdebt/refactor brevents syncmarkers (#254)

* Tech debt/add af sdk (#248)

- AF working
- Changed requiredActivity
- Added analytics error report
- test this.Activity is null or not
- Bugfix - Phrase Reminder crash
- added an exception handler for UserNotAuthenticatedException.
		 - note: this should allow for the system to display the native authorization UI when needed
		 - fixes issue - https://console.firebase.google.com/u/0/project/litewallet-beta/crashlytics/app/android:com.loafwallet/issues/09dac17241309f0e823ef597a9a82cd4
- Added dev note
- remove calls to BREventManager
- removed BREventManager
- renamed error message
- fixed Firebase Analytics event error

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* version bump

update gitignore

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Techdebt/ fixed send issue add syncing measurements (#255)

* removed unused BRSharedPreferences

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* started commenting out more Timber

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Added more shared preferences for syncing

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Commented out many verbose Timber logs

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* WIP

Still trying to figure out the eplased time and last and start timestamps…???
I dunno

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Moved sync measurment into the method calls

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Debugged the install issue with send

- Moved all the measurements in new methods
- recalculated measure points
- Added analytics
- event did_complete_sync was shown!
- adding a dummy file to make sure file system is set
||||WIP still verifying the JSON is present
- added a blockheight label
-  changed the sleep time (a hack to allow the device time to refresh the view) to 100 ms from 500ms!!
-WIP Why is the bundle not showing on time
Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* replaces afID to first location

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Removed redundant sync measurements

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* code bump

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Techdebt/test refactor cruft removal (#250)

* Removed non english seed words

-Refactor tests
- Reset AnalyticsTests

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Rename Bitcoinletter to Litecoinletters

-added tests
testLitecoinSymbolConstants
testAppExternalURLConstants
testFirebaseAnalyticsConstants

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* fix: [#152] make sure using Fragment, FragmentManager and FragmentTransaction from androidx (#260)

* fix: [#126] the issue came from FragmentBalanceSeedReminder.fetchSeedPhrase, so we just wrap with runCatching for now to avoid crash (#263)

* fix: [#264] add null checking for BRKeyStore.removeAliasAndFiles (#270)

* fix: [#265] add null checking, migrate viewpage… (#271)

* fix: [WIP][#265] work in progress add null checking, migrate viewpager to viewpager2 and more

* fix: [#265] finalize migration some deprecated class and implement null checking at FragmentTransactionItem

* fix: dix dismiss outside FragmentTransactionDetails

* πŸš€[Release v2.12.2 20241118] Merge into Develop (#272)

* πŸš€[Release v2.11.1 071024] Merge into Main (#246)

* replaced the control in PeerManager.c

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* reverted BRBitcoinAmount

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Cleaning up the files

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Removed Pusher remnants

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* version bump

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* Removed donation button

removed xml
removed fragments
removed references of the donation
removed analytical events

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* fix: prevent activity close

* code bump

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* enabled for Debug

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* fix: [#264] add null checking for BRKeyStore.removeAliasAndFiles (#270)

* fix: [#265] add null checking, migrate viewpage… (#271)

* fix: [WIP][#265] work in progress add null checking, migrate viewpager to viewpager2 and more

* fix: [#265] finalize migration some deprecated class and implement null checking at FragmentTransactionItem

* fix: dix dismiss outside FragmentTransactionDetails

* code bump

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* version bump

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>
Co-authored-by: andhikayuana <andhikayuana@gmail.com>

* revert minSDkVersion to 29 (#276)

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>

* fix: [#258] avoid OOM with cache the result of opsAll, previously called multiple times at onBindViewHolder (#277)

* fix: [#258] avoid OOM with cache the result of opsAll, previously called multiple times at onBindViewHolder

* chore: [#258] cleanup comment

* fix: [#266] add null checking and default value based on iOS since getCurrency can produce null (#278)

* fix: [#266] add null checking and default value based on iOS since getCurrency can produce null

* chore: [#266] cleanup comment

* fix: [#274] fixing locale on android 14 and setup test using junit & mockk (#282)

* chore: [#274] initial setup test using JUnit & MockK

* chore: [#274] add more test case at LocaleHelperTest

* fix: [#274] fix default language from shared preferences

* fix: [#274] disable language split on AAB

* chore: [#274] rename method

* bumped version and code

* compiled the env (#284)

please check @andhikayuana @josikie  that you are able to compile

* Users complained that recyclerView was setting to the wrong language

- Polished to index to a language
- bump code

* chore: [#126] simplify exception handling at BRKeyStore._getData and record exception to Firebase Crashlytics (#283)

---------

Signed-off-by: kcw-grunt <mrkerrywashington@icloud.com>
Co-authored-by: Josi Kie <54074780+josikie@users.noreply.github.com>
Co-authored-by: Andhika Yuana <andhikayuana@gmail.com>
  • Loading branch information
3 people authored Dec 4, 2024
1 parent dcb363e commit 893649d
Show file tree
Hide file tree
Showing 15 changed files with 379 additions and 213 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,4 @@ app/src/litewalletDebug/google-services.json
/app/debug/google-services.json
/.idea/dictionaries/grunt.xml
androidTestResultsUserPreferences.xml
.idea/deploymentTargetSelector.xml
17 changes: 14 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ android {
buildConfig true
viewBinding true
}
bundle {
language {
enableSplit = false
}
}
assetPacks = [":install_time_asset_pack",":fast_follow_asset_pack_01"]
signingConfigs {
release {
Expand Down Expand Up @@ -61,10 +66,10 @@ android {
defaultConfig {
testInstrumentationRunner = 'androidx.test.runner.AndroidJUnitRunner'
applicationId = 'com.loafwallet'
minSdkVersion 31
minSdkVersion 29
targetSdkVersion 34
versionCode 20241118
versionName "v2.12.2"
versionCode 20241130
versionName "v2.12.4"
multiDexEnabled true
archivesBaseName = "${versionName}(${versionCode})"

Expand All @@ -78,8 +83,10 @@ android {
// libraries Gradle should build and package with your APK.
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
ndkVersion "25.1.8937393"
externalNativeBuild {
cmake {
version "3.22.1"
arguments "-DANDROID_TOOLCHAIN=clang"
}
}
Expand Down Expand Up @@ -365,6 +372,10 @@ dependencies {

// Get the latest version from https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk
implementation 'com.appsflyer:af-android-sdk:6.15.1'

//test
testImplementation "io.mockk:mockk:1.13.13"
testImplementation 'junit:junit:4.13.2'
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ class IntroLanguageResource {
private val EUR: String = "EUR"
private val RMB: String = "RMB"
private val JPY: String = "JPY"
fun loadResources() : Array<IntroLanguage>{
return arrayOf<IntroLanguage> (
fun loadResources(): Array<IntroLanguage> {
return arrayOf<IntroLanguage>(
IntroLanguage(
Language.ENGLISH.code,
Language.ENGLISH.title,
Expand Down Expand Up @@ -115,4 +115,8 @@ class IntroLanguageResource {
)
)
}

fun findLanguageIndex(language: Language): Int {
return loadResources().map { intro -> intro.lang }.indexOf(language)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
Expand All @@ -14,13 +15,12 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.appsflyer.AppsFlyerLib;
import com.breadwallet.entities.IntroLanguageResource;
import com.breadwallet.entities.Language;
import com.breadwallet.presenter.activities.SetPinActivity;
import com.breadwallet.presenter.entities.PartnerNames;
import com.breadwallet.tools.adapter.CountryLanguageAdapter;
import com.breadwallet.tools.util.LocaleHelper;
import com.google.android.material.snackbar.Snackbar;
//import com.breadwallet.BuildConfig;
import com.breadwallet.R;
import com.breadwallet.presenter.activities.BreadActivity;
Expand Down Expand Up @@ -78,6 +78,10 @@ protected void onCreate(Bundle savedInstanceState) {
countryLanguageAdapter = new CountryLanguageAdapter(this, introLanguageResource.loadResources());
listLangRecyclerView.setAdapter(countryLanguageAdapter);

Language currentLanguage = LocaleHelper.Companion.getInstance().getCurrentLocale();
int currentIndex = introLanguageResource.findLanguageIndex(currentLanguage);
countryLanguageAdapter.updateCenterPosition(currentIndex);
new Handler().post(() -> listLangRecyclerView.scrollToPosition(currentIndex));
listLangRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
Expand All @@ -90,12 +94,12 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat
countryLanguageAdapter.updateCenterPosition(centerPosition);
description.setText(countryLanguageAdapter.selectedDesc());
showDialogForItem(countryLanguageAdapter.selectedMessage());
listLangRecyclerView.smoothScrollToPosition(centerPosition);
}
}
}

});

listLangRecyclerView.setLayoutManager(layoutManager);

setListeners();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package com.breadwallet.tools.adapter;

import android.app.Activity;
import android.content.Context;
import android.util.TypedValue;
Expand Down Expand Up @@ -45,6 +46,7 @@ public class TransactionListAdapter extends RecyclerView.Adapter<RecyclerView.Vi
private final int txResId;
private final int syncingResId;
private final int promptResId;
private final String cachedOpsAll;
private List<TxItem> backUpFeed;
private List<TxItem> itemFeed;
private final int txType = 0;
Expand All @@ -58,6 +60,9 @@ public TransactionListAdapter(Context mContext, List<TxItem> items) {
this.syncingResId = R.layout.syncing_item;
this.promptResId = R.layout.prompt_item;
this.mContext = mContext;

cachedOpsAll = Utils.fetchPartnerKey(mContext, PartnerNames.OPSALL);

items = new ArrayList<>();
init(items);
}
Expand Down Expand Up @@ -179,8 +184,7 @@ private void setTexts(final TxHolder convertView, int position) {

Set<String> outputAddressSet = new HashSet<String>(Arrays.asList(item.getTo()));

final String opsString = Utils.fetchPartnerKey(mContext, PartnerNames.OPSALL);
List<String> opsList = new ArrayList<String>(Arrays.asList(opsString.split(",")));
List<String> opsList = new ArrayList<String>(Arrays.asList(cachedOpsAll.split(",")));
Set<String> opsSet = new HashSet<>();
opsSet.addAll(opsList);
List<String> outputAddresses = outputAddressSet.stream().filter(element -> !opsSet.contains(element)).collect(Collectors.toList());
Expand Down
67 changes: 28 additions & 39 deletions app/src/main/java/com/breadwallet/tools/security/BRKeyStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.breadwallet.tools.util.TypesConverter;
import com.breadwallet.tools.util.Utils;
import com.breadwallet.wallet.BRWalletManager;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.platform.entities.WalletInfo;
import com.platform.tools.KVStoreManager;

Expand All @@ -36,6 +37,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
Expand Down Expand Up @@ -239,8 +241,11 @@ private synchronized static byte[] _getData(final Context context, String alias,
if (encryptedData != null) {
//new format data is present, good
byte[] iv = retrieveEncryptedData(context, alias_iv);
if (iv == null)
throw new NullPointerException("iv is missing when data isn't: " + alias);
if (iv == null) {
NullPointerException exception = new NullPointerException("iv is missing when data isn't: " + alias);
FirebaseCrashlytics.getInstance().recordException(exception);
return null;
}
Cipher outCipher;

outCipher = Cipher.getInstance(NEW_CIPHER_ALGORITHM);
Expand All @@ -251,8 +256,9 @@ private synchronized static byte[] _getData(final Context context, String alias,
return decryptedData;
}
} catch (IllegalBlockSizeException | BadPaddingException e) {
Timber.e(e);
throw new RuntimeException("failed to decrypt data: " + e.getMessage());
Timber.e(e, "failed to decrypt data: " + alias);
FirebaseCrashlytics.getInstance().recordException(e);
return null;
}
}
//no new format data, get the old one and migrate it to the new format
Expand All @@ -264,7 +270,9 @@ private synchronized static byte[] _getData(final Context context, String alias,
if (!fileExists) {
return null;/* file also not there, fine then */
}
Timber.e(new BRKeystoreErrorException("file is present but the key is gone: " + alias));
BRKeystoreErrorException exception = new BRKeystoreErrorException("file is present but the key is gone: " + alias);
Timber.e(exception);
FirebaseCrashlytics.getInstance().recordException(exception);
return null;
}

Expand All @@ -275,12 +283,15 @@ private synchronized static byte[] _getData(final Context context, String alias,
removeAliasAndFiles(keyStore, alias, context);
//report it if one exists and not the other.
if (ivExists != aliasExists) {
Timber.e(new BRKeystoreErrorException("alias or iv isn't on the disk: " + alias + ", aliasExists:" + aliasExists));
return null;
BRKeystoreErrorException exception = new BRKeystoreErrorException("alias or iv isn't on the disk: " + alias + ", aliasExists:" + aliasExists);
Timber.e(exception);
FirebaseCrashlytics.getInstance().recordException(exception);
} else {
Timber.e(new BRKeystoreErrorException("!ivExists && !aliasExists: " + alias));
return null;
BRKeystoreErrorException exception = new BRKeystoreErrorException("!ivExists && !aliasExists: " + alias);
Timber.e(exception);
FirebaseCrashlytics.getInstance().recordException(exception);
}
return null;
}

byte[] iv = readBytesFromFile(getFilePath(alias_iv, context));
Expand Down Expand Up @@ -309,36 +320,14 @@ private synchronized static byte[] _getData(final Context context, String alias,
storeEncryptedData(context, encryptedData, alias);
return result;

} catch (InvalidKeyException e) {
if (e instanceof UserNotAuthenticatedException) {
/** user not authenticated, ask the system for authentication */
Timber.e(e, "timber:_getData: showAuthenticationScreen: %s", alias);
showAuthenticationScreen(context, request_code, alias);
throw (UserNotAuthenticatedException) e;
} else {
Timber.e(e, "timber:_getData: InvalidKeyException");
if (e instanceof KeyPermanentlyInvalidatedException)
showKeyInvalidated(context);
throw new UserNotAuthenticatedException(); //just to not go any further
}
} catch (IOException | CertificateException | KeyStoreException e) {
/** keyStore.load(null) threw the Exception, meaning the keystore is unavailable */
Timber.d(e, "_getData: keyStore.load(null) threw the Exception, meaning the keystore is unavailable");
if (e instanceof FileNotFoundException) {
Timber.e(new RuntimeException("the key is present but the phrase on the disk no", e), "_getData: File not found exception");
throw new RuntimeException(e.getMessage());
} else {
Timber.e(e);
throw new RuntimeException(e.getMessage());
}
} catch (UnrecoverableKeyException | NoSuchAlgorithmException | NoSuchPaddingException |
InvalidAlgorithmParameterException e) {
/** if for any other reason the keystore fails, crash! */
Timber.e(e, "timber:getData: error");
throw new RuntimeException(e.getMessage());
} catch (BadPaddingException | IllegalBlockSizeException | NoSuchProviderException e) {
Timber.e(e);
throw new RuntimeException(e.getMessage());
} catch (UserNotAuthenticatedException e) {
Timber.e(e, "timber:_getData: showAuthenticationScreen: %s", alias);
showAuthenticationScreen(context, request_code, alias);
throw e;
} catch (GeneralSecurityException | IOException e) {
Timber.e(e, "timber:getData: error retrieving");
FirebaseCrashlytics.getInstance().recordException(e);
throw new IllegalStateException(e);
} finally {
lock.unlock();
}
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/breadwallet/tools/util/LocaleHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.breadwallet.tools.util
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
import androidx.preference.PreferenceManager
import com.breadwallet.entities.Language
import java.util.*
Expand Down Expand Up @@ -34,6 +36,8 @@ class LocaleHelper private constructor() {
Locale.setDefault(locale)
val config = context.resources.configuration
config.setLocale(locale)
val localeList = LocaleListCompat.forLanguageTags(language.code)
AppCompatDelegate.setApplicationLocales(localeList)
return context.createConfigurationContext(config)
}

Expand Down
5 changes: 4 additions & 1 deletion app/src/main/java/com/breadwallet/tools/util/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,13 @@ else if (name == PartnerNames.PUSHERSTAGING) {
/// Description: 1715876807
public static long tieredOpsFee(Context app, long sendAmount) {

double doubleRate = 83.000;
double sendAmountDouble = new Double(String.valueOf(sendAmount));
String usIso = Currency.getInstance(new Locale("en", "US")).getCurrencyCode();
CurrencyEntity currency = CurrencyDataSource.getInstance(app).getCurrencyByIso(usIso);
double doubleRate = currency.rate;
if (currency != null) {
doubleRate = currency.rate;
}
double usdInLTC = sendAmountDouble * doubleRate / 100_000_000.0;
usdInLTC = Math.floor(usdInLTC * 100) / 100;

Expand Down
8 changes: 4 additions & 4 deletions app/src/main/res/layout/activity_intro.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,13 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/language_list"
android:layout_width="200dp"
android:layout_height="55dp"
android:layout_height="70dp"
android:layout_marginTop="96dp"
android:paddingBottom="14dp"
android:background="@drawable/lang_rounded_background"
android:paddingStart="10dp"
android:paddingTop="18dp"
android:paddingEnd="10dp"
android:paddingTop="14dp"
android:background="@drawable/lang_rounded_background"
android:paddingBottom="17dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
Expand Down
53 changes: 53 additions & 0 deletions app/src/test/java/com/breadwallet/tools/util/LocaleHelperTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.breadwallet.tools.util

import android.content.Context
import com.breadwallet.entities.Language
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class LocaleHelperTest {

@Test
fun `given LocaleHelper instance, then should validate default value`() {
val context: Context = mockk(relaxed = true)

LocaleHelper.init(context)

val currentLocale = LocaleHelper.instance.currentLocale

assertTrue(currentLocale == Language.ENGLISH)
assertEquals("en", currentLocale.code)
assertEquals("English", currentLocale.title)
assertEquals("Select language", currentLocale.desc)
}

@Test
fun `getLocale invoked, should return Locale object`() {
val localeIndonesian = LocaleHelper.getLocale(Language.INDONESIAN)

assertEquals("id", localeIndonesian.language)

val localeChineseSimplified = LocaleHelper.getLocale(Language.CHINESE_SIMPLIFIED)

assertEquals("zh", localeChineseSimplified.language)
assertEquals("CN", localeChineseSimplified.country)
}

@Test
fun `setLocaleIfNeeded invoked, should update current locale`() {
val context: Context = mockk(relaxed = true)
LocaleHelper.init(context)

val currentLocale = LocaleHelper.instance.currentLocale
assertTrue(currentLocale == Language.ENGLISH)

var changed = LocaleHelper.instance.setLocaleIfNeeded(Language.INDONESIAN)
assertTrue(changed)

changed = LocaleHelper.instance.setLocaleIfNeeded(Language.INDONESIAN)
assertFalse(changed)
}
}
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ buildscript {
// in below line we are adding configurations to our project.
configurations.all {
// in below line we are adding strategy for each dependency and requesting the details
resolutionStrategy.eachDependency {DependencyResolveDetails details ->
resolutionStrategy.eachDependency {details ->
// on below line we are getting to see the details using requested.
def requested = details.requested
// in below line we are requesting a group.
Expand All @@ -29,7 +29,7 @@ buildscript {

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.google.gms:google-services:4.4.0'
classpath 'com.google.gms:google-services:4.4.2'

classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'

Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
Loading

0 comments on commit 893649d

Please sign in to comment.