From 386121aaec16d440ebdb58f1f6663053d2d44090 Mon Sep 17 00:00:00 2001 From: akram09 Date: Fri, 25 Oct 2019 01:04:43 +0100 Subject: [PATCH] initialzed the project --- .idea/misc.xml | 2 +- app/build.gradle | 75 +++++- app/google-services.json | 48 ++++ app/src/main/AndroidManifest.xml | 3 +- .../team7/socialblind/ElbessApplication.kt | 32 +++ .../team7/socialblind/base/BaseActivity.kt | 72 ++++++ .../team7/socialblind/base/BaseDataSource.kt | 42 ++++ .../socialblind/base/BaseRecyclerAdapter.kt | 93 +++++++ .../team7/socialblind/base/BaseViewModel.kt | 132 ++++++++++ .../java/com/team7/socialblind/base/State.kt | 3 + .../com/team7/socialblind/package-info.java | 4 + .../socialblind/{ => ui}/MainActivity.kt | 3 +- .../team7/socialblind/util/LocaleManager.kt | 55 ++++ .../com/team7/socialblind/util/Settings.kt | 29 +++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/values/strings.xml | 1 + build.gradle | 21 +- versions.gradle | 234 ++++++++++++++++++ 18 files changed, 825 insertions(+), 26 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/src/main/java/com/team7/socialblind/ElbessApplication.kt create mode 100644 app/src/main/java/com/team7/socialblind/base/BaseActivity.kt create mode 100644 app/src/main/java/com/team7/socialblind/base/BaseDataSource.kt create mode 100644 app/src/main/java/com/team7/socialblind/base/BaseRecyclerAdapter.kt create mode 100644 app/src/main/java/com/team7/socialblind/base/BaseViewModel.kt create mode 100644 app/src/main/java/com/team7/socialblind/base/State.kt create mode 100644 app/src/main/java/com/team7/socialblind/package-info.java rename app/src/main/java/com/team7/socialblind/{ => ui}/MainActivity.kt (81%) create mode 100644 app/src/main/java/com/team7/socialblind/util/LocaleManager.kt create mode 100644 app/src/main/java/com/team7/socialblind/util/Settings.kt create mode 100644 versions.gradle diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a7509..7bfef59 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 0396cc2..ff6bdea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 29 @@ -21,15 +21,72 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + vectorDrawables.useSupportLibrary = true + } + + dataBinding { + enabled true + } } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.0.1' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + //Dependencies + implementation deps.base.domain + implementation deps.android.constraint_layout + implementation deps.android.activity + implementation deps.android.lifecycle_extensions + implementation deps.android.ktx_fragment + implementation deps.android.fragment + implementation deps.android.curved_view + implementation deps.android.appcompat + implementation deps.android.recyclerview + implementation deps.android.design + implementation deps.android.picasso + implementation deps.android.shimmer + implementation deps.android.circle_imageview + implementation deps.android.image_copper + implementation deps.android.lottie + implementation deps.android.indicator + implementation deps.android.multidex + implementation deps.android.timbre + implementation deps.android.expand_layou + implementation deps.android.scalLayout + implementation deps.android.recycler_tablayout + implementation deps.android.spinner + implementation deps.android.backdrop + implementation deps.android.flex_layout + implementation deps.android.expandableToolabr + implementation deps.android.loadingBtn + implementation deps.android.customeFab + implementation deps.android.prefrences + implementation deps.android.tooltip + implementation deps.android.gesture + implementation deps.android.photoView + implementation deps.android.labelView + implementation deps.android.curve + + implementation deps.epoxy.core + implementation deps.epoxy.databinding + implementation deps.epoxy.paging + kapt deps.epoxy.processor + + implementation deps.firebase.fcm + + implementation deps.kotlin.kotlin_jre + implementation deps.kotlin.coroutines_core + implementation deps.kotlin.coroutines_android + + implementation deps.rxJava.core + implementation deps.rxJava.rxAndroid + implementation deps.rxJava.rxKotlin + implementation deps.rxJava.reactive_network + implementation deps.rxJava.rxpreferences } +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..5b46c61 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "760449034411", + "firebase_url": "https://social-blind.firebaseio.com", + "project_id": "social-blind", + "storage_bucket": "social-blind.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:760449034411:android:d8e38be247b30f7952efee", + "android_client_info": { + "package_name": "com.team7.socialblind" + } + }, + "oauth_client": [ + { + "client_id": "760449034411-k1qi7gvg9iei9btca3lcfbfqieo31agn.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.team7.socialblind", + "certificate_hash": "10ad5f06619d2bae65a29d6bb2bf9bcd6d042e25" + } + }, + { + "client_id": "760449034411-l7j0ocnjreikfbfjahlftsdfuc05rpv6.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCUZgtm0JXKyaCUvdmXCXAG9u8515H7TdM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "760449034411-l7j0ocnjreikfbfjahlftsdfuc05rpv6.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1fa8a12..d7dbae2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,10 +6,11 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:name=".ElbessApplication" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/team7/socialblind/ElbessApplication.kt b/app/src/main/java/com/team7/socialblind/ElbessApplication.kt new file mode 100644 index 0000000..b54ef9e --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/ElbessApplication.kt @@ -0,0 +1,32 @@ +package com.team7.socialblind + +import android.app.Application +import android.content.Context +import android.content.res.Configuration + +import timber.log.Timber + +import com.team7.socialblind.util.LocaleManager + + +class ElbessApplication : Application() { + + + + override fun attachBaseContext(base: Context) { + super.attachBaseContext(LocaleManager.setLocale(base)) + } + + override fun onConfigurationChanged(newConfig: Configuration?) { + super.onConfigurationChanged(newConfig) + LocaleManager.setLocale(this) + } + + override fun onCreate() { + super.onCreate() + if (BuildConfig.DEBUG) { + Timber.plant(Timber.DebugTree()) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/team7/socialblind/base/BaseActivity.kt b/app/src/main/java/com/team7/socialblind/base/BaseActivity.kt new file mode 100644 index 0000000..6ea8c89 --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/base/BaseActivity.kt @@ -0,0 +1,72 @@ +package com.team7.socialblind.base + +import android.content.Context +import android.content.res.Configuration +import com.google.android.material.snackbar.Snackbar +import android.view.inputmethod.InputMethodManager +import android.widget.Toast +import androidx.annotation.StringRes +import androidx.appcompat.app.AppCompatActivity +import com.team7.socialblind.R +import com.team7.socialblind.util.LocaleManager + + +abstract class BaseActivity : AppCompatActivity() { + + override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(LocaleManager.setLocale(newBase)) + } + + override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) { + if (overrideConfiguration != null) { + val uiMode = overrideConfiguration.uiMode + overrideConfiguration.setTo(baseContext.resources.configuration) + overrideConfiguration.uiMode = uiMode + } + super.applyOverrideConfiguration(overrideConfiguration) + } + + fun showSnackBar(message: String) { + val snackbar = Snackbar.make( + findViewById(android.R.id.content), + message, Snackbar.LENGTH_SHORT + ) + snackbar.show() + } + + fun hideKeyboard() { + val view = this.currentFocus + if (view != null) { + val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(view.windowToken, 0) + } + } + + fun showToast(message: String) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } + + fun onError(message: String?) { + if (message != null) { + showSnackBar(message) + } else { + showSnackBar(getString(R.string.uknown_error)) + } + } + + fun onError(@StringRes resId: Int) { + onError(getString(resId)) + } + + fun showMessage(message: String?) { + if (message != null) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this, getString(R.string.uknown_error), Toast.LENGTH_SHORT).show() + } + } + + fun showMessage(@StringRes resId: Int) { + showMessage(getString(resId)) + } +} diff --git a/app/src/main/java/com/team7/socialblind/base/BaseDataSource.kt b/app/src/main/java/com/team7/socialblind/base/BaseDataSource.kt new file mode 100644 index 0000000..51ec2ea --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/base/BaseDataSource.kt @@ -0,0 +1,42 @@ +package com.team7.elbess.base + +import androidx.paging.PositionalDataSource +import timber.log.Timber + +abstract class BaseDataSource : PositionalDataSource() { + + protected lateinit var pageCallback: PageCallback + + override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback) { + Timber.v("load range [${params.startPosition},${params.startPosition + params.loadSize}") + pageCallback = object : PageCallback { + override fun onResult(items: List) { + callback.onResult(items) + } + } + loadPage(LoadParam(params.startPosition, params.loadSize)) + } + + override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback) { + Timber.v("loadInitial size : ${params.pageSize}, reqested loaded size ${params.requestedLoadSize},start position ${params.requestedStartPosition}") + pageCallback = object : PageCallback { + override fun onResult(items: List) { + callback.onResult(items, items.size) + } + } + startInteractor() + loadPage(LoadParam(params.requestedStartPosition, params.pageSize)) + } + + abstract fun startInteractor() + + abstract fun loadPage(loadParam: LoadParam) + + abstract fun dispose() + + data class LoadParam(val start: Int, val size: Int) + + interface PageCallback { + fun onResult(items: List) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/team7/socialblind/base/BaseRecyclerAdapter.kt b/app/src/main/java/com/team7/socialblind/base/BaseRecyclerAdapter.kt new file mode 100644 index 0000000..ca55813 --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/base/BaseRecyclerAdapter.kt @@ -0,0 +1,93 @@ +package com.team7.elbess.base + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SortedList + +/** + * layoutId --> layout idTyped of recycler card + * kClass --> class of recentOp example User::class.java + * D --> Data class example User + * B -> Data Binding Class like CardBinding + * */ +abstract class BaseRecyclerAdapter(kClass: Class, @LayoutRes val layoutId: Int) : + RecyclerView.Adapter.ViewHolder>() { + + val callback: SortedList.Callback = object : SortedList.Callback() { + override fun areItemsTheSame(item1: D, item2: D): Boolean = this@BaseRecyclerAdapter.areItemsTheSame(item1, item2) + + override fun onMoved(fromPosition: Int, toPosition: Int) { + this@BaseRecyclerAdapter.notifyItemMoved(fromPosition, toPosition) + } + + override fun onChanged(position: Int, count: Int) { + this@BaseRecyclerAdapter.notifyItemRangeChanged(position, count) + } + + override fun onInserted(position: Int, count: Int) { + this@BaseRecyclerAdapter.notifyItemRangeInserted(position, count) + } + + override fun onRemoved(position: Int, count: Int) { + this@BaseRecyclerAdapter.notifyItemRangeRemoved(position, count) + } + + override fun compare(o1: D, o2: D): Int = this@BaseRecyclerAdapter.compare(o1, o2) + + override fun areContentsTheSame(oldItem: D, newItem: D): Boolean = this@BaseRecyclerAdapter.areContentsTheSame(oldItem, newItem) + } + + /** + * if you want change any thing in recyclerview just + * change the content of @param{listOfData} and it + * will notify the adapter automaticlly + * */ + + val listOfData: SortedList = SortedList(kClass, callback) + + abstract fun areItemsTheSame(item1: D, item2: D): Boolean + abstract fun compare(o1: D, o2: D): Int + abstract fun areContentsTheSame(oldItem: D, newItem: D): Boolean + abstract fun upDateView(item: D, binding: B) + abstract fun onClickOnItem(item: D, view: View?, binding: B, adapterPostion: Int) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + val binding = DataBindingUtil.inflate(inflater, layoutId, parent, false) + return ViewHolder(binding) + } + + override fun getItemCount(): Int = listOfData.size() + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.upDateView(listOfData[position]) + } + + open fun addAll(items: List) { + listOfData.beginBatchedUpdates() + val size = listOfData.size() + if (size> 0) { + for (i in (size - 1) downTo 0) { + val item = listOfData[i] + if (!items.contains(item)) listOfData.remove(item) + } + } + listOfData.addAll(items) + listOfData.endBatchedUpdates() + } + + inner class ViewHolder(val binding: B) : RecyclerView.ViewHolder(binding.root) { + + fun upDateView(item: D) { + upDateView(item, binding) + binding.root.setOnClickListener { + onClickOnItem(item, it, binding, adapterPosition) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/team7/socialblind/base/BaseViewModel.kt b/app/src/main/java/com/team7/socialblind/base/BaseViewModel.kt new file mode 100644 index 0000000..e7cc391 --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/base/BaseViewModel.kt @@ -0,0 +1,132 @@ +package com.team7.socialblind.base + +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModel +import com.roacult.kero.team7.jstarter_domain.exception.Failure +import com.roacult.kero.team7.jstarter_domain.interactors.EitherInteractor +import com.roacult.kero.team7.jstarter_domain.interactors.ObservableEitherInteractor +import com.roacult.kero.team7.jstarter_domain.interactors.ObservableInteractor +import com.roacult.kero.team7.jstarter_domain.interactors.launchInteractor +import com.team7.elbess.base.State +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job + +abstract class BaseViewModel (initialState: S) : ViewModel() { + + protected val state: MutableLiveData by lazy { + val liveData: MutableLiveData = MutableLiveData() + liveData.value = initialState + liveData + } + + private val job = Job() + private val disposable: CompositeDisposable = CompositeDisposable() + + /** + * scope to launch interactors + * */ + protected val scope = CoroutineScope(Dispatchers.Main + job) + + /** + * this method will change state in live date + * */ + protected fun setState(stateChanger: S.() -> S) { + state.value = state.value?.stateChanger() + } + + /** + * observe state in live date + * */ + fun observe(lifecycleOwner: LifecycleOwner, observer: (S) -> Unit) { + state.observe(lifecycleOwner, Observer(observer)) + } + fun observeNotLifecycle(observer: (S) -> Unit) { + state.observeForever(observer) + } + + /** + * this method will not change state + * it's only used to handle current value of state + * */ + fun withState(stateHandler: (S) -> Unit) { + stateHandler(state.value!!) + } + + fun dispose() { + if (job.isActive) + job.cancel() + disposable.dispose() + } + + override fun onCleared() { + super.onCleared() + dispose() + } + + /** + * launch observable either interactor + * @param interactor interactor you want launch + * @param errorHandler callback of errors + * @param dataHandler callback of results + * @return Disposable to dispose stream + * + * Note : all interactors launched by this method + * will automatically disposed when viewModel destroyed + * */ + protected fun launchEitherObservableInteractor( + interactor: ObservableEitherInteractor, + param: P, + errorHandler: (F) -> Unit, + dataHandler: (R) -> Unit + ): Disposable { + val dispos = interactor.observe(param) { + it.either(errorHandler, dataHandler) + } + disposable.add(dispos) + return dispos + } + + + + protected fun launchObservableInteractor( + interactor: ObservableInteractor, + param: P, + errorHandler: (Throwable) -> Unit, + dataHandler: (Type) -> Unit + ): Disposable { + val dispos = interactor.observe(param, errorHandler, dataHandler) + disposable.add(dispos) + return dispos + } + protected fun launchEitherInteractor( + interactor: EitherInteractor, + param: P, + errorHandler: (F) -> Unit, + dataHandler: (R) -> Unit + ) { + scope.launchInteractor(interactor, param) { + it.either(errorHandler, dataHandler) + } + } + + protected fun launchInteractor(observable: Observable, onError: ((Throwable) -> Unit)? = null, onNext: (T) -> Unit): Disposable { + + val dispos = if (onError != null) observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(onNext, onError) + else observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(onNext) + + disposable.add(dispos) + return dispos + } +} diff --git a/app/src/main/java/com/team7/socialblind/base/State.kt b/app/src/main/java/com/team7/socialblind/base/State.kt new file mode 100644 index 0000000..7a71609 --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/base/State.kt @@ -0,0 +1,3 @@ +package com.team7.elbess.base + +interface State \ No newline at end of file diff --git a/app/src/main/java/com/team7/socialblind/package-info.java b/app/src/main/java/com/team7/socialblind/package-info.java new file mode 100644 index 0000000..5798a5f --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/package-info.java @@ -0,0 +1,4 @@ +@EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "module_") +package com.team7.socialblind; + +import com.airbnb.epoxy.EpoxyDataBindingPattern; diff --git a/app/src/main/java/com/team7/socialblind/MainActivity.kt b/app/src/main/java/com/team7/socialblind/ui/MainActivity.kt similarity index 81% rename from app/src/main/java/com/team7/socialblind/MainActivity.kt rename to app/src/main/java/com/team7/socialblind/ui/MainActivity.kt index d8f128f..15a2a73 100644 --- a/app/src/main/java/com/team7/socialblind/MainActivity.kt +++ b/app/src/main/java/com/team7/socialblind/ui/MainActivity.kt @@ -1,7 +1,8 @@ -package com.team7.socialblind +package com.team7.socialblind.ui import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.team7.socialblind.R class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/team7/socialblind/util/LocaleManager.kt b/app/src/main/java/com/team7/socialblind/util/LocaleManager.kt new file mode 100644 index 0000000..888703a --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/util/LocaleManager.kt @@ -0,0 +1,55 @@ +package com.team7.socialblind.util + +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import android.os.Build +import androidx.preference.PreferenceManager +import java.util.* + +object LocaleManager { + + /** + * set current pref locale + */ + fun setLocale(mContext: Context): Context { + return updateResources(mContext, getLanguagePref(mContext)) + } + + /** + * Set new Locale with context + */ + fun setNewLocale(mContext: Context, language: String): Context { + return updateResources(mContext, language) + } + + /** + * Get saved Locale from SharedPreferences + * + * @param mContext current context + * @return current locale key by default return english locale + */ + fun getLanguagePref(mContext: Context): String { + val mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext) + return mPreferences.getString(Settings.SETTINGS_LANGUAGE, Settings.SETTINGS_LANGUAGE_FR)!! + } + + /** + * update resource + */ + fun updateResources(context: Context, language: String?): Context { + val locale = Locale(language) + Locale.setDefault(locale) + val config = Configuration(context.resources.configuration) + config.setLocale(locale) + return context.createConfigurationContext(config) + } + + /** + * get current locale + */ + fun getLocale(res: Resources): Locale { + val config = res.configuration + return if (Build.VERSION.SDK_INT >= 24) config.locales.get(0) else config.locale + } +} \ No newline at end of file diff --git a/app/src/main/java/com/team7/socialblind/util/Settings.kt b/app/src/main/java/com/team7/socialblind/util/Settings.kt new file mode 100644 index 0000000..f92c10b --- /dev/null +++ b/app/src/main/java/com/team7/socialblind/util/Settings.kt @@ -0,0 +1,29 @@ +package com.team7.socialblind.util + +class Settings { + companion object { + + // prefrences keys + const val SETTINGS_EDIT_PROFILE = "settings_editProfile" + const val SETTINGS_PUBLIC_PROFILE = "settings_public_profile" + const val SETTINGS_SAVE_VIEWS = "settings_save_views" + const val SETTINGS_THEME = "settings_theme" + const val SETTINGS_LANGUAGE = "settings_language" + const val SETTINGS_SIGNOUT = "settings_signout" + const val SETTINGS_REPORT = "settings_report" + const val SETTINGS_RATE_US = "settings_rate_us" + const val SETTINGS_TERMS = "settings_terms" + const val SETTINGS_PRIVACY_POLICER = "settings_privacy_policy" + const val SETTINGS_VERSION = "settings_version" + + // theme options + const val SETTINGS_THEME_LIGHT = "light_theme" + const val SETTINGS_THEME_DARK = "dark_theme" + const val SETTINGS_THEME_SAVNG_BATTERY = "saving_battery_mode" + + // language options + const val SETTINGS_LANGUAGE_FR = "fr" + const val SETTINGS_LANGUAGE_EN = "en" + const val SETTINGS_LANGUAGE_AR = "ar" + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 716af5a..f0d128b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".ui.MainActivity"> Social Blind + Ukncow Error diff --git a/build.gradle b/build.gradle index a87f8fa..c10a7bb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,28 +1,23 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.31' - repositories { - google() - jcenter() - - } + apply from: 'versions.gradle' + addRepos(repositories) dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath deps.android_gradle_plugin + classpath deps.kotlin_gradle_plugin + classpath deps.navigation_safe_args + classpath 'com.google.gms:google-services:4.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { - repositories { - google() - jcenter() - - } + addRepos(repositories) } + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/versions.gradle b/versions.gradle new file mode 100644 index 0000000..d036723 --- /dev/null +++ b/versions.gradle @@ -0,0 +1,234 @@ +/** + *Source largely taken from this OS repo: https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/versions.gradle + * Thank you to everyone involved in this awesome OS project! + * + * In this file, we basically build a tree of deps in a very DRY way. + **/ + +//ext is a way to add extra data key/value pairs to a gradle domain object. Since it has no prefix, +//it is short hand for project.ext in this case. +//[:] is groovy syntax for creating a "Map" Object, which is a collection of key/value pairs + +//create a map of key/value pairs, called deps (deps) +ext.deps = [:] + +//def means we're making a local variable. We'll use this map to build our deps key/value +//pairs below + +def versions = [:] +versions.espresso = "3.1.0" +versions.mockito = "2.13.0" +versions.junit = "5.1.1" +versions.test = "1.0.0" +versions.runner = "1.1.0" +versions.truth = "0.42" +versions.lifecycle = "2.2.0-alpha01" +versions.room = "2.1.0-alpha03" +versions.navigation = "2.1.0-alpha04" +versions.dagger = "2.16" +versions.support_test = "1.0.1" +versions.design = "1.1.0-alpha09" +versions.appcompat = "1.1.0-alpha05" +versions.fragment= "1.1.0-alpha09" +versions.ktx_fragment = "1.0.0" +versions.rec_view = "1.0.0" +versions.constraint_layout = "2.0.0-alpha2" +versions.coroutine_version = "1.0.0" +versions.android_gradle_plugin = '3.4.0' +versions.kotlin = "1.3.21" +versions.jstarter= "1.0.1" +versions.rxJava="2.2.8" +versions.rxKotlin = "2.3.0" +versions.rxAndroid="2.1.1" +versions.circle_image = "3.0.0" +versions.lottieVersion ="3.0.0" +versions.picasso_version = "2.71828" +versions.shimmer = '0.4.0' +versions.multidex = '1.0.3' +versions.image_copper='2.8.0' +versions.paging = "2.1.0" +versions.retrofit ='2.5.0' +versions.retrofit_coroutines='0.9.2' +versions.gson = "2.3" +versions.okhttp = "3.12.0" +versions.roboelectric = "4.2.1" +versions.mockito_kotlin= "2.1.0" +versions.leak_canary="2.0-alpha-1" +versions.stetho = "1.5.0" +versions.chuck = "1.1.0" +versions.curved = "1.2.1" +versions.indicator = '3.0.3' +versions.epoxy="3.4.2" +versions.timbre = "4.7.1" +versions.expande_layout = '2.9.2' +versions.scaleLayout = '1.2.1' +versions.backdrop="0.1.6" +versions.spinner = "2.0.0" +versions.backdrop = "1.0" +versions.flexbox = "1.1.0" +versions.google_services= "16.0.1" +versions.reactive_network = "3.0.3" +versions.checkableView = "1.0.3" +versions.rxpreferences = "2.0.0" +versions.instabug = "8.5.0" +versions.prefrences = "1.1.0-rc01" +versions.fcm = "20.0.0" + +def deps = [:] +def android = [:] +android.appcompat = "androidx.appcompat:appcompat:$versions.appcompat" +android.fragment = "androidx.fragment:fragment:$versions.fragment" +android.activity="androidx.activity:activity-ktx:1.0.0-alpha08" +android.recyclerview = "androidx.recyclerview:recyclerview:$versions.appcompat" +android.design = "com.google.android.material:material:$versions.design" +android.constraint_layout = "androidx.constraintlayout:constraintlayout:$versions.constraint_layout" +android.lifecycle_extensions = "androidx.lifecycle:lifecycle-extensions:$versions.lifecycle" +android.viewModelOnly = "androidx.lifecycle:lifecycle-livedata:$versions.lifecycle" +android.ktx_fragment = "androidx.fragment:fragment-ktx:$versions.ktx_fragment" +android.picasso = "com.squareup.picasso:picasso:$versions.picasso_version" +android.shimmer = "com.facebook.shimmer:shimmer:$versions.shimmer" +android.lottie ="com.airbnb.android:lottie:$versions.lottieVersion" +android.image_copper = "com.theartofdev.edmodo:android-image-cropper:$versions.image_copper" +android.circle_imageview = "de.hdodenhof:circleimageview:$versions.circle_image" +android.custom_fab = "com.github.clans:fab:$versions.custom_fab" +android.multidex = "com.android.support:multidex:$versions.multidex" +android.paging = "androidx.paging:paging-runtime:$versions.paging" +android.navigation_ui= "androidx.navigation:navigation-ui-ktx:$versions.navigation" +android.navigation_fragment = "androidx.navigation:navigation-fragment-ktx:$versions.navigation" +android.leak_canary= "com.squareup.leakcanary:leakcanary-android:$versions.leak_canary" +android.curved_view = "com.github.developer-shivam:Crescento:$versions.curved" +android.indicator ="com.tbuonomo.andrui:viewpagerdotsindicator:$versions.indicator" +android.timbre = "com.jakewharton.timber:timber:$versions.timbre" +android.expand_layou = "net.cachapa.expandablelayout:expandablelayout:$versions.expande_layout" +android.recycler_tablayout= "com.nshmura:recyclertablayout:1.5.0" +android.scalLayout = "com.github.iammert:ScalingLayout:$versions.scaleLayout" +android.backdrop="ru.semper-viventem.backdrop:backdrop:$versions.backdrop" +android.spinner = "com.github.ganfra:material-spinner:$versions.spinner" +android.backdrop = "com.github.roiacult:BackdropLayout:$versions.backdrop" +android.facebook = "com.facebook.android:facebook-login:[4,5)" +android.flex_layout = "com.google.android:flexbox:$versions.flexbox" +android.google_services= "com.google.android.gms:play-services-auth:$versions.google_services" +android.expandableToolabr = "com.github.roiacult:ExpandableToolbar:1.0.0" +android.checkableView = "com.github.okdroid:checkablechipview:$versions.checkableView" +android.instabug = "com.instabug.library:instabug:$versions.instabug" +android.loadingBtn ="com.github.dmytrodanylyk.android-process-button:library:1.0.4" +android.customeFab = "com.leinardi.android:speed-dial:3.0.0" +android.prefrences = "androidx.preference:preference-ktx:$versions.prefrences" +android.numberPicker = "com.github.sephiroth74:NumberSlidingPicker:1.0.3" +android.tooltip = "com.github.sephiroth74:android-target-tooltip:2.0.4" +android.gesture = "it.sephiroth.android.library.uigestures:uigesture-recognizer-kotlin:1.2.7" +android.photoView = "com.github.chrisbanes:PhotoView:2.3.0" +android.labelView = "com.github.linger1216:labelview:v1.1.2" +android.curve = "com.github.florent37:shapeofview:1.4.7" +deps.android = android + +def room = [:] +room.runtime = "androidx.room:room-runtime:$versions.room" +room.compiler = "androidx.room:room-compiler:$versions.room" +room.rxJava= "androidx.room:room-rxjava2:$versions.room" +room.coroutines="androidx.room:room-coroutines:$versions.room" +room.testing = "androidx.room:room-testing:$versions.room" +deps.room = room + +def base = [:] +base.jstarter = "com.roacult.team7:Jstarter:$versions.jstarter" +base.domain = "com.roacult.team7:Jstarter_domain:$versions.jstarter" +base.presentation = "com.roacult.team7:Jstarter_presentation:$versions.jstarter" +deps.base = base + +def dagger=[:] +dagger.core= "com.google.dagger:dagger-android:$versions.dagger" +dagger.javax = "javax.inject:javax.inject:1" +dagger.support= "com.google.dagger:dagger-android-support:$versions.dagger" +dagger.kaptCompiler= "com.google.dagger:dagger-compiler:$versions.dagger" +dagger.kaptProcessor= "com.google.dagger:dagger-android-processor:$versions.dagger" +deps.dagger=dagger + +def epoxy = [:] +epoxy.core = "com.airbnb.android:epoxy:$versions.epoxy" +epoxy.processor = "com.airbnb.android:epoxy-processor:$versions.epoxy" +epoxy.databinding = "com.airbnb.android:epoxy-databinding:$versions.epoxy" +epoxy.paging = "com.airbnb.android:epoxy-paging:$versions.epoxy" +deps.epoxy = epoxy + +def retrofit =[:] +retrofit.core = "com.squareup.retrofit2:retrofit:$versions.retrofit" +retrofit.coroutine_support= "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:$versions.retrofit_coroutines" +retrofit.okhttp= "com.squareup.okhttp:okhttp:$versions.retrofit" +retrofit.gson = "com.google.code.gson:gson:$versions.gson" +retrofit.rxjava = "com.squareup.retrofit2:adapter-rxjava2:$versions.retrofit" +retrofit.gson_retrofit = "com.squareup.retrofit2:converter-gson:$versions.retrofit" +retrofit.okhttp3 = "com.squareup.okhttp3:okhttp:$versions.okhttp" +retrofit.logging ="com.squareup.okhttp3:logging-interceptor:$versions.okhttp" +retrofit.mockweberver ="com.squareup.okhttp3:mockwebserver:$versions.okhttp" +retrofit.stetho = "com.facebook.stetho:stetho-okhttp3:$versions.stetho" +retrofit.chuck_release = "com.readystatesoftware.chuck:library-no-op:$versions.chuck" +retrofit.chuck_debug ="com.readystatesoftware.chuck:library:$versions.chuck" +retrofit.scalar_converter= "com.squareup.retrofit2:converter-scalars:$versions.retrofit" +deps.retrofit = retrofit + +def firebase =[:] +firebase.fcm = "com.google.firebase:firebase-messaging:$versions.fcm" +deps.firebase = firebase + +def test = [:] +test.junit = "org.junit.jupiter:junit-jupiter-api:$versions.junit" +test.kotlin_junit = "org.jetbrains.kotlin:kotlin-test-junit:$versions.kotlin" +test.mockk = "io.mockk:mockk:1.8.9.kotlin13" +test.mock_kotlin= "com.nhaarman.mockitokotlin2:mockito-kotlin:$versions.mockito_kotlin" +test.roboelectric = "org.robolectric:robolectric:$versions.roboelectric" +deps.test = test + +def android_test = [:] +android_test.core ="androidx.test:core:$versions.test" +android_test.runner = "androidx.test:runner:$versions.runner" +android_test.rules= "androidx.test:rules:$versions.runner" +android_test.junit ="androidx.test.ext:junit:$versions.test" +android_test.ext_truth="androidx.test.ext:truth:$versions.test" +android_test.truth= "com.google.truth:truth:$versions.truth" +android_test.espresso_core= "androidx.test.espresso:espresso-core:$versions.espresso" +android_test.espresso_contrib= "androidx.test.espresso:espresso-contrib:$versions.espresso" +android_test.espresso_intents="androidx.test.espresso:espresso-intents:$versions.espresso" +android_test.espresso_accessibility = "androidx.test.espresso:espresso-accessibility:$versions.espresso" +android_test.espresso_idling_res = "androidx.test.espresso:espresso-idling-resource:$versions.espresso" +android_test.espresso_idling_concureent = "androidx.test.espresso.idling:idling-concurrent:$versions.espresso" +deps.android_test =android_test + +def kotlin = [:] +kotlin.kotlin_jre = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin" +kotlin.kotlin_gradle_plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin" +kotlin.coroutines_core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutine_version" +kotlin.coroutines_android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$versions.coroutine_version" +kotlin.rx2 = "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$versions.coroutine_version" +deps.kotlin = kotlin + +def rxjava =[:] +rxjava.core="io.reactivex.rxjava2:rxjava:$versions.rxJava" +rxjava.rxKotlin = "io.reactivex.rxjava2:rxkotlin:$versions.rxKotlin" +rxjava.rxAndroid= "io.reactivex.rxjava2:rxandroid:$versions.rxAndroid" +rxjava.rxpreferences = "com.f2prateek.rx.preferences2:rx-preferences:$versions.rxpreferences" +rxjava.reactive_network = "com.github.pwittchen:reactivenetwork-rx2:$versions.reactive_network" +deps.rxJava = rxjava + +def build_versions = [:] +build_versions.min_sdk = 19 +build_versions.target_sdk = 28 +build_versions.CODE_VERSION = 1 +build_versions.VERSION = "1.0.0" +ext.build_versions = build_versions + +deps.android_gradle_plugin = "com.android.tools.build:gradle:$versions.android_gradle_plugin" +deps.kotlin_gradle_plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin" +deps.navigation_safe_args = "androidx.navigation:navigation-safe-args-gradle-plugin:$versions.navigation" +ext.deps = deps + + +static def addRepos(RepositoryHandler handler) { + handler.google() + handler.jcenter() + handler.maven { url 'https://jitpack.io' } + handler.maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } + handler.maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } +} + +ext.addRepos = this.&addRepos \ No newline at end of file