Loading build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ buildscript { propMinSdkVersion = 16 propTargetSdkVersion = propCompileSdkVersion propVersionCode = 1 propVersionName = '3.9.9' propVersionName = '3.11.3' kotlin_version = '1.2.21' support_libs = '27.0.2' } Loading commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt +17 −14 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc val layoutInflater = activity.layoutInflater var primaryColor = baseConfig.primaryColor var textColor = baseConfig.textColor var backgroundColor = baseConfig.backgroundColor var itemViews = SparseArray<View>() val selectedPositions = HashSet<Int>() var positionOffset = 0 private val multiSelector = MultiSelector() private var actMode: ActionMode? = null Loading Loading @@ -80,10 +82,10 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc } fun selectAll() { val cnt = itemCount val cnt = itemCount - positionOffset for (i in 0 until cnt) { selectedPositions.add(i) notifyItemChanged(i) notifyItemChanged(i + positionOffset) } updateTitle(cnt) } Loading @@ -96,7 +98,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc } override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) { selectItemRange(initialSelection, lastDraggedIndex, minReached, maxReached) selectItemRange(initialSelection, lastDraggedIndex - positionOffset, minReached, maxReached) } }) } else { Loading Loading @@ -223,7 +225,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fun createViewHolder(layoutType: Int, parent: ViewGroup?): ViewHolder { val view = layoutInflater.inflate(layoutType, parent, false) return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, itemClick) return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, positionOffset, itemClick) } fun bindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int, view: View) { Loading @@ -234,7 +236,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fun removeSelectedItems() { selectedPositions.sortedDescending().forEach { notifyItemRemoved(it) notifyItemRemoved(it + positionOffset) itemViews.put(it, null) } Loading @@ -248,8 +250,9 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fastScroller?.measureRecyclerView() } class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: BaseSimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback, val multiSelector: MultiSelector, val itemClick: (Any) -> (Unit)) : SwappingHolder(view, multiSelector) { open class ViewHolder(view: View, val adapterListener: MyAdapterListener? = null, val activity: BaseSimpleActivity? = null, val multiSelectorCallback: ModalMultiSelectorCallback? = null, val multiSelector: MultiSelector, val positionOffset: Int = 0, val itemClick: ((Any) -> (Unit))? = null) : SwappingHolder(view, multiSelector) { fun bindView(any: Any, allowLongClick: Boolean = true, callback: (itemView: View, layoutPosition: Int) -> Unit): View { return itemView.apply { callback(this, layoutPosition) Loading @@ -266,20 +269,20 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc private fun viewClicked(any: Any) { if (multiSelector.isSelectable) { val isSelected = adapterListener.getSelectedPositions().contains(adapterPosition) adapterListener.toggleItemSelectionAdapter(!isSelected, adapterPosition) val isSelected = adapterListener?.getSelectedPositions()?.contains(adapterPosition - positionOffset) ?: false adapterListener?.toggleItemSelectionAdapter(!isSelected, adapterPosition - positionOffset) } else { itemClick(any) itemClick?.invoke(any) } } private fun viewLongClicked() { if (!multiSelector.isSelectable) { activity.startSupportActionMode(multiSelectorCallback) adapterListener.toggleItemSelectionAdapter(true, adapterPosition) if (!multiSelector.isSelectable && multiSelectorCallback != null) { activity?.startSupportActionMode(multiSelectorCallback) adapterListener?.toggleItemSelectionAdapter(true, adapterPosition - positionOffset) } adapterListener.itemLongClicked(adapterPosition) adapterListener?.itemLongClicked(adapterPosition - positionOffset) } } } commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt +2 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,8 @@ class CopyMoveTask(val activity: BaseSimpleActivity, val copyOnly: Boolean = fal activity.scanFile(destination) {} } } } catch (e: Exception) { activity.showErrorToast(e) } finally { inputStream?.close() out?.close() Loading commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt +11 −4 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import com.simplemobiletools.commons.helpers.MyContentProvider.Companion.COL_TEX import com.simplemobiletools.commons.models.SharedTheme import com.simplemobiletools.commons.views.* import java.io.File import java.text.SimpleDateFormat import java.util.* fun Context.isOnMainThread() = Looper.myLooper() == Looper.getMainLooper() fun Context.getSharedPrefs() = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE) Loading Loading @@ -114,13 +116,13 @@ fun Context.isThankYouInstalled(): Boolean { fun Context.isFingerPrintSensorAvailable() = isMarshmallowPlus() && Reprint.isHardwarePresent() fun Context.getLatestMediaId(uri: Uri = MediaStore.Files.getContentUri("external")): Long { val projection = arrayOf(BaseColumns._ID) val sortOrder = "${MediaStore.Images.ImageColumns.DATE_TAKEN} DESC" val MAX_VALUE = "max_value" val projection = arrayOf("MAX(${BaseColumns._ID}) AS $MAX_VALUE") var cursor: Cursor? = null try { cursor = contentResolver.query(uri, projection, null, null, sortOrder) cursor = contentResolver.query(uri, projection, null, null, null) if (cursor?.moveToFirst() == true) { return cursor.getLongValue(BaseColumns._ID) return cursor.getLongValue(MAX_VALUE) } } finally { cursor?.close() Loading Loading @@ -311,3 +313,8 @@ fun Context.getSharedTheme(callback: (sharedTheme: SharedTheme?) -> Unit) { } fun Context.getDialogTheme() = if (baseConfig.backgroundColor.getContrastColor() == Color.WHITE) R.style.MyDialogTheme_Dark else R.style.MyDialogTheme fun Context.getCurrentFormattedDateTime(): String { val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.getDefault()) return simpleDateFormat.format(Date(System.currentTimeMillis())) } commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt 0 → 100644 +5 −0 Original line number Diff line number Diff line package com.simplemobiletools.commons.interfaces interface RecyclerScrollCallback { fun onScrolled(scrollY: Int) } Loading
build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ buildscript { propMinSdkVersion = 16 propTargetSdkVersion = propCompileSdkVersion propVersionCode = 1 propVersionName = '3.9.9' propVersionName = '3.11.3' kotlin_version = '1.2.21' support_libs = '27.0.2' } Loading
commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt +17 −14 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc val layoutInflater = activity.layoutInflater var primaryColor = baseConfig.primaryColor var textColor = baseConfig.textColor var backgroundColor = baseConfig.backgroundColor var itemViews = SparseArray<View>() val selectedPositions = HashSet<Int>() var positionOffset = 0 private val multiSelector = MultiSelector() private var actMode: ActionMode? = null Loading Loading @@ -80,10 +82,10 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc } fun selectAll() { val cnt = itemCount val cnt = itemCount - positionOffset for (i in 0 until cnt) { selectedPositions.add(i) notifyItemChanged(i) notifyItemChanged(i + positionOffset) } updateTitle(cnt) } Loading @@ -96,7 +98,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc } override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) { selectItemRange(initialSelection, lastDraggedIndex, minReached, maxReached) selectItemRange(initialSelection, lastDraggedIndex - positionOffset, minReached, maxReached) } }) } else { Loading Loading @@ -223,7 +225,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fun createViewHolder(layoutType: Int, parent: ViewGroup?): ViewHolder { val view = layoutInflater.inflate(layoutType, parent, false) return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, itemClick) return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, positionOffset, itemClick) } fun bindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int, view: View) { Loading @@ -234,7 +236,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fun removeSelectedItems() { selectedPositions.sortedDescending().forEach { notifyItemRemoved(it) notifyItemRemoved(it + positionOffset) itemViews.put(it, null) } Loading @@ -248,8 +250,9 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc fastScroller?.measureRecyclerView() } class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: BaseSimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback, val multiSelector: MultiSelector, val itemClick: (Any) -> (Unit)) : SwappingHolder(view, multiSelector) { open class ViewHolder(view: View, val adapterListener: MyAdapterListener? = null, val activity: BaseSimpleActivity? = null, val multiSelectorCallback: ModalMultiSelectorCallback? = null, val multiSelector: MultiSelector, val positionOffset: Int = 0, val itemClick: ((Any) -> (Unit))? = null) : SwappingHolder(view, multiSelector) { fun bindView(any: Any, allowLongClick: Boolean = true, callback: (itemView: View, layoutPosition: Int) -> Unit): View { return itemView.apply { callback(this, layoutPosition) Loading @@ -266,20 +269,20 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc private fun viewClicked(any: Any) { if (multiSelector.isSelectable) { val isSelected = adapterListener.getSelectedPositions().contains(adapterPosition) adapterListener.toggleItemSelectionAdapter(!isSelected, adapterPosition) val isSelected = adapterListener?.getSelectedPositions()?.contains(adapterPosition - positionOffset) ?: false adapterListener?.toggleItemSelectionAdapter(!isSelected, adapterPosition - positionOffset) } else { itemClick(any) itemClick?.invoke(any) } } private fun viewLongClicked() { if (!multiSelector.isSelectable) { activity.startSupportActionMode(multiSelectorCallback) adapterListener.toggleItemSelectionAdapter(true, adapterPosition) if (!multiSelector.isSelectable && multiSelectorCallback != null) { activity?.startSupportActionMode(multiSelectorCallback) adapterListener?.toggleItemSelectionAdapter(true, adapterPosition - positionOffset) } adapterListener.itemLongClicked(adapterPosition) adapterListener?.itemLongClicked(adapterPosition - positionOffset) } } }
commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt +2 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,8 @@ class CopyMoveTask(val activity: BaseSimpleActivity, val copyOnly: Boolean = fal activity.scanFile(destination) {} } } } catch (e: Exception) { activity.showErrorToast(e) } finally { inputStream?.close() out?.close() Loading
commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt +11 −4 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import com.simplemobiletools.commons.helpers.MyContentProvider.Companion.COL_TEX import com.simplemobiletools.commons.models.SharedTheme import com.simplemobiletools.commons.views.* import java.io.File import java.text.SimpleDateFormat import java.util.* fun Context.isOnMainThread() = Looper.myLooper() == Looper.getMainLooper() fun Context.getSharedPrefs() = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE) Loading Loading @@ -114,13 +116,13 @@ fun Context.isThankYouInstalled(): Boolean { fun Context.isFingerPrintSensorAvailable() = isMarshmallowPlus() && Reprint.isHardwarePresent() fun Context.getLatestMediaId(uri: Uri = MediaStore.Files.getContentUri("external")): Long { val projection = arrayOf(BaseColumns._ID) val sortOrder = "${MediaStore.Images.ImageColumns.DATE_TAKEN} DESC" val MAX_VALUE = "max_value" val projection = arrayOf("MAX(${BaseColumns._ID}) AS $MAX_VALUE") var cursor: Cursor? = null try { cursor = contentResolver.query(uri, projection, null, null, sortOrder) cursor = contentResolver.query(uri, projection, null, null, null) if (cursor?.moveToFirst() == true) { return cursor.getLongValue(BaseColumns._ID) return cursor.getLongValue(MAX_VALUE) } } finally { cursor?.close() Loading Loading @@ -311,3 +313,8 @@ fun Context.getSharedTheme(callback: (sharedTheme: SharedTheme?) -> Unit) { } fun Context.getDialogTheme() = if (baseConfig.backgroundColor.getContrastColor() == Color.WHITE) R.style.MyDialogTheme_Dark else R.style.MyDialogTheme fun Context.getCurrentFormattedDateTime(): String { val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.getDefault()) return simpleDateFormat.format(Date(System.currentTimeMillis())) }
commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt 0 → 100644 +5 −0 Original line number Diff line number Diff line package com.simplemobiletools.commons.interfaces interface RecyclerScrollCallback { fun onScrolled(scrollY: Int) }