diff --git a/app/build.gradle b/app/build.gradle index 1defe9f78..8e3931eb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,23 +96,23 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { } ext.lifecycleVersion = "2.2.0" -ext.roomVersion = '2.2.4' -ext.retrofitVersion = '2.7.1' -ext.okhttpVersion = '4.3.1' -ext.glideVersion = '4.10.0' -ext.daggerVersion = '2.26' +ext.roomVersion = '2.2.5' +ext.retrofitVersion = '2.8.1' +ext.okhttpVersion = '4.4.0' +ext.glideVersion = '4.11.0' +ext.daggerVersion = '2.27' // if libraries are changed here, they should also be changed in LicenseActivity dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" - implementation "androidx.appcompat:appcompat:1.2.0-alpha02" - implementation "androidx.fragment:fragment-ktx:1.2.2" + implementation "androidx.appcompat:appcompat:1.2.0-beta01" + implementation "androidx.fragment:fragment-ktx:1.2.4" implementation "androidx.browser:browser:1.2.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" implementation "androidx.recyclerview:recyclerview:1.1.0" - implementation "androidx.exifinterface:exifinterface:1.1.0" + implementation "androidx.exifinterface:exifinterface:1.2.0" implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.preference:preference:1.1.0" implementation "androidx.sharetarget:sharetarget:1.0.0-rc01" @@ -122,7 +122,7 @@ dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycleVersion" implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.paging:paging-runtime-ktx:2.1.1" + implementation "androidx.paging:paging-runtime-ktx:2.1.2" implementation "androidx.viewpager2:viewpager2:1.0.0" implementation "androidx.room:room-runtime:$roomVersion" implementation "androidx.room:room-rxjava2:$roomVersion" @@ -137,7 +137,7 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:$okhttpVersion" implementation "com.squareup.okhttp3:logging-interceptor:$okhttpVersion" - implementation "org.conscrypt:conscrypt-android:2.2.1" + implementation "org.conscrypt:conscrypt-android:2.4.0" implementation "com.github.bumptech.glide:glide:$glideVersion" implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion" diff --git a/app/src/blue/res/mipmap-hdpi/ic_shortcut_compose.png b/app/src/blue/res/mipmap-hdpi/ic_shortcut_compose.png deleted file mode 100644 index 03ac90029..000000000 Binary files a/app/src/blue/res/mipmap-hdpi/ic_shortcut_compose.png and /dev/null differ diff --git a/app/src/blue/res/mipmap-mdpi/ic_shortcut_compose.png b/app/src/blue/res/mipmap-mdpi/ic_shortcut_compose.png deleted file mode 100644 index 2ba7f82bc..000000000 Binary files a/app/src/blue/res/mipmap-mdpi/ic_shortcut_compose.png and /dev/null differ diff --git a/app/src/blue/res/mipmap-xhdpi/ic_shortcut_compose.png b/app/src/blue/res/mipmap-xhdpi/ic_shortcut_compose.png deleted file mode 100644 index 9ec8f40c1..000000000 Binary files a/app/src/blue/res/mipmap-xhdpi/ic_shortcut_compose.png and /dev/null differ diff --git a/app/src/blue/res/mipmap-xxhdpi/ic_shortcut_compose.png b/app/src/blue/res/mipmap-xxhdpi/ic_shortcut_compose.png deleted file mode 100644 index 1ad9ff5ae..000000000 Binary files a/app/src/blue/res/mipmap-xxhdpi/ic_shortcut_compose.png and /dev/null differ diff --git a/app/src/blue/res/mipmap-xxxhdpi/ic_shortcut_compose.png b/app/src/blue/res/mipmap-xxxhdpi/ic_shortcut_compose.png deleted file mode 100644 index a1d41bcef..000000000 Binary files a/app/src/blue/res/mipmap-xxxhdpi/ic_shortcut_compose.png and /dev/null differ diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt index 333eb09d1..485f6a8a6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt @@ -52,8 +52,6 @@ import com.keylesspalace.tusky.components.compose.ComposeActivity import com.keylesspalace.tusky.components.report.ReportActivity import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.entity.Account -import com.keylesspalace.tusky.entity.Field -import com.keylesspalace.tusky.entity.IdentityProof import com.keylesspalace.tusky.entity.Relationship import com.keylesspalace.tusky.interfaces.ActionButtonActivity import com.keylesspalace.tusky.interfaces.LinkListener @@ -311,7 +309,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI * Subscribe to data loaded at the view model */ private fun subscribeObservables() { - viewModel.accountData.observe(this, Observer> { + viewModel.accountData.observe(this, Observer { when (it) { is Success -> onAccountChanged(it.data) is Error -> { @@ -321,7 +319,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI } } }) - viewModel.relationshipData.observe(this, Observer> { + viewModel.relationshipData.observe(this, Observer { val relation = it?.data if (relation != null) { onRelationshipChanged(relation) @@ -334,7 +332,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI } }) - viewModel.accountFieldData.observe(this, Observer>> { + viewModel.accountFieldData.observe(this, Observer { accountFieldAdapter.fields = it accountFieldAdapter.notifyDataSetChanged() diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt index 9477b8440..06edd80bb 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt @@ -77,7 +77,7 @@ class AccountsInListFragment : DialogFragment(), Injectable { super.onCreate(savedInstanceState) setStyle(STYLE_NORMAL, R.style.TuskyDialogFragmentStyle) viewModel = viewModelFactory.create(AccountsInListViewModel::class.java) - val args = arguments!! + val args = requireArguments() listId = args.getString(LIST_ID_ARG)!! listName = args.getString(LIST_NAME_ARG)!! @@ -255,12 +255,12 @@ class AccountsInListFragment : DialogFragment(), Injectable { loadAvatar(account.avatar, avatar, radius, animateAvatar) rejectButton.apply { - if (inAList) { + contentDescription = if (inAList) { setImageResource(R.drawable.ic_reject_24dp) - contentDescription = getString(R.string.action_remove_from_list) + getString(R.string.action_remove_from_list) } else { setImageResource(R.drawable.ic_plus_24dp) - contentDescription = getString(R.string.action_add_to_list) + getString(R.string.action_add_to_list) } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt index 54aca8971..539dcfe01 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt @@ -135,7 +135,7 @@ class ListsActivity : BaseActivity(), Injectable, HasAndroidInjector { val positiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE) editText.onTextChanged { s, _, _, _ -> - positiveButton.isEnabled = !s.isNullOrBlank() + positiveButton.isEnabled = !s.isBlank() } editText.setText(list?.title) editText.text?.let { editText.setSelection(it.length) } diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt index 864a7208a..26e85deba 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt @@ -277,7 +277,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene addTabAdapter.updateData(addableTabs) maxTabsInfo.visible(addableTabs.size == 0 || currentTabs.size >= MAX_TAB_COUNT) - currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT); + currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT) } override fun onStartDelete(viewHolder: RecyclerView.ViewHolder) { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/AccountMediaFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/AccountMediaFragment.kt index 0f89c3e00..74c97b6ca 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/AccountMediaFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/AccountMediaFragment.kt @@ -199,10 +199,10 @@ class AccountMediaFragment : BaseFragment(), RefreshableFragment, Injectable { val itemCount = layoutManager.itemCount val lastItem = layoutManager.findLastCompletelyVisibleItemPosition() if (itemCount <= lastItem + 3 && fetchingStatus == FetchingStatus.NOT_FETCHING) { - statuses.lastOrNull()?.let { last -> - Log.d(TAG, "Requesting statuses with max_id: ${last.id}, (bottom)") + statuses.lastOrNull()?.let { (id) -> + Log.d(TAG, "Requesting statuses with max_id: ${id}, (bottom)") fetchingStatus = FetchingStatus.FETCHING_BOTTOM - currentCall = api.accountStatuses(accountId, last.id, null, null, null, true, null) + currentCall = api.accountStatuses(accountId, id, null, null, null, true, null) currentCall?.enqueue(bottomCallback) } } @@ -254,7 +254,7 @@ class AccountMediaFragment : BaseFragment(), RefreshableFragment, Injectable { if (view != null && activity != null) { val url = items[currentIndex].attachment.url ViewCompat.setTransitionName(view, url) - val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity!!, view, url) + val options = ActivityOptionsCompat.makeSceneTransitionAnimation(requireActivity(), view, url) startActivity(intent, options.toBundle()) } else { startActivity(intent) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java index 0c20cfafe..7cbfde5ef 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java @@ -212,7 +212,7 @@ public class TimelineFragment extends SFragment implements @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Bundle arguments = Objects.requireNonNull(getArguments()); + Bundle arguments = requireArguments(); kind = Kind.valueOf(arguments.getString(KIND_ARG)); if (kind == Kind.TAG || kind == Kind.USER diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt index 1c3672519..2831100db 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt @@ -89,7 +89,7 @@ class ViewImageFragment : ViewMediaFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - toolbar = activity!!.toolbar + toolbar = requireActivity().toolbar this.transition = BehaviorSubject.create() return inflater.inflate(R.layout.fragment_view_image, container, false) } @@ -97,7 +97,7 @@ class ViewImageFragment : ViewMediaFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val arguments = this.arguments!! + val arguments = this.requireArguments() val attachment = arguments.getParcelable(ARG_ATTACHMENT) this.shouldStartTransition = arguments.getBoolean(ARG_START_POSTPONED_TRANSITION) val url: String? diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt index 0b3a23a70..09c29d473 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt @@ -136,12 +136,12 @@ class ViewVideoFragment : ViewMediaFragment() { progressBar.hide() mp.isLooping = true - if (arguments!!.getBoolean(ARG_START_POSTPONED_TRANSITION)) { + if (requireArguments().getBoolean(ARG_START_POSTPONED_TRANSITION)) { videoView.start() } } - if (arguments!!.getBoolean(ARG_START_POSTPONED_TRANSITION)) { + if (requireArguments().getBoolean(ARG_START_POSTPONED_TRANSITION)) { mediaActivity.onBringUp() } } @@ -151,7 +151,7 @@ class ViewVideoFragment : ViewMediaFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - toolbar = activity!!.toolbar + toolbar = requireActivity().toolbar mediaActivity = activity as ViewMediaActivity return inflater.inflate(R.layout.fragment_view_video, container, false) } diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index daa6252ad..bbffc0a91 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,7 +7,6 @@ 8dp 0dp 120dp - 8dp 14dp 16dp 36dp diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index 8b0c916aa..12f7bab54 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -11,6 +11,7 @@ import com.keylesspalace.tusky.fragment.SFragment import com.keylesspalace.tusky.network.MastodonApi import com.nhaarman.mockitokotlin2.mock import okhttp3.Request +import okio.Timeout import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before @@ -99,6 +100,10 @@ class FilterTest { ) ) } + + override fun timeout(): Timeout { + throw Error("not implemented") + } }) activity.mastodonApi = apiMock diff --git a/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt b/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt index aaa2b349e..7f82e2495 100644 --- a/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt +++ b/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt @@ -18,13 +18,9 @@ package com.keylesspalace.tusky import android.app.Application import android.content.Context import android.content.res.Configuration -import android.util.Log import androidx.emoji.text.EmojiCompat import com.keylesspalace.tusky.util.LocaleManager -import dagger.android.DispatchingAndroidInjector -import dagger.android.HasAndroidInjector import de.c1710.filemojicompat.FileEmojiCompatConfig -import javax.inject.Inject // override TuskyApplication for Robolectric tests, only initialize the necessary stuff class TuskyApplication : Application() { diff --git a/build.gradle b/build.gradle index 38f3d2b41..cb3ee21f3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,11 @@ buildscript { - ext.kotlin_version = '1.3.70' + ext.kotlin_version = '1.3.71' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.android.tools.build:gradle:3.6.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6254d2d4a..6623300be 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew.bat b/gradlew.bat index 24467a141..9109989e3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @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="-Xmx64m" "-Xms64m"