Skip to content

Instantly share code, notes, and snippets.

@rovkinmax
rovkinmax / shell_script_for_build_phase.sh
Created July 7, 2021 12:34
If Flutter does not set up CFBundleShortVersionString or CFBundleVersion use this script to set up it via build phase in xcode
buildName=$(sed -n -e "/FLUTTER_BUILD_NAME/ s/.*\= *//p" Flutter/Generated.xcconfig);
buildNumber=$(sed -n -e "/FLUTTER_BUILD_NUMBER/ s/.*\= *//p" Flutter/Generated.xcconfig);
echo "$buildName"
echo "$buildNumber"
oneSignalPlist="OneSignalNotificationServiceExtension/Info.plist" # any other plist
plutil -replace CFBundleShortVersionString -string "$buildName" "$oneSignalPlist"
plutil -replace CFBundleVersion -string "$buildNumber" "$oneSignalPlist"
runnerPlist="Runner/Info.plist"
/// Помощник с логикой пагинации
class PaginationHelper<T> {
static const double _defaultPaginationOffset = 50;
/// Смещение от конца прокрутки после которого начинать пагинацию
double paginationOffset;
/// Контроллер прокрутки
ScrollController scrollController;
/// Билдер [WidgetModel] для экрана Дэшборда [DashboardScreen]
DashboardWidgetModel createDashboardScreenWm(BuildContext context) {
final component = Injector.of<DashboardScreenComponent>(context).component;
final dependencies = WidgetModelDependencies(
errorHandler: StandardErrorHandler(
component.messageController,
component.dialogController,
component.sessionInteractor,
component.authInteractor,
///Базовый класс для обработки ошибок, связанных с сервисным слоем
abstract class NetworkErrorHandler implements ErrorHandler {
@override
void handleError(Object error) {
Object e;
bool isSilent = false;
bool isOverlayed = false;
if (error is SilentException) {
e = error.originalError;
@rovkinmax
rovkinmax / build.gradle
Last active May 15, 2021 07:11
Google xml generator without google services gradle plugin
android {
productFlavors { // or build types
dev {
project.ext.setProperty("googleAppId", "your google app id") // for task in google_service_xml_generator.gradle
}
prod {
project.ext.setProperty("googleAppId", "your google app id") // for task in google_service_xml_generator.gradle
}
}
@rovkinmax
rovkinmax / RoundViewConres.kt
Created May 28, 2020 10:44
example how round corners for any view
fun View.setRoundedCornersRes(@DimenRes resId: Int) {
setRoundedCorners(resources.getDimension(resId))
}
fun View.setRoundedCorners(@Px radius: Int) {
setRoundedCorners(radius.toFloat())
}
fun View.setRoundedCorners(@Px radius: Float) {
clipToOutline = true
@rovkinmax
rovkinmax / FlowAssert.kt
Last active April 13, 2020 13:23
FlowAssert example
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.toList
import java.lang.Long.min
fun <T> synchronizedList(vararg elements: T): MutableList<T> = Collections.synchronizedList(mutableListOf(*elements))
class FlowAssert<T>(flow: Flow<T>) {
companion object {
class LifecycleProvider {
private var disposable: Disposable? = null
private var observable: BehaviorSubject<Any>? = null
internal fun unsubscribe(): Unit {
if (disposable?.isDisposed?.not() ?: false) {
observable?.onNext(Any())
disposable?.dispose()
}
disposable = null
@rovkinmax
rovkinmax / Contact
Last active November 18, 2016 07:21
Example for reading contacts in Android
data class Contact(val id: String = "", val name: String = "", val photoUri: String = "", var phoneNumber: String = "", val typeStringRes: Int = 0)
class EncryptionManager(val alias: String, context: Context) {
companion object {
private const val KEY_STORE_PROVIDER = "AndroidKeyStore"
private const val CIPHER_PROVIDER = "AndroidOpenSSL"
private const val DISTINGUISHED = "CN=Company,O=Android Authority"
private const val TRANSFORMATION = "${KeyProperties.KEY_ALGORITHM_RSA}/${KeyProperties.BLOCK_MODE_ECB}/${KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1}"
}
private val context: Context