forked from GitHub-Mirror/riotX-android
Display some version of Riot and SDK (Fix #185)
This commit is contained in:
parent
1eb374fa49
commit
1cfc85a772
@ -32,10 +32,11 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName "0.0.1"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
||||||
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
|
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
|
||||||
resValue "string", "git_sdk_revision_unix_date", "\"${gitRevisionUnixDate()}\""
|
resValue "string", "git_sdk_revision_unix_date", "\"${gitRevisionUnixDate()}\""
|
||||||
resValue "string", "git_sdk_revision_date", "\"${gitRevisionDate()}\""
|
resValue "string", "git_sdk_revision_date", "\"${gitRevisionDate()}\""
|
||||||
|
@ -19,6 +19,7 @@ package im.vector.matrix.android.api
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner
|
import androidx.lifecycle.ProcessLifecycleOwner
|
||||||
import com.zhuinden.monarchy.Monarchy
|
import com.zhuinden.monarchy.Monarchy
|
||||||
|
import im.vector.matrix.android.BuildConfig
|
||||||
import im.vector.matrix.android.api.auth.Authenticator
|
import im.vector.matrix.android.api.auth.Authenticator
|
||||||
import im.vector.matrix.android.api.session.Session
|
import im.vector.matrix.android.api.session.Session
|
||||||
import im.vector.matrix.android.api.session.sync.FilterService
|
import im.vector.matrix.android.api.session.sync.FilterService
|
||||||
@ -86,6 +87,9 @@ class Matrix private constructor(context: Context) : MatrixKoinComponent {
|
|||||||
return instance
|
return instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getSdkVersion(): String {
|
||||||
|
return BuildConfig.VERSION_NAME + " (" + BuildConfig.GIT_SDK_REVISION + ")"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ project.android.buildTypes.all { buildType ->
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
def buildNumber = System.getenv("BUILD_NUMBER") as Integer ?: 0
|
def buildNumber = System.getenv("BUILDKITE_BUILD_NUMBER") as Integer ?: 0
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 28
|
compileSdkVersion 28
|
||||||
@ -63,9 +63,16 @@ android {
|
|||||||
versionCode generateVersionCodeFromTimestamp()
|
versionCode generateVersionCodeFromTimestamp()
|
||||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
||||||
|
|
||||||
|
buildConfigField "String", "GIT_REVISION", "\"${gitRevision()}\""
|
||||||
resValue "string", "git_revision", "\"${gitRevision()}\""
|
resValue "string", "git_revision", "\"${gitRevision()}\""
|
||||||
|
|
||||||
|
buildConfigField "String", "GIT_REVISION_DATE", "\"${gitRevisionDate()}\""
|
||||||
resValue "string", "git_revision_date", "\"${gitRevisionDate()}\""
|
resValue "string", "git_revision_date", "\"${gitRevisionDate()}\""
|
||||||
|
|
||||||
|
buildConfigField "String", "GIT_BRANCH_NAME", "\"${gitBranchName()}\""
|
||||||
resValue "string", "git_branch_name", "\"${gitBranchName()}\""
|
resValue "string", "git_branch_name", "\"${gitBranchName()}\""
|
||||||
|
|
||||||
|
buildConfigField "String", "BUILD_NUMBER", "\"${buildNumber}\""
|
||||||
resValue "string", "build_number", "\"${buildNumber}\""
|
resValue "string", "build_number", "\"${buildNumber}\""
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
@ -39,10 +39,13 @@ import im.vector.riotredesign.features.lifecycle.VectorActivityLifecycleCallback
|
|||||||
import im.vector.riotredesign.features.rageshake.VectorFileLogger
|
import im.vector.riotredesign.features.rageshake.VectorFileLogger
|
||||||
import im.vector.riotredesign.features.rageshake.VectorUncaughtExceptionHandler
|
import im.vector.riotredesign.features.rageshake.VectorUncaughtExceptionHandler
|
||||||
import im.vector.riotredesign.features.roomdirectory.RoomDirectoryModule
|
import im.vector.riotredesign.features.roomdirectory.RoomDirectoryModule
|
||||||
|
import im.vector.riotredesign.features.version.getVersion
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import org.koin.log.EmptyLogger
|
import org.koin.log.EmptyLogger
|
||||||
import org.koin.standalone.StandAloneContext.startKoin
|
import org.koin.standalone.StandAloneContext.startKoin
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
class VectorApplication : Application() {
|
class VectorApplication : Application() {
|
||||||
@ -57,6 +60,8 @@ class VectorApplication : Application() {
|
|||||||
super.onCreate()
|
super.onCreate()
|
||||||
appContext = this
|
appContext = this
|
||||||
|
|
||||||
|
logInfo()
|
||||||
|
|
||||||
VectorUncaughtExceptionHandler.activate(this)
|
VectorUncaughtExceptionHandler.activate(this)
|
||||||
|
|
||||||
// Log
|
// Log
|
||||||
@ -92,6 +97,20 @@ class VectorApplication : Application() {
|
|||||||
vectorConfiguration.initConfiguration()
|
vectorConfiguration.initConfiguration()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun logInfo() {
|
||||||
|
val appVersion = getVersion(longFormat = true, useBuildNumber = true)
|
||||||
|
val sdkVersion = Matrix.getSdkVersion()
|
||||||
|
val date = SimpleDateFormat("MM-dd HH:mm:ss.SSSZ", Locale.US).format(Date())
|
||||||
|
|
||||||
|
Timber.v("----------------------------------------------------------------")
|
||||||
|
Timber.v("----------------------------------------------------------------")
|
||||||
|
Timber.v(" Application version: $appVersion")
|
||||||
|
Timber.v(" SDK version: $sdkVersion")
|
||||||
|
Timber.v(" Local time: $date")
|
||||||
|
Timber.v("----------------------------------------------------------------")
|
||||||
|
Timber.v("----------------------------------------------------------------\n\n\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context) {
|
override fun attachBaseContext(base: Context) {
|
||||||
super.attachBaseContext(base)
|
super.attachBaseContext(base)
|
||||||
MultiDex.install(this)
|
MultiDex.install(this)
|
||||||
|
@ -34,6 +34,7 @@ import im.vector.riotredesign.core.extensions.toOnOff
|
|||||||
import im.vector.riotredesign.core.utils.getDeviceLocale
|
import im.vector.riotredesign.core.utils.getDeviceLocale
|
||||||
import im.vector.riotredesign.features.settings.VectorLocale
|
import im.vector.riotredesign.features.settings.VectorLocale
|
||||||
import im.vector.riotredesign.features.themes.ThemeUtils
|
import im.vector.riotredesign.features.themes.ThemeUtils
|
||||||
|
import im.vector.riotredesign.features.version.getVersion
|
||||||
import okhttp3.*
|
import okhttp3.*
|
||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
@ -192,13 +193,11 @@ object BugReporter {
|
|||||||
|
|
||||||
var deviceId = "undefined"
|
var deviceId = "undefined"
|
||||||
var userId = "undefined"
|
var userId = "undefined"
|
||||||
var matrixSdkVersion = "undefined"
|
|
||||||
var olmVersion = "undefined"
|
var olmVersion = "undefined"
|
||||||
|
|
||||||
Matrix.getInstance().currentSession?.let { session ->
|
Matrix.getInstance().currentSession?.let { session ->
|
||||||
userId = session.sessionParams.credentials.userId
|
userId = session.sessionParams.credentials.userId
|
||||||
deviceId = session.sessionParams.credentials.deviceId ?: "undefined"
|
deviceId = session.sessionParams.credentials.deviceId ?: "undefined"
|
||||||
// TODO matrixSdkVersion = session.getVersion(true);
|
|
||||||
olmVersion = session.getCryptoVersion(context, true)
|
olmVersion = session.getCryptoVersion(context, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,9 +209,9 @@ object BugReporter {
|
|||||||
.addFormDataPart("user_agent", Matrix.getInstance().getUserAgent())
|
.addFormDataPart("user_agent", Matrix.getInstance().getUserAgent())
|
||||||
.addFormDataPart("user_id", userId)
|
.addFormDataPart("user_id", userId)
|
||||||
.addFormDataPart("device_id", deviceId)
|
.addFormDataPart("device_id", deviceId)
|
||||||
// TODO .addFormDataPart("version", Matrix.getInstance(context).getVersion(true, false))
|
.addFormDataPart("version", getVersion(longFormat = true, useBuildNumber = false))
|
||||||
.addFormDataPart("branch_name", context.getString(R.string.git_branch_name))
|
.addFormDataPart("branch_name", context.getString(R.string.git_branch_name))
|
||||||
.addFormDataPart("matrix_sdk_version", matrixSdkVersion)
|
.addFormDataPart("matrix_sdk_version", Matrix.getSdkVersion())
|
||||||
.addFormDataPart("olm_version", olmVersion)
|
.addFormDataPart("olm_version", olmVersion)
|
||||||
.addFormDataPart("device", Build.MODEL.trim())
|
.addFormDataPart("device", Build.MODEL.trim())
|
||||||
.addFormDataPart("lazy_loading", true.toOnOff())
|
.addFormDataPart("lazy_loading", true.toOnOff())
|
||||||
|
@ -21,7 +21,9 @@ import android.content.Context
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
import im.vector.matrix.android.api.Matrix
|
||||||
import im.vector.riotredesign.BuildConfig
|
import im.vector.riotredesign.BuildConfig
|
||||||
|
import im.vector.riotredesign.features.version.getVersion
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import java.io.StringWriter
|
import java.io.StringWriter
|
||||||
@ -32,8 +34,8 @@ object VectorUncaughtExceptionHandler : Thread.UncaughtExceptionHandler {
|
|||||||
// key to save the crash status
|
// key to save the crash status
|
||||||
private const val PREFS_CRASH_KEY = "PREFS_CRASH_KEY"
|
private const val PREFS_CRASH_KEY = "PREFS_CRASH_KEY"
|
||||||
|
|
||||||
private var vectorVersion: String = ""
|
private val vectorVersion = getVersion(longFormat = true, useBuildNumber = true)
|
||||||
private var matrixSdkVersion: String = ""
|
private val matrixSdkVersion = Matrix.getSdkVersion()
|
||||||
|
|
||||||
private var previousHandler: Thread.UncaughtExceptionHandler? = null
|
private var previousHandler: Thread.UncaughtExceptionHandler? = null
|
||||||
|
|
||||||
@ -120,12 +122,6 @@ object VectorUncaughtExceptionHandler : Thread.UncaughtExceptionHandler {
|
|||||||
previousHandler?.uncaughtException(thread, throwable)
|
previousHandler?.uncaughtException(thread, throwable)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Call me
|
|
||||||
fun setVersions(vectorVersion: String, matrixSdkVersion: String) {
|
|
||||||
this.vectorVersion = vectorVersion
|
|
||||||
this.matrixSdkVersion = matrixSdkVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tells if the application crashed
|
* Tells if the application crashed
|
||||||
*
|
*
|
||||||
|
@ -40,11 +40,10 @@ import timber.log.Timber;
|
|||||||
|
|
||||||
public class PreferencesManager {
|
public class PreferencesManager {
|
||||||
|
|
||||||
public static final String VERSION_BUILD = "VERSION_BUILD";
|
|
||||||
|
|
||||||
public static final String SETTINGS_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY = "SETTINGS_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY_2";
|
public static final String SETTINGS_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY = "SETTINGS_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY_2";
|
||||||
public static final String SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY = "SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY";
|
public static final String SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY = "SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY";
|
||||||
public static final String SETTINGS_VERSION_PREFERENCE_KEY = "SETTINGS_VERSION_PREFERENCE_KEY";
|
public static final String SETTINGS_VERSION_PREFERENCE_KEY = "SETTINGS_VERSION_PREFERENCE_KEY";
|
||||||
|
public static final String SETTINGS_SDK_VERSION_PREFERENCE_KEY = "SETTINGS_SDK_VERSION_PREFERENCE_KEY";
|
||||||
public static final String SETTINGS_OLM_VERSION_PREFERENCE_KEY = "SETTINGS_OLM_VERSION_PREFERENCE_KEY";
|
public static final String SETTINGS_OLM_VERSION_PREFERENCE_KEY = "SETTINGS_OLM_VERSION_PREFERENCE_KEY";
|
||||||
public static final String SETTINGS_LOGGED_IN_PREFERENCE_KEY = "SETTINGS_LOGGED_IN_PREFERENCE_KEY";
|
public static final String SETTINGS_LOGGED_IN_PREFERENCE_KEY = "SETTINGS_LOGGED_IN_PREFERENCE_KEY";
|
||||||
public static final String SETTINGS_HOME_SERVER_PREFERENCE_KEY = "SETTINGS_HOME_SERVER_PREFERENCE_KEY";
|
public static final String SETTINGS_HOME_SERVER_PREFERENCE_KEY = "SETTINGS_HOME_SERVER_PREFERENCE_KEY";
|
||||||
|
@ -43,6 +43,7 @@ import androidx.core.view.isVisible
|
|||||||
import androidx.preference.*
|
import androidx.preference.*
|
||||||
import com.google.android.material.textfield.TextInputEditText
|
import com.google.android.material.textfield.TextInputEditText
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
|
import im.vector.matrix.android.api.Matrix
|
||||||
import im.vector.matrix.android.api.MatrixCallback
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
import im.vector.matrix.android.api.extensions.getFingerprintHumanReadable
|
import im.vector.matrix.android.api.extensions.getFingerprintHumanReadable
|
||||||
import im.vector.matrix.android.api.extensions.sortByLastSeen
|
import im.vector.matrix.android.api.extensions.sortByLastSeen
|
||||||
@ -72,6 +73,7 @@ import im.vector.riotredesign.features.crypto.keys.KeysExporter
|
|||||||
import im.vector.riotredesign.features.crypto.keys.KeysImporter
|
import im.vector.riotredesign.features.crypto.keys.KeysImporter
|
||||||
import im.vector.riotredesign.features.crypto.keysbackup.settings.KeysBackupManageActivity
|
import im.vector.riotredesign.features.crypto.keysbackup.settings.KeysBackupManageActivity
|
||||||
import im.vector.riotredesign.features.themes.ThemeUtils
|
import im.vector.riotredesign.features.themes.ThemeUtils
|
||||||
|
import im.vector.riotredesign.features.version.getVersion
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
@ -637,11 +639,23 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref
|
|||||||
|
|
||||||
// application version
|
// application version
|
||||||
(findPreference(PreferencesManager.SETTINGS_VERSION_PREFERENCE_KEY)).let {
|
(findPreference(PreferencesManager.SETTINGS_VERSION_PREFERENCE_KEY)).let {
|
||||||
it.summary = "TODO" // VectorUtils.getApplicationVersion(appContext)
|
it.summary = getVersion(longFormat = false, useBuildNumber = true)
|
||||||
|
|
||||||
it.setOnPreferenceClickListener {
|
it.setOnPreferenceClickListener { pref ->
|
||||||
appContext?.let {
|
appContext?.let { ctx ->
|
||||||
copyToClipboard(it, "TODO") //VectorUtils.getApplicationVersion(it))
|
copyToClipboard(ctx, pref.summary)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SDK version
|
||||||
|
(findPreference(PreferencesManager.SETTINGS_SDK_VERSION_PREFERENCE_KEY)).let {
|
||||||
|
it.summary = Matrix.getSdkVersion()
|
||||||
|
|
||||||
|
it.setOnPreferenceClickListener { pref ->
|
||||||
|
appContext?.let { ctx ->
|
||||||
|
copyToClipboard(ctx, pref.summary)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@ -1456,7 +1470,6 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref
|
|||||||
private fun refreshPreferences() {
|
private fun refreshPreferences() {
|
||||||
PreferenceManager.getDefaultSharedPreferences(activity).edit {
|
PreferenceManager.getDefaultSharedPreferences(activity).edit {
|
||||||
putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, "TODO") //session.myUser.displayname)
|
putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, "TODO") //session.myUser.displayname)
|
||||||
putString(PreferencesManager.SETTINGS_VERSION_PREFERENCE_KEY, "TODO") // VectorUtils.getApplicationVersion(activity))
|
|
||||||
|
|
||||||
/* TODO
|
/* TODO
|
||||||
session.dataHandler.pushRules()?.let {
|
session.dataHandler.pushRules()?.let {
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.riotredesign.features.version
|
||||||
|
|
||||||
|
import im.vector.riotredesign.BuildConfig
|
||||||
|
|
||||||
|
fun getVersion(longFormat: Boolean, useBuildNumber: Boolean): String {
|
||||||
|
var result = BuildConfig.VERSION_NAME
|
||||||
|
|
||||||
|
var flavor = BuildConfig.SHORT_FLAVOR_DESCRIPTION
|
||||||
|
|
||||||
|
if (flavor.isNotBlank()) {
|
||||||
|
flavor += "-"
|
||||||
|
}
|
||||||
|
|
||||||
|
var gitVersion = BuildConfig.GIT_REVISION
|
||||||
|
val gitRevisionDate = BuildConfig.GIT_REVISION_DATE
|
||||||
|
val buildNumber = BuildConfig.BUILD_NUMBER
|
||||||
|
|
||||||
|
var useLongFormat = longFormat
|
||||||
|
|
||||||
|
if (useBuildNumber && buildNumber != "0") {
|
||||||
|
// It's a build from CI
|
||||||
|
gitVersion = "b$buildNumber"
|
||||||
|
useLongFormat = false
|
||||||
|
}
|
||||||
|
|
||||||
|
result += if (useLongFormat) {
|
||||||
|
" ($flavor$gitVersion-$gitRevisionDate)"
|
||||||
|
} else {
|
||||||
|
" ($flavor$gitVersion)"
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
@ -6,4 +6,6 @@
|
|||||||
|
|
||||||
<string name="import_e2e_keys_from_file">"Import e2e keys from file \"%1$s\"."</string>
|
<string name="import_e2e_keys_from_file">"Import e2e keys from file \"%1$s\"."</string>
|
||||||
|
|
||||||
|
<string name="settings_sdk_version">Matrix SDK Version</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
@ -454,10 +454,15 @@
|
|||||||
android:title="@string/settings_version"
|
android:title="@string/settings_version"
|
||||||
tools:summary="1.2.3" />
|
tools:summary="1.2.3" />
|
||||||
|
|
||||||
|
<im.vector.riotredesign.core.preference.VectorPreference
|
||||||
|
android:key="SETTINGS_SDK_VERSION_PREFERENCE_KEY"
|
||||||
|
android:title="@string/settings_sdk_version"
|
||||||
|
tools:summary="4.5.6" />
|
||||||
|
|
||||||
<im.vector.riotredesign.core.preference.VectorPreference
|
<im.vector.riotredesign.core.preference.VectorPreference
|
||||||
android:key="SETTINGS_OLM_VERSION_PREFERENCE_KEY"
|
android:key="SETTINGS_OLM_VERSION_PREFERENCE_KEY"
|
||||||
android:title="@string/settings_olm_version"
|
android:title="@string/settings_olm_version"
|
||||||
tools:summary="1.2.3" />
|
tools:summary="7.8.9" />
|
||||||
|
|
||||||
<im.vector.riotredesign.core.preference.VectorPreference
|
<im.vector.riotredesign.core.preference.VectorPreference
|
||||||
android:key="SETTINGS_COPYRIGHT_PREFERENCE_KEY"
|
android:key="SETTINGS_COPYRIGHT_PREFERENCE_KEY"
|
||||||
|
Loading…
Reference in New Issue
Block a user