Compare commits

..

1 Commits

28 changed files with 30 additions and 283 deletions

View File

@ -1,10 +1,10 @@
apply plugin: 'kotlin-android'
rootProject.ext {
compileSdk = 33
compileSdk = 30
minSdk = 21
targetSdk = 33
targetSdk = 30
}
android {
@ -16,12 +16,12 @@ android {
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
buildFeatures {

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.templates.logansquare"
}
dependencies {
implementation project(":utils")
implementation project(":logging")

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.extensions"
}
dependencies {
implementation "androidx.recyclerview:recyclerview"
implementation "androidx.fragment:fragment-ktx"

View File

@ -1,13 +1,19 @@
package ru.touchin.extensions
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import ru.touchin.roboswag.core.log.Lc
import android.provider.Browser
fun Context.safeStartActivity(intent: Intent, options: Bundle? = null, resolveFlags: Int = 0): Boolean =
packageManager.resolveActivity(intent, resolveFlags)?.let { startActivity(intent, options) } != null
fun Context.safeStartActivity(intent: Intent, options: Bundle? = null) =
try {
startActivity(intent, options)
} catch (e: ActivityNotFoundException) {
Lc.e(e, "Couldn't find activity with this parameters")
}
fun Context.openBrowser(url: String) = Intent(Intent.ACTION_VIEW)
.setData(Uri.parse(url))
@ -28,4 +34,3 @@ fun Context.openBrowserWithHeaders(url: String, headersMap: Map<String, String>)
fun Context.callToPhoneNumber(phoneNumber: String) = Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("tel:$phoneNumber"))
.let { intent -> safeStartActivity(intent) }

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.lifecycle.rx"
}
dependencies {
api project(":utils")
api project(":logging")

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.lifecycle_viewcontroller"
}
dependencies {
implementation project(":lifecycle")
implementation project(":navigation-viewcontroller")

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.lifecycle"
}
dependencies {
compileOnly "javax.inject:javax.inject:1"

View File

@ -10,13 +10,4 @@ sealed class ContentEvent<out T>(open val data: T?) {
data class Complete<out T>(override val data: T? = null) : ContentEvent<T>(data)
fun <P> transform(transformation: (T?) -> P): ContentEvent<P> {
return when(this) {
is Loading -> Loading(transformation(data))
is Success -> Success(transformation(data))
is Complete -> Complete(transformation(data))
is Error -> Error(throwable, transformation(data))
}
}
}

View File

@ -1,24 +1,10 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.livedata.location"
}
configurations.configureEach {
resolutionStrategy.eachDependency {
if (requested.name == "agconnect-core") {
useVersion(libs.versions.agconnectCore.get())
}
}
}
dependencies {
api project(":lifecycle")
implementation "com.google.android.gms:play-services-location"
implementation "com.huawei.hms:location:$versions.hmsLocation"
constraints {
implementation("com.google.android.gms:play-services-location") {
version {

View File

@ -1,62 +0,0 @@
package ru.touchin.livedata.location
import android.Manifest.permission.ACCESS_COARSE_LOCATION
import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.content.Context
import android.location.Location
import android.os.Looper
import androidx.annotation.RequiresPermission
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import com.huawei.hms.location.FusedLocationProviderClient
import com.huawei.hms.location.LocationAvailability
import com.huawei.hms.location.LocationCallback
import com.huawei.hms.location.LocationRequest
import com.huawei.hms.location.LocationResult
import com.huawei.hms.location.LocationServices
class HuaweiLocationLiveData(
context: Context,
private val request: LocationRequest
) : LiveData<Location>() {
private val fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context)
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
postValue(result.lastLocation)
}
override fun onLocationAvailability(availability: LocationAvailability) {
if (!availability.isLocationAvailable) postValue(null)
}
}
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
override fun observe(owner: LifecycleOwner, observer: Observer<in Location>) {
super.observe(owner, observer)
}
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
override fun onActive() {
startListening()
}
override fun onInactive() {
stopListening()
}
private fun stopListening() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
private fun startListening() {
fusedLocationClient.requestLocationUpdates(
request,
locationCallback,
Looper.getMainLooper()
)
}
}

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.roboswag.core.log"
}
dependencies {
implementation "androidx.annotation:annotation"

View File

@ -3,20 +3,7 @@ apply from: "../android-configs/lib-config.gradle"
apply plugin: 'kotlin-kapt'
android {
namespace "ru.touchin.roboswag.navigation_base"
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
viewBinding true
buildConfig true
}
buildFeatures.viewBinding = true
}
dependencies {

View File

@ -26,7 +26,6 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics;
import net.danlew.android.joda.JodaTimeAndroid;
import ru.touchin.hardware.ProcessKt;
import ru.touchin.roboswag.core.log.ConsoleLogProcessor;
import ru.touchin.roboswag.core.log.Lc;
import ru.touchin.roboswag.core.log.LcGroup;
@ -47,7 +46,7 @@ public abstract class TouchinApp extends Application {
enableStrictMode();
Lc.initialize(new ConsoleLogProcessor(LcLevel.VERBOSE), true);
LcGroup.UI_LIFECYCLE.disable();
} else if (ProcessKt.isOnMainProcess(this)) {
} else {
try {
final FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.setCrashlyticsCollectionEnabled(true);

View File

@ -2,30 +2,12 @@ apply from: "../android-configs/lib-config.gradle"
apply plugin: 'kotlin-kapt'
android {
namespace "ru.touchin.roboswag.navigation_viewcontroller"
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
viewBinding true
buildConfig true
}
}
dependencies {
implementation project(":utils")
implementation project(":logging")
implementation project(":navigation-base")
implementation "androidx.appcompat:appcompat"
implementation "androidx.lifecycle:lifecycle-common-java8"
constraints {
implementation("androidx.appcompat:appcompat") {
@ -33,11 +15,5 @@ dependencies {
require '1.7.0-alpha03'
}
}
implementation("androidx.lifecycle:lifecycle-common-java8") {
version {
require '2.2.0'
}
}
}
}

View File

@ -35,7 +35,6 @@ import android.view.animation.Animation
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle
import ru.touchin.roboswag.core.utils.ShouldNotHappenException
import ru.touchin.roboswag.navigation_viewcontroller.BuildConfig
import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController
@ -81,8 +80,7 @@ open class ViewControllerFragment<TActivity : FragmentActivity, TState : Parcela
lateinit var state: TState private set
var viewControllerClass: Class<ViewController<TActivity, TState>>? = null
private set
lateinit var viewControllerClass: Class<ViewController<TActivity, TState>> private set
private var viewController: ViewController<out TActivity, out TState>? = null
@ -243,19 +241,15 @@ open class ViewControllerFragment<TActivity : FragmentActivity, TState : Parcela
creationContext: ViewController.CreationContext,
savedInstanceState: Bundle?
): ViewController<out TActivity, out TState> {
viewControllerClass
?.let { mViewControllerClass ->
if (mViewControllerClass.constructors.size != 1) {
throw IllegalStateException("There should be single constructor for $viewControllerClass")
}
val constructor = mViewControllerClass.constructors[0]
return when (constructor.parameterTypes.size) {
1 -> constructor.newInstance(creationContext)
2 -> constructor.newInstance(creationContext, savedInstanceState)
else -> throw IllegalArgumentException("Wrong constructor parameters count: ${constructor.parameterTypes.size}")
} as ViewController<out TActivity, out TState>
}
?: throw ShouldNotHappenException("viewControllerClass is null")
if (viewControllerClass.constructors.size != 1) {
throw IllegalStateException("There should be single constructor for $viewControllerClass")
}
val constructor = viewControllerClass.constructors[0]
return when (constructor.parameterTypes.size) {
1 -> constructor.newInstance(creationContext)
2 -> constructor.newInstance(creationContext, savedInstanceState)
else -> throw IllegalArgumentException("Wrong constructor parameters count: ${constructor.parameterTypes.size}")
} as ViewController<out TActivity, out TState>
}
override fun toString(): String = "${super.toString()} ViewController: $viewControllerClass"

View File

@ -120,7 +120,7 @@ open class ViewControllerNavigation<TActivity : FragmentActivity>(
*/
fun <TState : Parcelable> setViewControllerAsTop(
viewControllerClass: Class<out ViewController<out TActivity, TState>>,
state: TState?,
state: TState,
addToStack: Boolean = true,
tag: String? = null,
transactionSetup: ((FragmentTransaction) -> Unit)? = null
@ -149,7 +149,7 @@ open class ViewControllerNavigation<TActivity : FragmentActivity>(
*/
fun <TState : Parcelable> setInitialViewController(
viewControllerClass: Class<out ViewController<out TActivity, TState>>,
state: TState?,
state: TState,
tag: String? = null,
transactionSetup: ((FragmentTransaction) -> Unit)? = null
) {

View File

@ -1,44 +0,0 @@
package ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers
import android.os.Parcelable
import android.view.View
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.viewbinding.ViewBinding
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class ViewControllerViewBindingDelegate<T : ViewBinding, TActivity : FragmentActivity, TState : Parcelable>(
val viewController: ViewController<TActivity, TState>,
val viewBindingFactory: (View) -> T
) : ReadOnlyProperty<ViewController<TActivity, TState>, T> {
private var binding: T? = null
init {
viewController.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
viewController.fragment.viewLifecycleOwnerLiveData.observe(viewController) { viewLifecycleOwner ->
viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) {
binding = null
}
})
}
}
})
}
override fun getValue(thisRef: ViewController<TActivity, TState>, property: KProperty<*>): T {
val binding = binding
if (binding != null) {
return binding
}
return viewBindingFactory(viewController.view).also { this.binding = it }
}
}
fun <T : ViewBinding, TActivity : FragmentActivity, TState : Parcelable>
ViewController<TActivity, TState>.viewBinding(viewBindingFactory: (View) -> T) =
ViewControllerViewBindingDelegate(this, viewBindingFactory)

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.roboswag.recyclerview_adapters"
}
dependencies {
implementation project(':kotlin-extensions')
@ -16,7 +12,7 @@ dependencies {
constraints {
implementation("androidx.recyclerview:recyclerview") {
version {
require '1.1.0'
require '1.0.0'
}
}
implementation("androidx.core:core-ktx") {

View File

@ -69,7 +69,7 @@ open class DelegationListAdapter<TItem>(config: AsyncDifferConfig<TItem>) : Recy
*
* @param list The new list to be displayed.
*/
fun submitList(list: List<TItem>?) = differ.submitList(list)
fun submitList(list: List<TItem>) = differ.submitList(list)
/**
* Submits a new list to be diffed, and displayed.
@ -84,14 +84,6 @@ open class DelegationListAdapter<TItem>(config: AsyncDifferConfig<TItem>) : Recy
*/
fun submitList(list: List<TItem>?, commitCallback: (() -> Unit)?) = differ.submitList(list, commitCallback)
/**
* Same as [submitList] with fast simple remove all items of a previous list
*/
fun replaceList(list: List<TItem>) {
submitList(null)
submitList(list)
}
/**
* Get the current List - any diffing to present this list has already been computed and
* dispatched via the ListUpdateCallback.

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.calendar"
}
dependencies {
implementation project(":logging")
implementation 'net.danlew:android.joda'

View File

@ -276,7 +276,7 @@ public final class CalendarUtils {
final int firstDayInNextMonth = nextMonthFirstDay.getDayOfWeek() - 1;
if (daysLeftInWeek != 0) {
calendarItems.add(new CalendarEmptyItem(shift, shift + daysLeftInWeek - 1));
calendarItems.add(new CalendarEmptyItem(shift, shift + daysLeftInWeek));
shift += daysLeftInWeek;
}
calendarItems.add(new CalendarHeaderItem(nextMonthFirstDay.getYear(), nextMonthFirstDay.getMonthOfYear() - 1, shift, shift));

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.extensions.rx"
}
dependencies {
implementation project(":utils")
implementation project(":logging")

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.core.observables.storable"
}
dependencies {
implementation project(":utils")
implementation project(":logging")

View File

@ -1,9 +1,5 @@
apply from: "../android-configs/lib-config.gradle"
android {
namespace "ru.touchin.roboswag.core.utils"
}
dependencies {
def coreVersion = '1.0.0'
def annotationVersion = '1.1.0'

View File

@ -1,21 +0,0 @@
package ru.touchin.hardware
import android.app.ActivityManager
import android.content.Context
import android.os.Process
fun Context.isOnMainProcess(): Boolean {
val applicationContext = this.applicationContext
val runningAppProcesses = (applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager)
.runningAppProcesses
if (runningAppProcesses != null && runningAppProcesses.size != 0) {
for (runningProcessInfo in runningAppProcesses) {
val isCurrentProcess = runningProcessInfo.pid == Process.myPid()
val isMainProcessName = this.packageName == runningProcessInfo.processName
if (isCurrentProcess && isMainProcessName) {
return true
}
}
}
return false
}

View File

@ -2,11 +2,8 @@ apply from: "../android-configs/lib-config.gradle"
apply plugin: 'kotlin-android'
android {
namespace "ru.touchin.roboswag.views"
buildFeatures {
viewBinding true
buildConfig true
}
}

View File

@ -58,7 +58,6 @@ class LoadingContentView @JvmOverloads constructor(
showChild(R.id.error_with_repeat)
}
}
else -> Unit
}
}

View File

@ -28,14 +28,6 @@ public class Switcher extends FrameLayout {
@Nullable
private Animation outAnimation;
public void setOutAnimation(@Nullable Animation outAnimation) {
this.outAnimation = outAnimation;
}
public void setInAnimation(@Nullable Animation inAnimation) {
this.inAnimation = inAnimation;
}
public Switcher(@NonNull final Context context) {
this(context, null);
}