fixed crashes

fixed #633
This commit is contained in:
Mariotaku Lee 2016-11-26 16:13:00 +08:00
parent 0a5002f10a
commit fc5b5a0360
12 changed files with 67 additions and 34 deletions

View File

@ -33,14 +33,15 @@
-dontwarn sun.misc.**
-dontwarn sun.nio.**
-dontwarn java.nio.file.**
-dontwarn InnerClasses
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keepattributes SourceFile
-keepattributes LineNumberTable
-keepattributes Signature
-keepattributes InnetClasses
-keepattributes InnerClasses
# https://github.com/bluelinelabs/LoganSquare
-keep class com.bluelinelabs.logansquare.annotation.JsonObject

View File

@ -0,0 +1,16 @@
package android.support.v4.app
/**
* Created by mariotaku on 2016/11/26.
*/
fun LoaderManager.hasRunningLoadersSafe(): Boolean {
if (!(this is LoaderManagerImpl)) return false
var loadersRunning = false
val count = mLoaders.size()
for (i in 0 until count) {
val li = mLoaders.valueAt(i) ?: continue
loadersRunning = loadersRunning or (li.mStarted && !li.mDeliveredData)
}
return loadersRunning
}

View File

@ -24,10 +24,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Parcelable
import android.support.v4.app.ActivityCompat
import android.support.v4.app.DialogFragment
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v4.app.*
import android.support.v4.view.ViewPager
import android.support.v7.widget.Toolbar
import android.view.Menu
@ -103,10 +100,9 @@ class MediaViewerActivity : BaseActivity(), IExtendedActivity, ATEToolbarCustomi
val adapter = viewPager.adapter
val currentItem = viewPager.currentItem
if (currentItem < 0 || currentItem >= adapter.count) return false
val obj = adapter.instantiateItem(viewPager, currentItem)
if (obj !is MediaViewerFragment) return false
val obj = adapter.instantiateItem(viewPager, currentItem) as? MediaViewerFragment ?: return false
if (obj is CacheDownloadMediaViewerFragment) {
val running = obj.loaderManager.hasRunningLoaders()
val running = obj.loaderManager.hasRunningLoadersSafe()
val downloaded = obj.hasDownloadedData()
MenuUtils.setItemAvailability(menu, R.id.refresh, !running && !downloaded)
MenuUtils.setItemAvailability(menu, R.id.share, !running && downloaded)

View File

@ -335,7 +335,7 @@ abstract class AbsStatusesFragment protected constructor() :
val lastItemIndex = Math.min(statusEndIndex, lastVisiblePos)
lastReadPositionKey = adapter.getStatusPositionKey(lastItemIndex)
val positionView = layoutManager.findViewByPosition(lastItemIndex)
lastVisibleTop = if (positionView != null) positionView.top else 0
lastVisibleTop = positionView?.top ?: 0
} else if (rememberPosition && tag != null) {
lastReadPositionKey = readStateManager.getPosition(tag)
lastVisibleTop = 0

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView
import android.view.KeyEvent
@ -50,7 +51,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment<Par
override var refreshing: Boolean
get() {
if (context == null || isDetached) return false
return loaderManager.hasRunningLoaders()
return loaderManager.hasRunningLoadersSafe()
}
set(value) {
super.refreshing = value

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.text.TextUtils
import com.squareup.otto.Subscribe
@ -199,7 +200,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() {
override var refreshing: Boolean
get() {
if (context == null || isDetached) return false
return loaderManager.hasRunningLoaders()
return loaderManager.hasRunningLoadersSafe()
}
set(value) {
super.refreshing = value

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView
import android.view.KeyEvent
@ -52,7 +53,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment<
override var refreshing: Boolean
get() {
if (context == null || isDetached) return false
return loaderManager.hasRunningLoaders()
return loaderManager.hasRunningLoadersSafe()
}
set(value) {
super.refreshing = value

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
@ -85,7 +86,7 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
override var refreshing: Boolean
get() {
if (context == null || isDetached) return false
return loaderManager.hasRunningLoaders()
return loaderManager.hasRunningLoadersSafe()
}
set(value) {
super.refreshing = value

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.view.View
import android.widget.AdapterView
@ -100,7 +101,7 @@ class SavedSearchesListFragment : AbsContentListViewFragment<SavedSearchesAdapte
}
override var refreshing: Boolean
get() = loaderManager.hasRunningLoaders()
get() = loaderManager.hasRunningLoadersSafe()
set(value) {
super.refreshing = value
}

View File

@ -35,6 +35,7 @@ import android.os.Bundle
import android.support.annotation.UiThread
import android.support.v4.app.FragmentManagerAccessor
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.AsyncTaskLoader
import android.support.v4.content.ContextCompat
import android.support.v4.content.Loader
@ -485,7 +486,7 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
}
override val refreshing: Boolean
get() = loaderManager.hasRunningLoaders()
get() = loaderManager.hasRunningLoadersSafe()
override fun onLoadMoreContents(@IndicatorPosition position: Long) {
if (!hasMoreConversation) return
@ -558,6 +559,7 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
private fun displayTranslation(translation: TranslationResult) {
adapter?.translationResult = translation
val status = this.status
val context = this.context ?: return
if (status != null) {
val event = TranslateEvent.create(context, status, translation.translatedLang)
HotMobiLogger.getInstance(context).log(status.account_key, event);
@ -565,24 +567,27 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
}
private fun saveReadPosition(): ReadPosition? {
val position = layoutManager!!.findFirstVisibleItemPosition()
val lm = layoutManager ?: return null
val adapter = this.adapter ?: return null
val position = lm.findFirstVisibleItemPosition()
if (position == RecyclerView.NO_POSITION) return null
val itemType = adapter!!.getItemType(position)
var itemId = adapter!!.getItemId(position)
val itemType = adapter.getItemType(position)
var itemId = adapter.getItemId(position)
val positionView: View?
if (itemType == StatusAdapter.ITEM_IDX_CONVERSATION_LOAD_MORE) {
// Should be next item
positionView = layoutManager!!.findViewByPosition(position + 1)
itemId = adapter!!.getItemId(position + 1)
positionView = lm.findViewByPosition(position + 1)
itemId = adapter.getItemId(position + 1)
} else {
positionView = layoutManager!!.findViewByPosition(position)
positionView = lm.findViewByPosition(position)
}
return ReadPosition(itemId, if (positionView != null) positionView.top else 0)
return ReadPosition(itemId, positionView?.top ?: 0)
}
private fun restoreReadPosition(position: ReadPosition?) {
val adapter = this.adapter ?: return
if (position == null) return
val adapterPosition = adapter!!.findPositionByItemId(position.statusId)
val adapterPosition = adapter.findPositionByItemId(position.statusId)
if (adapterPosition < 0) return
//TODO maintain read position
layoutManager!!.scrollToPositionWithOffset(adapterPosition, position.offsetTop)

View File

@ -757,6 +757,7 @@ class UserFragment : BaseSupportFragment(), OnClickListener, OnLinkClickListener
@UiThread
override fun onPrepareOptionsMenu(menu: Menu?) {
val user = user ?: return
val account = this.account
val isMyself = user.account_key.maybeEquals(user.key)
val mentionItem = menu!!.findItem(R.id.mention)
@ -768,21 +769,29 @@ class UserFragment : BaseSupportFragment(), OnClickListener, OnLinkClickListener
MenuUtils.setItemAvailability(menu, R.id.mention, !isMyself)
MenuUtils.setItemAvailability(menu, R.id.incoming_friendships, isMyself)
MenuUtils.setItemAvailability(menu, R.id.saved_searches, isMyself)
MenuUtils.setItemAvailability(menu, R.id.scheduled_statuses, isMyself && MicroBlogAPIFactory.getOfficialKeyType(activity, user.account_key) == ConsumerKeyType.TWEETDECK)
MenuUtils.setItemAvailability(menu, R.id.muted_users, isMyself)
MenuUtils.setItemAvailability(menu, R.id.blocked_users, isMyself)
MenuUtils.setItemAvailability(menu, R.id.scheduled_statuses, isMyself &&
MicroBlogAPIFactory.getOfficialKeyType(activity, user.account_key)
== ConsumerKeyType.TWEETDECK)
MenuUtils.setItemAvailability(menu, R.id.blocked_users, isMyself)
MenuUtils.setItemAvailability(menu, R.id.block, !isMyself)
MenuUtils.setItemAvailability(menu, R.id.mute_user, !isMyself)
MenuUtils.setItemAvailability(menu, R.id.report_spam, !isMyself)
MenuUtils.setItemAvailability(menu, R.id.enable_retweets, !isMyself)
val isTwitter: Boolean
if (account != null) {
MenuUtils.setItemAvailability(menu, R.id.add_to_list, TextUtils.equals(ParcelableAccount.Type.TWITTER,
ParcelableAccountUtils.getAccountType(account!!)))
isTwitter = TextUtils.equals(ParcelableAccount.Type.TWITTER,
ParcelableAccountUtils.getAccountType(account))
} else {
MenuUtils.setItemAvailability(menu, R.id.add_to_list, false)
isTwitter = false
}
MenuUtils.setItemAvailability(menu, R.id.add_to_list, isTwitter)
MenuUtils.setItemAvailability(menu, R.id.mute_user, !isMyself && isTwitter)
MenuUtils.setItemAvailability(menu, R.id.muted_users, isMyself && isTwitter)
MenuUtils.setItemAvailability(menu, R.id.report_spam, !isMyself && isTwitter)
MenuUtils.setItemAvailability(menu, R.id.enable_retweets, !isMyself && isTwitter)
val userRelationship = relationship
if (userRelationship != null) {

View File

@ -3,6 +3,7 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.StaggeredGridLayoutManager
@ -37,7 +38,7 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment<StaggeredGridPa
override var refreshing: Boolean
get() {
if (context == null || isDetached) return false
return loaderManager.hasRunningLoaders()
return loaderManager.hasRunningLoadersSafe()
}
set(value) {
super.refreshing = value