Repository: bitvale/DroidMotion
Branch: master
Commit: 8bf3d8e269fd
Files: 73
Total size: 100.9 KB
Directory structure:
gitextract_vvxwq36_/
├── .gitignore
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── bitvale/
│ │ └── droidmotion/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── bitvale/
│ │ │ └── droidmotion/
│ │ │ ├── MainActivity.kt
│ │ │ ├── adapter/
│ │ │ │ ├── BaseViewHolder.kt
│ │ │ │ └── RecyclerAdapter.kt
│ │ │ ├── common/
│ │ │ │ ├── Constants.kt
│ │ │ │ └── Extensions.kt
│ │ │ ├── fragment/
│ │ │ │ ├── BaseFragment.kt
│ │ │ │ ├── DetailsFragment.kt
│ │ │ │ └── RecyclerFragment.kt
│ │ │ ├── listener/
│ │ │ │ ├── BottomNavigationViewListener.kt
│ │ │ │ └── OnBackPressedListener.kt
│ │ │ └── model/
│ │ │ └── DataProvider.kt
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── item_animation_fall_down.xml
│ │ │ └── layout_animation_fall_down.xml
│ │ ├── animator/
│ │ │ └── main_list_animator.xml
│ │ ├── drawable/
│ │ │ ├── bottom_navigation_selector.xml
│ │ │ ├── ic_complaint.xml
│ │ │ ├── ic_correct.xml
│ │ │ ├── ic_error.xml
│ │ │ ├── ic_export.xml
│ │ │ ├── ic_file.xml
│ │ │ ├── ic_incorrect.xml
│ │ │ ├── ic_left.xml
│ │ │ ├── ic_menu_account.xml
│ │ │ ├── ic_menu_dialog.xml
│ │ │ ├── ic_menu_gift.xml
│ │ │ ├── ic_menu_main.xml
│ │ │ ├── ic_menu_wallet.xml
│ │ │ ├── ic_negative.xml
│ │ │ ├── ic_not_received.xml
│ │ │ ├── ic_positive.xml
│ │ │ ├── ic_received.xml
│ │ │ ├── ic_right.xml
│ │ │ ├── ic_sort.xml
│ │ │ ├── img_apple.xml
│ │ │ ├── img_dribble.xml
│ │ │ ├── img_facebook.xml
│ │ │ ├── img_github.xml
│ │ │ ├── img_google_play.xml
│ │ │ ├── img_instagram.xml
│ │ │ ├── img_twitter.xml
│ │ │ ├── img_vimeo.xml
│ │ │ ├── img_vk.xml
│ │ │ ├── img_youtube.xml
│ │ │ └── splash_screen.xml
│ │ ├── layout/
│ │ │ ├── activity_main.xml
│ │ │ ├── fragment_details.xml
│ │ │ ├── fragment_recycler.xml
│ │ │ ├── item_card.xml
│ │ │ └── item_details.xml
│ │ ├── menu/
│ │ │ └── bottom_navigation_main.xml
│ │ ├── transition/
│ │ │ └── shared_element_transition.xml
│ │ ├── values/
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── values-sw600dp/
│ │ │ └── dimens.xml
│ │ └── values-sw720dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── bitvale/
│ └── droidmotion/
│ └── ExampleUnitTest.kt
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches/build_file_checksums.ser
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild
.idea
app/release/
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2018 Alexander Kolpakov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# DroidMotion
<img src="/art/preview.gif" alt="sample" title="sample" width="320" height="600" align="right"/>
[](http://developer.android.com/index.html)
[](https://android-arsenal.com/api?level=19)
[](/LICENSE)
This is an Android sample project that shows how to implement a simple android motion.
#
You can see the description of the implementation on medium and get the sample app with similar motions on Google Play.
<a href="https://play.google.com/store/apps/details?id=com.skycodetech.codingquiz">
<img alt="Android app on Google Play" src="/art/google_play.png" width="172" height="70"/>
</a>
<a href="https://medium.com/@bitvale/from-dribbble-template-to-android-motion-74fe03282c88">
<img alt="Read on Medium" src="/art/medium.png" width="172" height="70" hspace="8" />
</a>
<a href="https://dribbble.com/shots/5613604-Mobile-app-motion">
<img alt="Design on Dribbble" src="/art/dribbble.png" width="172" height="70"/>
</a>
#
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion rootProject.compileSdkVersion
defaultConfig {
applicationId "com.bitvale.droidmotion"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
useProguard false
minifyEnabled false
}
release {
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
androidExtensions {
experimental = true
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Testing dependencies
testImplementation "junit:junit:$rootProject.junitVersion"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
implementation "androidx.appcompat:appcompat:$rootProject.androidxVersion"
implementation "androidx.recyclerview:recyclerview:$rootProject.androidxVersion"
implementation "androidx.cardview:cardview:$rootProject.androidxVersion"
implementation "com.google.android.material:material:$rootProject.materialVersion"
implementation "androidx.constraintlayout:constraintlayout:$rootProject.constraintLayoutVersion"
implementation "androidx.core:core-ktx:$rootProject.androidxVersion"
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hideBottomNavigationView the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/androidTest/java/com/bitvale/droidmotion/ExampleInstrumentedTest.kt
================================================
package com.bitvale.droidmotion
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getTargetContext()
assertEquals("com.bitvale.animation", appContext.packageName)
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bitvale.androidmotion">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.Launcher">
<activity android:name="com.bitvale.droidmotion.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/MainActivity.kt
================================================
package com.bitvale.droidmotion
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.bitvale.androidmotion.R
import com.bitvale.droidmotion.common.replaceFragmentInActivity
import com.bitvale.droidmotion.fragment.RecyclerFragment
import com.bitvale.droidmotion.listener.BottomNavigationViewListener
import com.bitvale.droidmotion.listener.OnBackPressedListener
import kotlinx.android.synthetic.main.activity_main.*
/**
* Created by Alexander Kolpakov on 25.07.2018
*/
class MainActivity : AppCompatActivity(), BottomNavigationViewListener {
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupFragment(RecyclerFragment.newInstance())
}
private fun setupFragment(fragment: Fragment) {
supportFragmentManager.findFragmentById(R.id.fragment_container)
?: fragment.let {
replaceFragmentInActivity(it, R.id.fragment_container)
}
}
override fun hideBottomNavigationView() {
if (bottom_navigation.translationY == 0f)
bottom_navigation.animate()
.translationY(bottom_navigation.height.toFloat())
.setDuration(250)
.start()
}
override fun showBottomNavigationView() {
if (bottom_navigation.translationY >= bottom_navigation.height.toFloat())
bottom_navigation.animate()
.translationY(0f)
.setDuration(400)
.start()
}
override fun onBackPressed() {
val fragmentList = supportFragmentManager.fragments
var proceedToSuper = true
for (fragment in fragmentList) {
if (fragment is OnBackPressedListener) {
proceedToSuper = false
(fragment as OnBackPressedListener).onBackPressed()
}
}
if (proceedToSuper) super.onBackPressed()
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/adapter/BaseViewHolder.kt
================================================
package com.bitvale.droidmotion.adapter
import android.os.Build
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import com.bitvale.androidmotion.R
import com.bitvale.droidmotion.common.inflate
import com.bitvale.droidmotion.model.DataProvider.BaseData
import com.bitvale.droidmotion.model.DataProvider.Card
import com.bitvale.droidmotion.model.DataProvider.Details
import com.bitvale.droidmotion.common.TRANSITION_CARD
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_card.*
import kotlinx.android.synthetic.main.item_details.*
/**
* Created by Alexander Kolpakov on 29.07.2018
*/
abstract class BaseViewHolder<T : BaseData>(view: View) : RecyclerView.ViewHolder(view), LayoutContainer {
override val containerView: View?
get() = itemView
abstract fun bind(data: T, listener: View.OnClickListener? = null)
class CardViewHolder(parent: ViewGroup) : BaseViewHolder<Card>(parent.inflate(R.layout.item_card)) {
override fun bind(data: Card, listener: View.OnClickListener?) {
containerView?.setOnClickListener(listener)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
containerView?.transitionName = TRANSITION_CARD + adapterPosition
}
tv_title.text = data.name
tv_amount.text = data.amount
tv_date.text = data.date
tv_status.text = data.status.code
img_status.setImageResource(data.status.iconId)
img_card.setImageResource(data.imageId)
}
}
class DetailsViewHolder(parent: ViewGroup) : BaseViewHolder<Details>(parent.inflate(R.layout.item_details)) {
override fun bind(data: Details, listener: View.OnClickListener?) {
tv_details_title.text = data.title
tv_details_subtitle.text = data.subtitle
tv_details_amount.text = data.amount
}
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/adapter/RecyclerAdapter.kt
================================================
package com.bitvale.droidmotion.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import com.bitvale.droidmotion.model.DataProvider.BaseData
import com.bitvale.droidmotion.model.DataProvider.Details
import com.bitvale.droidmotion.adapter.BaseViewHolder.DetailsViewHolder
import com.bitvale.droidmotion.adapter.BaseViewHolder.CardViewHolder
/**
* Created by Alexander Kolpakov on 17.07.2018
*/
class RecyclerAdapter<T : BaseData>(private var dataSet: List<T>, private var listener: View.OnClickListener? = null)
: RecyclerView.Adapter<BaseViewHolder<T>>() {
@Suppress("UNCHECKED_CAST")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T> {
return when (viewType) {
0 -> DetailsViewHolder(parent) as BaseViewHolder<T>
else -> CardViewHolder(parent) as BaseViewHolder<T>
}
}
override fun getItemCount() = dataSet.size
override fun getItemViewType(position: Int): Int {
val type = dataSet[0].javaClass
return when (type) {
Details::class.java -> 0
else -> 1
}
}
override fun onBindViewHolder(holder: BaseViewHolder<T>, position: Int) = holder.bind(dataSet[position], listener)
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/common/Constants.kt
================================================
package com.bitvale.droidmotion.common
const val TRANSITION_CARD = "card_transition_"
const val TRANSITION_TOOLBAR = "toolbar_transition"
const val EXTRA_COORDINATES = "coordinates"
const val EXTRA_POSITION = "position"
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/common/Extensions.kt
================================================
package com.bitvale.droidmotion.common
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.content.Context
import android.os.Build
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView
import androidx.core.view.drawToBitmap
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.bitvale.androidmotion.R
/**
* Created by Alexander Kolpakov on 17.07.2018
*/
fun ViewGroup.inflate(@LayoutRes layoutId: Int, attachToRoot: Boolean = false): View {
return LayoutInflater.from(context).inflate(layoutId, this, attachToRoot)
}
fun Context.getStatusBarHeight(): Int {
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
else 0
}
fun Context.getToolbarHeight(): Int {
val tv = TypedValue()
return if (theme.resolveAttribute(android.R.attr.actionBarSize, tv, true))
TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
else 0
}
fun AppCompatActivity.replaceFragmentInActivity(fragment: Fragment, frameId: Int) {
supportFragmentManager.transact {
replace(frameId, fragment)
}
}
private inline fun FragmentManager.transact(action: FragmentTransaction.() -> Unit) {
beginTransaction().apply {
action()
}.commit()
}
fun View.copyViewImage(): View {
val copy = ImageView(context)
val bitmap = drawToBitmap()
copy.setImageBitmap(bitmap)
// On pre-Lollipop when we create a copy, the card view's shadow is copied too as content and
// we do not need an additional card view.
return (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CardView(context).apply {
cardElevation = resources.getDimension(R.dimen.card_elevation)
radius = resources.getDimension(R.dimen.card_corner_radius)
addView(copy)
}
} else {
copy
}).apply {
layoutParams = this@copyViewImage.layoutParams
layoutParams.height = this@copyViewImage.height
layoutParams.width = this@copyViewImage.width
x = this@copyViewImage.x
y = this@copyViewImage.y
}
}
fun Animator.withEndAction(action: () -> Unit): Animator {
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
action()
}
})
return this
}
fun Animator.withStartAction(action: () -> Unit): Animator {
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
action()
}
})
return this
}
inline fun supportsLollipop(action: () -> Unit) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
action()
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/fragment/BaseFragment.kt
================================================
package com.bitvale.droidmotion.fragment
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.cardview.widget.CardView
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import com.bitvale.androidmotion.R
import com.bitvale.droidmotion.common.getStatusBarHeight
/**
* Created by Alexander Kolpakov on 26.07.2018
*/
open class BaseFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setupToolbarMargin(view)
}
private fun setupToolbarMargin(view: View) {
val toolbar = view.findViewById<View?>(R.id.toolbar)
toolbar?.let {
val statusBarHeight = context?.getStatusBarHeight()
val lp = it.layoutParams as ViewGroup.LayoutParams
lp.height += statusBarHeight as Int
if (it is CardView) {
it.setContentPadding(0, statusBarHeight, 0, 0)
} else {
it.updatePadding(top = statusBarHeight)
}
}
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/fragment/DetailsFragment.kt
================================================
package com.bitvale.droidmotion.fragment
import android.animation.AnimatorInflater
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnticipateInterpolator
import android.view.animation.OvershootInterpolator
import androidx.core.view.doOnLayout
import androidx.core.view.updatePadding
import com.bitvale.androidmotion.R
import com.bitvale.droidmotion.common.*
import com.bitvale.droidmotion.listener.OnBackPressedListener
import com.bitvale.droidmotion.model.DataProvider
import kotlinx.android.synthetic.main.fragment_details.*
import kotlinx.android.synthetic.main.item_card.*
/**
* Created by Alexander Kolpakov on 25.07.2018
*/
class DetailsFragment : BaseFragment(), OnBackPressedListener {
private lateinit var coordinates: FloatArray
companion object {
const val TAG = "DetailsFragment"
fun newInstance(coordinates: FloatArray, adapterPosition: Int): DetailsFragment {
val bundle = Bundle().apply {
putFloatArray(EXTRA_COORDINATES, coordinates)
putInt(EXTRA_POSITION, adapterPosition)
}
return DetailsFragment().apply { arguments = bundle }
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
coordinates = it.getFloatArray(EXTRA_COORDINATES)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_details, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val position = if (arguments != null) (arguments as Bundle).getInt(EXTRA_POSITION)
else 0
setupViews(position)
if (savedInstanceState == null) {
animateToolbar()
fab_negative.animate()
.translationY(0f)
.setDuration(650)
.setInterpolator(OvershootInterpolator(4f))
.start()
fab_positive.animate()
.translationY(0f)
.setStartDelay(100)
.setDuration(650)
.setInterpolator(OvershootInterpolator(4f))
.start()
} else {
toolbar.alpha = 1f
}
}
private fun setupViews(position: Int) {
supportsLollipop {
details_card.transitionName = TRANSITION_CARD + position
toolbar_container.transitionName = TRANSITION_TOOLBAR
}
(details_card.layoutParams as ViewGroup.MarginLayoutParams).topMargin = coordinates[2].toInt()
val data = DataProvider.getCardData()[position]
tv_title.text = data.name
tv_amount.text = data.amount
tv_date.text = data.date
tv_status.text = data.status.code
img_status.setImageResource(data.status.iconId)
img_card.setImageResource(data.imageId)
fab_negative.setOnClickListener { onBackPressed() }
with(recycler_view) {
adapter = com.bitvale.droidmotion.adapter.RecyclerAdapter(DataProvider.getDetailsData())
setHasFixedSize(true)
fab_negative.doOnLayout {
val paddingBottom = (paddingBottom + fab_negative.height * 1.5).toInt()
updatePadding(bottom = paddingBottom)
}
}
}
override fun onBackPressed() {
animateViewsOut()
}
private fun animateViewsOut() {
val translateTo = fab_negative.height * 2f
AnimatorInflater.loadAnimator(activity, R.animator.main_list_animator).apply {
setTarget(recycler_view)
start()
}
fab_negative.animate()
.translationY(translateTo)
.setDuration(350)
.setInterpolator(AnticipateInterpolator(2f))
.start()
fab_positive.animate()
.translationY(translateTo)
.setStartDelay(50)
.setDuration(350)
.withEndAction {
activity?.supportFragmentManager?.popBackStack()
}
.setInterpolator(AnticipateInterpolator(2f))
.start()
animateToolbar(0f, 350)
}
private fun animateToolbar(alphaTo: Float = 1f, duration: Long = 200) {
toolbar.animate().alpha(alphaTo).setDuration(duration).start()
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/fragment/RecyclerFragment.kt
================================================
package com.bitvale.droidmotion.fragment
import android.animation.AnimatorInflater
import android.animation.ValueAnimator
import android.os.Bundle
import android.transition.TransitionInflater
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.doOnLayout
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bitvale.androidmotion.R
import com.bitvale.droidmotion.adapter.RecyclerAdapter
import com.bitvale.droidmotion.common.*
import com.bitvale.droidmotion.listener.BottomNavigationViewListener
import com.bitvale.droidmotion.model.DataProvider
import kotlinx.android.synthetic.main.fragment_recycler.*
/**
* Created by Alexander Kolpakov on 25.07.2018
*/
class RecyclerFragment : BaseFragment(), View.OnClickListener {
companion object {
const val TAG = "RecyclerFragment"
fun newInstance(): RecyclerFragment {
return RecyclerFragment()
}
}
var bottomNavListener: BottomNavigationViewListener? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_recycler, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
if (savedInstanceState == null) {
root.doOnLayout {
toolbar.animate()
.translationY(0f)
.alpha(1f)
.setDuration(400)
.start()
bottomNavListener?.showBottomNavigationView()
}
} else {
toolbar.alpha = 1f
toolbar.translationY = 0f
}
}
private fun setupViews() {
supportsLollipop {
details_toolbar_transition_helper.transitionName = TRANSITION_TOOLBAR
}
details_toolbar_transition_helper.translationY = -resources.getDimension(R.dimen.details_toolbar_container_height)
toolbar.translationY = -toolbar.context.getToolbarHeight().toFloat()
val elevation = resources.getDimension(R.dimen.toolbar_elevation)
with(recycler_view) {
adapter = RecyclerAdapter(DataProvider.getCardData(), this@RecyclerFragment)
setHasFixedSize(true)
val lm = layoutManager as LinearLayoutManager
addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (dy > 0) bottomNavListener?.hideBottomNavigationView()
if (dy < 0) bottomNavListener?.showBottomNavigationView()
if (lm.findFirstCompletelyVisibleItemPosition() == 0) {
if (toolbar.cardElevation == 0f) return
animateToolbarElevation(true)
} else {
if (toolbar.cardElevation > 0f) return
toolbar.cardElevation = elevation
}
}
})
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if (activity is BottomNavigationViewListener) {
bottomNavListener = activity as BottomNavigationViewListener
} else {
throw ClassCastException("$activity must implement BottomNavigationViewListener")
}
}
override fun onClick(view: View) {
val fragmentTransaction = initFragmentTransaction(view)
val copy = view.copyViewImage()
copy.y += toolbar.height
root.addView(copy)
view.visibility = View.INVISIBLE
startAnimation(copy, fragmentTransaction)
}
private fun initFragmentTransaction(view: View): FragmentTransaction? {
val toY = view.resources.getDimensionPixelOffset(R.dimen.details_toolbar_container_height) - view.height / 2f
val positions = FloatArray(3)
positions[0] = view.x
positions[1] = view.y + toolbar.height
positions[2] = toY
val adapterPosition = recycler_view.getChildAdapterPosition(view)
val detailsFragment = DetailsFragment.newInstance(positions, adapterPosition)
val transaction = fragmentManager?.beginTransaction()
?.replace(R.id.fragment_container, detailsFragment, DetailsFragment.TAG)
?.addToBackStack(null)
supportsLollipop {
val transition = TransitionInflater.from(context)
.inflateTransition(R.transition.shared_element_transition)
detailsFragment.sharedElementEnterTransition = transition
transaction
?.addSharedElement(view, view.transitionName)
?.addSharedElement(details_toolbar_transition_helper, details_toolbar_transition_helper.transitionName)
}
return transaction
}
private fun startAnimation(view: View, fragmentTransaction: FragmentTransaction?) {
AnimatorInflater.loadAnimator(activity, R.animator.main_list_animator).apply {
setTarget(recycler_view)
withStartAction { if (toolbar.cardElevation > 0) animateToolbarElevation(true) }
withEndAction {
recycler_view.visibility = View.INVISIBLE
val toY = view.resources.getDimensionPixelOffset(R.dimen.details_toolbar_container_height) - view.height / 2f
view.animate().y(toY).start()
toolbar.animate()
.translationY(-toolbar.height.toFloat())
.alpha(0f)
.setDuration(600)
.withStartAction {
bottomNavListener?.hideBottomNavigationView()
details_toolbar_transition_helper.animate().translationY(0f).setDuration(500).start()
}
.withEndAction {
fragmentTransaction?.commitAllowingStateLoss()
}
.start()
}
start()
}
}
private fun animateToolbarElevation(animateOut: Boolean) {
var valueFrom = resources.getDimension(R.dimen.toolbar_elevation)
var valueTo = 0f
if (!animateOut) {
valueTo = valueFrom
valueFrom = 0f
}
ValueAnimator.ofFloat(valueFrom, valueTo).setDuration(250).apply {
startDelay = 0
addUpdateListener { toolbar.cardElevation = it.animatedValue as Float }
start()
}
}
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/listener/BottomNavigationViewListener.kt
================================================
package com.bitvale.droidmotion.listener
/**
* Created by Alexander Kolpakov on 29.07.2018
*/
interface BottomNavigationViewListener {
fun hideBottomNavigationView()
fun showBottomNavigationView()
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/listener/OnBackPressedListener.kt
================================================
package com.bitvale.droidmotion.listener
/**
* Created by Alexander Kolpakov on 26.07.2018
*/
interface OnBackPressedListener {
fun onBackPressed()
}
================================================
FILE: app/src/main/java/com/bitvale/droidmotion/model/DataProvider.kt
================================================
package com.bitvale.droidmotion.model
import androidx.annotation.DrawableRes
import com.bitvale.androidmotion.R
/**
* Created by Alexander Kolpakov on 24.07.2018
*/
object DataProvider {
fun getCardData(): List<Card> {
val data = ArrayList<Card>()
data.add(Card(0, "Google Play", "28.07.2018", "$38,456.78", Status.COMPLAINT, R.drawable.img_google_play))
data.add(Card(1, "Twitter", "27.07.2018", "$1,550.60", Status.RECEIVED, R.drawable.img_twitter))
data.add(Card(2, "YouTube", "27.07.2018", "$14,340.00", Status.CORRECT, R.drawable.img_youtube))
data.add(Card(3, "Dribbble", "26.07.2018", "$2,678.27", Status.ERROR, R.drawable.img_dribble))
data.add(Card(4, "Apple Store", "26.07.2018", "$20,479.12", Status.CORRECT, R.drawable.img_apple))
data.add(Card(5, "VK", "25.07.2018", "$13,846.13", Status.INCORRECT, R.drawable.img_vk))
data.add(Card(6, "Instagram", "25.07.2018", "$24,856.17", Status.NOT_RECEIVED, R.drawable.img_instagram))
data.add(Card(7, "Github", "24.07.2018", "$376.90", Status.COMPLAINT, R.drawable.img_github))
data.add(Card(8, "Vimeo", "23.07.2018", "$7,568.02", Status.RECEIVED, R.drawable.img_vimeo))
data.add(Card(9, "Facebook", "10.07.2018", "$18,347.32", Status.INCORRECT, R.drawable.img_facebook))
return data
}
fun getDetailsData(): List<Details> {
val data = ArrayList<Details>()
data.add(Details(0, "In App purchase\"Gem\"", "$14,340.00 X1 (including VAT 10%)", "$14,340.00"))
data.add(Details(0, "In App purchase \"Money\"", "$2,456.78 X1 (including VAT 10%)", "$2,456.78"))
data.add(Details(0, "Interstitial Ads", "$1,150.15 X1 (including VAT 10%)", "$1,150.15"))
data.add(Details(0, "Rewarded video", "$566.20 X1 (including VAT 10%)", "$566.20"))
return data
}
interface BaseData
data class Card(val id: Int, val name: String, val date: String, val amount: String, val status: Status,
@DrawableRes val imageId: Int) : BaseData
data class Details(val id: Int, val title: String, val subtitle: String, val amount: String) : BaseData
enum class Status(val code: String, @DrawableRes val iconId: Int) {
CORRECT("Correct", R.drawable.ic_correct),
INCORRECT("Incorrect", R.drawable.ic_incorrect),
COMPLAINT("Complaint", R.drawable.ic_complaint),
ERROR("Error", R.drawable.ic_error),
RECEIVED("Received", R.drawable.ic_received),
NOT_RECEIVED("Not received", R.drawable.ic_not_received)
}
}
================================================
FILE: app/src/main/res/anim/item_animation_fall_down.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime">
<translate
android:fromYDelta="-20%"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />
<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />
<scale
android:fromXScale="105%"
android:fromYScale="105%"
android:interpolator="@android:anim/decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="100%"
android:toYScale="100%" />
</set>
================================================
FILE: app/src/main/res/anim/layout_animation_fall_down.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_fall_down"
android:animationOrder="normal"
android:delay="15%" />
================================================
FILE: app/src/main/res/animator/main_list_animator.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="translationY"
android:valueType="floatType"
android:duration="300"
android:valueTo="-40"/>
<objectAnimator
android:propertyName="alpha"
android:valueType="floatType"
android:duration="300"
android:valueTo="0"/>
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:duration="300"
android:valueTo="0.96"/>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:duration="300"
android:valueTo="0.96"/>
</set>
================================================
FILE: app/src/main/res/drawable/bottom_navigation_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorAccent" android:state_checked="true" />
<item android:color="@color/color_disabled" android:state_checked="false" />
</selector>
================================================
FILE: app/src/main/res/drawable/ic_complaint.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M12 2C6.5 2 2 6.5 2 12 2 17.5 6.5 22 12 22 17.5 22 22 17.5 22 12 22 6.5 17.5 2 12 2Zm0.617065 16l-1.799987 0 0 -1.799988 1.799987 0 0 1.799988zm2.100037 -6.197998c-0.498047 0.599976 -1.302002 0.995972 -1.697998 1.5C12.617065 13.799988 12.617065 14.400024 12.617065 15l-1.799987 0c0 -1.002014 0 -1.848022 0.401977 -2.447998 0.396057 -0.599976 1.200012 -0.95398 1.698059 -1.349976 1.451965 -1.3440548 1.09198 -3.2460323 -0.900024 -3.4020382 -0.994141 0 -1.799988 0.8059082 -1.799988 1.7999878l-1.7999877 0C8.4171143 7.6117554 10.02887 6 12.01709 6c3.210022 0.132019 4.607971 3.3720093 2.700012 5.802002z"
android:fillColor="#a4a4a4" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_correct.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M12 2C6.5 2 2 6.5 2 12 2 17.5 6.5 22 12 22 17.5 22 22 17.5 22 12 22 6.5 17.5 2 12 2Zm-1.8 15.1l-4.4 -4.4 1.5 -1.5 2.9 2.9 6.6 -6.6 1.5 1.5 -8.1 8.1z"
android:fillColor="#008dff" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_error.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M21.711304 11.5L17.288696 3.8397217c-0.17865 -0.3093872 -0.508789 -0.5 -0.866028 -0.5l-8.8453365 0c-0.3572388 0 -0.6873779 0.1906128 -0.8660278 0.5L2.2886963 11.5c-0.1786499 0.309387 -0.1786499 0.690613 0 1l4.4226074 7.660278c0.1786499 0.309388 0.5087891 0.5 0.8660278 0.5l8.8453365 0c0.357239 0 0.687378 -0.190612 0.866028 -0.5L21.711304 12.5c0.17865 -0.309387 0.17865 -0.690613 0 -1zM16.5 15.231018L15.231018 16.5 12 13.268982 8.7689819 16.5 7.5 15.231018 10.731018 12 7.5 8.7689819 8.7689819 7.5 12 10.731018 15.231018 7.5 16.5 8.7689819 13.268982 12 16.5 15.231018Z"
android:fillColor="#ff4d6a" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_export.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#eee"
android:pathData="M19.229492 22.19043l-14.479492 0c-1.5991211 0 -2.8999023 -1.254883 -2.8999023 -2.796875l0 -4.810547c0 -0.497071 0.402832 -0.900391 0.8999023 -0.900391 0.4970703 0 0.8999023 0.403321 0.8999023 0.900391l0 4.810547c0 0.549804 0.4936523 0.996093 1.1000977 0.996093l14.479492 0c0.606445 0 1.09961 -0.446289 1.09961 -0.996093l0 -4.810547c0 -0.497071 0.40332 -0.900391 0.90039 -0.900391 0.49707 0 0.900391 0.403321 0.900391 0.900391l0 4.810547c0 1.541992 -1.301758 2.796875 -2.900391 2.796875z" />
<path
android:fillColor="#eee"
android:pathData="M16.414062 6.4287109L12.813477 2.5649414c-0.338379 -0.362793 -0.906739 -0.3828125 -1.271973 -0.044434 -0.01617 0.015076 -0.02216 0.035706 -0.03693 0.051636 -0.06421 0.035095 -0.131653 0.062866 -0.187683 0.1148682l-3.723145 3.46875C7.2299765 6.4946288 7.2094687 7.064453 7.548336 7.4277343 7.7255821 7.618164 7.9663048 7.7143554 8.2070274 7.7143554c0.2197266 0 0.4399414 -0.080078 0.6132813 -0.2412109l2.2797853 -2.1240234 0 11.2133789c0 0.49707 0.402832 0.900391 0.899902 0.900391 0.49707 0 0.899902 -0.403321 0.899902 -0.900391l0 -11.2646485 2.197754 2.3583984c0.176758 0.1899414 0.416993 0.2861328 0.658203 0.2861328 0.219727 0 0.44043 -0.080078 0.613282 -0.2416992 0.364257 -0.3388672 0.383789 -0.9082031 0.04492 -1.2719727z" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_file.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M14 2L6 2C4.8900146 2 4 2.8900146 4 4l0 16c0 1.099976 0.8900146 2 2 2l12 0c1.104553 0 2 -0.895447 2 -2L20 8 14 2Zm0 15.408386c0 0.395874 -0.323852 0.719727 -0.719727 0.719727l-6.5605464 0C6.3238525 18.128113 6 17.80426 6 17.408386L6 17.247864C6 16.85199 6.3238525 16.528137 6.7197266 16.528137l6.5605474 0C13.676148 16.528137 14 16.85199 14 17.247864l0 0.160522zm2 -4.029724c0 0.429382 -0.351318 0.780701 -0.780701 0.780701l-8.4385983 0C6.3513184 14.159363 6 13.808044 6 13.378662l0 -0.03857C6 12.91071 6.3513184 12.559391 6.7807007 12.559391l8.4385983 0C15.648682 12.559387 16 12.910706 16 13.340088l0 0.03857zM13 9L13 3.5 18.5 9 13 9Z"
android:fillColor="#008dff" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_incorrect.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M21.829163 18.935974L13.092102 3.8029785c-0.485351 -0.8407593 -1.698852 -0.8407593 -2.184204 0L2.1708374 18.935974c-0.4854126 0.840698 0.1213379 1.891602 1.0921021 1.891602l17.4741215 0c0.970764 0 1.577514 -1.050904 1.092102 -1.891602zm-9.094361 -0.588135c-0.207885 0.184815 -0.4505 0.277161 -0.727966 0.277161 -0.281982 0 -0.528565 -0.09082 -0.738525 -0.273682 -0.210511 -0.182312 -0.315491 -0.437683 -0.315491 -0.766174 0 -0.286804 0.100647 -0.530823 0.30133 -0.731995 0.201111 -0.20111 0.44751 -0.301513 0.73877 -0.301513 0.291382 0 0.539612 0.100403 0.745483 0.301513 0.20575 0.201172 0.308777 0.445313 0.308777 0.731995 0 0.323364 -0.104004 0.577576 -0.312378 0.762695zM12.998779 10.656433L12.70044 14.0755c-0.03229 0.407227 -0.101563 0.719056 -0.208252 0.936646 -0.106385 0.217041 -0.282227 0.3255 -0.526978 0.3255 -0.249939 0 -0.423035 -0.104736 -0.520081 -0.31549 -0.09717 -0.2099 -0.166809 -0.530457 -0.208129 -0.960388l-0.222107 -3.321961c-0.04169 -0.647278 -0.06207 -1.1119383 -0.06207 -1.3938597 0 -0.383728 0.100647 -0.6832886 0.30133 -0.8978882C11.455261 8.2324829 11.720276 8.125 12.048157 8.125c0.397827 0 0.664062 0.1376343 0.797851 0.4127808 0.133789 0.2753906 0.201172 0.671875 0.201172 1.189209 0 0.3052982 -0.01642 0.6155392 -0.0484 0.9294432z"
android:fillColor="#ff4d6a" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_left.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M14.90628 18.719482c-0.256835 0 -0.513671 -0.09863 -0.708984 -0.294921l-5.8124999 -5.84375c-0.2416992 -0.243165 -0.3330078 -0.57959 -0.2734375 -0.893067 0.03418 -0.195312 0.1264648 -0.383301 0.2773438 -0.53418L13.954132 5.5744628c0.390625 -0.3916016 1.023438 -0.3916016 1.414063 -0.00195 0.391601 0.3901367 0.391601 1.0234375 0.002 1.4140625l-4.871582 4.8837887 5.116699 5.144043c0.389648 0.391602 0.387695 1.024414 -0.0039 1.414063 -0.195313 0.194336 -0.450196 0.291015 -0.705079 0.291015z"
android:fillColor="#eee" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_menu_account.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#eee"
android:pathData="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_menu_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M15.078125 3.0178833l-5.78125 0c-3.9101563 0 -7.109375 3.1992188 -7.109375 7.1093747 0 3.910156 3.1992188 7.109375 7.109375 7.109375l5.731079 0 -0.0031 3.826538c-0.0042 -0.09558 0.01343 -0.185913 0.04523 -0.269409 -0.02631 0.07465 -0.04132 0.154602 -0.03766 0.238404 0.01544 0.353454 0.31604 0.627258 0.671447 0.611694 0.210511 -0.0092 0.383912 -0.124024 0.494507 -0.284668 -0.01697 0.02924 -0.02789 0.06213 -0.04858 0.0885l3.760742 -6.127991c1.39563 -1.300232 2.276917 -3.14624 2.276917 -5.192444 0 -3.9101559 -3.199219 -7.1093747 -7.109375 -7.1093747zm-7.09375 8.1434937c-0.5609131 0 -1.015625 -0.463013 -1.015625 -1.034119 0 -0.5711057 0.4547119 -1.0340573 1.015625 -1.0340573C8.5452881 9.0932007 9 9.5561523 9 10.127258 9 10.698364 8.5452881 11.161377 7.984375 11.161377Zm4.015625 0c-0.560913 0 -1.015625 -0.463013 -1.015625 -1.034119 0 -0.5711057 0.454712 -1.0340573 1.015625 -1.0340573 0.560913 0 1.015625 0.4629517 1.015625 1.0340573 0 0.571106 -0.454712 1.034119 -1.015625 1.034119zm4.015625 0C15.454712 11.161377 15 10.698364 15 10.127258c0 -0.5711057 0.454712 -1.0340573 1.015625 -1.0340573 0.560913 0 1.015625 0.4629517 1.015625 1.0340573 0 0.571106 -0.454712 1.034119 -1.015625 1.034119z"
android:fillColor="#eee" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_menu_gift.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#eee"
android:pathData="M3.5000203 11.130429l0 10.217384C3.5000203 21.707853 3.7921686 22 4.1522079 22l6.7391411 0 0 -10.869571 -7.3913287 0z" />
<path
android:fillColor="#eee"
android:pathData="M13.108731 11.130429l0 10.869571 6.739141 0c0.360039 0 0.652187 -0.292149 0.652187 -0.652187l0 -10.217384 -7.391328 0z" />
<path
android:fillColor="#eee"
android:pathData="M21.152206 5.9130468l-4.959608 0C16.415293 5.5290627 16.543497 5.0837111 16.543497 4.6087112 16.543497 3.1701562 15.373341 2 13.934786 2 13.156192 2 12.456661 2.3432422 11.978262 2.8858986 11.499904 2.3432422 10.800372 2 10.021778 2 8.5832624 2 7.4130673 3.1701562 7.4130673 4.6087108c0 0.4749999 0.1282029 0.9203515 0.3508983 1.3043361l-4.9161329 0c-0.3601563 0 -0.6521876 0.2919922 -0.6521876 0.6521873l0 2.6087103c0 0.360157 0.2919924 0.6521873 0.6521876 0.6521873l8.0434763 0 0 -2.6087107 1.086953 0 1.130429 0 0 2.6087108 8.043477 0c0.360155 0 0.652188 -0.2919931 0.652188 -0.6521873l0 -2.6087099c0 -0.3601957 -0.291993 -0.6521879 -0.65215 -0.6521879zm-9.826092 0l-0.434766 0 -0.86957 0c-0.7192582 0 -1.3043355 -0.5850778 -1.3043355 -1.3043356 0 -0.7192578 0.5850773 -1.3043361 1.3043355 -1.3043361 0.719258 0 1.304336 0.5850782 1.304336 1.3043361l0 1.3043356 0 0zm2.608672 0l-0.826095 0 -0.478242 0 0 -1.304336c0 -0.7192578 0.585078 -1.3043358 1.304336 -1.3043358 0.719257 0 1.304336 0.5850782 1.304336 1.3043358 0.00004 0.7192578 -0.585039 1.304336 -1.304335 1.304336z" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_menu_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M3.73 2.21c-1.1045532 0 -2 0.8954468 -2 2l0 3.625 2 0 0 -3.625 3.625 0 0 -2 -3.625 0z"
android:fillColor="#000000" />
<path
android:pathData="M20.27 7.835l2 0 0 -3.625c0 -1.1045532 -0.895446 -2 -2 -2l-3.645813 0 0 2 3.645813 0 0 3.625z"
android:fillColor="#000000" />
<path
android:pathData="M3.73 16.124188l-2 0 0 3.645813c0 1.104553 0.8954468 2 2 2l3.583313 0 0 -2 -3.583313 0 0 -3.645813z"
android:fillColor="#000000" />
<path
android:pathData="M20.27 16.124188l0 3.645813 -3.645813 0 0 2 3.645813 0c1.104554 0 2 -0.895447 2 -2l0 -3.645813 -2 0z"
android:fillColor="#000000" />
<path
android:pathData="M16.5 12A4.5 4.5 0 0 1 12 16.5 4.5 4.5 0 0 1 7.5 12 4.5 4.5 0 0 1 12 7.5 4.5 4.5 0 0 1 16.5 12Z"
android:fillColor="#000000" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_menu_wallet.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M18.390167 5.7830162C18.390167 4.4894009 17.76325 3.4375 16.992348 3.4375l-13.279167 0c-0.7709348 0 -1.397819 1.0519009 -1.397819 2.3455162"
android:fillColor="#eee" />
<path
android:pathData="M2.315362 7.3189588l0 11.5881232c0 0.912991 0.7424281 1.655418 1.6554573 1.655418l15.7267077 0c0.91299 0 1.655456 -0.742427 1.655456 -1.655456l0 -2.069292c0 -0.228762 -0.185112 -0.413876 -0.413873 -0.413876l-2.89704 0c-1.825594 0 -3.310877 -1.485282 -3.310877 -3.310875 0 -1.825593 1.485283 -3.3108755 3.310877 -3.3108755l2.89704 0c0.228761 0 0.413873 -0.185112 0.413873 -0.4138737l0 -2.069293"
android:fillColor="#eee" />
<path
android:pathData="M20.41635 13.270833a2.0261829 2.0261829 0 0 1 -2.026183 2.026183 2.0261829 2.0261829 0 0 1 -2.026183 -2.026183 2.0261829 2.0261829 0 0 1 2.026183 -2.026183 2.0261829 2.0261829 0 0 1 2.026183 2.026183z"
android:fillColor="#eee" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_negative.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M6.4155273 18.591797c-0.2553711 0 -0.5112305 -0.09766 -0.7060547 -0.291992 -0.3911133 -0.389649 -0.3920898 -1.023438 -0.00195 -1.414063L10.582031 11.999023 5.6508789 7.0800781C5.2597656 6.6899414 5.2587891 6.0566406 5.6489258 5.6660156 6.0375977 5.2744141 6.671875 5.2729492 7.0629883 5.6640625l4.9316407 4.9189455 4.924316 -4.9360354c0.390625 -0.3916016 1.023438 -0.3916016 1.414063 -0.00195 0.391601 0.3901367 0.391601 1.0234375 0.002 1.4140625l-4.924805 4.9365229 4.891602 4.879395c0.391601 0.389648 0.391601 1.023437 0.002 1.414062 -0.390625 0.392579 -1.023438 0.390625 -1.414063 0.002L11.998141 13.412158 7.1236291 18.2979C6.9283167 18.49419 6.671969 18.591846 6.4156213 18.591846Z"
android:fillColor="#eee" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_not_received.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#008dff"
android:pathData="M15.784925 4.0088868l0 0c-2.678516 -2.6785159 -7.0215764 -2.6785159 -9.7004686 0l0 0C3.6708488 6.4224949 3.3991482 10.967066 5.4474692 13.698035l5.4872218 7.924603 5.487223 -7.924603c2.04832 -2.730969 1.776618 -7.2755401 -0.636989 -9.6891482zM11.001484 11.0565c-1.250578 0 -2.2641727 -1.013594 -2.2641727 -2.2641722 0 -1.250578 1.0135946 -2.2641721 2.2641727 -2.2641721 1.250578 0 2.264172 1.0135946 2.264172 2.2641721 0 1.2505772 -1.013972 2.2641722 -2.264172 2.2641722z" />
<path
android:fillColor="#ff4d6a"
android:pathData="M19.924587 17.471655A4.5283446 4.5283446 0 0 1 15.396242 22a4.5283446 4.5283446 0 0 1 -4.528344 -4.528345 4.5283446 4.5283446 0 0 1 4.528344 -4.528345 4.5283446 4.5283446 0 0 1 4.528345 4.528345z" />
<path
android:fillColor="#eee"
android:pathData="M14.83225 17.471655l-1.436008 1.436008 0.563992 0.563992 1.436008 -1.436009 1.436009 1.436009 0.563991 -0.563992 -1.436008 -1.436008 1.436008 -1.436009 -0.563991 -0.56399 -1.436009 1.436007 -1.436008 -1.436007 -0.563992 0.56399z" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_positive.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#eee"
android:pathData="M8.8662109 18.291016c-0.099609 0 -0.1987305 -0.01465 -0.2949219 -0.04395C8.3798827 18.210937 8.1967773 18.119141 8.0488281 17.97168L3.871582 13.804688C3.4804688 13.415039 3.4794922 12.78125 3.869632 12.390625c0.3891602 -0.391602 1.0234375 -0.393066 1.4140625 -0.002L8.822757 15.918898 18.71387 6.0028827c0.390625 -0.3916016 1.023438 -0.3916016 1.414063 -0.00195 0.391601 0.3901367 0.391601 1.0234375 0.002 1.4140625L9.5742188 17.99707c-0.1953125 0.196289 -0.4516602 0.293946 -0.7080079 0.293946z" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_received.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M15.784925 4.0088868l0 0c-2.678516 -2.6785159 -7.0215764 -2.6785159 -9.7004686 0l0 0C3.6708488 6.4224949 3.3991482 10.967066 5.4474692 13.698035l5.4872218 7.924603 5.487223 -7.924603c2.04832 -2.730969 1.776618 -7.2755401 -0.636989 -9.6891482zM11.001484 11.0565c-1.250578 0 -2.2641727 -1.013594 -2.2641727 -2.2641722 0 -1.250578 1.0135946 -2.2641721 2.2641727 -2.2641721 1.250578 0 2.264172 1.0135946 2.264172 2.2641721 0 1.2505772 -1.013972 2.2641722 -2.264172 2.2641722z"
android:fillColor="#ff4d6a" />
<path
android:pathData="M15.25 12.825806c-2.474976 0 -4.5 2.025024 -4.5 4.5 0 2.475036 2.025024 4.5 4.5 4.5 2.474976 0 4.5 -2.024964 4.5 -4.5 0 -2.474976 -2.025024 -4.5 -4.5 -4.5z"
android:fillColor="#008dff" />
<path
android:pathData="M18.231262 16.121643l-0.675049 -0.674988 -2.96997 2.969971 -1.304993 -1.304993 -0.674988 0.675049 1.979981 1.979981z"
android:fillColor="#eee" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_right.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M9.0937195 5.2805176c0.2568359 0 0.5136719 0.098633 0.7089844 0.2949219L15.615204 11.41919c0.241699 0.243164 0.333008 0.579589 0.273437 0.893066 -0.03418 0.195312 -0.126464 0.383301 -0.277343 0.53418l-5.56543 5.579101c-0.3906251 0.391602 -1.0234376 0.391602 -1.4140626 0.002C8.2402038 18.037401 8.2402038 17.4041 8.6298554 17.013475L13.501434 12.129639 8.3847351 6.9855957C7.9950867 6.5939941 7.9970398 5.9611816 8.3886414 5.5715332 8.5839539 5.3771973 8.8388367 5.2805176 9.0937195 5.2805176Z"
android:fillColor="#42000000" />
</vector>
================================================
FILE: app/src/main/res/drawable/ic_sort.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="24"
android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M20.02372 8L3.9762802 8C3.439326 8 3 7.5606737 3 7.0237198l0 -0.04744C3 6.4393263 3.439326 6 3.9762802 6L20.02372 6C20.560675 6 21 6.4393263 21 6.9762802l0 0.04744C21 7.5606737 20.560675 8 20.02372 8Z"
android:fillColor="#008dff" />
<path
android:pathData="M13.9845 13L3.9842501 13C3.4429126 13 3 12.557088 3 12.01575l0 -0.0315C3 11.442912 3.4429126 11 3.9842501 11L13.9845 11c0.541338 0 0.98425 0.442912 0.98425 0.98425l0 0.0315C14.96875 12.557088 14.525838 13 13.9845 13Z"
android:fillColor="#008dff" />
<path
android:pathData="M7.984376 18L3.999999 18C3.4499996 18 3 17.550001 3 17.000002l0 -0.000004C3 16.449999 3.4499996 16 3.999999 16l3.984377 0c0.5499992 0 0.999999 0.449999 0.999999 0.999998l0 0.000004C8.984375 17.550001 8.5343752 18 7.984376 18Z"
android:fillColor="#008dff" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_apple.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M440.94394 344.58444c-1.52014 -2.35028 -3.99173 -3.91894 -6.76608 -4.29358 -36.49512 -4.76706 -62.21625 -38.21649 -57.44919 -74.71161 3.36731 -25.77954 21.41858 -47.24661 46.2377 -54.98838 5.04016 -1.61538 7.8172 -7.01044 6.20187 -12.05063 -0.25158 -0.78433 -0.60284 -1.53362 -1.04577 -2.22901 -16.74762 -30.22497 -46.5261 -51.01193 -80.67182 -56.31088 -17.20672 0.82117 -34.16366 4.45352 -50.19705 10.75241 -11.51517 4.63411 -23.67453 7.47225 -36.05218 8.4138 -12.37767 -0.94155 -24.53702 -3.77969 -36.05217 -8.4138 -16.03339 -6.29889 -32.99035 -9.93124 -50.19707 -10.75241 -35.78356 0 -105.415452 50.73343 -105.415452 143.74873 0 88.39563 64.475802 201.24826 114.998992 201.24826 19.2776 0.17252 38.32341 -4.21453 55.58315 -12.80352 6.50013 -3.58472 13.68487 -5.75354 21.08346 -6.36359 7.39768 0.61002 14.58331 2.77884 21.08347 6.36359 17.2597 8.58899 36.30554 12.97604 55.58313 12.80352 40.05829 0 85.27176 -68.7694 104.20797 -132.49771 0.79239 -2.67645 0.37912 -5.56759 -1.13296 -7.91519z"
android:fillColor="#37474f" />
<path
android:pathData="M251.61697 140.00124c58.19309 -0.0638 105.35257 -47.22237 105.41547 -105.415455 0 -5.292648 -4.29004 -9.583548 -9.58267 -9.583548 -58.19309 0.06379 -105.35256 47.222367 -105.41545 105.415443 -0.0009 5.29265 4.29001 9.58356 9.58265 9.58356z"
android:fillColor="#37474f" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_dribble.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M471.625 254.44751A215.625 215.625 0 0 1 256 470.07251 215.625 215.625 0 0 1 40.375 254.44751 215.625 215.625 0 0 1 256 38.82251a215.625 215.625 0 0 1 215.625 215.625z"
android:fillColor="#ec407a" />
<path
android:pathData="M256 26C129.18375 26 26 129.18375 26 256 26 382.81625 129.18375 486 256 486 382.81625 486 486 382.81625 486 256 486 129.18375 382.81625 26 256 26Zm201.16376 231.72501c-48.70252 -12.85125 -98.64127 -14.34626 -146.22254 -4.5425 -6.49749 -16.215 -13.51251 -32.17125 -21.04501 -47.92624 43.03876 -20.125 82.82877 -47.40875 117.73123 -81.13251C438.41876 159.4575 457.25 205.515 457.25 256c0 0.57501 -0.0862 1.12125 -0.0862 1.72501zM387.30127 103.82625c-32.60251 31.48125 -69.69 57.12626 -109.88251 75.87124C255.94254 138.58499 230.81502 99.312492 202.38129 62.224991 219.4875 57.481251 237.39876 54.75 256 54.75c50.16873 0 96.02499 18.572502 131.30127 49.07625zM173.97624 72.402496C203.15749 109.5475 228.77374 149.1075 250.595 190.53625 190.22 213.59375 124.66999 222.44876 59.033737 214.77251 72.345001 151.0625 115.93 98.449997 173.97624 72.402496ZM54.75 256c0 -4.3125 0.373749 -8.53874 0.661251 -12.76501 17.020001 2.01251 34.039997 3.335 51.002499 3.335 54.10749 0 107.26624 -10.58 157.09 -29.98625 6.89999 14.375 13.39746 28.95125 19.40625 43.72876C212.24248 281.53 149.27999 326.7825 106.90249 390.69373 74.616249 354.98624 54.75 307.8075 54.75 256Zm73.16875 155.10626c38.985 -61.29498 98.44 -104.50625 165.34122 -124.05627 18.17001 50.02499 31.25125 101.97626 38.87003 155.13501 -23.48873 9.66 -49.19125 15.065 -76.13 15.065 -48.61626 0 -93.265 -17.33624 -128.08125 -46.14374zM359.0975 428.5c-7.90622 -50.6575 -20.44125 -100.25122 -37.60498 -148.12003 43.44126 -8.165 88.89499 -6.23873 133.17002 6.26752C445.37625 346.9075 409.41 398.3125 359.0975 428.5Z"
android:fillColor="#c2185b" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_facebook.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M428.5 26l-345 0C51.788757 26 26 51.788757 26 83.5l0 345c0 31.71124 25.788757 57.5 57.5 57.5l172.5 0 0 -158.125 -57.5 0 0 -71.875 57.5 0 0 -57.5c0 -47.63873 38.61127 -86.25 86.25 -86.25l57.5 0 0 71.875 -28.75 0c-15.87 0 -28.75 -1.495 -28.75 14.375l0 57.5 71.875 0 -28.75 71.875 -43.125 0 0 158.125 86.25 0c31.71124 0 57.5 -25.78876 57.5 -57.5l0 -345C486 51.788757 460.21124 26 428.5 26Z"
android:fillColor="#1976d2" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_github.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M255.97125 30.787899C128.9825 30.787899 26 134.1729 26 261.70789c0 102.005 65.895004 188.54251 157.32001 219.10372 11.5 2.12754 15.69749 -5.00247 15.69749 -11.12625 0 -5.49124 -0.20125 -20.00998 -0.31625 -39.27249C134.7325 444.3566 121.22 399.44913 121.22 399.44913c-10.43625 -26.68 -25.529998 -33.78125 -25.529998 -33.78125 -20.901252 -14.31751 1.552498 -14.03 1.552498 -14.03 23.08625 1.63876 35.21876 23.80499 35.21876 23.80499 20.52748 35.27628 53.84875 25.09876 66.95874 19.17624 2.07001 -14.92123 8.02125 -25.09875 14.60499 -30.8775 -51.05999 -5.83625 -104.765 -25.64499 -104.765 -114.10874 0 -25.21376 8.97001 -45.8275 23.69001 -61.98501 -2.38625 -5.83625 -10.26375 -29.325 2.24249 -61.09374 0 0 19.32001 -6.21001 63.25001 23.66124 18.3425 -5.11751 38.00751 -7.67625 57.58625 -7.76249 19.52127 0.115 39.21502 2.64498 57.58627 7.79124 43.90125 -29.87125 63.19251 -23.66125 63.19251 -23.66125 12.535 31.7975 4.65747 55.2575 2.29998 61.09375 14.74875 16.1575 23.63248 36.77125 23.63248 61.985 0 88.69374 -53.76248 108.21498 -104.99499 113.93626 8.25125 7.13 15.61123 21.2175 15.61123 42.75125 0 30.8775 -0.2875 55.77503 -0.2875 63.33624 0 6.18128 4.14001 13.36878 15.81253 11.09751C420.16251 450.1929 486 363.68414 486 261.70789 486 134.1729 383.01752 30.787899 255.97125 30.787899Z"
android:fillColor="#5c6bc0" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_google_play.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M290.67004 256.04071L59.668861 478.47919C48.851418 471.08646 42.428902 458.78967 42.542469 445.68811l0 -379.294792C42.428902 53.291767 48.851417 40.994995 59.668861 33.602241L290.67004 256.04071Z"
android:fillColor="#2196f3" />
<path
android:pathData="M371.49979 178.34389L290.67004 256.04071 59.668861 33.602241c0.870369 -0.67456 1.776959 -1.302124 2.714882 -1.87976 12.208664 -7.399603 27.458229 -7.638491 39.893047 -0.626587l269.223 147.247996z"
android:fillColor="#4caf50" />
<path
android:pathData="M469.45694 256.04071c0.15076 14.79038 -7.8862 28.45197 -20.88593 35.50693l-77.07025 42.18988 -80.82974 -77.69684 80.82974 -77.69681 77.07025 42.18988c12.9997 7.05501 21.03669 20.71657 20.88593 35.50696z"
android:fillColor="#ffc107" />
<path
android:pathData="M371.49979 333.73755l-269.223 147.24798c-12.46223 6.90323 -27.654033 6.66437 -39.893043 -0.62658 -0.937923 -0.57764 -1.844513 -1.2052 -2.714882 -1.87979l231.002155 -222.43848 80.82877 77.69687z"
android:fillColor="#f44336" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_instagram.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M363.27618 104.31049l-212.55236 0c-24.5857 0 -44.41333 19.82672 -44.41333 44.41333l0 212.55236c0 24.58576 19.82672 44.41333 44.41333 44.41333l212.55236 0c24.58576 0 44.41333 -19.82672 44.41333 -44.41333l0 -212.55236c0 -24.5857 -19.82672 -44.41333 -44.41333 -44.41333zM257 358.10382c-57.10382 0 -103.10382 -46 -103.10382 -103.10382 0 -57.10382 46.00006 -103.10382 103.10382 -103.10382 57.10376 0 103.10382 46.00006 103.10382 103.10382 0 57.10376 -46 103.10382 -103.10382 103.10382zm103.10382 -190.3457c-8.72388 0 -15.86194 -7.13806 -15.86194 -15.86194 0 -8.72382 7.13806 -15.86188 15.86194 -15.86188 8.72382 0 15.86188 7.13806 15.86188 15.86188 0 8.72473 -7.13806 15.86285 -15.86188 15.86194z"
android:fillColor="#c04fbd" />
<path
android:pathData="M257 183.62091c-38.0686 0 -71.37909 33.31049 -71.37909 71.37909 0 38.0686 33.31049 71.37909 71.37909 71.37909 38.0686 0 71.37909 -33.31049 71.37909 -71.37909 0 -38.0686 -33.31049 -71.37909 -71.37909 -71.37909z"
android:fillColor="#c04fbd" />
<path
android:pathData="M359.31042 25L154.68951 25C84.10376 25 27 82.10376 27 152.68951l0 204.62098C27 427.89624 84.10376 485 154.68951 485l204.62098 0C429.89624 485 487 427.89624 487 357.31042l0 -204.62091C487 82.10376 429.89624 25 359.31042 25Zm80.10291 333.10382c0 43.62091 -35.68951 79.31043 -79.31042 79.31043l-206.20673 0c-43.62091 0 -79.310426 -35.68952 -79.310426 -79.31043l0 -206.20673c0 -43.62091 35.689516 -79.31042 79.310426 -79.31042l206.20764 0c43.62 0 79.30951 35.68951 79.30951 79.30951l0 206.20764z"
android:fillColor="#c04fbd" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_twitter.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M486 113.37125c-17.10626 7.50376 -35.33377 12.4775 -54.33752 14.89251 19.55001 -11.6725 34.47125 -30.015004 41.48623 -52.123745 -18.22748 10.8675 -38.35248 18.543747 -59.79999 22.827491 -17.30746 -18.428749 -41.975 -29.842498 -68.88497 -29.842498 -52.21003 0 -94.24251 42.377492 -94.24251 94.328742 0 7.47501 0.6325 14.66251 2.18501 21.50501 -78.40126 -3.82375 -147.77499 -41.4 -194.378754 -98.641247 -8.136249 14.116247 -12.908752 30.273747 -12.908752 47.667507 0 32.65998 16.818748 61.61123 41.888748 78.37249 -15.151253 -0.2875 -30.014999 -4.68625 -42.607498 -11.61499 0 0.28751 0 0.66124 0 1.03499 0 45.8275 32.688744 83.8925 75.554996 92.66124 -7.67625 2.09876 -16.04251 3.10498 -24.725009 3.10498 -6.037499 0 -12.132493 -0.345 -17.853745 -1.60998 12.218742 37.34625 46.891244 64.80249 88.118734 65.69375 -32.085 25.09876 -72.823743 40.22125 -116.926237 40.22125 -7.733749 0 -15.151252 -0.345 -22.568752 -1.29376C67.773758 427.49374 117.28125 442.875 170.67 442.875c173.53499 0 268.40997 -143.75 268.40997 -268.35248 0 -4.16874 -0.14374 -8.19374 -0.345 -12.18999C457.45123 149.05 473.17749 132.46126 486 113.37125Z"
android:fillColor="#03a9f4" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_vimeo.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M26 164.57924l18.572102 24.46571c0 0 38.524173 -30.38809 51.346401 -15.26591 12.994717 15.26591 62.184907 198.57197 78.457057 232.46748 14.2022 29.69812 53.61759 68.88352 96.68416 40.93912C314.52881 419.06876 458.01697 296.53888 483.71887 151.55576 509.36334 6.8313751 310.7626 37.133217 289.94806 163.28551c52.38138 -31.45183 80.61325 12.87971 53.76135 62.98988 -26.90942 50.31143 -51.60516 83.11447 -64.39862 83.11447 -12.56348 0 -22.51077 -33.75177 -37.23045 -92.34302C226.98691 156.35689 226.98691 46.936756 163.85329 59.35648 104.16957 71.143753 26 164.57924 26 164.57924Z"
android:fillColor="#00bcd4" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_vk.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M251.07796 386.12668l27.48701 0c0 0 8.30936 -0.92005 12.53592 -5.49164 3.91028 -4.19781 3.76651 -12.0759 3.76651 -12.0759 0 0 -0.54629 -36.88894 16.58997 -42.32309 16.87747 -5.3479 38.55655 35.65259 61.52951 51.4375 17.36627 11.93213 30.56347 9.31571 30.56347 9.31571l61.44327 -0.86258c0 0 32.1449 -1.98389 16.90625 -27.25699 -1.23633 -2.07013 -8.8844 -18.68884 -45.6871 -52.84637 -38.5278 -35.76764 -33.35242 -29.95969 13.05347 -91.80549 28.2633 -37.66526 39.56286 -60.66694 36.02639 -70.50016 -3.36398 -9.37319 -24.15179 -6.9005 -24.15179 -6.9005l-69.12006 0.40253c0 0 -5.11789 -0.69005 -8.94192 1.58136 -3.70902 2.24267 -6.09543 7.41804 -6.09543 7.41804 0 0 -10.95453 29.15463 -25.56064 53.93895 -30.79349 52.30008 -43.12814 55.06029 -48.15976 51.81131 -11.70212 -7.56181 -8.76941 -30.41974 -8.76941 -46.63592 0 -50.68998 7.67682 -71.82277 -14.97986 -77.28568 -7.53305 -1.81138 -13.05343 -3.01897 -32.28862 -3.22023 -24.66929 -0.25877 -45.57209 0.0863 -57.38922 5.86543 -7.87808 3.85279 -13.94476 12.44965 -10.23575 12.93845 4.5716 0.60379 14.92235 2.78895 20.41401 10.26449 7.10177 9.63196 6.843 31.31106 6.843 31.31106 0 0 4.08281 59.66062 -9.51694 67.07867 -9.34444 5.08913 -22.13913 -5.29039 -49.5974 -52.76012 -14.05978 -24.29553 -24.69805 -51.17874 -24.69805 -51.17874 0 0 -2.0414 -5.00287 -5.69291 -7.67682 -4.42783 -3.24898 -10.6383 -4.28406 -10.6383 -4.28406l-65.727313 0.40253c0 0 -9.861973 0.28752 -13.484739 4.57158 -3.220236 3.82404 -0.258768 11.70212 -0.258768 11.70212 0 0 51.46627 120.38505 109.71806 181.08076 53.45019 55.63532 114.11714 51.9838 114.11714 51.9838l0 0z"
android:fillColor="#1e88e5" />
</vector>
================================================
FILE: app/src/main/res/drawable/img_youtube.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="512"
android:viewportHeight="512"
android:width="512dp"
android:height="512dp">
<path
android:pathData="M466.45001 128.34998C453.97247 106.15497 440.43127 102.07251 412.85999 100.52002 385.3175 98.651245 316.05872 97.875 256.0575 97.875c-60.11628 0 -129.40375 0.776245 -156.917485 2.61627 -27.513794 1.58124 -41.083802 5.63501 -53.67627 27.85871C32.612488 150.51624 26 188.69623 26 255.91376c0 0.0575 0 0.0862 0 0.0862 0 0.0575 0 0.0862 0 0.0862l0 0.0575c0 66.92999 6.612488 105.39752 19.463745 127.33374 12.592529 22.19501 26.133728 26.22003 53.647522 28.0888 27.542483 1.60999 96.829953 2.55872 156.946233 2.55872 60.00122 0 129.26 -0.94873 156.83123 -2.53003 27.57123 -1.86871 41.11255 -5.89374 53.59003 -28.08874C479.44501 361.57001 486 323.10248 486 256.17249c0 0 0 -0.0863 0 -0.14374 0 0 0 -0.0575 0 -0.0863 0 -67.24627 -6.55499 -105.42626 -19.54999 -127.59252zM198.5 342.25L198.5 169.75 342.25 256 198.5 342.25Z"
android:fillColor="#f44336" />
</vector>
================================================
FILE: app/src/main/res/drawable/splash_screen.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/window_background" />
<item>
<bitmap
android:gravity="center"
android:src="@drawable/splash" />
</item>
</layer-list>
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:translationY="?attr/actionBarSize"
android:background="@android:color/white"
app:itemIconTint="@drawable/bottom_navigation_selector"
app:itemTextColor="@drawable/bottom_navigation_selector"
app:labelVisibilityMode="unlabeled"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/bottom_navigation_main" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/fragment_details.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:id="@+id/toolbar_container"
android:layout_width="match_parent"
android:layout_height="@dimen/details_toolbar_container_height"
app:cardBackgroundColor="@color/toolbar_background"
app:cardCornerRadius="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:translationY="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="top"
android:alpha="0"
tools:alpha="1"
tools:layout_marginTop="@dimen/margin_normal">
<ImageView
android:id="@+id/img_back"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginStart="@dimen/margin_small"
android:clickable="true"
android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_left" />
<TextView
android:id="@+id/tv_action_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_small"
android:clickable="true"
android:focusable="true"
android:text="@string/action_back"
android:textAppearance="@style/ToolbarAction"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/img_back"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/img_export"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginEnd="@dimen/margin_normal"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_export" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<include
android:id="@+id/details_card"
layout="@layout/item_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space_normal"
android:layout_marginEnd="@dimen/space_normal"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_marginTop="80dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_fall_down"
android:overScrollMode="never"
android:paddingStart="@dimen/padding_small"
android:paddingTop="@dimen/padding_small"
android:paddingEnd="@dimen/padding_small"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/details_card"
tools:itemCount="14"
tools:listitem="@layout/item_details" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/fab_margin"
android:layout_marginBottom="@dimen/margin_medium"
android:clickable="true"
android:focusable="true"
android:translationY="@dimen/fab_translateY"
app:backgroundTint="@color/color_negative"
app:elevation="@dimen/fab_elevation"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:srcCompat="@drawable/ic_negative"
tools:translationY="0dp" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/fab_margin"
android:layout_marginBottom="@dimen/margin_medium"
android:clickable="true"
android:focusable="true"
android:translationY="@dimen/fab_translateY"
app:backgroundTint="@color/color_positive"
app:elevation="@dimen/fab_elevation"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/guideline"
app:srcCompat="@drawable/ic_positive"
tools:translationY="0dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/fragment_recycler.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:alpha="0"
app:cardCornerRadius="0dp"
app:cardElevation="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:alpha="1"
tools:layout_marginTop="@dimen/margin_medium">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_marginStart="@dimen/margin_normal"
android:text="@string/title_main"
android:textAppearance="@style/Title"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/img_sort"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginEnd="@dimen/margin_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/img_file"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_sort" />
<ImageView
android:id="@+id/img_file"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginEnd="@dimen/margin_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_file" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<View
android:id="@+id/details_toolbar_transition_helper"
android:layout_width="match_parent"
android:layout_height="@dimen/details_toolbar_container_height"
android:background="@color/toolbar_background"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:translationY="-200dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_fall_down"
android:overScrollMode="never"
android:padding="@dimen/padding_small"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
tools:itemCount="4"
tools:listitem="@layout/item_card" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/item_card.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_small"
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
app:cardCornerRadius="@dimen/card_corner_radius"
app:cardElevation="@dimen/card_elevation"
app:contentPadding="@dimen/padding_normal">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img_card"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@drawable/img_twitter" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_normal"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
app:layout_constraintBottom_toBottomOf="@+id/img_card"
app:layout_constraintStart_toEndOf="@+id/img_card"
app:layout_constraintTop_toTopOf="@+id/img_card"
tools:text="Twitter" />
<TextView
android:id="@+id/tv_title_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:text="@string/detail_caption_amount"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
app:layout_constraintStart_toStartOf="@+id/img_card"
app:layout_constraintTop_toBottomOf="@+id/img_card" />
<TextView
android:id="@+id/tv_title_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/detail_caption_date"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
app:layout_constraintBottom_toBottomOf="@+id/tv_title_amount"
app:layout_constraintStart_toStartOf="@+id/guideline_0"
app:layout_constraintTop_toTopOf="@+id/tv_title_amount" />
<TextView
android:id="@+id/tv_title_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/detail_caption_status"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
app:layout_constraintBottom_toBottomOf="@+id/tv_title_date"
app:layout_constraintStart_toStartOf="@+id/guideline_1"
app:layout_constraintTop_toTopOf="@+id/tv_title_date" />
<TextView
android:id="@+id/tv_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:layout_marginBottom="@dimen/margin_tiny"
android:textAppearance="@style/DetailsBold.Large"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/tv_title_amount"
app:layout_constraintTop_toBottomOf="@+id/tv_title_amount"
tools:text="11,550.00" />
<TextView
android:id="@+id/tv_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Body1"
app:layout_constraintBaseline_toBaselineOf="@+id/tv_amount"
app:layout_constraintStart_toStartOf="@+id/tv_title_date"
tools:text="27.08.2018" />
<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Body1"
app:layout_constraintBaseline_toBaselineOf="@+id/tv_date"
app:layout_constraintStart_toStartOf="@+id/tv_title_status"
tools:text="Correct" />
<ImageView
android:id="@+id/img_status"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginTop="@dimen/margin_small"
android:layout_marginEnd="@dimen/margin_small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_correct" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.35" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.65" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
================================================
FILE: app/src/main/res/layout/item_details.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:orientation="vertical"
android:focusable="true">
<TextView
android:id="@+id/tv_details_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_normal"
android:layout_marginTop="@dimen/margin_normal"
android:textAppearance="@style/DetailsTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Twitter" />
<TextView
android:id="@+id/tv_details_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:layout_marginBottom="@dimen/margin_normal"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/tv_details_title"
app:layout_constraintTop_toBottomOf="@+id/tv_details_title"
tools:text="$11,550.00 X1 (including VAT 10%)" />
<TextView
android:id="@+id/tv_details_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/DetailsBold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
tools:text="$11,550.00" />
<ImageView
android:id="@+id/img_details"
android:layout_width="@dimen/toolbar_icon_size"
android:layout_height="@dimen/toolbar_icon_size"
android:layout_marginEnd="@dimen/margin_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_right" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.70" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/menu/bottom_navigation_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_gift"
android:enabled="true"
android:icon="@drawable/ic_menu_gift"
android:title="Gift"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_wallet"
android:enabled="true"
android:icon="@drawable/ic_menu_wallet"
android:title="Gift"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_main"
android:enabled="true"
android:icon="@drawable/ic_menu_main"
android:title="Gift"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_dialog"
android:enabled="true"
android:icon="@drawable/ic_menu_dialog"
android:title="Gift"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_account"
android:enabled="true"
android:icon="@drawable/ic_menu_account"
android:title="Gift"
app:showAsAction="ifRoom" />
</menu>
================================================
FILE: app/src/main/res/transition/shared_element_transition.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="400"
android:interpolator="@android:interpolator/overshoot"
android:transitionOrdering="together"
android:startDelay="0">
<changeClipBounds/>
<changeTransform/>
<changeBounds/>
</transitionSet>
================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3aa3f7</color>
<color name="colorPrimaryDark">#025497</color>
<color name="colorAccent">#008dff</color>
<color name="color_negative">#ff4d6a</color>
<color name="color_positive">@color/colorAccent</color>
<color name="toolbar_background">@color/colorAccent</color>
<color name="color_disabled">#505a595b</color>
<color name="title_text_color">#4d4d4d</color>
<color name="text_color_light">#eee</color>
<color name="window_background">@android:color/white</color>
</resources>
================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="font_title">26sp</dimen>
<dimen name="font_larger">22sp</dimen>
<dimen name="font_large">18sp</dimen>
<dimen name="font_normal">16sp</dimen>
<dimen name="font_medium">14sp</dimen>
<dimen name="font_small">12sp</dimen>
<dimen name="space_tiny">4dp</dimen>
<dimen name="space_small">8dp</dimen>
<dimen name="space_normal">16dp</dimen>
<dimen name="space_medium">24dp</dimen>
<dimen name="space_large">32dp</dimen>
<dimen name="space_xlarge">48dp</dimen>
<dimen name="space_huge">64dp</dimen>
<dimen name="margin_tiny">@dimen/space_tiny</dimen>
<dimen name="margin_small">@dimen/space_small</dimen>
<dimen name="margin_normal">@dimen/space_normal</dimen>
<dimen name="margin_large">@dimen/space_large</dimen>
<dimen name="margin_medium">@dimen/space_medium</dimen>
<dimen name="padding_tiny">@dimen/space_tiny</dimen>
<dimen name="padding_small">@dimen/space_small</dimen>
<dimen name="padding_normal">@dimen/space_normal</dimen>
<dimen name="padding_medium">@dimen/space_medium</dimen>
<dimen name="padding_large">@dimen/space_large</dimen>
<dimen name="fab_margin">@dimen/space_xlarge</dimen>
<dimen name="fab_translateY">100dp</dimen>
<dimen name="fab_elevation">@dimen/space_tiny</dimen>
<dimen name="card_elevation">@dimen/space_tiny</dimen>
<dimen name="toolbar_elevation">@dimen/space_tiny</dimen>
<dimen name="card_corner_radius">@dimen/space_small</dimen>
<dimen name="icon_size">56dp</dimen>
<dimen name="toolbar_icon_size">@dimen/space_medium</dimen>
<dimen name="details_toolbar_container_height">156dp</dimen>
<dimen name="details_card_height">146dp</dimen>
</resources>
================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">DroidMotion</string>
<string name="title_main">My income</string>
<string name="detail_caption_status">Status</string>
<string name="detail_caption_date">Date</string>
<string name="detail_caption_amount">Amount</string>
<string name="action_back">Back</string>
</resources>
================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>
<!-- Base application theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@color/window_background</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
<!-- Text styles -->
<style name="Title">
<item name="android:textSize">@dimen/font_title</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/title_text_color</item>
</style>
<style name="ToolbarAction" parent="Base.TextAppearance.AppCompat.Caption">
<item name="android:textColor">@color/text_color_light</item>
<item name="android:textSize">@dimen/font_medium</item>
</style>
<style name="DetailsTitle" parent="Base.TextAppearance.AppCompat.Title">
<item name="android:textSize">@dimen/font_normal</item>
</style>
<style name="DetailsBold" parent="Base.TextAppearance.AppCompat.Body1">
<item name="android:textStyle">bold</item>
</style>
<style name="DetailsBold.Large" parent="Base.TextAppearance.AppCompat.Body1">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
================================================
FILE: app/src/main/res/values-sw600dp/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--For tab like Nexus 7-->
<dimen name="details_toolbar_container_height">164dp</dimen>
</resources>
================================================
FILE: app/src/main/res/values-sw720dp/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--For tab like Nexus 9 ~ w = 768dp-->
<dimen name="space_tiny">8dp</dimen>
<dimen name="space_small">12dp</dimen>
<dimen name="space_normal">20dp</dimen>
<dimen name="space_large">36dp</dimen>
<dimen name="space_xlarge">52dp</dimen>
<dimen name="space_huge">68dp</dimen>
<dimen name="font_title">28sp</dimen>
<dimen name="font_larger">24sp</dimen>
<dimen name="font_large">20sp</dimen>
<dimen name="font_normal">18sp</dimen>
<dimen name="font_medium">16sp</dimen>
<dimen name="font_small">14sp</dimen>
<dimen name="icon_size">76dp</dimen>
<dimen name="details_toolbar_container_height">196dp</dimen>
</resources>
================================================
FILE: app/src/test/java/com/bitvale/droidmotion/ExampleUnitTest.kt
================================================
package com.bitvale.droidmotion
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
// Sdk and tools
compileSdkVersion = 28
minSdkVersion = 19
targetSdkVersion = 28
// App dependencies
constraintLayoutVersion = '1.1.2'
gradleVersion = '3.3.0-alpha10'
junitVersion = '4.12'
kotlinVersion = '1.2.61'
androidxVersion = "1.0.0-rc02"
materialVersion = "1.0.0-rc01"
constraintLayoutVersion = '1.1.2'
}
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:$gradleVersion"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Wed Sep 12 22:37:27 EET 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: settings.gradle
================================================
include ':app'
gitextract_vvxwq36_/ ├── .gitignore ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── bitvale/ │ │ └── droidmotion/ │ │ └── ExampleInstrumentedTest.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── bitvale/ │ │ │ └── droidmotion/ │ │ │ ├── MainActivity.kt │ │ │ ├── adapter/ │ │ │ │ ├── BaseViewHolder.kt │ │ │ │ └── RecyclerAdapter.kt │ │ │ ├── common/ │ │ │ │ ├── Constants.kt │ │ │ │ └── Extensions.kt │ │ │ ├── fragment/ │ │ │ │ ├── BaseFragment.kt │ │ │ │ ├── DetailsFragment.kt │ │ │ │ └── RecyclerFragment.kt │ │ │ ├── listener/ │ │ │ │ ├── BottomNavigationViewListener.kt │ │ │ │ └── OnBackPressedListener.kt │ │ │ └── model/ │ │ │ └── DataProvider.kt │ │ └── res/ │ │ ├── anim/ │ │ │ ├── item_animation_fall_down.xml │ │ │ └── layout_animation_fall_down.xml │ │ ├── animator/ │ │ │ └── main_list_animator.xml │ │ ├── drawable/ │ │ │ ├── bottom_navigation_selector.xml │ │ │ ├── ic_complaint.xml │ │ │ ├── ic_correct.xml │ │ │ ├── ic_error.xml │ │ │ ├── ic_export.xml │ │ │ ├── ic_file.xml │ │ │ ├── ic_incorrect.xml │ │ │ ├── ic_left.xml │ │ │ ├── ic_menu_account.xml │ │ │ ├── ic_menu_dialog.xml │ │ │ ├── ic_menu_gift.xml │ │ │ ├── ic_menu_main.xml │ │ │ ├── ic_menu_wallet.xml │ │ │ ├── ic_negative.xml │ │ │ ├── ic_not_received.xml │ │ │ ├── ic_positive.xml │ │ │ ├── ic_received.xml │ │ │ ├── ic_right.xml │ │ │ ├── ic_sort.xml │ │ │ ├── img_apple.xml │ │ │ ├── img_dribble.xml │ │ │ ├── img_facebook.xml │ │ │ ├── img_github.xml │ │ │ ├── img_google_play.xml │ │ │ ├── img_instagram.xml │ │ │ ├── img_twitter.xml │ │ │ ├── img_vimeo.xml │ │ │ ├── img_vk.xml │ │ │ ├── img_youtube.xml │ │ │ └── splash_screen.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_recycler.xml │ │ │ ├── item_card.xml │ │ │ └── item_details.xml │ │ ├── menu/ │ │ │ └── bottom_navigation_main.xml │ │ ├── transition/ │ │ │ └── shared_element_transition.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── values-sw600dp/ │ │ │ └── dimens.xml │ │ └── values-sw720dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── bitvale/ │ └── droidmotion/ │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle
Condensed preview — 73 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (113K chars).
[
{
"path": ".gitignore",
"chars": 195,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches/build_file_checksums.ser\n/.idea/libraries\n/.idea/modules.xml\n/.idea/worksp"
},
{
"path": "LICENSE",
"chars": 1084,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2018 Alexander Kolpakov\n\nPermission is hereby granted, free of charge, to any perso"
},
{
"path": "README.md",
"chars": 1170,
"preview": "# DroidMotion\n\n<img src=\"/art/preview.gif\" alt=\"sample\" title=\"sample\" width=\"320\" height=\"600\" align=\"right\"/>\n\n[![Plat"
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/build.gradle",
"chars": 1723,
"preview": "apply plugin: 'com.android.application'\n\napply plugin: 'kotlin-android'\n\napply plugin: 'kotlin-android-extensions'\n\nandr"
},
{
"path": "app/proguard-rules.pro",
"chars": 771,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/src/androidTest/java/com/bitvale/droidmotion/ExampleInstrumentedTest.kt",
"chars": 632,
"preview": "package com.bitvale.droidmotion\n\nimport androidx.test.InstrumentationRegistry\nimport androidx.test.runner.AndroidJUnit4\n"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 751,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/MainActivity.kt",
"chars": 2089,
"preview": "package com.bitvale.droidmotion\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport android"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/adapter/BaseViewHolder.kt",
"chars": 1988,
"preview": "package com.bitvale.droidmotion.adapter\n\nimport android.os.Build\nimport androidx.recyclerview.widget.RecyclerView\nimport"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/adapter/RecyclerAdapter.kt",
"chars": 1298,
"preview": "package com.bitvale.droidmotion.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport android.view.View\nimpor"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/common/Constants.kt",
"chars": 222,
"preview": "package com.bitvale.droidmotion.common\n\n\nconst val TRANSITION_CARD = \"card_transition_\"\nconst val TRANSITION_TOOLBAR = \""
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/common/Extensions.kt",
"chars": 3110,
"preview": "package com.bitvale.droidmotion.common\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapt"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/fragment/BaseFragment.kt",
"chars": 1056,
"preview": "package com.bitvale.droidmotion.fragment\n\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGrou"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/fragment/DetailsFragment.kt",
"chars": 4650,
"preview": "package com.bitvale.droidmotion.fragment\n\nimport android.animation.AnimatorInflater\nimport android.os.Bundle\nimport andr"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/fragment/RecyclerFragment.kt",
"chars": 6871,
"preview": "package com.bitvale.droidmotion.fragment\n\nimport android.animation.AnimatorInflater\nimport android.animation.ValueAnimat"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/listener/BottomNavigationViewListener.kt",
"chars": 209,
"preview": "package com.bitvale.droidmotion.listener\n\n/**\n * Created by Alexander Kolpakov on 29.07.2018\n */\ninterface BottomNavigat"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/listener/OnBackPressedListener.kt",
"chars": 156,
"preview": "package com.bitvale.droidmotion.listener\n\n/**\n * Created by Alexander Kolpakov on 26.07.2018\n */\ninterface OnBackPressed"
},
{
"path": "app/src/main/java/com/bitvale/droidmotion/model/DataProvider.kt",
"chars": 2575,
"preview": "package com.bitvale.droidmotion.model\n\nimport androidx.annotation.DrawableRes\nimport com.bitvale.androidmotion.R\n\n/**\n *"
},
{
"path": "app/src/main/res/anim/item_animation_fall_down.xml",
"chars": 738,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:durat"
},
{
"path": "app/src/main/res/anim/layout_animation_fall_down.xml",
"chars": 232,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layoutAnimation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "app/src/main/res/animator/main_list_animator.xml",
"chars": 788,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:order"
},
{
"path": "app/src/main/res/drawable/bottom_navigation_selector.xml",
"chars": 278,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "app/src/main/res/drawable/ic_complaint.xml",
"chars": 908,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_correct.xml",
"chars": 455,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_error.xml",
"chars": 876,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_export.xml",
"chars": 1591,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "app/src/main/res/drawable/ic_file.xml",
"chars": 943,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_incorrect.xml",
"chars": 1571,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_left.xml",
"chars": 794,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_menu_account.xml",
"chars": 391,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_menu_dialog.xml",
"chars": 1503,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_menu_gift.xml",
"chars": 1762,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "app/src/main/res/drawable/ic_menu_main.xml",
"chars": 1087,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_menu_wallet.xml",
"chars": 1184,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_negative.xml",
"chars": 990,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_not_received.xml",
"chars": 1352,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "app/src/main/res/drawable/ic_positive.xml",
"chars": 799,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "app/src/main/res/drawable/ic_received.xml",
"chars": 1148,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:viewpo"
},
{
"path": "app/src/main/res/drawable/ic_right.xml",
"chars": 802,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/ic_sort.xml",
"chars": 1102,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_apple.xml",
"chars": 1619,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_dribble.xml",
"chars": 2112,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_facebook.xml",
"chars": 697,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_github.xml",
"chars": 1597,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_google_play.xml",
"chars": 1327,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_instagram.xml",
"chars": 1856,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_twitter.xml",
"chars": 1430,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_vimeo.xml",
"chars": 888,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_vk.xml",
"chars": 1899,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/img_youtube.xml",
"chars": 1125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:vi"
},
{
"path": "app/src/main/res/drawable/splash_screen.xml",
"chars": 311,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item"
},
{
"path": "app/src/main/res/layout/activity_main.xml",
"chars": 1443,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/layout/fragment_details.xml",
"chars": 6283,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/layout/fragment_recycler.xml",
"chars": 3926,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/layout/item_card.xml",
"chars": 5677,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/"
},
{
"path": "app/src/main/res/layout/item_details.xml",
"chars": 2704,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/menu/bottom_navigation_main.xml",
"chars": 1139,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app=\"h"
},
{
"path": "app/src/main/res/transition/shared_element_transition.xml",
"chars": 356,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<transitionSet\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "app/src/main/res/values/colors.xml",
"chars": 600,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#3aa3f7</color>\n <color name=\"color"
},
{
"path": "app/src/main/res/values/dimens.xml",
"chars": 1783,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <dimen name=\"font_title\">26sp</dimen>\n <dimen name=\"font_large"
},
{
"path": "app/src/main/res/values/strings.xml",
"chars": 337,
"preview": "<resources>\n\n <string name=\"app_name\">DroidMotion</string>\n <string name=\"title_main\">My income</string>\n <stri"
},
{
"path": "app/src/main/res/values/styles.xml",
"chars": 1588,
"preview": "<resources>\n <!-- Base application theme -->\n <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n "
},
{
"path": "app/src/main/res/values-sw600dp/dimens.xml",
"chars": 160,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!--For tab like Nexus 7-->\n <dimen name=\"details_toolbar_cont"
},
{
"path": "app/src/main/res/values-sw720dp/dimens.xml",
"chars": 727,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!--For tab like Nexus 9 ~ w = 768dp-->\n <dimen name=\"space_ti"
},
{
"path": "app/src/test/java/com/bitvale/droidmotion/ExampleUnitTest.kt",
"chars": 348,
"preview": "package com.bitvale.droidmotion\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which"
},
{
"path": "build.gradle",
"chars": 1043,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n\n "
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 231,
"preview": "#Wed Sep 12 22:37:27 EET 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
},
{
"path": "gradle.properties",
"chars": 779,
"preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
},
{
"path": "gradlew",
"chars": 5296,
"preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n## Gradle start up"
},
{
"path": "gradlew.bat",
"chars": 2176,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "settings.gradle",
"chars": 15,
"preview": "include ':app'\n"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the bitvale/DroidMotion GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 73 files (100.9 KB), approximately 35.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.