Fix #636. Minor improvements. Dependency updates
This commit is contained in:
parent
6de260d73f
commit
4d7b188999
@ -102,7 +102,7 @@ dependencies {
|
|||||||
compile 'com.github.inorichi:junrar-android:634c1f5'
|
compile 'com.github.inorichi:junrar-android:634c1f5'
|
||||||
|
|
||||||
// Android support library
|
// Android support library
|
||||||
final support_library_version = '25.1.1'
|
final support_library_version = '25.2.0'
|
||||||
compile "com.android.support:support-v4:$support_library_version"
|
compile "com.android.support:support-v4:$support_library_version"
|
||||||
compile "com.android.support:appcompat-v7:$support_library_version"
|
compile "com.android.support:appcompat-v7:$support_library_version"
|
||||||
compile "com.android.support:cardview-v7:$support_library_version"
|
compile "com.android.support:cardview-v7:$support_library_version"
|
||||||
@ -111,7 +111,7 @@ dependencies {
|
|||||||
compile "com.android.support:support-annotations:$support_library_version"
|
compile "com.android.support:support-annotations:$support_library_version"
|
||||||
compile "com.android.support:customtabs:$support_library_version"
|
compile "com.android.support:customtabs:$support_library_version"
|
||||||
|
|
||||||
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
|
compile 'com.android.support.constraint:constraint-layout:1.0.0'
|
||||||
|
|
||||||
compile 'com.android.support:multidex:1.0.1'
|
compile 'com.android.support:multidex:1.0.1'
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ dependencies {
|
|||||||
compile 'com.squareup.okio:okio:1.11.0'
|
compile 'com.squareup.okio:okio:1.11.0'
|
||||||
|
|
||||||
// REST
|
// REST
|
||||||
final retrofit_version = '2.1.0'
|
final retrofit_version = '2.2.0'
|
||||||
compile "com.squareup.retrofit2:retrofit:$retrofit_version"
|
compile "com.squareup.retrofit2:retrofit:$retrofit_version"
|
||||||
compile "com.squareup.retrofit2:converter-gson:$retrofit_version"
|
compile "com.squareup.retrofit2:converter-gson:$retrofit_version"
|
||||||
compile "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
|
compile "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
|
||||||
@ -151,13 +151,13 @@ dependencies {
|
|||||||
|
|
||||||
// Job scheduling
|
// Job scheduling
|
||||||
compile 'com.evernote:android-job:1.1.6'
|
compile 'com.evernote:android-job:1.1.6'
|
||||||
compile 'com.google.android.gms:play-services-gcm:10.0.1'
|
compile 'com.google.android.gms:play-services-gcm:10.2.0'
|
||||||
|
|
||||||
// Changelog
|
// Changelog
|
||||||
compile 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'
|
compile 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'
|
||||||
|
|
||||||
// Database
|
// Database
|
||||||
compile "com.pushtorefresh.storio:sqlite:1.12.2"
|
compile "com.pushtorefresh.storio:sqlite:1.12.3"
|
||||||
|
|
||||||
// Model View Presenter
|
// Model View Presenter
|
||||||
final nucleus_version = '3.0.0'
|
final nucleus_version = '3.0.0'
|
||||||
|
@ -98,9 +98,6 @@
|
|||||||
android:name=".data.download.DownloadService"
|
android:name=".data.download.DownloadService"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".data.track.TrackUpdateService"
|
|
||||||
android:exported="false" />
|
|
||||||
<service
|
<service
|
||||||
android:name=".data.updater.UpdateDownloaderService"
|
android:name=".data.updater.UpdateDownloaderService"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
@ -22,8 +22,6 @@ interface Track : Serializable {
|
|||||||
|
|
||||||
var status: Int
|
var status: Int
|
||||||
|
|
||||||
var update: Boolean
|
|
||||||
|
|
||||||
fun copyPersonalFrom(other: Track) {
|
fun copyPersonalFrom(other: Track) {
|
||||||
last_chapter_read = other.last_chapter_read
|
last_chapter_read = other.last_chapter_read
|
||||||
score = other.score
|
score = other.score
|
||||||
|
@ -20,8 +20,6 @@ class TrackImpl : Track {
|
|||||||
|
|
||||||
override var status: Int = 0
|
override var status: Int = 0
|
||||||
|
|
||||||
override var update: Boolean = false
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (other == null || javaClass != other.javaClass) return false
|
if (other == null || javaClass != other.javaClass) return false
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.data.track
|
|
||||||
|
|
||||||
import android.app.Service
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.IBinder
|
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.Track
|
|
||||||
import rx.Observable
|
|
||||||
import rx.android.schedulers.AndroidSchedulers
|
|
||||||
import rx.schedulers.Schedulers
|
|
||||||
import rx.subscriptions.CompositeSubscription
|
|
||||||
import uy.kohesive.injekt.injectLazy
|
|
||||||
|
|
||||||
class TrackUpdateService : Service() {
|
|
||||||
|
|
||||||
val trackManager: TrackManager by injectLazy()
|
|
||||||
val db: DatabaseHelper by injectLazy()
|
|
||||||
|
|
||||||
private lateinit var subscriptions: CompositeSubscription
|
|
||||||
|
|
||||||
override fun onCreate() {
|
|
||||||
super.onCreate()
|
|
||||||
subscriptions = CompositeSubscription()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
|
||||||
subscriptions.unsubscribe()
|
|
||||||
super.onDestroy()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
|
|
||||||
val track = intent.getSerializableExtra(EXTRA_TRACK)
|
|
||||||
if (track != null) {
|
|
||||||
updateLastChapterRead(track as Track, startId)
|
|
||||||
return Service.START_REDELIVER_INTENT
|
|
||||||
} else {
|
|
||||||
stopSelf(startId)
|
|
||||||
return Service.START_NOT_STICKY
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBind(intent: Intent): IBinder? {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateLastChapterRead(track: Track, startId: Int) {
|
|
||||||
val sync = trackManager.getService(track.sync_id)
|
|
||||||
if (sync == null) {
|
|
||||||
stopSelf(startId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
subscriptions.add(Observable.defer { sync.update(track) }
|
|
||||||
.flatMap { db.insertTrack(track).asRxObservable() }
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe({ stopSelf(startId) },
|
|
||||||
{ stopSelf(startId) }))
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
private val EXTRA_TRACK = "extra_track"
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun start(context: Context, track: Track) {
|
|
||||||
val intent = Intent(context, TrackUpdateService::class.java)
|
|
||||||
intent.putExtra(EXTRA_TRACK, track)
|
|
||||||
context.startService(intent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -45,7 +45,7 @@ class TrackFragment : BaseRxFragment<TrackPresenter>() {
|
|||||||
|
|
||||||
private fun findSearchFragmentIfNeeded() {
|
private fun findSearchFragmentIfNeeded() {
|
||||||
if (dialog == null) {
|
if (dialog == null) {
|
||||||
dialog = childFragmentManager.findFragmentByTag(searchFragmentTag) as TrackSearchDialog
|
dialog = childFragmentManager.findFragmentByTag(searchFragmentTag) as? TrackSearchDialog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,11 +171,11 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
|
|||||||
.content(getString(R.string.confirm_update_manga_sync, chapterToUpdate))
|
.content(getString(R.string.confirm_update_manga_sync, chapterToUpdate))
|
||||||
.positiveText(android.R.string.yes)
|
.positiveText(android.R.string.yes)
|
||||||
.negativeText(android.R.string.no)
|
.negativeText(android.R.string.no)
|
||||||
.onPositive { dialog, which -> presenter.updateTrackLastChapterRead() }
|
.onPositive { dialog, which -> presenter.updateTrackLastChapterRead(chapterToUpdate) }
|
||||||
.onAny { dialog1, which1 -> super.onBackPressed() }
|
.onAny { dialog1, which1 -> super.onBackPressed() }
|
||||||
.show()
|
.show()
|
||||||
} else {
|
} else {
|
||||||
presenter.updateTrackLastChapterRead()
|
presenter.updateTrackLastChapterRead(chapterToUpdate)
|
||||||
super.onBackPressed()
|
super.onBackPressed()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -14,7 +14,6 @@ import eu.kanade.tachiyomi.data.database.models.Track
|
|||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||||
import eu.kanade.tachiyomi.data.track.TrackUpdateService
|
|
||||||
import eu.kanade.tachiyomi.source.LocalSource
|
import eu.kanade.tachiyomi.source.LocalSource
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
@ -452,27 +451,31 @@ class ReaderPresenter : BasePresenter<ReaderActivity>() {
|
|||||||
Math.floor(chapter.chapter_number.toDouble()).toInt()
|
Math.floor(chapter.chapter_number.toDouble()).toInt()
|
||||||
else if (prevChapter != null && prevChapter.read)
|
else if (prevChapter != null && prevChapter.read)
|
||||||
Math.floor(prevChapter.chapter_number.toDouble()).toInt()
|
Math.floor(prevChapter.chapter_number.toDouble()).toInt()
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
|
||||||
|
return if (trackList.any { lastChapterRead > it.last_chapter_read })
|
||||||
|
lastChapterRead
|
||||||
else
|
else
|
||||||
0
|
0
|
||||||
|
|
||||||
trackList.forEach { sync ->
|
|
||||||
if (lastChapterRead > sync.last_chapter_read) {
|
|
||||||
sync.last_chapter_read = lastChapterRead
|
|
||||||
sync.update = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return if (trackList.any { it.update }) lastChapterRead else 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts the service that updates the last chapter read in sync services
|
* Starts the service that updates the last chapter read in sync services
|
||||||
*/
|
*/
|
||||||
fun updateTrackLastChapterRead() {
|
fun updateTrackLastChapterRead(lastChapterRead: Int) {
|
||||||
trackList?.forEach { sync ->
|
trackList?.forEach { track ->
|
||||||
val service = trackManager.getService(sync.sync_id)
|
val service = trackManager.getService(track.sync_id)
|
||||||
if (service != null && service.isLogged && sync.update) {
|
if (service != null && service.isLogged && lastChapterRead > track.last_chapter_read) {
|
||||||
TrackUpdateService.start(context, sync)
|
track.last_chapter_read = lastChapterRead
|
||||||
|
|
||||||
|
// We wan't these to execute even if the presenter is destroyed and leaks for a
|
||||||
|
// while. The view can still be garbage collected.
|
||||||
|
Observable.defer { service.update(track) }
|
||||||
|
.map { db.insertTrack(track).executeAsBlocking() }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe({}, { Timber.e(it) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package eu.kanade.tachiyomi.ui.recent_updates
|
package eu.kanade.tachiyomi.ui.recent_updates
|
||||||
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible
|
||||||
|
|
||||||
class RecentChaptersAdapter(val fragment: RecentChaptersFragment) :
|
class RecentChaptersAdapter(val fragment: RecentChaptersFragment) :
|
||||||
FlexibleAdapter<RecentChapterItem>(null, fragment, true) {
|
FlexibleAdapter<IFlexible<*>>(null, fragment, true) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setDisplayHeadersAtStartUp(true)
|
setDisplayHeadersAtStartUp(true)
|
||||||
|
@ -9,6 +9,7 @@ import android.support.v7.widget.RecyclerView
|
|||||||
import android.view.*
|
import android.view.*
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
|
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
|
||||||
@ -116,7 +117,7 @@ class RecentChaptersFragment:
|
|||||||
* @return list of selected chapters
|
* @return list of selected chapters
|
||||||
*/
|
*/
|
||||||
fun getSelectedChapters(): List<RecentChapterItem> {
|
fun getSelectedChapters(): List<RecentChapterItem> {
|
||||||
return adapter.selectedPositions.mapNotNull { adapter.getItem(it) }
|
return adapter.selectedPositions.mapNotNull { adapter.getItem(it) as? RecentChapterItem }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,7 +126,7 @@ class RecentChaptersFragment:
|
|||||||
*/
|
*/
|
||||||
override fun onItemClick(position: Int): Boolean {
|
override fun onItemClick(position: Int): Boolean {
|
||||||
// Get item from position
|
// Get item from position
|
||||||
val item = adapter.getItem(position)
|
val item = adapter.getItem(position) as? RecentChapterItem ?: return false
|
||||||
if (actionMode != null && adapter.mode == FlexibleAdapter.MODE_MULTI) {
|
if (actionMode != null && adapter.mode == FlexibleAdapter.MODE_MULTI) {
|
||||||
toggleSelection(position)
|
toggleSelection(position)
|
||||||
return true
|
return true
|
||||||
@ -183,7 +184,7 @@ class RecentChaptersFragment:
|
|||||||
* Populate adapter with chapters
|
* Populate adapter with chapters
|
||||||
* @param chapters list of [Any]
|
* @param chapters list of [Any]
|
||||||
*/
|
*/
|
||||||
fun onNextRecentChapters(chapters: List<RecentChapterItem>) {
|
fun onNextRecentChapters(chapters: List<IFlexible<*>>) {
|
||||||
(activity as MainActivity).updateEmptyView(chapters.isEmpty(),
|
(activity as MainActivity).updateEmptyView(chapters.isEmpty(),
|
||||||
R.string.information_no_recent, R.drawable.ic_update_black_128dp)
|
R.string.information_no_recent, R.drawable.ic_update_black_128dp)
|
||||||
|
|
||||||
@ -291,6 +292,8 @@ class RecentChaptersFragment:
|
|||||||
* @param item item from ActionMode.
|
* @param item item from ActionMode.
|
||||||
*/
|
*/
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
||||||
|
if (!isAdded) return true
|
||||||
|
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_mark_as_read -> markAsRead(getSelectedChapters())
|
R.id.action_mark_as_read -> markAsRead(getSelectedChapters())
|
||||||
R.id.action_mark_as_unread -> markAsUnread(getSelectedChapters())
|
R.id.action_mark_as_unread -> markAsUnread(getSelectedChapters())
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:id="@+id/title_container"
|
android:id="@+id/title_container"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -48,14 +48,16 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/track_title"
|
android:id="@+id/track_title"
|
||||||
style="@style/TextAppearance.Medium.Button"
|
style="@style/TextAppearance.Medium.Button"
|
||||||
android:textColor="?colorAccent"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_marginStart="4dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_marginLeft="4dp"
|
||||||
|
android:gravity="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:ellipsize="middle"
|
||||||
android:text="@string/action_edit" />
|
android:text="@string/action_edit" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/divider1"
|
android:id="@+id/divider1"
|
||||||
@ -70,7 +72,7 @@
|
|||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp" />
|
android:layout_marginRight="16dp" />
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:id="@+id/status_container"
|
android:id="@+id/status_container"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -90,13 +92,14 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/track_status"
|
android:id="@+id/track_status"
|
||||||
style="@style/TextAppearance.Regular.Body1.Secondary"
|
style="@style/TextAppearance.Regular.Body1.Secondary"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_marginStart="4dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_marginLeft="4dp"
|
||||||
|
android:gravity="end"
|
||||||
tools:text="Reading" />
|
tools:text="Reading" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/divider2"
|
android:id="@+id/divider2"
|
||||||
@ -111,7 +114,7 @@
|
|||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp" />
|
android:layout_marginRight="16dp" />
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:id="@+id/chapters_container"
|
android:id="@+id/chapters_container"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -131,13 +134,14 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/track_chapters"
|
android:id="@+id/track_chapters"
|
||||||
style="@style/TextAppearance.Regular.Body1.Secondary"
|
style="@style/TextAppearance.Regular.Body1.Secondary"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_marginStart="4dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_marginLeft="4dp"
|
||||||
|
android:gravity="end"
|
||||||
tools:text="12/24" />
|
tools:text="12/24" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/divider3"
|
android:id="@+id/divider3"
|
||||||
@ -152,7 +156,7 @@
|
|||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp" />
|
android:layout_marginRight="16dp" />
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:id="@+id/score_container"
|
android:id="@+id/score_container"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -172,13 +176,14 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/track_score"
|
android:id="@+id/track_score"
|
||||||
style="@style/TextAppearance.Regular.Body1.Secondary"
|
style="@style/TextAppearance.Regular.Body1.Secondary"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_marginStart="4dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_marginLeft="4dp"
|
||||||
|
android:gravity="end"
|
||||||
tools:text="10" />
|
tools:text="10" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user