From 0a7d043b8ca91ad67d5e77653401fe0ed385da08 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sun, 25 Mar 2018 17:56:41 +0200 Subject: [PATCH] Implement about and crash screens --- app/build.gradle.kts | 4 +- app/sampledata/contributors.json | 29 +++ app/sampledata/libraries.json | 155 +++++++++++++ app/src/main/AndroidManifest.xml | 21 +- .../quasseldroid/dagger/ActivityModule.kt | 15 ++ .../quasseldroid/ui/chat/ChatActivity.kt | 10 +- .../quasseldroid/ui/chat/input/Editor.kt | 6 +- .../ui/chat/input/FormatHandler.kt | 2 +- .../ui/settings/SettingsActivity.kt | 14 +- .../settings/about/AboutSettingsActivity.kt | 5 + .../settings/about/AboutSettingsFragment.kt | 210 ++++++++++++++++++ .../about/AboutSettingsFragmentProvider.kt | 10 + .../ui/settings/about/Contributor.kt | 7 + .../ui/settings/about/ContributorAdapter.kt | 44 ++++ .../quasseldroid/ui/settings/about/Library.kt | 8 + .../ui/settings/about/LibraryAdapter.kt | 58 +++++ .../quasseldroid/ui/settings/about/License.kt | 9 + .../ui/settings/app/AppSettingsActivity.kt | 25 ++- .../settings/crash/CrashSettingsActivity.kt | 5 + .../settings/crash/CrashSettingsFragment.kt | 169 ++++++++++++++ .../crash/CrashSettingsFragmentProvider.kt | 10 + .../license/LicenseSettingsActivity.kt | 19 ++ .../license/LicenseSettingsFragment.kt | 35 +++ .../LicenseSettingsFragmentProvider.kt | 10 + .../accounts/edit/AccountEditActivity.kt | 6 +- .../quasseldroid/util/helper/GsonHelper.kt | 7 + .../res/layout-sw720dp/activity_settings.xml | 9 +- app/src/main/res/layout/activity_settings.xml | 16 +- app/src/main/res/layout/fragment_about.xml | 71 ++++++ app/src/main/res/layout/fragment_crash.xml | 5 + app/src/main/res/layout/fragment_license.xml | 28 +++ .../main/res/layout/layout_about_header.xml | 78 +++++++ .../main/res/layout/preference_vertical.xml | 4 +- .../main/res/layout/widget_contributor.xml | 49 ++++ app/src/main/res/layout/widget_crash.xml | 44 ++++ app/src/main/res/layout/widget_library.xml | 49 ++++ app/src/main/res/menu/activity_crashes.xml | 6 + app/src/main/res/menu/activity_main.xml | 6 +- app/src/main/res/menu/activity_settings.xml | 9 + app/src/main/res/menu/editor.xml | 41 +--- app/src/main/res/menu/formatting.xml | 44 ++++ app/src/main/res/menu/input_panel.xml | 9 - app/src/main/res/menu/setup_edit_account.xml | 4 +- .../res/mipmap-hdpi/ic_launcher_legacy.png | Bin 0 -> 3983 bytes .../res/mipmap-mdpi/ic_launcher_legacy.png | Bin 0 -> 2366 bytes .../res/mipmap-xhdpi/ic_launcher_legacy.png | Bin 0 -> 5819 bytes .../res/mipmap-xxhdpi/ic_launcher_legacy.png | Bin 0 -> 10074 bytes .../res/mipmap-xxxhdpi/ic_launcher_legacy.png | Bin 0 -> 14545 bytes app/src/main/res/values-de/strings.xml | 6 + app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/strings.xml | 10 + app/src/main/res/values/strings_licenses.xml | 48 ++++ app/src/main/res/values/styles_widgets.xml | 5 +- app/src/main/res/values/themes_base.xml | 2 + app/src/main/res/values/themes_gruvbox.xml | 2 + app/src/main/res/values/themes_solarized.xml | 2 + lib/build.gradle.kts | 2 +- persistence/build.gradle.kts | 2 +- viewmodel/build.gradle.kts | 2 +- 59 files changed, 1359 insertions(+), 88 deletions(-) create mode 100644 app/sampledata/contributors.json create mode 100644 app/sampledata/libraries.json create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt create mode 100644 app/src/main/res/layout/fragment_about.xml create mode 100644 app/src/main/res/layout/fragment_crash.xml create mode 100644 app/src/main/res/layout/fragment_license.xml create mode 100644 app/src/main/res/layout/layout_about_header.xml create mode 100644 app/src/main/res/layout/widget_contributor.xml create mode 100644 app/src/main/res/layout/widget_crash.xml create mode 100644 app/src/main/res/layout/widget_library.xml create mode 100644 app/src/main/res/menu/activity_crashes.xml create mode 100644 app/src/main/res/menu/activity_settings.xml create mode 100644 app/src/main/res/menu/formatting.xml delete mode 100644 app/src/main/res/menu/input_panel.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png create mode 100644 app/src/main/res/values/strings_licenses.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b426b435..fbcb8b236 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -120,7 +120,8 @@ dependencies { // Utility implementation("io.reactivex.rxjava2", "rxjava", "2.1.9") implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb") - implementation("org.jetbrains", "annotations", "15.0") + implementation("org.jetbrains", "annotations", "16.0.1") + implementation("com.google.code.gson", "gson", "2.8.2") withVersion("8.8.1") { implementation("com.jakewharton", "butterknife", version) kapt("com.jakewharton", "butterknife-compiler", version) @@ -136,7 +137,6 @@ dependencies { // UI implementation("me.zhanghai.android.materialprogressbar", "library", "1.4.2") implementation("com.afollestad.material-dialogs", "core", "0.9.6.0") - implementation("com.stepstone.stepper", "material-stepper", "4.3.1") implementation(project(":slidingpanel")) // Quality Assurance diff --git a/app/sampledata/contributors.json b/app/sampledata/contributors.json new file mode 100644 index 000000000..8683df065 --- /dev/null +++ b/app/sampledata/contributors.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "name": "Frederik M. J. Vestre", + "nickname": "freqmod", + "description": "Initial qdatastream deserialization attempts" + }, + { + "name": "Martin “Java Sucks” Sandsmark", + "nickname": "sandsmark", + "description": "Legacy protocol implementation, (de)serializers, project (de)moralizer" + }, + { + "name": "Magnus Fjell", + "nickname": "magnuf", + "description": "Legacy UI" + }, + { + "name": "Ken Børge Viktil", + "nickname": "Kenji", + "description": "Legacy UI" + }, + { + "name": "Janne Koschinski", + "nickname": "justJanne", + "description": "Rewrite, UI, Annotation Processors, Backend" + } + ] +} \ No newline at end of file diff --git a/app/sampledata/libraries.json b/app/sampledata/libraries.json new file mode 100644 index 000000000..f460cb3b5 --- /dev/null +++ b/app/sampledata/libraries.json @@ -0,0 +1,155 @@ +{ + "data": [ + { + "name": "Android Architecture Components: Lifecycle", + "version": "1.1.1", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle" + }, + { + "name": "Android Architecture Components: Paging", + "version": "1.0.0-alpha7", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://android.googlesource.com/platform/frameworks/support/+/master/paging" + }, + { + "name": "Android Architecture Components: Room", + "version": "1.1.0-beta1", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://android.googlesource.com/platform/frameworks/support/+/master/room" + }, + { + "name": "Android Sliding Up Panel", + "version": "3.5.0", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + } + }, + { + "name": "Android Support Library", + "version": "27.1.0", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://android.googlesource.com/platform/frameworks/support/+/master" + }, + { + "name": "AutoService", + "version": "1.0-rc4", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/google/auto/tree/master/service" + }, + { + "name": "Butter Knife", + "version": "8.8.1", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "http://jakewharton.github.io/butterknife/" + }, + { + "name": "Dagger 2", + "version": "2.15", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://google.github.io/dagger/" + }, + { + "name": "Gson", + "version": "2.8.2", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/google/gson" + }, + { + "name": "JavaPoet", + "version": "1.10.0", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/square/javapoet" + }, + { + "name": "JetBrains Java Annotations", + "version": "16.0.1", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/JetBrains/java-annotations" + }, + { + "name": "Kotlin Standard Library", + "version": "1.2.31", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://kotlinlang.org/" + }, + { + "name": "LeakCanary", + "version": "1.5.4", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/square/leakcanary" + }, + { + "name": "Material Dialogs", + "version": "0.9.6.0", + "license": { + "shortName": "MIT", + "fullName": "The MIT License (MIT}" + }, + "url": "https://github.com/afollestad/material-dialogs" + }, + { + "name": "MaterialProgressBar", + "version": "1.4.2", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/DreaminginCodeZH/MaterialProgressBar" + }, + { + "name": "RxJava", + "version": "2.1.9", + "license": { + "shortName": "Apache-2.0", + "fullName": "Apache License" + }, + "url": "https://github.com/ReactiveX/RxJava" + }, + { + "name": "ThreeTen backport project", + "version": "1.3.6", + "license": { + "shortName": "BSD 3-clause" + }, + "url": "http://www.threeten.org/threetenbp/" + } + ] +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 22ee8f941..e32180e8c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ <application android:name=".QuasselDroid" android:allowBackup="true" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_launcher_legacy" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.SplashTheme"> @@ -51,6 +51,25 @@ android:label="@string/label_settings" android:parentActivityName=".ui.chat.ChatActivity" android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.settings.crash.CrashSettingsActivity" + android:exported="false" + android:label="@string/label_crashes" + android:parentActivityName=".ui.settings.app.AppSettingsActivity" + android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.settings.about.AboutSettingsActivity" + android:exported="false" + android:label="@string/label_about" + android:parentActivityName=".ui.settings.app.AppSettingsActivity" + android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.settings.license.LicenseSettingsActivity" + android:exported="false" + android:label="@string/label_license" + android:parentActivityName=".ui.settings.about.AboutSettingsActivity" + android:windowSoftInputMode="adjustResize" /> + <activity android:name=".ui.setup.accounts.selection.AccountSelectionActivity" android:exported="false" diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt index 32b549b60..c3effe131 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt @@ -6,8 +6,14 @@ import de.kuschku.quasseldroid.service.QuasselService import de.kuschku.quasseldroid.ui.chat.ChatActivity import de.kuschku.quasseldroid.ui.chat.ChatActivityModule import de.kuschku.quasseldroid.ui.chat.ChatFragmentProvider +import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity +import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsFragmentProvider import de.kuschku.quasseldroid.ui.settings.app.AppSettingsActivity import de.kuschku.quasseldroid.ui.settings.app.AppSettingsFragmentProvider +import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity +import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsFragmentProvider +import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity +import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsFragmentProvider import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionFragmentProvider @@ -22,6 +28,15 @@ abstract class ActivityModule { @ContributesAndroidInjector(modules = [AppSettingsFragmentProvider::class]) abstract fun bindAppSettingsActivity(): AppSettingsActivity + @ContributesAndroidInjector(modules = [CrashSettingsFragmentProvider::class]) + abstract fun bindCrashSettingsActivity(): CrashSettingsActivity + + @ContributesAndroidInjector(modules = [AboutSettingsFragmentProvider::class]) + abstract fun bindAboutSettingsActivity(): AboutSettingsActivity + + @ContributesAndroidInjector(modules = [LicenseSettingsFragmentProvider::class]) + abstract fun bindLicenseSettingsActivity(): LicenseSettingsActivity + @ContributesAndroidInjector(modules = [AccountSetupFragmentProvider::class]) abstract fun bindAccountSetupActivity(): AccountSetupActivity diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 5365c3e40..cf6d3b697 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -294,11 +294,11 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc } override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { - android.R.id.home -> { + android.R.id.home -> { drawerToggle.onOptionsItemSelected(item) } - R.id.filter_messages -> { + R.id.action_filter_messages -> { runInBackground { viewModel.buffer { buffer -> val filtered = Message_Type.of(database.filtered().get(accountId, buffer) ?: 0) @@ -345,15 +345,15 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc } true } - R.id.settings -> { + R.id.action_settings -> { startActivity(Intent(applicationContext, AppSettingsActivity::class.java)) true } - R.id.disconnect -> { + R.id.action_disconnect -> { disconnect() true } - else -> super.onOptionsItemSelected(item) + else -> super.onOptionsItemSelected(item) } private fun disconnect() { diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt index ab3ceea63..96884a004 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt @@ -39,11 +39,11 @@ class Editor( private val panelStateCallback: (Boolean) -> Unit ) : ActionMenuView.OnMenuItemClickListener, Toolbar.OnMenuItemClickListener { override fun onMenuItemClick(item: MenuItem?) = when (item?.itemId) { - R.id.input_history -> { + R.id.action_input_history -> { panelStateCallback(true) true } - else -> formatHandler.onMenuItemClick(item) + else -> formatHandler.onMenuItemClick(item) } private val lastWord = BehaviorSubject.createDefault(Pair("", IntRange.EMPTY)) @@ -143,7 +143,7 @@ class Editor( formattingMenu.menu.retint(activity) formattingMenu.setOnMenuItemClickListener(this) - activity.menuInflater.inflate(R.menu.input_panel, formattingToolbar.menu) + activity.menuInflater.inflate(R.menu.editor, formattingToolbar.menu) formattingToolbar.menu.retint(activity) formattingToolbar.setOnMenuItemClickListener(this) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt index 2fcff65f9..e1656a01e 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt @@ -41,7 +41,7 @@ class FormatHandler(private val editText: EditText) { } @MenuRes - val menu: Int = R.menu.editor + val menu: Int = R.menu.formatting fun toggleBold(range: IntRange, createNew: Boolean = true) { if (range.isEmpty()) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt index 99f2657f8..6f26b2b27 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt @@ -8,8 +8,8 @@ import butterknife.ButterKnife import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.util.service.ServiceBoundActivity -abstract class SettingsActivity : ServiceBoundActivity() { - protected abstract val fragment: Fragment +abstract class SettingsActivity(private val fragment: Fragment? = null) : ServiceBoundActivity() { + protected open fun fragment(): Fragment? = null @BindView(R.id.toolbar) lateinit var toolbar: Toolbar @@ -22,8 +22,12 @@ abstract class SettingsActivity : ServiceBoundActivity() { setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) - val transaction = supportFragmentManager.beginTransaction() - transaction.add(R.id.fragment_container, fragment) - transaction.commit() + val fragment = this.fragment ?: this.fragment() + + if (fragment != null) { + val transaction = supportFragmentManager.beginTransaction() + transaction.replace(R.id.fragment_container, fragment) + transaction.commit() + } } } \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt new file mode 100644 index 000000000..5f6d1701f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt @@ -0,0 +1,5 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import de.kuschku.quasseldroid.ui.settings.SettingsActivity + +class AboutSettingsActivity : SettingsActivity(AboutSettingsFragment()) \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt new file mode 100644 index 000000000..9de5af5a6 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt @@ -0,0 +1,210 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.support.v4.view.ViewCompat +import android.support.v7.widget.DividerItemDecoration +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import dagger.android.support.DaggerFragment +import de.kuschku.quasseldroid.BuildConfig +import de.kuschku.quasseldroid.R + +class AboutSettingsFragment : DaggerFragment() { + + @BindView(R.id.version) + lateinit var version: TextView + + @BindView(R.id.action_website) + lateinit var website: Button + + @BindView(R.id.action_github) + lateinit var github: Button + + @BindView(R.id.contributors) + lateinit var contributors: RecyclerView + + @BindView(R.id.libraries) + lateinit var libraries: RecyclerView + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.fragment_about, container, false) + ButterKnife.bind(this, view) + + version.text = BuildConfig.VERSION_NAME + + website.setOnClickListener { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse("https://quasseldroid.info/") + context?.startActivity(intent) + } + + github.setOnClickListener { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse("https://github.com/justjanne/quasseldroid-ng") + context?.startActivity(intent) + } + + val apache2 = License( + shortName = "Apache-2.0", + fullName = "Apache License", + text = R.string.license_apache_2 + ) + + libraries.layoutManager = LinearLayoutManager(context) + libraries.adapter = LibraryAdapter(listOf( + Library( + name = "Android Architecture Components: Lifecycle", + version = "1.1.1", + license = apache2, + url = "https://android.googlesource.com/platform/frameworks/support/+/master/lifecycle" + ), + Library( + name = "Android Architecture Components: Paging", + version = "1.0.0-alpha7", + license = apache2, + url = "https://android.googlesource.com/platform/frameworks/support/+/master/paging" + ), + Library( + name = "Android Architecture Components: Room", + version = "1.1.0-beta1", + license = apache2, + url = "https://android.googlesource.com/platform/frameworks/support/+/master/room" + ), + Library( + name = "Android Sliding Up Panel", + version = "3.5.0", + license = apache2 + ), + Library( + name = "Android Support Library", + version = "27.1.0", + license = apache2, + url = "https://android.googlesource.com/platform/frameworks/support/+/master" + ), + Library( + name = "AutoService", + version = "1.0-rc4", + license = apache2, + url = "https://github.com/google/auto/tree/master/service" + ), + Library( + name = "Butter Knife", + version = "8.8.1", + license = apache2, + url = "http://jakewharton.github.io/butterknife/" + ), + Library( + name = "Dagger 2", + version = "2.15", + license = apache2, + url = "https://google.github.io/dagger/" + ), + Library( + name = "Gson", + version = "2.8.2", + license = apache2, + url = "https://github.com/google/gson" + ), + Library( + name = "JavaPoet", + version = "1.10.0", + license = apache2, + url = "https://github.com/square/javapoet" + ), + Library( + name = "JetBrains Java Annotations", + version = "16.0.1", + license = apache2, + url = "https://github.com/JetBrains/java-annotations" + ), + Library( + name = "Kotlin Standard Library", + version = "1.2.31", + license = apache2, + url = "https://kotlinlang.org/" + ), + Library( + name = "LeakCanary", + version = "1.5.4", + license = apache2, + url = "https://github.com/square/leakcanary" + ), + Library( + name = "Material Dialogs", + version = "0.9.6.0", + license = License( + shortName = "MIT", + fullName = "The MIT License (MIT)", + text = R.string.license_materialdialogs + ), + url = "https://github.com/afollestad/material-dialogs" + ), + Library( + name = "MaterialProgressBar", + version = "1.4.2", + license = apache2, + url = "https://github.com/DreaminginCodeZH/MaterialProgressBar" + ), + Library( + name = "RxJava", + version = "2.1.9", + license = apache2, + url = "https://github.com/ReactiveX/RxJava" + ), + Library( + name = "ThreeTen backport project", + version = "1.3.6", + license = License( + shortName = "BSD 3-clause", + text = R.string.license_threetenbp + ), + url = "http://www.threeten.org/threetenbp/" + ) + )) + libraries.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) + ViewCompat.setNestedScrollingEnabled(libraries, false) + + contributors.layoutManager = LinearLayoutManager(context) + contributors.adapter = ContributorAdapter(listOf( + Contributor( + name = "Frederik M. J. Vestre", + nickName = "freqmod", + description = "Initial qdatastream deserialization attempts" + ), + Contributor( + name = "Martin “Java Sucks” Sandsmark", + nickName = "sandsmark", + description = "Legacy protocol implementation, (de)serializers, project (de)moralizer" + ), + Contributor( + name = "Magnus Fjell", + nickName = "magnuf", + description = "Legacy UI" + ), + Contributor( + name = "Ken Børge Viktil", + nickName = "Kenji", + description = "Legacy UI" + ), + Contributor( + name = "Janne Koschinski", + nickName = "justJanne", + description = "Rewrite, UI, Annotation Processors, Backend" + ) + )) + contributors.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) + ViewCompat.setNestedScrollingEnabled(contributors, false) + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt new file mode 100644 index 000000000..e12cd9aef --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class AboutSettingsFragmentProvider { + @ContributesAndroidInjector + abstract fun bindAboutSettingsFragment(): AboutSettingsFragment +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt new file mode 100644 index 000000000..30ba46c4b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt @@ -0,0 +1,7 @@ +package de.kuschku.quasseldroid.ui.settings.about + +data class Contributor( + val name: String, + val nickName: String, + val description: String +) \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt new file mode 100644 index 000000000..91ed4cdb3 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt @@ -0,0 +1,44 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import de.kuschku.quasseldroid.R + +class ContributorAdapter(private val contributors: List<Contributor>) : + RecyclerView.Adapter<ContributorAdapter.ContributorViewHolder>() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ContributorViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.widget_contributor, parent, false) + ) + + override fun getItemCount() = contributors.size + + override fun onBindViewHolder(holder: ContributorViewHolder, position: Int) { + holder.bind(contributors[position]) + } + + class ContributorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + @BindView(R.id.name) + lateinit var name: TextView + + @BindView(R.id.nickname) + lateinit var nickName: TextView + + @BindView(R.id.description) + lateinit var description: TextView + + init { + ButterKnife.bind(this, itemView) + } + + fun bind(item: Contributor) { + this.name.text = item.name + this.nickName.text = item.nickName + this.description.text = item.description + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt new file mode 100644 index 000000000..2621adf09 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt @@ -0,0 +1,8 @@ +package de.kuschku.quasseldroid.ui.settings.about + +data class Library( + val name: String, + val version: String, + val license: License, + val url: String? = null +) \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt new file mode 100644 index 000000000..f2cfb94bf --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt @@ -0,0 +1,58 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import android.content.Intent +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity + +class LibraryAdapter(private val libraries: List<Library>) : + RecyclerView.Adapter<LibraryAdapter.LibraryViewHolder>() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = LibraryViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.widget_library, parent, false) + ) + + override fun getItemCount() = libraries.size + + override fun onBindViewHolder(holder: LibraryViewHolder, position: Int) { + holder.bind(libraries[position]) + } + + class LibraryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + @BindView(R.id.name) + lateinit var name: TextView + + @BindView(R.id.version) + lateinit var version: TextView + + @BindView(R.id.license) + lateinit var license: TextView + + private var item: Library? = null + + init { + ButterKnife.bind(this, itemView) + itemView.setOnClickListener { + this.item?.run { + val intent = Intent(itemView.context, + LicenseSettingsActivity::class.java) + intent.putExtra("license_name", license.fullName) + intent.putExtra("license_text", license.text) + itemView.context.startActivity(intent) + } + } + } + + fun bind(item: Library) { + this.item = item + this.name.text = item.name + this.version.text = item.version + this.license.text = item.license.shortName + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt new file mode 100644 index 000000000..08e21f53b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid.ui.settings.about + +import android.support.annotation.StringRes + +data class License( + val shortName: String, + val fullName: String = shortName, + @StringRes val text: Int +) \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt index d1127016e..7dcbb7f02 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt @@ -1,7 +1,28 @@ package de.kuschku.quasseldroid.ui.settings.app +import android.content.Intent +import android.view.Menu +import android.view.MenuItem +import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.ui.settings.SettingsActivity +import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity +import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity -class AppSettingsActivity : SettingsActivity() { - override val fragment = AppSettingsFragment() +class AppSettingsActivity : SettingsActivity(AppSettingsFragment()) { + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.activity_settings, menu) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { + R.id.action_about -> { + startActivity(Intent(applicationContext, AboutSettingsActivity::class.java)) + true + } + R.id.action_crashes -> { + startActivity(Intent(applicationContext, CrashSettingsActivity::class.java)) + true + } + else -> super.onOptionsItemSelected(item) + } } \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt new file mode 100644 index 000000000..5d21e0bc9 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt @@ -0,0 +1,5 @@ +package de.kuschku.quasseldroid.ui.settings.crash + +import de.kuschku.quasseldroid.ui.settings.SettingsActivity + +class CrashSettingsActivity : SettingsActivity(CrashSettingsFragment()) \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt new file mode 100644 index 000000000..fb2f41473 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt @@ -0,0 +1,169 @@ +package de.kuschku.quasseldroid.ui.settings.crash + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.HandlerThread +import android.support.v4.view.ViewCompat +import android.support.v7.recyclerview.extensions.ListAdapter +import android.support.v7.util.DiffUtil +import android.support.v7.widget.DividerItemDecoration +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.* +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import de.kuschku.malheur.data.Report +import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.util.helper.fromJson +import de.kuschku.quasseldroid.util.service.ServiceBoundFragment +import org.threeten.bp.Instant +import org.threeten.bp.ZoneId +import org.threeten.bp.format.DateTimeFormatter +import java.io.File + +class CrashSettingsFragment : ServiceBoundFragment() { + @BindView(R.id.list) + lateinit var list: RecyclerView + + private lateinit var handlerThread: HandlerThread + private lateinit var handler: Handler + + private var gson: Gson? = null + private var crashDir: File? = null + private var adapter: CrashAdapter? = null + + override fun onAttach(context: Context?) { + super.onAttach(context) + handlerThread = HandlerThread("CrashSettings") + handlerThread.start() + handler = Handler(handlerThread.looper) + } + + override fun onDetach() { + super.onDetach() + handlerThread.quit() + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.fragment_crash, container, false) + ButterKnife.bind(this, view) + + setHasOptionsMenu(true) + + this.adapter = CrashAdapter() + this.crashDir = File(requireContext().cacheDir, "crashes") + this.gson = GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create() + + list.layoutManager = LinearLayoutManager(context) + list.adapter = adapter + list.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) + ViewCompat.setNestedScrollingEnabled(list, false) + + handler.post { + val crashDir = this.crashDir + val gson = this.gson + + if (crashDir != null && gson != null) { + val list: List<Pair<Report, String>> = crashDir.listFiles() + .map { it.readText() } + .map { Pair<Report, String>(gson.fromJson(it), it) } + .sortedByDescending { it.first.environment?.crashTime } + + requireActivity().runOnUiThread { + this.adapter?.submitList(list) + } + } + } + return view + } + + class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHolder>( + object : DiffUtil.ItemCallback<Pair<Report, String>>() { + override fun areItemsTheSame(oldItem: Pair<Report, String>?, newItem: Pair<Report, String>?) = + oldItem?.second == newItem?.second + + override fun areContentsTheSame(oldItem: Pair<Report, String>?, + newItem: Pair<Report, String>?) = + oldItem == newItem + } + ) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CrashViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.widget_crash, parent, false) + ) + + override fun onBindViewHolder(holder: CrashViewHolder, position: Int) { + val (report, data) = getItem(position) + holder.bind(report, data) + } + + class CrashViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + @BindView(R.id.crash_time) + lateinit var crashTime: TextView + + @BindView(R.id.version_name) + lateinit var versionName: TextView + + @BindView(R.id.error) + lateinit var error: TextView + + var item: Report? = null + var data: String? = null + + private val dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss") + + init { + ButterKnife.bind(this, itemView) + itemView.setOnClickListener { + data?.let { + val intent = Intent(Intent.ACTION_SEND) + intent.type = "application/json" + intent.putExtra(Intent.EXTRA_TEXT, it) + itemView.context.startActivity( + Intent.createChooser( + intent, + itemView.context.getString(R.string.label_share_crashreport) + ) + ) + } + } + } + + fun bind(item: Report, data: String) { + this.item = item + this.data = data + + this.crashTime.text = item.environment?.crashTime?.let { + dateTimeFormatter.format(Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault())) + } + this.versionName.text = "${item.application?.versionName}" + this.error.text = "${item.crash?.exception?.lines()?.firstOrNull()}" + } + } + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + inflater?.inflate(R.menu.activity_crashes, menu) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { + R.id.action_delete_all -> { + runInBackground { + File(requireContext().cacheDir, "crashes").listFiles().forEach { + it.delete() + } + requireActivity().runOnUiThread { + this.adapter?.submitList(emptyList()) + } + } + true + } + else -> super.onOptionsItemSelected(item) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt new file mode 100644 index 000000000..3cb243e5f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.settings.crash + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class CrashSettingsFragmentProvider { + @ContributesAndroidInjector + abstract fun bindAppSettingsFragment(): CrashSettingsFragment +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt new file mode 100644 index 000000000..aa455d511 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt @@ -0,0 +1,19 @@ +package de.kuschku.quasseldroid.ui.settings.license + +import android.os.Bundle +import de.kuschku.quasseldroid.ui.settings.SettingsActivity + +class LicenseSettingsActivity : SettingsActivity() { + private lateinit var arguments: Bundle + + override fun onCreate(savedInstanceState: Bundle?) { + arguments = intent.extras + super.onCreate(savedInstanceState) + } + + override fun fragment(): LicenseSettingsFragment { + val fragment = LicenseSettingsFragment() + fragment.arguments = arguments + return fragment + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt new file mode 100644 index 000000000..5e5fe63c9 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt @@ -0,0 +1,35 @@ +package de.kuschku.quasseldroid.ui.settings.license + +import android.os.Bundle +import android.text.Html +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import dagger.android.support.DaggerFragment +import de.kuschku.quasseldroid.R + +class LicenseSettingsFragment : DaggerFragment() { + @BindView(R.id.name) + lateinit var name: TextView + + @BindView(R.id.text) + lateinit var text: TextView + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.fragment_license, container, false) + ButterKnife.bind(this, view) + + name.text = arguments?.getString("license_name") + + val textResource = arguments?.getInt("license_text", 0) ?: 0 + if (textResource != 0) { + text.text = Html.fromHtml(getString(textResource)) + } + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt new file mode 100644 index 000000000..03c5df1fe --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.settings.license + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class LicenseSettingsFragmentProvider { + @ContributesAndroidInjector + abstract fun bindLicenseSettingsFragment(): LicenseSettingsFragment +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt index b5677d016..224609628 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt @@ -136,7 +136,7 @@ class AccountEditActivity : AppCompatActivity() { } override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { - R.id.delete -> { + R.id.action_delete -> { AlertDialog.Builder(this) .setTitle("Delete?") .setMessage("Are you sure?") @@ -161,7 +161,7 @@ class AccountEditActivity : AppCompatActivity() { .show() true } - R.id.save -> { + R.id.action_save -> { if (isValid) { val it = account if (it != null) { @@ -179,6 +179,6 @@ class AccountEditActivity : AppCompatActivity() { } true } - else -> super.onOptionsItemSelected(item) + else -> super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt new file mode 100644 index 000000000..c760c8a60 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GsonHelper.kt @@ -0,0 +1,7 @@ +package de.kuschku.quasseldroid.util.helper + +import com.google.gson.Gson +import java.io.File + +inline fun <reified T> Gson.fromJson(file: File) = this.fromJson(file.reader(), T::class.java) +inline fun <reified T> Gson.fromJson(text: String) = this.fromJson(text, T::class.java) \ No newline at end of file diff --git a/app/src/main/res/layout-sw720dp/activity_settings.xml b/app/src/main/res/layout-sw720dp/activity_settings.xml index 42e160571..9ddcca650 100644 --- a/app/src/main/res/layout-sw720dp/activity_settings.xml +++ b/app/src/main/res/layout-sw720dp/activity_settings.xml @@ -1,8 +1,9 @@ <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#eeeeee" + android:background="?attr/colorBackgroundSecondary" android:fitsSystemWindows="true" android:orientation="vertical"> @@ -22,7 +23,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:contentInsetStartWithNavigation="0dp" - app:popupTheme="@style/Widget.PopupOverlay" /> + app:popupTheme="?attr/actionBarPopupTheme" /> </android.support.design.widget.AppBarLayout> @@ -32,6 +33,7 @@ android:layout_gravity="center_horizontal" android:layout_marginBottom="32dp" android:layout_marginTop="-64dp" + android:background="?attr/colorBackgroundCard" android:clipToPadding="false" app:cardElevation="4dp"> @@ -43,7 +45,8 @@ <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + tools:layout="@layout/fragment_about" /> </android.support.v4.widget.NestedScrollView> </android.support.v7.widget.CardView> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index a42c0cb50..8ed200484 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -21,14 +21,20 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:contentInsetStartWithNavigation="0dp" - app:popupTheme="@style/Widget.PopupOverlay" /> + app:popupTheme="?attr/actionBarPopupTheme" /> </android.support.design.widget.AppBarLayout> - <FrameLayout - android:id="@+id/fragment_container" - android:layout_width="fill_parent" - android:layout_height="fill_parent" /> + <android.support.v4.widget.NestedScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scrollbars="vertical"> + + <FrameLayout + android:id="@+id/fragment_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </android.support.v4.widget.NestedScrollView> </LinearLayout> </android.support.v4.widget.DrawerLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml new file mode 100644 index 000000000..f7a76b384 --- /dev/null +++ b/app/src/main/res/layout/fragment_about.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <include layout="@layout/layout_about_header" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="?listPreferredItemHeight" + android:orientation="vertical"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingBottom="8dp" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingStart="?android:attr/listPreferredItemPaddingLeft" + android:paddingTop="8dp" + android:text="@string/label_contributors" + android:textColor="?colorAccent" + android:textSize="16sp" + android:textStyle="bold" /> + + <android.support.v7.widget.RecyclerView + android:id="@+id/contributors" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:itemCount="5" + tools:listitem="@layout/widget_contributor" /> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="?listPreferredItemHeight" + android:orientation="vertical"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingBottom="8dp" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingStart="?android:attr/listPreferredItemPaddingLeft" + android:paddingTop="8dp" + android:text="@string/label_libraries" + android:textColor="?colorAccent" + android:textSize="16sp" + android:textStyle="bold" /> + + <android.support.v7.widget.RecyclerView + android:id="@+id/libraries" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:listitem="@layout/widget_library" /> + + </LinearLayout> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_crash.xml b/app/src/main/res/layout/fragment_crash.xml new file mode 100644 index 000000000..d84e8ff1d --- /dev/null +++ b/app/src/main/res/layout/fragment_crash.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml new file mode 100644 index 000000000..26a12b053 --- /dev/null +++ b/app/src/main/res/layout/fragment_license.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scrollbars="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> + + <TextView + android:id="@+id/name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:textAppearance="@style/TextAppearance.AppCompat.Title" + tools:text="Apache-2.0" /> + + <TextView + android:id="@+id/text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:text="@string/license_apache_2" /> + </LinearLayout> +</android.support.v4.widget.NestedScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_about_header.xml b/app/src/main/res/layout/layout_about_header.xml new file mode 100644 index 000000000..eb6fcbdec --- /dev/null +++ b/app/src/main/res/layout/layout_about_header.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingEnd="?listPreferredItemPaddingRight" + android:paddingLeft="?listPreferredItemPaddingLeft" + android:paddingRight="?listPreferredItemPaddingRight" + android:paddingStart="?listPreferredItemPaddingLeft" + android:paddingTop="?listPreferredItemHeight"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <android.support.v7.widget.AppCompatImageView + android:layout_width="?actionBarSize" + android:layout_height="?actionBarSize" + android:layout_gravity="center" + android:layout_marginEnd="?listPreferredItemPaddingRight" + android:layout_marginRight="?listPreferredItemPaddingRight" + app:srcCompat="@mipmap/ic_launcher_legacy" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:orientation="vertical"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/app_name" + android:textAppearance="@style/TextAppearance.AppCompat.Title" /> + + <TextView + android:id="@+id/version" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.AppCompat.Small" + tools:text="v0.3.0-310-ge2d1d05" /> + </LinearLayout> + </LinearLayout> + + <android.support.v7.widget.ButtonBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:layout_marginTop="8dp" + android:orientation="horizontal"> + + <Button + android:id="@+id/action_website" + style="@style/Widget.Button.Colored" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_website" /> + + <Button + android:id="@+id/action_github" + style="@style/Widget.Button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_github" /> + + </android.support.v7.widget.ButtonBarLayout> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="4dp" + android:layout_marginRight="4dp" + android:text="@string/app_description_long" /> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/preference_vertical.xml b/app/src/main/res/layout/preference_vertical.xml index 0d382f7c3..f2bd7b80d 100644 --- a/app/src/main/res/layout/preference_vertical.xml +++ b/app/src/main/res/layout/preference_vertical.xml @@ -64,7 +64,7 @@ android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?colorTextPrimary" android:textSize="16sp" tools:text="Font Size" /> @@ -74,7 +74,7 @@ android:layout_height="wrap_content" android:maxLines="10" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?android:attr/textColorSecondary" /> + android:textColor="?colorTextSecondary" /> <LinearLayout android:id="@android:id/widget_frame" diff --git a/app/src/main/res/layout/widget_contributor.xml b/app/src/main/res/layout/widget_contributor.xml new file mode 100644 index 000000000..dd0b1b87a --- /dev/null +++ b/app/src/main/res/layout/widget_contributor.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:gravity="center_vertical" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingStart="?android:attr/listPreferredItemPaddingLeft" + tools:showIn="@layout/fragment_about"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingBottom="16dp" + android:paddingTop="16dp"> + + <TextView + android:id="@+id/name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="?colorTextPrimary" + android:textSize="16sp" + tools:text="@sample/contributors.json/data/name" /> + + <TextView + android:id="@+id/nickname" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextSecondary" + tools:text="@sample/contributors.json/data/nickname" /> + + <TextView + android:id="@+id/description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextSecondary" + tools:text="@sample/contributors.json/data/description" /> + </LinearLayout> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_crash.xml b/app/src/main/res/layout/widget_crash.xml new file mode 100644 index 000000000..3bc5b9d83 --- /dev/null +++ b/app/src/main/res/layout/widget_crash.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:gravity="center_vertical" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingStart="?android:attr/listPreferredItemPaddingLeft"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingBottom="16dp" + android:paddingTop="16dp"> + + <TextView + android:id="@+id/crash_time" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="?colorTextPrimary" + android:textSize="16sp" /> + + <TextView + android:id="@+id/version_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextPrimary" /> + + <TextView + android:id="@+id/error" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextSecondary" /> + </LinearLayout> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_library.xml b/app/src/main/res/layout/widget_library.xml new file mode 100644 index 000000000..3aef66275 --- /dev/null +++ b/app/src/main/res/layout/widget_library.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:gravity="center_vertical" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingStart="?android:attr/listPreferredItemPaddingLeft" + tools:showIn="@layout/fragment_about"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingBottom="16dp" + android:paddingTop="16dp"> + + <TextView + android:id="@+id/name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="?colorTextPrimary" + android:textSize="16sp" + tools:text="@sample/libraries.json/data/name" /> + + <TextView + android:id="@+id/version" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextSecondary" + tools:text="@sample/libraries.json/data/version" /> + + <TextView + android:id="@+id/license" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?colorTextSecondary" + tools:text="@sample/libraries.json/data/license/shortName" /> + </LinearLayout> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/menu/activity_crashes.xml b/app/src/main/res/menu/activity_crashes.xml new file mode 100644 index 000000000..6191d5b80 --- /dev/null +++ b/app/src/main/res/menu/activity_crashes.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:id="@+id/action_delete_all" + android:title="@string/label_delete_all" /> +</menu> diff --git a/app/src/main/res/menu/activity_main.xml b/app/src/main/res/menu/activity_main.xml index 5d9cfcb50..214b44fcd 100644 --- a/app/src/main/res/menu/activity_main.xml +++ b/app/src/main/res/menu/activity_main.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item - android:id="@+id/filter_messages" + android:id="@+id/action_filter_messages" android:title="@string/label_filter_messages" /> <item - android:id="@+id/settings" + android:id="@+id/action_settings" android:title="@string/label_settings" /> <item - android:id="@+id/disconnect" + android:id="@+id/action_disconnect" android:title="@string/label_disconnect" /> </menu> diff --git a/app/src/main/res/menu/activity_settings.xml b/app/src/main/res/menu/activity_settings.xml new file mode 100644 index 000000000..391c758fa --- /dev/null +++ b/app/src/main/res/menu/activity_settings.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:id="@+id/action_crashes" + android:title="@string/label_crashes" /> + <item + android:id="@+id/action_about" + android:title="@string/label_about" /> +</menu> diff --git a/app/src/main/res/menu/editor.xml b/app/src/main/res/menu/editor.xml index 3add5e54e..a5e677112 100644 --- a/app/src/main/res/menu/editor.xml +++ b/app/src/main/res/menu/editor.xml @@ -2,43 +2,8 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item - android:id="@+id/format_bold" - android:icon="@drawable/ic_format_bold" - android:title="@string/label_bold" - app:showAsAction="always" /> - <item - android:id="@+id/format_italic" - android:icon="@drawable/ic_format_italic" - android:title="@string/label_italic" - app:showAsAction="always" /> - <item - android:id="@+id/format_underline" - android:icon="@drawable/ic_format_underline" - android:title="@string/label_underline" - app:showAsAction="always" /> - <item - android:id="@+id/format_strikethrough" - android:icon="@drawable/ic_format_strikethrough" - android:title="@string/label_strikethrough" - app:showAsAction="always" /> - <item - android:id="@+id/format_monospace" - android:icon="@drawable/ic_format_monospace" - android:title="@string/label_monospace" - app:showAsAction="always" /> - <item - android:id="@+id/format_foreground" - android:icon="@drawable/ic_format_foreground" - android:title="@string/label_foreground" - app:showAsAction="always" /> - <item - android:id="@+id/format_background" - android:icon="@drawable/ic_format_background" - android:title="@string/label_background" - app:showAsAction="always" /> - <item - android:id="@+id/format_clear" - android:icon="@drawable/ic_format_clear" - android:title="@string/label_clear_formatting" + android:id="@+id/action_input_history" + android:icon="@drawable/ic_history" + android:title="@string/label_input_history" app:showAsAction="always" /> </menu> \ No newline at end of file diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml new file mode 100644 index 000000000..3add5e54e --- /dev/null +++ b/app/src/main/res/menu/formatting.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + <item + android:id="@+id/format_bold" + android:icon="@drawable/ic_format_bold" + android:title="@string/label_bold" + app:showAsAction="always" /> + <item + android:id="@+id/format_italic" + android:icon="@drawable/ic_format_italic" + android:title="@string/label_italic" + app:showAsAction="always" /> + <item + android:id="@+id/format_underline" + android:icon="@drawable/ic_format_underline" + android:title="@string/label_underline" + app:showAsAction="always" /> + <item + android:id="@+id/format_strikethrough" + android:icon="@drawable/ic_format_strikethrough" + android:title="@string/label_strikethrough" + app:showAsAction="always" /> + <item + android:id="@+id/format_monospace" + android:icon="@drawable/ic_format_monospace" + android:title="@string/label_monospace" + app:showAsAction="always" /> + <item + android:id="@+id/format_foreground" + android:icon="@drawable/ic_format_foreground" + android:title="@string/label_foreground" + app:showAsAction="always" /> + <item + android:id="@+id/format_background" + android:icon="@drawable/ic_format_background" + android:title="@string/label_background" + app:showAsAction="always" /> + <item + android:id="@+id/format_clear" + android:icon="@drawable/ic_format_clear" + android:title="@string/label_clear_formatting" + app:showAsAction="always" /> +</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/input_panel.xml b/app/src/main/res/menu/input_panel.xml deleted file mode 100644 index af252a356..000000000 --- a/app/src/main/res/menu/input_panel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/input_history" - android:icon="@drawable/ic_history" - android:title="@string/label_input_history" - app:showAsAction="always" /> -</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/setup_edit_account.xml b/app/src/main/res/menu/setup_edit_account.xml index 06155b5aa..93611a841 100644 --- a/app/src/main/res/menu/setup_edit_account.xml +++ b/app/src/main/res/menu/setup_edit_account.xml @@ -2,11 +2,11 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item - android:id="@+id/save" + android:id="@+id/action_save" android:title="@string/label_save" app:showAsAction="ifRoom" /> <item - android:id="@+id/delete" + android:id="@+id/action_delete" android:icon="@drawable/ic_delete" android:title="@string/label_delete" app:iconTint="#fff" diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-hdpi/ic_launcher_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..f38fcf4b41832598338e5c4a1dda5d484be62199 GIT binary patch literal 3983 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%0A|{eNr^r4pX{`g=U;Q zM1%awCPSgJMIL=)fM?!*ox5*b#AnZ+Lq}Wl7%wJM-@q_0Y&*=iAKk^t0S#FP9A#?+ z+Q!5NN4%qK8!Oir`DSQucs<XZNE56mN-8Ll_Dva($?;(|!z~ZJ$0w$~&n;g#gNv6; zXThv?^7&lMNBJTMl}d&E#|C)wy%Ou5`he~e70BelI}C727&=ft6ug51JH$I6I2xl| zN3H_pj}#iG2Bl11Qrcq^b#jlE4h{?qbNj!&hZs9Kb4HF;E9NkFdNWho@=n1`7^zzH z_E$LcVVPgOeuUk}D=4kN%%ZYIyeh7%B^p0$i{oEhiQIX3Ig#(O?ejVJyl#R3p{+nv zNSt=VfrGMn-BC!P1u&sH!k!bFdw+4jUcrosRGs}-HV1W^zbF$$-Y$_UWoIz%;-l>J zBB&)QU^?Q|eN<Fqg1<_WhQAh11<25q9&Hq+g&~Qhyki5C^ekVn-A2tm9(K?8RW|E& z5+mzqf(pE=Jz&sI^5>do)Rj2q<mN>hg$=KpMY~~4JEy)WIHa^&M)}x!tg@55X`;u) z{tDpjcTzL#XrhTAxjbaD0rL-pXac_(a^sTHUJfXLR`%tmm3CjR#DSYVyWsd>d67;F zN|dvaPNp;ssvr94`oEid!?lMc+x!P8RZQv>OjsxS+e~rNY^Cctv^Ij{#m4efS2=UE zaD0cjq1-bX!w|Hfb5oXSv!y8R=2R(PPzjhHfTT;G`mYGsKdjE%*Hw)x+yC!q#BBTH zFMc*#T>P&()7t9gM22!*Az+`(isRV(etb=0qBz#V+b44qSCIc}Qb1wuwRe4Pw7B#U zE8E@*1pJPlN4hC>8bD)dh5!~&|Cn7hpnQ14Jsa~wJ8v@TeJ8cDlSQ{SWbb2@=cm%> zV`e%NA`2)V*?7;(O+&l>%&hkIqQyDsb=<ml>U(+u1a=*xeCXHrY-;O&`%kmglP5fI z+)_xmiXWrjcYweKX{7u4d$)`ZZCPVjeMd!$XIdZqCwRYKq=Av4XYb!yJGuGBOuhFA zu|tGpI$Zz)8>G>}=kMP(+P`_VS?%ezE1HuU6eJCdl%IQGXJz=U8#1+?edtLa6eR&h z${T;MYj||)>P)TlzBH&wpN;^54bo_J!vlLe2R2`y87=K#eAVRBjucQh?@M<s1hQjw pK3&P(cYfTqQ<F4FlXM!;{{mYxTumPJz25);002ovPDHLkV1g*y#7F=D literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-mdpi/ic_launcher_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbb5bec79527a8a12b22b711e3b77a098987359 GIT binary patch literal 2366 zcmV-E3BmS>P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00004b3#c}2nYxW zd<bNS00009a7bBm000J%000J%0pTCRbpQYW8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H12)ju{K~!jg?U;Lv9aSC2KWFZpyN|NFcl%nmg(A>RDHR%uAc#~D zTNGPpjL%32QKEp9SP_#(V~jBpi9|`nM}mMU2{8ms;{%YE2%*x&((Qv%XtzZkEtGxV zecZi|`ThLk%*>scJGZSd(bn{roXpIbbAIRhdz|0zcMhDQQ*??>(JA^5$fWhHx$li- zS;uK>G|9`L$HTl@1**p$=ZPMZU%4XVo7TU72gKJ-3Sd6@(?c7ks@X4z#7C+sO0v&? z623$q_P=WUJIW(%eC%7o?~F0b$d(`8@}0B39A%MB2;dA&@mWtjVmi_K*ZRfO|F)9n zTMe^Y9Ta6?LK&SB6a$zP9@>x}k+DT5^F`ohz-uIcse0t1h*LGL_5U5CT-D=p_2O2R zFFK93mN@J2sVdLzo#5%cMK<rN;E9RzPbjHg0Hxy5M8a#50@&#q@QVOVn&0nJl*`X@ z`R2+Fdb(Tc+4<Dgnq}2Rc~)JN=e5IA-1C=Fw!B{Pt<u;X>-;Q1bpnXSonI50iS|1P zYp-nO=Bwt^F|Jf9Oifn+Xl-_JT{rx<XkIH1e5I9NJ$;1xo}EI}r0$PEm^9@z6u?(& z-9$}T!yx={O`cWDI>Y`_xytjq-{tRnNBHy30wa@lPDiV<YH0_TFPX{m3%YT$8H|Bj zS9a0eIn1{o9|kfh?j*7A;}Sq5J}EiT3Z;DYBdsy;uf8?H-H#pM#eHQ=#zk;3j@9hg zl=8?6(`<PD4L;QK4&VLULe5=a=dQVUCI{Y`<d<8fQJe(exCPS4Np`4e*u-z)x7g?6 zF2ijr=Z157Upc}}_wM1vet}HR*P97UXWuaxCr9soj~njU&DNKXg!9*}KApw+3aWxi zu(rh3v^eD75C8=gP(j5uR6we%ThWPQ?B+XgsKC01UuU%BqL{b>VvGAv97fAI);@TU z1Bb^f2xGYGx-OU;57$g@^`=M>K*A<c0}%k|nQORgQAa53y&DfQTnIGoYe^Lq_4iY} zDT-hi8i$`e-XDg`<x6JKGs~dGNq>D!ZO0ZswAP5alA!AGv2$yovTy$|n|4j0#`wUj z*NP9c)+cs8;tOb9;fWoS^z9!C`K?@<N6RI2s_0wZdVz!rJuVlLx)z$x6F$6fMmToU z&Or>0uX*(s^=hscx?qYWR4^Ex+A$dNyW#`wARbyRp~Y!bJ)du+C8#b6)tM<ePlfKz zrkVu~6k>DIGIaDKh+xrief!43_wLSSt7T)*atWh~H01yj&ON38Q7OYok>X`mdoKJx zSg`vf9eg4Q#lo_m?Nu2lgk=qLJDcsifM>M?2;_30X@&FA@<2=|AC4-;Qk5n*13)h8 z|5GnIG@*cKZj7WuUpY;=8nB6C#aD#*5zT>W)$(y`iaV+RvGO+|1S$-UmB^oF-Duv- zW?nr!Mo?cRvvu@&#d+;~VR<*DvhcvuhuHJxB&agKvlbKvMyF8`i~*cX7`3!&1v8Oy zq@e)zY*FuPDi+QDcPCglzukg5KhHC}#{8V6H7zH=FImvSL+h53%~(M{e&KAcT;I#U zXoclVYuWt3;X>$&f?(93YQTUIfoi1=SA!^2OGL3;fb!fcwM}>J#a%S#1X0h=qP2*l zp(2DU&g%%l1GLX@`QX_zXmy28UECG+Z{9fwYHa9@<ew0iSAV=aY92r%*%(1o*|cYz ziK!9*v)h}wdByxN=|vNs`k_)hVPw3RP?9n<I>9Zg&t!H-GXRCD5}RHc0uzMfASp&# z3e^ih05)hfKqw4MI6V5dH^cF3*DU0+MeULJ9*Ok=VEFx(BRsSHZK~BO<#L7JZSE)M zx~yG&PRM7&U;7!HP(=KMClYRcd%&^EO;R#8WzSr@t=`dyhEyf*mig2A3piu0J@=0n zE8KDaE;jET30cO{i3(aRae7ylQb|~P_AGvW`!Y^zv77RZcMDvz{&~hq888_H1I9re zgI{u?j)TGQ-owjXB3A`<76{xXDBxm+oZ1aKQp)m;2lrC&U8$|b<u`XO<3~64FsChp zNU$e7+f-4<rCiQ&=VzAi;I}Rb!51b=+<yOdMvD%L^?&?OibyRgHmIrVEO5qcz3CQ6 zzNp8w=V$rx4d;_@Zw|**JYnlAL-f8j%Hg4D0OrkX;?l)=E?qn)wwXr?MecfF8-MH_ z2gd*oY8(s8@y9s^#n`h2hQZ%n8M8pW0Jm<f!~n;lyRV3#Lp&~A0QcUwh(!x#r)sDX zz535V?)-Hh+YXk%WU#jt28?YA7{|ZGa0~{6I1WPz0n*RJDHQi<|7i?;Zwf2Fzl}Rq z%;ED_ox}XD4va}p`>M*@N5*(`^L~EzhqtIYIUlfs)T#x=YS!w?f>*y>Pg0!)=6!8T zrSTCilB1)wjVe^jP?+GFOWOJ9lDTxxX`!>tX6%viX%4+t<k>v~JlXpm#%)23)h@=d z?2LbcbDW4Js9D5VxWgN+KDq_emV-{Bs!5e47S%F2w7rd|`X+gD`$1a@dwz}NWB}_X zxHIgLQ>|`QwFcf`gN5<;gRgu1Y@9~PD5MmJwrh}C!xldk1=%@T_p1sx8Kk+@N0P;4 za+plc*HaK)gH2@cP$WoPCO85aKYv>|s)`_uf>50WWb}n!e0uhU*WIG(hPzVJEYN^N zjUt+*>iLydZBMBv7^micBH&~cQ!B>3rnxJ<Z2NqJ0LGs7)QTl3I8tw?Ny`ua9Wpbn z|H0yxY|lo|&7Y+P>&*cw<1qTjien@)s~+!v)T)ykzqhBbZ`ZY%%J4p0LI^>HdtBEl zCjd!#_uc!(`(Iw|mWK8kBKzieZY53-lG4t*`zLp7{Di3t_XW2j$91i80+AFCKKAzX zjz_M`Rt8=QB4d(HWB~xA*#E@g;?@_g&y)xM(dbNYGLXZZo8FgS^U!nHjCfL#!~Cz$ kqG3)xIq0MY|Nlw<0@Zg+G5waI?f?J)07*qoM6N<$g2?KWT>t<8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..c467548ffc085b72f2514bea9989ec554dcc80b0 GIT binary patch literal 5819 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 FV1kp`R|Eh6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6d70aaa5c29bf01c84ba9da62de289341a933e GIT binary patch literal 10074 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 Y98zQ!?fM)3!@&V$BoxG}L=A)f2dq3fKL7v# literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..366142e9b7b379249e49bb3184429fad132a89fb GIT binary patch literal 14545 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2dce73ad1..88e9d923e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -5,17 +5,21 @@ <string name="connection_service_title">Verbindungsdienst</string> <string name="connection_service_description">Hält eine Verbindung zum Core, um Benachrichtigungen und die Übertragung von Nachrichten zu ermöglichen</string> + <string name="label_about">Über</string> <string name="label_buffer_name">Chatname</string> <string name="label_cancel">Abbrechen</string> <string name="label_close">Schließen</string> <string name="label_connect">Verbinden</string> + <string name="label_crashes">Absturzberichte</string> <string name="label_delete">Löschen</string> + <string name="label_delete_all">Alle Löschen</string> <string name="label_disconnect">Verbindung trennen</string> <string name="label_filter_messages">Nachrichten filtern</string> <string name="label_hide_perm">Permanent ausblenden</string> <string name="label_hide_temp">Temporär ausblenden</string> <string name="label_input_history">Eingabeverlauf</string> <string name="label_join">Verbinden</string> + <string name="label_license">Lizenz</string> <string name="label_no">Nein</string> <string name="label_open">Öffnen</string> <string name="label_part">Verlassen</string> @@ -24,8 +28,10 @@ <string name="label_save">Speichern</string> <string name="label_select_multiple">Auswählen</string> <string name="label_settings">Einstellungen</string> + <string name="label_share_crashreport">Absturzbericht Teilen</string> <string name="label_show_hidden">Alle anzeigen</string> <string name="label_unhide">Nicht mehr ausblenden</string> + <string name="label_website">Webseite</string> <string name="label_yes">Ja</string> <string name="notification_channel_connection_title">Verbindung</string> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 0af8785e4..b31f5bb0b 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -129,6 +129,7 @@ <attr name="colorForegroundMirc" format="integer" /> <attr name="colorTextPrimary" format="color" /> + <attr name="colorTextPrimaryInverse" format="color" /> <attr name="colorTextSecondary" format="color" /> <attr name="colorDivider" format="color" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b6e4470b9..139ae476d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,17 +4,21 @@ <string name="connection_service_title">Connection Service</string> <string name="connection_service_description">Keeps a connection to your core to allow for notifications, and to transmit messages.</string> + <string name="label_about">About</string> <string name="label_buffer_name">Buffer Name</string> <string name="label_cancel">Cancel</string> <string name="label_close">Close</string> <string name="label_connect">Connect</string> + <string name="label_crashes">Crashes</string> <string name="label_delete">Delete</string> + <string name="label_delete_all">Delete All</string> <string name="label_disconnect">Disconnect</string> <string name="label_filter_messages">Filter Messages</string> <string name="label_hide_perm">Hide Permanently</string> <string name="label_hide_temp">Hide Temporarily</string> <string name="label_input_history">Input History</string> <string name="label_join">Join</string> + <string name="label_license">License</string> <string name="label_no">No</string> <string name="label_open">Open</string> <string name="label_part">Part</string> @@ -23,8 +27,10 @@ <string name="label_save">Save</string> <string name="label_select_multiple">Select</string> <string name="label_settings">Settings</string> + <string name="label_share_crashreport">Share Crashreport</string> <string name="label_show_hidden">Show Hidden</string> <string name="label_unhide">Make Visible</string> + <string name="label_website">Website</string> <string name="label_yes">Yes</string> <string name="notification_channel_background" translatable="false">background</string> @@ -33,4 +39,8 @@ <string name="notification_channel_highlight_title">Highlight</string> <string name="buffer_delete_confirmation">Do you want to delete this buffer permanently?</string> + <string name="app_description_long">Quassel is a distributed, decentralized IRC client, written using C++ and Qt. QuasselDroid is a pure-java client for the Quassel core, allowing you to connect to your Quassel core using your Android (TM) phone.</string> + <string name="label_github">GitHub</string> + <string name="label_libraries">Libraries</string> + <string name="label_contributors">Contributors</string> </resources> diff --git a/app/src/main/res/values/strings_licenses.xml b/app/src/main/res/values/strings_licenses.xml new file mode 100644 index 000000000..d688ab36f --- /dev/null +++ b/app/src/main/res/values/strings_licenses.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:tools="http://schemas.android.com/tools"> + <string name="license_apache_2"><![CDATA[ + <p>Version 2.0, January 2004<br /><br /><a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p> + <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p> + <p><strong>1. Definitions</strong>.</p> + <p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.</p> + <p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p> + <p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p> + <p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p> + <p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p> + <p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p> + <p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p> + <p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p> + <p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p> + <p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.</p> + <p><strong>2. Grant of Copyright License</strong>. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.</p> + <p><strong>3. Grant of Patent License</strong>. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.</p> + <p><strong>4. Redistribution</strong>. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p> + <p>a. You must give any other recipients of the Work or Derivative Works a copy of this License; and</p> + <p>b. You must cause any modified files to carry prominent notices stating that You changed the files; and</p> + <p>c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p> + <p>d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.<br /><br /> You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.</p> + <p><strong>5. Submission of Contributions</strong>. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.</p> + <p><strong>6. Trademarks</strong>. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.</p> + <p><strong>7. Disclaimer of Warranty</strong>. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.</p> + <p><strong>8. Limitation of Liability</strong>. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.</p> + <p><strong>9. Accepting Warranty or Additional Liability</strong>. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.</p> + ]]></string> + <string name="license_materialdialogs" tools:ignore="TypographyOther"><![CDATA[ + <p>Copyright (c) 2014-2016 Aidan Michael Follestad</p> + <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p> + <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p> + <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p> + ]]></string> + <string name="license_threetenbp" tools:ignore="TypographyOther"><![CDATA[ + <p>Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos</p> + <p>All rights reserved.</p> + <p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p> + <ol> + <li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li> + <li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li> + <li>Neither the name of JSR-310 nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission..</li> + </ol> + <p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p> + ]]></string> + +</resources> diff --git a/app/src/main/res/values/styles_widgets.xml b/app/src/main/res/values/styles_widgets.xml index e9c9428f5..6fbeebcf0 100644 --- a/app/src/main/res/values/styles_widgets.xml +++ b/app/src/main/res/values/styles_widgets.xml @@ -4,9 +4,12 @@ <style name="Widget.Button" parent="Widget.AppCompat.Button"> <item name="backgroundTint">?attr/colorBackgroundCard</item> + <item name="android:textColor">?attr/colorTextPrimary</item> </style> - <style name="Widget.Button.Colored" parent="Widget.AppCompat.Button.Colored" /> + <style name="Widget.Button.Colored" parent="Widget.AppCompat.Button.Colored"> + <item name="android:textColor">?attr/colorTextPrimaryInverse</item> + </style> <style name="Widget.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> <item name="drawerArrowStyle">@style/Widget.DrawerArrowToggle</item> diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml index 5f41e0ace..a05ed7a54 100644 --- a/app/src/main/res/values/themes_base.xml +++ b/app/src/main/res/values/themes_base.xml @@ -51,6 +51,7 @@ <item name="windowActionModeOverlay">true</item> <item name="colorTextPrimary">#dedede</item> + <item name="colorTextPrimaryInverse">?colorBackground</item> <item name="colorTextSecondary">#8a8a8a</item> <item name="colorDivider">#1FFFFFFF</item> <item name="android:textColorHint">?colorTextSecondary</item> @@ -183,6 +184,7 @@ <item name="windowActionModeOverlay">true</item> <item name="colorTextPrimary">#212121</item> + <item name="colorTextPrimaryInverse">?colorBackground</item> <item name="colorTextSecondary">#757575</item> <item name="colorDivider">#1F000000</item> <item name="android:textColorHint">?colorTextSecondary</item> diff --git a/app/src/main/res/values/themes_gruvbox.xml b/app/src/main/res/values/themes_gruvbox.xml index f42712844..d9fc8ffb3 100644 --- a/app/src/main/res/values/themes_gruvbox.xml +++ b/app/src/main/res/values/themes_gruvbox.xml @@ -33,6 +33,7 @@ <item name="colorForegroundError">#9d0006</item> <item name="colorTextPrimary">#3c3836</item> + <item name="colorTextPrimaryInverse">#fbf1c7</item> <item name="colorTextSecondary">#665c54</item> <item name="colorDivider">#2d928374</item> @@ -87,6 +88,7 @@ <item name="colorForegroundError">#cc241d</item> <item name="colorTextPrimary">#dbdbb2</item> + <item name="colorTextPrimaryInverse">#282828</item> <item name="colorTextSecondary">#bdae93</item> <item name="colorDivider">#33928374</item> diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml index 69aed4a23..2a1000590 100644 --- a/app/src/main/res/values/themes_solarized.xml +++ b/app/src/main/res/values/themes_solarized.xml @@ -33,6 +33,7 @@ <item name="colorForegroundError">#B00000</item> <item name="colorTextPrimary">#586e75</item> + <item name="colorTextPrimaryInverse">#FDF6E3</item> <item name="colorTextSecondary">#657b83</item> <item name="colorDivider">#19586e75</item> @@ -87,6 +88,7 @@ <item name="colorForegroundError">#B00000</item> <item name="colorTextPrimary">#93a1a1</item> + <item name="colorTextPrimaryInverse">#002B36</item> <item name="colorTextSecondary">#839496</item> <item name="colorDivider">#1993a1a1</item> diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 53138ef03..6216e7698 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { } implementation("org.threeten", "threetenbp", "1.3.6") - implementation("io.reactivex.rxjava2:rxjava:2.1.9") + implementation("io.reactivex.rxjava2", "rxjava", "2.1.9") implementation(project(":invokerannotations")) kapt(project(":invokergenerator")) diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts index 8613c62d8..9674a5c20 100644 --- a/persistence/build.gradle.kts +++ b/persistence/build.gradle.kts @@ -45,7 +45,7 @@ dependencies { // Utility implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb") - implementation("org.jetbrains", "annotations", "15.0") + implementation("org.jetbrains", "annotations", "16.0.1") // Quassel implementation(project(":lib")) { diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts index 1b1afedb6..28548b70a 100644 --- a/viewmodel/build.gradle.kts +++ b/viewmodel/build.gradle.kts @@ -34,7 +34,7 @@ dependencies { // Utility implementation("io.reactivex.rxjava2", "rxjava", "2.1.9") implementation("org.threeten", "threetenbp", "1.3.6", classifier = "no-tzdb") - implementation("org.jetbrains", "annotations", "15.0") + implementation("org.jetbrains", "annotations", "16.0.1") // Quassel implementation(project(":lib")) { -- GitLab