1048 lines
26 KiB
Markdown
1048 lines
26 KiB
Markdown
## Plan [1.18.0]
|
|
|
|
04 Nov, 2021
|
|
|
|
### Changes
|
|
|
|
- Plans now support the latest UI design changes.
|
|
|
|
### No Breaking changes, clients can just update to the latest versions.
|
|
### Note: Clients should upgrade to Presentation v1.18.3
|
|
|
|
## Auth [1.17.6]
|
|
|
|
03 Nov, 2021
|
|
|
|
### Changes
|
|
|
|
- Allow Login without keys for Product VPN with AccountType External.
|
|
|
|
## Country [1.16.1], Human-Verification [1.16.2]
|
|
|
|
29 Oct, 2021
|
|
|
|
Bug fixes
|
|
|
|
- Incorrect background in HV and country picker
|
|
|
|
## Presentation [1.18.1]
|
|
|
|
28 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Added Snackbar proton_notification_norm to color taxonomy.
|
|
- Please use View extensions for Snackbar:
|
|
- View.normSnack
|
|
- View.warningSnack
|
|
- View.errorSnack
|
|
- View.successSnack
|
|
|
|
## Auth [1.17.5]
|
|
|
|
28 Oct, 2021
|
|
|
|
### Bug fixes
|
|
|
|
- Screen with Recovery Method is not shown sometimes
|
|
|
|
## User-Settings [1.16.1]
|
|
|
|
20 Oct, 2021
|
|
|
|
### Bug fixes
|
|
|
|
- Cannot change password for legacy users with 2fa enabled.
|
|
|
|
## Version [1.18]
|
|
|
|
25 Oct, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Contact 1.18.
|
|
- Domain 1.18.
|
|
- EventManager 1.18.
|
|
- MailSettings 1.18.
|
|
- Presentation 1.18.
|
|
- User 1.18.
|
|
- UserSettings 1.18.
|
|
|
|
### New Migration
|
|
|
|
- Please apply changes as follow to your AppDatabase:
|
|
- Add ```EventMetadataEntity``` to your AppDatabase ```entities```.
|
|
- Add ```EventManagerConverters``` to your ```TypeConverters```.
|
|
- Extends ```EventMetadataDatabase```.
|
|
- Add a migration to your AppDatabase (```addMigration```):
|
|
```
|
|
val MIGRATION_X_Y = object : Migration(X, Y) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
EventMetadataDatabase.MIGRATION_0.migrate(database)
|
|
}
|
|
}
|
|
```
|
|
|
|
### New Dagger Module
|
|
|
|
- To provide the various EventManager components:
|
|
```
|
|
@Module
|
|
@InstallIn(SingletonComponent::class)
|
|
object EventManagerModule {
|
|
|
|
@Provides
|
|
@Singleton
|
|
@EventManagerCoroutineScope
|
|
fun provideEventManagerCoroutineScope(): CoroutineScope =
|
|
CoroutineScope(Dispatchers.Default + SupervisorJob())
|
|
|
|
@Provides
|
|
@Singleton
|
|
@JvmSuppressWildcards
|
|
fun provideEventManagerProvider(
|
|
eventManagerFactory: EventManagerFactory,
|
|
eventListeners: Set<EventListener<*, *>>
|
|
): EventManagerProvider =
|
|
EventManagerProviderImpl(eventManagerFactory, eventListeners)
|
|
|
|
@Provides
|
|
@Singleton
|
|
fun provideEventMetadataRepository(
|
|
db: EventMetadataDatabase,
|
|
provider: ApiProvider
|
|
): EventMetadataRepository = EventMetadataRepositoryImpl(db, provider)
|
|
|
|
@Provides
|
|
@Singleton
|
|
fun provideEventWorkManager(
|
|
workManager: WorkManager,
|
|
appLifecycleProvider: AppLifecycleProvider
|
|
): EventWorkManager = EventWorkManagerImpl(workManager, appLifecycleProvider)
|
|
|
|
@Provides
|
|
@Singleton
|
|
@ElementsIntoSet
|
|
@JvmSuppressWildcards
|
|
fun provideEventListenerSet(
|
|
userEventListener: UserEventListener,
|
|
userAddressEventListener: UserAddressEventListener,
|
|
userSettingsEventListener: UserSettingsEventListener,
|
|
mailSettingsEventListener: MailSettingsEventListener,
|
|
contactEventListener: ContactEventListener,
|
|
contactEmailEventListener: ContactEmailEventListener,
|
|
): Set<EventListener<*, *>> = setOf(
|
|
userEventListener,
|
|
userAddressEventListener,
|
|
userSettingsEventListener,
|
|
mailSettingsEventListener,
|
|
contactEventListener,
|
|
contactEmailEventListener,
|
|
)
|
|
}
|
|
```
|
|
- To provide AppLifecycleObserver, AppLifecycleProvider and WorkManager (needed by EventManager):
|
|
```
|
|
@Module
|
|
@InstallIn(SingletonComponent::class)
|
|
object ApplicationModule {
|
|
...
|
|
@Provides
|
|
@Singleton
|
|
fun provideAppLifecycleObserver(): AppLifecycleObserver =
|
|
AppLifecycleObserver()
|
|
|
|
@Provides
|
|
@Singleton
|
|
fun provideWorkManager(@ApplicationContext context: Context): WorkManager =
|
|
WorkManager.getInstance(context)
|
|
...
|
|
}
|
|
|
|
@Module
|
|
@InstallIn(SingletonComponent::class)
|
|
abstract class ApplicationBindsModule {
|
|
@Binds
|
|
abstract fun provideAppLifecycleStateProvider(observer: AppLifecycleObserver): AppLifecycleProvider
|
|
}
|
|
```
|
|
|
|
### WorkManager
|
|
|
|
**Initialization of WorkManager is up to the client.**
|
|
|
|
EventManager/EventWorker assume the client support injecting:
|
|
```
|
|
@HiltWorker
|
|
open class EventWorker @AssistedInject constructor(
|
|
@Assisted context: Context,
|
|
@Assisted params: WorkerParameters,
|
|
...
|
|
```
|
|
|
|
Please refer to:
|
|
- https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager
|
|
- https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration.
|
|
|
|
### Changes
|
|
|
|
- Added EventManager Domain/Data and EventListeners.
|
|
- Added EventManager LogTags.
|
|
- Added EventManagerConfig and EventManagerConfigProvider.
|
|
- Added EventWorkManager and EventManagerWorker.
|
|
- Added UserEventListener.
|
|
- Added UserAddressEventListener.
|
|
- Added MailSettingsEventListener.
|
|
- Added UserSettingsEventListener.
|
|
- Added ContactEventListener.
|
|
- Added ContactEmailsEventListener.
|
|
- Added AppLifecycleObserver and AppLifecycleProvider.
|
|
|
|
## Presentation [1.17.0]
|
|
|
|
### Changes
|
|
|
|
- `ProtonInput` password field (inputType TextPassword) is now cleared when returning from background if more than 3 min have passed.
|
|
|
|
## Auth [1.17.3], Human Verification [1.16.1], User settings [1.16.1], Presentation [1.16.1]
|
|
|
|
22 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Add missing versions for Auth and User settings modules.
|
|
- Added `ScreenContentsProtector` with shared logic for both activities and fragments: it can be added to any component, inheritance is no longer mandatory but is encouraged.
|
|
- Moved most of `ProtonSecureActivity`'s logic to `ScreenContentsProtector` added a `ProtonSecureFragment` counterpart to apply security measures to fragments automatically.
|
|
- Fix a bug when several protected fragments were shown on screen.
|
|
- Added a `by protectScreen(ProtectScreenConfiguration)` delegate to automatically protect and unprotect activities and fragments based on their lifecycles. You can either use this delegate, the `ProtonSecure` superclasses or use `ScreenContentsProtector` manually and carefully checking that all secure components are protected and then unprotected when no longer needed.
|
|
|
|
## Auth [1.17.1], User [1.16.2].
|
|
|
|
19 Oct, 2021
|
|
|
|
### Bug fixes
|
|
|
|
- Force Change password via Web only for private sub-user.
|
|
|
|
## Auth [1.16.1], User [1.16.1].
|
|
|
|
15 Oct, 2021
|
|
|
|
### Bug fixes
|
|
|
|
- Fixed Login for AccountType Username (VPN).
|
|
- Allow Login without full/keys scopes, without fetching addresses if not needed.
|
|
- Return Success for UnlockUserPrimaryKey without keys.
|
|
|
|
## User [1.15.6], Key [1.15.6], Account-Manager [1.15.6]
|
|
|
|
15 Oct, 2021
|
|
|
|
### Changes
|
|
- `AddressEntity` and `PublicAddressEntity` now store the signed key list of the address.
|
|
- `PublicAddressDatabase` migration 1 and `AddressDatabase` migration 2 to reflect the model changes.
|
|
- Updated db schema of `coreexample` to version 10 to reflect the model changes.
|
|
- Updated db schema of `account-manager` to version 10 to reflect the model changes.
|
|
- Removed `PrivateKey.signedKeyList()` to replace it with `UserAddress.signKeyList()`
|
|
|
|
## Plan and Payments [1.16.0]
|
|
|
|
15 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Plan and Payments now rely on the newest V4 API, including changes in the API response, requests and entities.
|
|
|
|
### Breaking changes: Instead on plan id, now clients should rely and provide plan names for the paid plans they support.
|
|
|
|
## Auth [1.15.5]
|
|
|
|
15 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Fixed: For some set of languages (e.g. Polish, Czech), app would crash during signup when choosing recovery method.
|
|
|
|
## Presentation [1.15.7]
|
|
|
|
13 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Add new colors to the taxonomy for the sidebar component.
|
|
|
|
## Human Verification [1.15.5], Presentation [1.15.6]
|
|
|
|
13 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Protect screens with visible password fields using WindowManager's FLAG_SECURE.
|
|
- Add `ProtonSecureActivity` that can be extended to apply security measures to any activity. At the moment, it's being extended by `AuthActivity`.
|
|
|
|
## Crypto and Key [1.15.5]
|
|
|
|
11 Oct, 2021
|
|
|
|
### New features
|
|
|
|
- Add support to generate and verify encrypted signatures, example:
|
|
|
|
```
|
|
// Key holder 1 signs the message and encrypts the signature for Key Holder 2
|
|
val encryptedSignature = keyHolder1.useKeys(context) {
|
|
signDataEncrypted(data, keyHolder2PublicAddress.publicKeyRing())
|
|
}
|
|
// Key holder 2 decrypts the signature and verifies it with Key Holder 1's public keys.
|
|
val verified = keyHolder2.useKeys(context) {
|
|
verifyDataEncrypted(data, encryptedSignature, keyHolder1PublicAddress.publicKeyRing())
|
|
}
|
|
```
|
|
|
|
## Crypto and Key [1.15.4]
|
|
|
|
8 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Replaced Signature Verification validAtUtc (Long) by VerificationTime (Ignore, Now, Utc).
|
|
|
|
## Crypto [1.15.3]
|
|
|
|
### Changes
|
|
|
|
- Removed internal implementations `PasswordVerifier` and `BigIntegerCalculator`
|
|
and use `go-srp` to compute the password verifier instead.
|
|
|
|
## Network [1.15.6], Android Test [1.15.1]
|
|
|
|
### Changes
|
|
- Use mockk-android instead of mockk for android tests.
|
|
- Fix network dependency declaration causing compilation of library module to fail.
|
|
|
|
## Human-Verification [1.15.4]
|
|
|
|
### Changes
|
|
|
|
- Removed `HumanVerificationActivity` — use `HumanVerificationOrchestrator` instead
|
|
- Fix: In signup activity, the view-model's state is preserved if the activity is temporarily destroyed
|
|
- Updated nullability of `HumanVerificationOrchestrator.setOnHumanVerificationResult` callback:
|
|
`HumanVerificationResult` parameter is never null; check `token` property
|
|
to see if human verification was successful or not
|
|
|
|
### Dependencies
|
|
|
|
- Auth [1.15.4]
|
|
- Presentation [1.15.5]
|
|
- User-Settings [1.15.3]
|
|
|
|
## Human Verification [1.15.3], Network [1.15.5]
|
|
|
|
Oct 6, 2021
|
|
|
|
### Changes
|
|
|
|
- Add ExtraHeaderProvider to pass arbitrary headers to all API requests.
|
|
- Allow captcha WebView to use ExtraHeaderProvider's headers.
|
|
|
|
## Network [1.15.4]
|
|
|
|
5 Oct, 2021
|
|
|
|
### Changes
|
|
|
|
- Add log in ServerTimeInterceptor on Date parse failure.
|
|
|
|
## Key [1.15.3], Network [1.15.3]
|
|
|
|
Oct 4, 2021
|
|
|
|
### Changes
|
|
|
|
- Add CacheOverride OkHttp tag and CacheOverrideInterceptor to modify cache behavior per-request.
|
|
|
|
## Presentation [1.15.4]
|
|
|
|
Sep 30, 2021
|
|
|
|
### Changes
|
|
|
|
- Add a work around for MIUI Dark Mode breaking theming.
|
|
|
|
## Presentation [1.15.3], Auth [1.15.3]
|
|
|
|
Sep 27, 2021
|
|
|
|
### Changes
|
|
|
|
- Add styling for dialogs created with MaterialAlertDialogBuilder.
|
|
- Use MaterialAlertDialogBuilder for all dialogs.
|
|
- Add styling for action menu text.
|
|
|
|
## Crypto Version [1.15.2]
|
|
|
|
Sep 20, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Auth 1.15.2.
|
|
- Account 1.15.2.
|
|
- Crypto 1.15.2.
|
|
- Human-Verification 1.15.2.
|
|
- Key 1.15.2.
|
|
- Network 1.15.2.
|
|
- Util Kotlin 1.15.2.
|
|
- User 1.15.2.
|
|
- User-Settings 1.15.2.
|
|
|
|
### Api Changes
|
|
|
|
- Logger is no more injected. Instead Core use a static ```CoreLogger```. You now have to set the Logger instance, on Application create:
|
|
```
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
CoreLogger.set(CoreExampleLogger())
|
|
```
|
|
- There is also a new KeyStoreCrypto LogTag object you must be aware:
|
|
```
|
|
object LogTag {
|
|
/** Tag for KeyStore initialization check failure. */
|
|
const val KEYSTORE_INIT = "core.crypto.common.keystore.init"
|
|
|
|
/** Tag for KeyStore encrypt failure. */
|
|
const val KEYSTORE_ENCRYPT = "core.crypto.common.keystore.encrypt"
|
|
|
|
/** Tag for KeyStore decrypt failure. */
|
|
const val KEYSTORE_DECRYPT = "core.crypto.common.keystore.decrypt"
|
|
}
|
|
```
|
|
|
|
### New Features
|
|
|
|
- KeyStoreCrypto fallback if Android KeyStore is not properly working.
|
|
|
|
## Presentation [1.15.1]
|
|
|
|
Sep 21, 2021
|
|
|
|
### Changes
|
|
|
|
- Removed `FragmentManager.showForceUpdate` method; to present a "Forced Update" dialog, use `ForceUpdateActivity` instead
|
|
|
|
## User Settings [1.15.1]
|
|
|
|
Sep 20, 2021
|
|
|
|
### New Features
|
|
|
|
- Added IntEnum support for UserSettings.
|
|
|
|
## Test Android Instrumented [1.15.1]
|
|
|
|
Sep 12, 2021
|
|
|
|
### New Features
|
|
|
|
- Added PasswordManagementRobot
|
|
|
|
## Version [1.15.0]
|
|
|
|
Sep 8, 2021.
|
|
|
|
Upgrade Kotlin to 1.5.
|
|
|
|
### Dependencies
|
|
|
|
- Core Modules 1.15.0.
|
|
- Kotlin 1.5.30.
|
|
- Kotlin Coroutines 1.5.2.
|
|
- Kotlin Serialization 1.2.2.
|
|
- Gradle 7.2.
|
|
- Java 11.
|
|
- Android Gradle Plugins 7.0.2.
|
|
- Android Tools 30.0.2.
|
|
- Android Annotation 1.2.0.
|
|
- AndroidX Activity 1.3.1.
|
|
- AndroidX AppCompat 1.3.1.
|
|
- AndroidX Constraintlayout 2.1.0.
|
|
- AndroidX Fragment 1.3.6.
|
|
- AndroidX KTX 1.6.0.
|
|
- AndroidX Lifecycle 2.4.0-alpha03.
|
|
- AndroidX Paging 1.4.0.
|
|
- AndroidX Work 2.6.0.
|
|
- AndroidX Test 1.4.0.
|
|
- Android Material Components 1.4.0.
|
|
- Dagger 2.38.1
|
|
- Hilt 2.38.1.
|
|
- Timber 5.0.1.
|
|
- Turbine 0.6.1.
|
|
- OkHttp 4.9.1.
|
|
- Trust Kit 1.1.5.
|
|
- Store 4.0.2-KT15.
|
|
- Lottie 4.1.0.
|
|
- Falcon 2.2.0.
|
|
- Apache Common Codec 1.15.
|
|
- Gotev CookieStore 1.3.5.
|
|
- Google Tink 1.6.1.
|
|
- Espresso 3.4.0.
|
|
- Robolectric 4.6.1.
|
|
- Mockk 1.11.0.
|
|
- Junit KTX 1.1.3.
|
|
|
|
## User Settings Version [1.7.1]
|
|
|
|
Sep 10, 2021
|
|
|
|
### Added features
|
|
|
|
- Add better result callback for password management and recovery email change features.
|
|
- Password management and recovery email change screens now auto-close themselves on success.
|
|
|
|
### Dependencies
|
|
|
|
- UserSettings 1.7.1
|
|
|
|
## Crypto Version [1.6.3]
|
|
|
|
Sep 09, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Crypto 1.6.3.
|
|
- Key 1.6.3.
|
|
- User 1.6.3.
|
|
|
|
### New Features
|
|
|
|
- Added encryptAndSign/decryptAndVerify PublicKeyRing parameter (default to KeyHolderContext.publicKeyRing).
|
|
|
|
## Presentation [1.6.1]
|
|
|
|
Sep 09, 2021
|
|
|
|
### Changes
|
|
|
|
- Revert tab ripple effect to the default.
|
|
|
|
## Auth Version [1.7.0]
|
|
|
|
Sep 03, 2021
|
|
|
|
### Bug fixes
|
|
|
|
- Fixed dialog fragments crash on orientation change, mainly this stands for ProtonCancellableDialogFragment and PasswordAnd2FADialogFragment
|
|
- Note, breaking change, the API of these dialog fragments has changed a bit.
|
|
|
|
### Dependencies
|
|
|
|
- Auth 1.7.0
|
|
- HumanVerification 1.6.0
|
|
- Presentation 1.6.0
|
|
- UserSettings 1.7.0
|
|
|
|
### New Usage Example with fragment result pattern
|
|
```
|
|
private lateinit var requestNewCodeDialogResultLauncher: FragmentDialogResultLauncher<String>
|
|
|
|
requestNewCodeDialogResultLauncher =
|
|
parentFragmentManager.registerRequestNewCodeDialogResultLauncher(this@HumanVerificationEnterCodeFragment) {
|
|
// your code
|
|
}
|
|
|
|
equestNewCodeDialogResultLauncher.show("string")
|
|
```
|
|
|
|
## Crypto Version [1.6.2]
|
|
|
|
Aug 31, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Crypto 1.6.2.
|
|
- Key 1.6.2.
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed HashKey signature verification (do not throw IllegalArgumentException anymore on decryption).
|
|
|
|
## Test Android Instrumented [0.6.7]
|
|
|
|
Aug 30, 2021
|
|
|
|
### New Features
|
|
|
|
- Added RecoveryEmail robot
|
|
|
|
## Test Android Instrumented [0.6.6]
|
|
|
|
Aug 27, 2021
|
|
|
|
### New Features
|
|
|
|
- Added startsWith() matcher
|
|
- Added user creation quark commands
|
|
- Minor test data classes improvements
|
|
|
|
## Presentation [1.5.5]
|
|
|
|
Aug 27, 2021
|
|
|
|
### New Features
|
|
|
|
- Added ```?attr/proton_text_accent``` and ```?attr/proton_icon_accent```.
|
|
|
|
### Style Changes
|
|
|
|
- Linear progress bar styling has changed. The track is now 50% of the brand color so that it is lighter than the indicator in light mode and darker in dark mode.
|
|
|
|
### Bug Fixes
|
|
|
|
- ProtonRadioButton and ProtonCheckbox animations are fixed in Android 6.
|
|
- ProtonRadioButton and ProtonCheckbox padding is fixed to avoid long labels overlapping the button.
|
|
|
|
## Crypto Version [1.6.1]
|
|
|
|
Aug 25, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Crypto 1.6.1.
|
|
- Key 1.6.1.
|
|
- Mail Message 1.6.1.
|
|
- Util Kotlin 0.2.6.
|
|
|
|
### New Features
|
|
|
|
- Added Crypto encrypt/decrypt File with KeyPacket/SessionKey/HashKey support.
|
|
|
|
## Auth Version [1.6.1]
|
|
|
|
Aug 25, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed SetupAccountCheck to always refresh User Addresses before proceeding.
|
|
|
|
## User Settings Version [1.6.0]
|
|
|
|
Aug 17, 2021
|
|
|
|
### New Features
|
|
|
|
- Password Change: Single Pass mode password change, Two Pass mode login and mailbox password change.
|
|
|
|
### New Migration
|
|
|
|
- If you use ```Account Manager Data Db``` module, nothing to do, it's transparently applied.
|
|
- If you use your own AppDatabase, please apply changes as follow:
|
|
- Add ```OrganizationEntity``` to your AppDatabase ```entities```.
|
|
- Add ```OrganizationKeysEntity``` to your AppDatabase ```entities```.
|
|
- Add a migration to your AppDatabase (```addMigration```):
|
|
```
|
|
val MIGRATION_X_Y = object : Migration(X, Y) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
OrganizationDatabase.MIGRATION_0.migrate(database)
|
|
}
|
|
}
|
|
```
|
|
|
|
### Dependencies
|
|
|
|
- Account Manager 1.6.
|
|
- Auth 1.6.
|
|
- Crypto 1.6.
|
|
- Key 1.6.
|
|
- User 1.6.
|
|
- UserSettings 1.6.
|
|
|
|
## Crypto Version [1.5.3]
|
|
|
|
Aug 18, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Crypto 1.5.3.
|
|
- Key 1.5.3.
|
|
- User 1.5.3.
|
|
|
|
### Behavior Changes
|
|
|
|
- Set X25519 as default Key type for generation (removed RSA).
|
|
- Changed Key identity as: email <email>.
|
|
|
|
## Presentation Version [1.5.4]
|
|
|
|
Aug 20, 2021
|
|
|
|
### New Features
|
|
|
|
- Added color ```?attr/proton_blender_norm``` for greying out content behind dialogs.
|
|
|
|
## Network Version [1.5.4]
|
|
|
|
Aug 18, 2021
|
|
|
|
### New Features
|
|
|
|
- Added optional OkHttp Cache (see ```ApiManagerFactory```). This cache is shared across all user, session, api or call.
|
|
|
|
### Breaking Changes
|
|
|
|
- You'll have to instantiate/use ```ApiResult.Error.NoInternet()``` instead of the static object.
|
|
|
|
### Behavior Changes
|
|
|
|
- Removed ```isConnectedToNetwork``` check before trying a call (see ```ApiManagerImpl```).
|
|
- You'll now receive ```ApiResult.Error.NoInternet``` only on ```UnknownHostException```.
|
|
|
|
## Network Version [1.5.3]
|
|
|
|
Aug 18, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed Network error retryable conditions:
|
|
```
|
|
/**
|
|
* Return true if [ApiResult] is retryable (e.g. connection issue or http error 5XX).
|
|
*/
|
|
fun <T> ApiResult<T>.isRetryable(): Boolean = when (this) {
|
|
is ApiResult.Success,
|
|
is ApiResult.Error.Parse,
|
|
is ApiResult.Error.Certificate,
|
|
is ApiResult.Error.TooManyRequest -> false
|
|
is ApiResult.Error.Connection -> true
|
|
is ApiResult.Error.Http -> httpCode in 500..599
|
|
}
|
|
```
|
|
|
|
### Behavior Changes
|
|
|
|
- As a result of the above fix, any HTTP Error 5XX will trigger backoff retry, see ```ApiClient```:
|
|
```
|
|
/**
|
|
* Retry count for exponential backoff.
|
|
*/
|
|
val backoffRetryCount: Int get() = 2
|
|
|
|
/**
|
|
* Base value (in milliseconds) for exponential backoff logic. e.g. for value 500 first retry
|
|
* will happen randomly after 500-1000ms, next one after 1000-2000ms ...
|
|
*/
|
|
val backoffBaseDelayMs: Int get() = 500
|
|
```
|
|
|
|
## Presentation Version [1.5.3]
|
|
|
|
Aug 17, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed ProtonCheckbox and ProtonRadioButton not updating their button drawable in certain scenarios.
|
|
|
|
## Version [1.5.2]
|
|
|
|
Aug 13, 2021
|
|
|
|
Various SignUp/SignIn fixes & improvements.
|
|
|
|
### Dependencies
|
|
|
|
- Account 1.5.2.
|
|
- Auth 1.5.2.
|
|
- Human Verification 1.5.2.
|
|
- Network 1.5.2.
|
|
- User 1.5.2.
|
|
- Plan 1.5.2.
|
|
- Presentation 1.5.2.
|
|
|
|
### Bug Fixes
|
|
|
|
- HumanVerification: Fixed concurrency issue while updating state/token.
|
|
- Account: Fixed concurrency issue while updating account/session state.
|
|
- Auth: Fixed error on login within SignUp process.
|
|
- Auth: Fixed wrong initial Fragment shown if available HV methods equal ("sms", "email").
|
|
- Auth: Fixed "Recovery Email" & "Recovery Phone number".
|
|
- Auth: Fixed blank username error.
|
|
- Auth: Fixed passwords do not match error.
|
|
- Auth Presentation: Fixed Add Account Portrait Orientation.
|
|
- Presentation: Fixed TextInputLayout Outline stroke (color/size).
|
|
- Presentation: Fixed OnBackPressedCallback & and Fragments backstack flow.
|
|
- Presentation: Fixed Fragment hideKeyboard.
|
|
- Auth: Fixed missing state changes (e.g. no network).
|
|
|
|
### New Features
|
|
|
|
- Network: Added TooManyRequest error handling per Session.
|
|
- HumanVerification: Added SMS/Email Token code validation.
|
|
- User: Added default Domain fallback.
|
|
|
|
### API Changes
|
|
|
|
- ```UserVerificationRepositoryImpl``` do not depend anymore on ```clientIdProvider``` & ```humanVerificationRepository```:
|
|
```
|
|
@Provides
|
|
@Singleton
|
|
fun provideUserVerificationRepository(
|
|
apiProvider: ApiProvider
|
|
): UserVerificationRepository = UserVerificationRepositoryImpl(apiProvider)
|
|
```
|
|
- You must now provide a Default Domain Host to ```DomainRepositoryImpl```.
|
|
```
|
|
@Provides
|
|
@DefaultDomainHost
|
|
fun provideDefaultDomainHost() = Constants.HOST // "protonmail.com"
|
|
...
|
|
@Provides
|
|
@Singleton
|
|
fun provideDomainRepository(
|
|
@DefaultDomainHost defaultDomain : Domain,
|
|
provider: ApiProvider
|
|
): DomainRepository = DomainRepositoryImpl(defaultDomain, provider)
|
|
```
|
|
|
|
## Test Android Instrumented [0.6.5]
|
|
|
|
Aug 12, 2021
|
|
|
|
### New Features
|
|
|
|
- CoreRobot.addText() and replaceText() are added as replacements for setText().
|
|
addText() behaves exactly the same as setText().
|
|
|
|
### Deprecations
|
|
|
|
- CoreRobot.setText() is deprecated for confusing behavior - it adds text instead of setting new text on a view.
|
|
|
|
## Presentation Version [0.10.3]
|
|
|
|
Aug 11, 2021
|
|
|
|
### Style Changes
|
|
|
|
- ```@color/text_weak_selector``` is updated to use ```?attr/proton_text_weak``` and ```?attr/proton_text_disabled``` instead of directly using ```@color``` values.
|
|
|
|
## Presentation Version [0.10.2]
|
|
|
|
Aug 5, 2021
|
|
|
|
### New Features
|
|
|
|
- Added View.snack extension that accepts a function block allowing for full customization of the created Snackbar.
|
|
|
|
### Style Changes
|
|
|
|
- Snackbar text styles have been updated to Proton.Text.\* to match designs.
|
|
- Snackbar text color has been forced to white also in dark theme.
|
|
|
|
## Presentation Version [0.10.1]
|
|
|
|
Aug 3, 2021
|
|
|
|
### API Changes
|
|
|
|
- ProtonCheckbox and ProtonRadioButton are now open classes.
|
|
- ProtonCheckbox and ProtonRadioButton don't use compound drawables to draw the button on the right. This means that setting a drawable with e.g. setCompoundDrawablesRelative(icon, null, null, null) doesn't unexpectedly break them.
|
|
- Add Proton.Text.Hero style.
|
|
- Add ProtonInput.clearTextAndOverwriteMemory() - the method overwrites and clears the input's text buffer. It should be used to limit the time passwords are kept in memory.
|
|
|
|
## Translations Version [2021-07-30-140045]
|
|
|
|
Jul 30, 2021
|
|
|
|
### Dependencies
|
|
|
|
- Account Manager 1.5.1.
|
|
- Auth 1.4.1.
|
|
- Country 0.1.6.
|
|
- Human Verification 1.3.4.
|
|
- Payment 0.2.3.
|
|
- Plan 0.1.2.
|
|
- Presentation 0.10.1.
|
|
|
|
### New Supported Languages
|
|
|
|
- From Agency: en, de, fr.
|
|
- From Community: cs, es-rMX, fr-rCA, pl.
|
|
- You can filter them by using:
|
|
```
|
|
android {
|
|
defaultConfig {
|
|
resConfigs "de", "en", "fr"
|
|
}
|
|
}
|
|
```
|
|
|
|
## User Settings Version [1.5.1]
|
|
|
|
Jul 30, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed UserSettingsDatabase MIGRATION_0.
|
|
|
|
## Version [1.5.0]
|
|
|
|
Jul 30, 2021
|
|
|
|
Add user settings, with initial update recovery email option.
|
|
|
|
### Dependencies
|
|
|
|
- Auth 1.5.0.
|
|
- Account Manager 1.5.0.
|
|
- User 1.5.0.
|
|
- UserSettings 1.5.0.
|
|
- Plan 0.2.0.
|
|
- Presentation 0.10.0.
|
|
|
|
### New Modules
|
|
|
|
- **User Settings**: Get and update UserSettings.
|
|
|
|
### New Migration
|
|
|
|
- If you use ```Account Manager Data Db``` module, nothing to do, it's transparently applied.
|
|
- If you use your own AppDatabase, please apply changes as follow:
|
|
- Add ```UserSettingsEntity``` to your AppDatabase ```entities```.
|
|
- Add ```UserSettingsConverters``` to your AppDatabase ```TypeConverters```.
|
|
- Extends ```UserSettingsDatabase``` from your AppDatabase.
|
|
- Add a migration to your AppDatabase (```addMigration```):
|
|
```
|
|
val MIGRATION_X_Y = object : Migration(X, Y) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
UserSettingsDatabase.MIGRATION_0.migrate(database)
|
|
}
|
|
}
|
|
```
|
|
|
|
### New Features
|
|
|
|
- Added ```UserSettings module``` with Update Recovery Email feature.
|
|
- Added ```FragmentActivity.addOnBackPressedCallback``` in presentation module.
|
|
|
|
### Recommendations
|
|
|
|
- Do not expect ```UserSettings``` properties to be stable, they could change in future.
|
|
|
|
## Crypto Version [1.1.5], Key Version [1.3.2]
|
|
|
|
Jul 28, 2021
|
|
|
|
### New Features
|
|
|
|
- Added Crypto encryptAndSignFile & decryptAndVerifyFile.
|
|
|
|
## Mail Settings Version [1.3.2]
|
|
|
|
Jul 28, 2021
|
|
|
|
### New Features
|
|
|
|
- Added MailSettingsRepository updateMailSettings & MailSettingsResponse.toMailSettings.
|
|
|
|
## Account Manager Version [1.3.2]
|
|
|
|
Jul 27, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Changed Account Initials Count to 1.
|
|
|
|
## Presentation Version [0.9.9]
|
|
|
|
Jul 26, 2021
|
|
|
|
### New Features
|
|
|
|
- Added ```ProtonCheckbox``` and ```ProtonRadioButton``` that display their "button" (i.e. the checkbox or circle) to the right of the label.
|
|
|
|
## User Version [1.3.2]
|
|
|
|
Jul 23, 2021
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed UserAddressRepositoryImpl issue when no address returned from fetcher.
|
|
|
|
### Recommendations
|
|
|
|
- You must update to this version because it prevent to properly sign in/up without address.
|
|
|
|
## Version [1.3.1]
|
|
|
|
Jul 21, 2021
|
|
|
|
Refactor Core Database.
|
|
|
|
### Dependencies
|
|
|
|
- Account 1.3.1.
|
|
- AccountManager 1.3.1.
|
|
- Data 1.3.1.
|
|
- DataRoom 1.3.1.
|
|
- HumanVerification 1.3.1.
|
|
- Key 1.3.1.
|
|
- MailSettings 1.3.1.
|
|
- User 1.3.1.
|
|
|
|
### New Modules
|
|
|
|
- **Data Room**: New module containing all Android Room specifics.
|
|
- **AccountManager Data Db**: New module containing old AccountManagerDatabase, for backward compatibility purposes.
|
|
|
|
### New Features
|
|
|
|
- ```SupportSQLiteDatabase``` extensions: ```getTableColumns```, ```recreateTable```, ```addTableColumn```, ```dropTableColumn```, ```dropTableContent``` or ```dropTable```.
|
|
- ```UserRepository.updateUser```: function for event handing.
|
|
- ```UserAddressRepository.updateAddresses/deleteAddresses```: functions for event handling.
|
|
|
|
### Bug Fixes
|
|
|
|
- Fixed UserAddressRepositoryImpl to fetch addresses if DB table if empty.
|
|
|
|
### API Changes
|
|
|
|
- Removed Dagger Provides for ```AccountManagerDatabase``` from **AccountManager Dagger** module.
|
|
- Client need to provide all Database components:
|
|
```
|
|
@Module
|
|
@InstallIn(SingletonComponent::class)
|
|
object AppDatabaseModule {
|
|
@Provides
|
|
@Singleton
|
|
fun provideDatabase(@ApplicationContext context: Context): AccountManagerDatabase =
|
|
AccountManagerDatabase.buildDatabase(context)
|
|
}
|
|
|
|
@Module
|
|
@InstallIn(SingletonComponent::class)
|
|
abstract class DatabaseBindsModule {
|
|
@Binds
|
|
abstract fun provideAccountDatabase(db: AccountManagerDatabase): AccountDatabase
|
|
|
|
@Binds
|
|
abstract fun provideUserDatabase(db: AccountManagerDatabase): UserDatabase
|
|
|
|
@Binds
|
|
abstract fun provideAddressDatabase(db: AccountManagerDatabase): AddressDatabase
|
|
|
|
@Binds
|
|
abstract fun provideKeySaltDatabase(db: AccountManagerDatabase): KeySaltDatabase
|
|
|
|
@Binds
|
|
abstract fun providePublicAddressDatabase(db: AccountManagerDatabase): PublicAddressDatabase
|
|
|
|
@Binds
|
|
abstract fun provideHumanVerificationDatabase(db: AccountManagerDatabase): HumanVerificationDatabase
|
|
|
|
@Binds
|
|
abstract fun provideMailSettingsDatabase(db: AccountManagerDatabase): MailSettingsDatabase
|
|
}
|
|
```
|
|
|
|
### Recommendations
|
|
|
|
- You should **not use** ```AccountManagerDatabase``` anymore (could be deprecated in future).
|
|
- You should define your own Database, see CoreExample ```AppDatabase```, ```AppDatabaseMigrations``` and ```AppDatabaseBindsModule```.
|