code cleanup
This commit is contained in:
parent
940f366fcb
commit
dbb61b7032
|
@ -41,7 +41,7 @@ android {
|
|||
|
||||
buildConfigField 'boolean', 'LEAK_CANARY_ENABLED', 'Boolean.parseBoolean("true")'
|
||||
buildConfigField 'boolean', 'SHOW_CUSTOM_TOKEN_DIALOG', 'Boolean.parseBoolean("false")'
|
||||
buildConfigField 'boolean', 'HOTMOBI_LOG_ENABLED', 'Boolean.parseBoolean("true")'
|
||||
buildConfigField 'boolean', 'HOTMOBI_LOG_ENABLED', 'Boolean.parseBoolean("false")'
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
|
@ -1,103 +0,0 @@
|
|||
/*
|
||||
* Twidere - Twitter client for Android
|
||||
*
|
||||
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package edu.tsinghua.hotmobi.model;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.bluelinelabs.logansquare.annotation.JsonField;
|
||||
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||
|
||||
import org.mariotaku.twidere.model.UserKey;
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 15/8/8.
|
||||
*/
|
||||
@JsonObject
|
||||
public class ScrollRecord implements LogModel {
|
||||
@JsonField(name = "id")
|
||||
String id;
|
||||
@JsonField(name = "account_id")
|
||||
String accountId;
|
||||
@JsonField(name = "account_host")
|
||||
String accountHost;
|
||||
@JsonField(name = "timestamp")
|
||||
long timestamp;
|
||||
@JsonField(name = "time_offset")
|
||||
long timeOffset;
|
||||
@JsonField(name = "scroll_state")
|
||||
int scrollState;
|
||||
|
||||
public static ScrollRecord create(String id, UserKey accountKey, long timestamp, long timeOffset, int scrollState) {
|
||||
final ScrollRecord record = new ScrollRecord();
|
||||
record.setId(id);
|
||||
record.setAccountId(accountKey.getId());
|
||||
record.setAccountHost(accountKey.getHost());
|
||||
record.setTimestamp(timestamp);
|
||||
record.setTimeOffset(timeOffset);
|
||||
record.setScrollState(scrollState);
|
||||
return record;
|
||||
}
|
||||
|
||||
public void setAccountId(String accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
public void setAccountHost(String accountHost) {
|
||||
this.accountHost = accountHost;
|
||||
}
|
||||
|
||||
public void setTimeOffset(long timeOffset) {
|
||||
this.timeOffset = timeOffset;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setTimestamp(long timestamp) {
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public void setScrollState(int scrollState) {
|
||||
this.scrollState = scrollState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ScrollRecord{" +
|
||||
"id=" + id +
|
||||
", mAccountKey=" + accountId +
|
||||
", timestamp=" + timestamp +
|
||||
", timeOffset=" + timeOffset +
|
||||
", scrollState=" + scrollState +
|
||||
'}';
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getLogFileName() {
|
||||
return "scroll";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -58,6 +58,9 @@ class AccountSelectorActivity : BaseActivity(), OnClickListener, OnItemClickList
|
|||
return intent.getBooleanExtra(EXTRA_OAUTH_ONLY, false)
|
||||
}
|
||||
|
||||
/**
|
||||
* If not null, account selector will only show accounts matched this host.
|
||||
*/
|
||||
private val accountHost: String?
|
||||
get() {
|
||||
return intent.getStringExtra(EXTRA_ACCOUNT_HOST)
|
||||
|
@ -73,6 +76,9 @@ class AccountSelectorActivity : BaseActivity(), OnClickListener, OnItemClickList
|
|||
return intent.getBooleanExtra(EXTRA_SINGLE_SELECTION, false)
|
||||
}
|
||||
|
||||
/**
|
||||
* True if you want account picked automatically if there are only one match.
|
||||
*/
|
||||
private val isSelectOnlyItemAutomatically: Boolean
|
||||
get() = intent.getBooleanExtra(EXTRA_SELECT_ONLY_ITEM_AUTOMATICALLY, false)
|
||||
|
||||
|
|
|
@ -34,10 +34,8 @@ import android.view.*
|
|||
import com.squareup.otto.Subscribe
|
||||
import edu.tsinghua.hotmobi.HotMobiLogger
|
||||
import edu.tsinghua.hotmobi.model.MediaEvent
|
||||
import edu.tsinghua.hotmobi.model.ScrollRecord
|
||||
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
|
||||
import org.mariotaku.abstask.library.AbstractTask
|
||||
import org.mariotaku.abstask.library.TaskStarter
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.twidere.BuildConfig
|
||||
import org.mariotaku.twidere.Constants.*
|
||||
import org.mariotaku.twidere.R
|
||||
|
@ -52,6 +50,7 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
|
|||
import org.mariotaku.twidere.annotation.ReadPositionTag
|
||||
import org.mariotaku.twidere.constant.IntentConstants
|
||||
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
||||
import org.mariotaku.twidere.constant.readFromBottomKey
|
||||
import org.mariotaku.twidere.fragment.AbsStatusesFragment.DefaultOnLikedListener
|
||||
import org.mariotaku.twidere.loader.iface.IExtendedLoader
|
||||
import org.mariotaku.twidere.model.*
|
||||
|
@ -73,50 +72,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec
|
|||
private lateinit var activitiesBusCallback: Any
|
||||
private lateinit var navigationHelper: RecyclerViewNavigationHelper
|
||||
|
||||
private var pauseOnScrollListener: OnScrollListener? = null
|
||||
private var activeHotMobiScrollTracker: OnScrollListener? = null
|
||||
|
||||
private val hotMobiScrollTracker = object : OnScrollListener() {
|
||||
|
||||
var records: MutableList<ScrollRecord>? = null
|
||||
private var firstVisibleTimestamp: Long = -1
|
||||
private var firstVisibleAccountId: UserKey? = null
|
||||
private var firstVisiblePosition = -1
|
||||
private var scrollState: Int = 0
|
||||
|
||||
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
|
||||
val layoutManager = recyclerView!!.layoutManager as LinearLayoutManager
|
||||
val pos = layoutManager.findFirstVisibleItemPosition()
|
||||
if (pos != firstVisiblePosition && pos >= 0) {
|
||||
//noinspection unchecked
|
||||
val adapter = recyclerView.adapter as ParcelableActivitiesAdapter
|
||||
val activity = adapter.getActivity(pos)
|
||||
if (activity != null) {
|
||||
val timestamp = activity.timestamp
|
||||
val accountKey = activity.account_key
|
||||
if (timestamp != firstVisibleTimestamp || accountKey != firstVisibleAccountId) {
|
||||
if (records == null) records = ArrayList<ScrollRecord>()
|
||||
val time = System.currentTimeMillis()
|
||||
records!!.add(ScrollRecord.create(timestamp.toString(), accountKey, time,
|
||||
TimeZone.getDefault().getOffset(time).toLong(), scrollState))
|
||||
}
|
||||
firstVisibleTimestamp = timestamp
|
||||
firstVisibleAccountId = accountKey
|
||||
}
|
||||
}
|
||||
firstVisiblePosition = pos
|
||||
}
|
||||
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
|
||||
scrollState = newState
|
||||
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
|
||||
if (records != null) {
|
||||
HotMobiLogger.getInstance(activity).logList(records, null, "scroll")
|
||||
}
|
||||
records = null
|
||||
}
|
||||
}
|
||||
}
|
||||
private lateinit var pauseOnScrollListener: OnScrollListener
|
||||
|
||||
private val onScrollListener = object : OnScrollListener() {
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
|
||||
|
@ -131,8 +87,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec
|
|||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
super.onActivityCreated(savedInstanceState)
|
||||
activitiesBusCallback = createMessageBusCallback()
|
||||
scrollListener!!.reversed = preferences.getBoolean(KEY_READ_FROM_BOTTOM)
|
||||
val layoutManager = layoutManager
|
||||
scrollListener.reversed = preferences[readFromBottomKey]
|
||||
adapter.setListener(this)
|
||||
registerForContextMenu(recyclerView)
|
||||
navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter,
|
||||
|
@ -153,13 +108,11 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec
|
|||
triggerRefresh()
|
||||
return true
|
||||
}
|
||||
val layoutManager = layoutManager
|
||||
if (recyclerView == null || layoutManager == null) return false
|
||||
val focusedChild = RecyclerViewUtils.findRecyclerViewChild(recyclerView,
|
||||
layoutManager.focusedChild)
|
||||
var position = RecyclerView.NO_POSITION
|
||||
if (focusedChild != null && focusedChild.parent === recyclerView) {
|
||||
position = recyclerView!!.getChildLayoutPosition(focusedChild)
|
||||
position = recyclerView.getChildLayoutPosition(focusedChild)
|
||||
}
|
||||
if (position != RecyclerView.NO_POSITION) {
|
||||
val activity = adapter.getActivity(position) ?: return false
|
||||
|
@ -394,34 +347,11 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec
|
|||
super.onStart()
|
||||
recyclerView.addOnScrollListener(onScrollListener)
|
||||
recyclerView.addOnScrollListener(pauseOnScrollListener)
|
||||
val task = object : AbstractTask<Any?, Boolean, RecyclerView>() {
|
||||
public override fun doLongOperation(params: Any?): Boolean {
|
||||
val context = context ?: return false
|
||||
val prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME,
|
||||
Context.MODE_PRIVATE)
|
||||
if (!prefs.getBoolean(KEY_USAGE_STATISTICS, false)) return false
|
||||
val logFile = HotMobiLogger.getLogFile(context, null, "scroll")
|
||||
return logFile.length() < 131072
|
||||
}
|
||||
|
||||
public override fun afterExecute(recyclerView: RecyclerView?, result: Boolean?) {
|
||||
if (result!!) {
|
||||
activeHotMobiScrollTracker = hotMobiScrollTracker
|
||||
recyclerView!!.addOnScrollListener(activeHotMobiScrollTracker)
|
||||
}
|
||||
}
|
||||
}
|
||||
task.callback = recyclerView
|
||||
TaskStarter.execute(task)
|
||||
bus.register(activitiesBusCallback)
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
bus.unregister(activitiesBusCallback)
|
||||
if (activeHotMobiScrollTracker != null) {
|
||||
recyclerView.removeOnScrollListener(activeHotMobiScrollTracker)
|
||||
}
|
||||
activeHotMobiScrollTracker = null
|
||||
recyclerView.removeOnScrollListener(pauseOnScrollListener)
|
||||
recyclerView.removeOnScrollListener(onScrollListener)
|
||||
if (userVisibleHint) {
|
||||
|
@ -513,14 +443,13 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec
|
|||
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo?) {
|
||||
if (!userVisibleHint || menuInfo == null) return
|
||||
val inflater = MenuInflater(context)
|
||||
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo?
|
||||
val position = contextMenuInfo!!.position
|
||||
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo
|
||||
val position = contextMenuInfo.position
|
||||
when (adapter.getItemViewType(position)) {
|
||||
ITEM_VIEW_TYPE_STATUS -> {
|
||||
val status = getActivityStatus(position) ?: return
|
||||
inflater.inflate(R.menu.action_status, menu)
|
||||
MenuUtils.setupForStatus(context, preferences, menu, status,
|
||||
twitterWrapper)
|
||||
MenuUtils.setupForStatus(context, preferences, menu, status, twitterWrapper)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,8 +43,10 @@ import org.mariotaku.twidere.view.iface.IExtendedView
|
|||
/**
|
||||
* Created by mariotaku on 15/10/26.
|
||||
*/
|
||||
abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<RecyclerView.ViewHolder>, L : RecyclerView.LayoutManager> : BaseSupportFragment(), SwipeRefreshLayout.OnRefreshListener, HeaderDrawerLayout.DrawerCallback, RefreshScrollTopInterface, IControlBarActivity.ControlBarOffsetListener, ContentScrollHandler.ContentListSupport, ControlBarShowHideHelper.ControlBarAnimationListener {
|
||||
|
||||
abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<RecyclerView.ViewHolder>,
|
||||
L : RecyclerView.LayoutManager> : BaseSupportFragment(), SwipeRefreshLayout.OnRefreshListener,
|
||||
HeaderDrawerLayout.DrawerCallback, RefreshScrollTopInterface, IControlBarActivity.ControlBarOffsetListener,
|
||||
ContentScrollHandler.ContentListSupport, ControlBarShowHideHelper.ControlBarAnimationListener {
|
||||
|
||||
lateinit var layoutManager: L
|
||||
protected set
|
||||
|
@ -55,7 +57,7 @@ abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<Recycle
|
|||
|
||||
// Callbacks and listeners
|
||||
private lateinit var drawerCallback: SimpleDrawerCallback
|
||||
var scrollListener: RecyclerViewScrollHandler? = null
|
||||
lateinit var scrollListener: RecyclerViewScrollHandler
|
||||
// Data fields
|
||||
private val systemWindowsInsets = Rect()
|
||||
|
||||
|
@ -201,8 +203,8 @@ abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<Recycle
|
|||
recyclerView.adapter = adapter
|
||||
|
||||
scrollListener = RecyclerViewScrollHandler(this, RecyclerViewScrollHandler.RecyclerViewCallback(recyclerView))
|
||||
scrollListener!!.touchSlop = ViewConfiguration.get(context).scaledTouchSlop
|
||||
recyclerView.setOnTouchListener(scrollListener!!.touchListener)
|
||||
scrollListener.touchSlop = ViewConfiguration.get(context).scaledTouchSlop
|
||||
recyclerView.setOnTouchListener(scrollListener.touchListener)
|
||||
}
|
||||
|
||||
protected open fun setupRecyclerView(context: Context, recyclerView: RecyclerView) {
|
||||
|
|
|
@ -29,19 +29,14 @@ import android.support.v4.content.Loader
|
|||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.support.v7.widget.RecyclerView.OnScrollListener
|
||||
import android.text.TextUtils
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import com.squareup.otto.Subscribe
|
||||
import edu.tsinghua.hotmobi.HotMobiLogger
|
||||
import edu.tsinghua.hotmobi.model.MediaEvent
|
||||
import edu.tsinghua.hotmobi.model.ScrollRecord
|
||||
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
|
||||
import org.mariotaku.abstask.library.AbstractTask
|
||||
import org.mariotaku.abstask.library.TaskStarter
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.twidere.BuildConfig
|
||||
import org.mariotaku.twidere.Constants
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.TwidereConstants
|
||||
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter
|
||||
|
@ -64,7 +59,6 @@ import org.mariotaku.twidere.view.ExtendedRecyclerView
|
|||
import org.mariotaku.twidere.view.holder.GapViewHolder
|
||||
import org.mariotaku.twidere.view.holder.StatusViewHolder
|
||||
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 14/11/5.
|
||||
|
@ -77,50 +71,9 @@ abstract class AbsStatusesFragment protected constructor() :
|
|||
private lateinit var statusesBusCallback: Any
|
||||
private lateinit var navigationHelper: RecyclerViewNavigationHelper
|
||||
private var pauseOnScrollListener: OnScrollListener? = null
|
||||
private var activeHotMobiScrollTracker: OnScrollListener? = null
|
||||
var loaderInitialized: Boolean = false
|
||||
private set
|
||||
private val hotMobiScrollTracker = object : OnScrollListener() {
|
||||
|
||||
var records: MutableList<ScrollRecord>? = null
|
||||
private var firstVisibleId: String? = null
|
||||
private var firstVisibleAccountId: UserKey? = null
|
||||
private var firstVisiblePosition = -1
|
||||
private var scrollState: Int = 0
|
||||
|
||||
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
|
||||
val layoutManager = recyclerView!!.layoutManager as LinearLayoutManager
|
||||
val position = layoutManager.findFirstVisibleItemPosition()
|
||||
if (position != position && position >= 0) {
|
||||
//noinspection unchecked
|
||||
val adapter = recyclerView.adapter as ParcelableStatusesAdapter
|
||||
val status = adapter.getStatus(position)
|
||||
if (status != null) {
|
||||
val id = status.id
|
||||
val accountId = status.account_key
|
||||
if (!TextUtils.equals(id, firstVisibleId) || accountId != firstVisibleAccountId) {
|
||||
if (records == null) records = ArrayList<ScrollRecord>()
|
||||
val time = System.currentTimeMillis()
|
||||
records!!.add(ScrollRecord.create(id, accountId, time,
|
||||
TimeZone.getDefault().getOffset(time).toLong(), scrollState))
|
||||
}
|
||||
firstVisibleId = id
|
||||
firstVisibleAccountId = accountId
|
||||
}
|
||||
}
|
||||
firstVisiblePosition = position
|
||||
}
|
||||
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
|
||||
scrollState = newState
|
||||
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
|
||||
if (records != null) {
|
||||
HotMobiLogger.getInstance(activity).logList(records, null, "scroll")
|
||||
}
|
||||
records = null
|
||||
}
|
||||
}
|
||||
}
|
||||
private val onScrollListener = object : OnScrollListener() {
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
|
||||
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
|
||||
|
@ -184,33 +137,11 @@ abstract class AbsStatusesFragment protected constructor() :
|
|||
super.onStart()
|
||||
recyclerView.addOnScrollListener(onScrollListener)
|
||||
recyclerView.addOnScrollListener(pauseOnScrollListener)
|
||||
val task = object : AbstractTask<Any?, Boolean, AbsStatusesFragment>() {
|
||||
public override fun doLongOperation(params: Any?): Boolean {
|
||||
val context = callback?.context ?: return false
|
||||
val prefs = callback?.preferences ?: return false
|
||||
if (!prefs.getBoolean(Constants.KEY_USAGE_STATISTICS, false)) return false
|
||||
val logFile = HotMobiLogger.getLogFile(context, null, "scroll")
|
||||
return logFile.length() < 131072
|
||||
}
|
||||
|
||||
public override fun afterExecute(fragment: AbsStatusesFragment?, result: Boolean) {
|
||||
if (result && fragment != null) {
|
||||
fragment.activeHotMobiScrollTracker = fragment.hotMobiScrollTracker
|
||||
fragment.recyclerView.addOnScrollListener(fragment.activeHotMobiScrollTracker)
|
||||
}
|
||||
}
|
||||
}
|
||||
task.callback = this
|
||||
TaskStarter.execute(task)
|
||||
bus.register(statusesBusCallback)
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
bus.unregister(statusesBusCallback)
|
||||
if (activeHotMobiScrollTracker != null) {
|
||||
recyclerView.removeOnScrollListener(activeHotMobiScrollTracker)
|
||||
}
|
||||
activeHotMobiScrollTracker = null
|
||||
recyclerView.removeOnScrollListener(pauseOnScrollListener)
|
||||
recyclerView.removeOnScrollListener(onScrollListener)
|
||||
if (userVisibleHint) {
|
||||
|
|
Loading…
Reference in New Issue