From 049cb6d6a63bf3fd32a2cbab925213aefe426cc3 Mon Sep 17 00:00:00 2001 From: Maxim Leshchenko Date: Sat, 21 Aug 2021 13:11:55 +0000 Subject: [PATCH] Add a desktop-like about app page Show version, authors and useful links --- AndroidManifest.xml | 25 +++ res/drawable/ic_baseline_info_24.xml | 10 + res/drawable/ic_baseline_send_24.xml | 11 + res/drawable/ic_baseline_web_24.xml | 10 + res/drawable/ic_kde_24dp.xml | 4 + res/drawable/ic_kde_48dp.xml | 9 + res/drawable/konqi.png | Bin 0 -> 82515 bytes res/layout/about_person_list_item_entry.xml | 71 +++++++ res/layout/activity_about_kde.xml | 137 +++++++++++++ res/layout/activity_easter_egg.xml | 24 +++ res/layout/activity_licenses.xml | 16 ++ res/layout/fragment_about.xml | 191 ++++++++++++++++++ res/menu/menu_licenses.xml | 18 ++ res/values/attrs.xml | 8 + res/values/strings.xml | 63 ++++++ res/values/styles.xml | 16 ++ .../UserInterface/About/AboutData.kt | 53 +++++ .../UserInterface/About/AboutFragment.kt | 119 +++++++++++ .../UserInterface/About/AboutKDEActivity.kt | 48 +++++ .../UserInterface/About/AboutPerson.kt | 35 ++++ .../About/AboutPersonEntryItem.kt | 48 +++++ .../About/AdapterLinearLayout.kt | 52 +++++ .../About/ApplicationAboutData.kt | 42 ++++ .../UserInterface/About/AutoGridLayout.kt | 55 +++++ .../UserInterface/About/EasterEggActivity.kt | 175 ++++++++++++++++ .../UserInterface/About/LicensesActivity.kt | 67 ++++++ .../UserInterface/About/StringListAdapter.kt | 28 +++ .../UserInterface/List/ListAdapter.java | 11 + .../UserInterface/MainActivity.java | 16 +- .../UserInterface/SettingsFragment.java | 62 ------ 30 files changed, 1361 insertions(+), 63 deletions(-) create mode 100644 res/drawable/ic_baseline_info_24.xml create mode 100644 res/drawable/ic_baseline_send_24.xml create mode 100644 res/drawable/ic_baseline_web_24.xml create mode 100644 res/drawable/ic_kde_24dp.xml create mode 100644 res/drawable/ic_kde_48dp.xml create mode 100644 res/drawable/konqi.png create mode 100644 res/layout/about_person_list_item_entry.xml create mode 100644 res/layout/activity_about_kde.xml create mode 100644 res/layout/activity_easter_egg.xml create mode 100644 res/layout/activity_licenses.xml create mode 100644 res/layout/fragment_about.xml create mode 100644 res/menu/menu_licenses.xml create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AboutData.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AboutFragment.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AboutKDEActivity.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AboutPerson.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AboutPersonEntryItem.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AdapterLinearLayout.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/ApplicationAboutData.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/AutoGridLayout.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/EasterEggActivity.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/LicensesActivity.kt create mode 100644 src/org/kde/kdeconnect/UserInterface/About/StringListAdapter.kt diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a5b3ddbc..3248108c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -365,7 +365,32 @@ android:value="org.kde.kdeconnect.UserInterface.MainActivity" /> + + + + + + + + + + diff --git a/res/drawable/ic_baseline_info_24.xml b/res/drawable/ic_baseline_info_24.xml new file mode 100644 index 00000000..17255b7a --- /dev/null +++ b/res/drawable/ic_baseline_info_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/res/drawable/ic_baseline_send_24.xml b/res/drawable/ic_baseline_send_24.xml new file mode 100644 index 00000000..f0d63e17 --- /dev/null +++ b/res/drawable/ic_baseline_send_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/res/drawable/ic_baseline_web_24.xml b/res/drawable/ic_baseline_web_24.xml new file mode 100644 index 00000000..48696cd5 --- /dev/null +++ b/res/drawable/ic_baseline_web_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/res/drawable/ic_kde_24dp.xml b/res/drawable/ic_kde_24dp.xml new file mode 100644 index 00000000..674b8c34 --- /dev/null +++ b/res/drawable/ic_kde_24dp.xml @@ -0,0 +1,4 @@ + + + diff --git a/res/drawable/ic_kde_48dp.xml b/res/drawable/ic_kde_48dp.xml new file mode 100644 index 00000000..b1b16f8f --- /dev/null +++ b/res/drawable/ic_kde_48dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/konqi.png b/res/drawable/konqi.png new file mode 100644 index 0000000000000000000000000000000000000000..68216c8c7e8d68cce7a5075f4f984579352b2f84 GIT binary patch literal 82515 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%0D{8z{T%9LvXu@JN(aS^FXYq3DKbEj! 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 R4!~CkX>kRyDiOn={{i>qT}}W1 literal 0 HcmV?d00001 diff --git a/res/layout/about_person_list_item_entry.xml b/res/layout/about_person_list_item_entry.xml new file mode 100644 index 00000000..54fd627b --- /dev/null +++ b/res/layout/about_person_list_item_entry.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + diff --git a/res/layout/activity_about_kde.xml b/res/layout/activity_about_kde.xml new file mode 100644 index 00000000..5995d5fa --- /dev/null +++ b/res/layout/activity_about_kde.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/activity_easter_egg.xml b/res/layout/activity_easter_egg.xml new file mode 100644 index 00000000..60b7f7d2 --- /dev/null +++ b/res/layout/activity_easter_egg.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout/activity_licenses.xml b/res/layout/activity_licenses.xml new file mode 100644 index 00000000..f14d58f6 --- /dev/null +++ b/res/layout/activity_licenses.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout/fragment_about.xml b/res/layout/fragment_about.xml new file mode 100644 index 00000000..dc2dec85 --- /dev/null +++ b/res/layout/fragment_about.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/menu/menu_licenses.xml b/res/menu/menu_licenses.xml new file mode 100644 index 00000000..4f32b6f0 --- /dev/null +++ b/res/menu/menu_licenses.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index bfd6fb90..37919e90 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -1,4 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 24cdb865..fac1dbb3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -454,5 +454,68 @@ Source Code https://invent.kde.org/network/kdeconnect-android/ Licenses + Website + https://kdeconnect.kde.org/ + + (С) 2013-2021 The KDE Connect Developers + + About + Authors + Thanks To + Easter Egg + Email contributor\n%s + Visit contributor\'s homepage\n%s + Version %s + About KDE + KDE - Be Free! + KDE + Konqi + Rise Up + Rise Down + + Multi-platform app that allows your devices to communicate (e.g., your phone and your computer) + + About + +

KDE is a cooperative enterprise: no single entity controls its direction or products. Instead, we work together to achieve the common goal of building the world\'s finest Free Software. Everyone is welcome to join and contribute to KDE, including you.

+ Visit https://www.kde.org/ for more information about the KDE community and the software we produce. + ]]> + + Report Bugs or Wishes +

Software can always be improved, and the KDE team is ready to do so. However, you - the user - must tell us when something does not work as expected or could be done better.

+

KDE has a bug tracking system. Visit https://bugs.kde.org/ or use the \"Report Bug\" button from the about screen to report bugs.

+ If you have a suggestion for improvement then you are welcome to use the bug tracking system to register your wish. Make sure you use the severity called \"Wishlist\". + ]]>
+ + Join KDE +

You do not have to be a software developer to be a member of the KDE team. You can join the national teams that translate program interfaces. You can provide graphics, themes, sounds, and improved documentation. You decide!

+

Visit https://community.kde.org/Get_Involved for information on some projects in which you can participate.

+ If you need more information or documentation, then a visit to https://techbase.kde.org/ will provide you with what you need. + ]]>
+ + Support KDE +

KDE software is and will always be available free of charge, however creating it is not free.

+

To support development the KDE community has formed the KDE e.V., a non-profit organization legally founded in Germany. KDE e.V. represents the KDE community in legal and financial matters. See https://ev.kde.org/ for information on KDE e.V.

+

KDE benefits from many kinds of contributions, including financial. We use the funds to reimburse members and others for expenses they incur when contributing. Further funds are used for legal support and organizing conferences and meetings.

+

We would like to encourage you to support our efforts with a financial donation, using one of the ways described at https://www.kde.org/community/donations/.

+ Thank you very much in advance for your support. + ]]>
+ + + Maintainer and developer + Developer + macOS support. Working on iOS support + Bug fixes and general improvements + SFTP implementation, bug fixes and general improvements + SMS plugin improvements + Contacts plugin improvements + UI improvements and this about page + Remote keyboard plugin and bug fixes + Support for using the keyboard in the remote input plugin, bug fixes and general improvements + Everyone else who has contributed to KDE Connect over the years diff --git a/res/values/styles.xml b/res/values/styles.xml index a9fb8470..3ac5f9fc 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -63,4 +63,20 @@ true false + + + diff --git a/src/org/kde/kdeconnect/UserInterface/About/AboutData.kt b/src/org/kde/kdeconnect/UserInterface/About/AboutData.kt new file mode 100644 index 00000000..fd9595a8 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AboutData.kt @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.content.Context +import android.os.Parcel +import android.os.Parcelable + +class AboutData(var name: String, var description: Int, var icon: Int, var versionName: String, var copyrightStatement: String? = null, + var bugURL: String? = null, var websiteURL: String? = null, var sourceCodeURL: String? = null, var donateURL: String? = null, + var authorsFooterText: Int? = null) : Parcelable { + val authors: MutableList = mutableListOf() + + constructor(parcel: Parcel) : this(parcel.readString()!!, parcel.readInt(), parcel.readInt(), parcel.readString()!!, parcel.readString(), + parcel.readString(), parcel.readString(), parcel.readString(), parcel.readString(), + if (parcel.readByte() == 0x01.toByte()) parcel.readInt() else null) { + parcel.readList(authors as List<*>, AboutPerson::class.java.classLoader) + } + + fun getDescriptionString(context: Context): String = context.resources.getString(description) + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): AboutData = AboutData(parcel) + override fun newArray(size: Int): Array = arrayOfNulls(size) + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(name) + parcel.writeInt(description) + parcel.writeInt(icon) + parcel.writeString(versionName) + parcel.writeString(copyrightStatement) + parcel.writeList(authors.toList()) + + parcel.writeString(bugURL) + parcel.writeString(websiteURL) + parcel.writeString(sourceCodeURL) + parcel.writeString(donateURL) + + if (authorsFooterText == null) { + parcel.writeByte(0x00) + } else { + parcel.writeByte(0x01) + parcel.writeInt(authorsFooterText!!) + } + } + + override fun describeContents(): Int = 0 +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/AboutFragment.kt b/src/org/kde/kdeconnect/UserInterface/About/AboutFragment.kt new file mode 100644 index 00000000..9331db92 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AboutFragment.kt @@ -0,0 +1,119 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import org.kde.kdeconnect.UserInterface.List.ListAdapter +import org.kde.kdeconnect.UserInterface.MainActivity +import org.kde.kdeconnect_tp.R +import org.kde.kdeconnect_tp.databinding.FragmentAboutBinding + +class AboutFragment : Fragment() { + private var binding: FragmentAboutBinding? = null + private lateinit var aboutData: AboutData + private var tapCount = 0 + private var firstTapMillis: Long? = null + + companion object { + @JvmStatic + fun newInstance(aboutData: AboutData): Fragment { + val fragment = AboutFragment() + + val args = Bundle(1) + args.putParcelable("ABOUT_DATA", aboutData) + fragment.arguments = args + + return fragment + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + if (activity != null) { + (requireActivity() as MainActivity).supportActionBar?.setTitle(R.string.about) + } + + aboutData = requireArguments().getParcelable("ABOUT_DATA")!! + binding = FragmentAboutBinding.inflate(inflater, container, false) + + updateData() + return binding!!.root + } + + @SuppressLint("SetTextI18n") + fun updateData() { + // Update general info + + binding!!.appName.text = aboutData.name + binding!!.appDescription.text = this.context?.let { aboutData.getDescriptionString(it) } + if (aboutData.copyrightStatement == null) "" else "\n\n" + aboutData.copyrightStatement + binding!!.appIcon.setImageDrawable(this.context?.let { ContextCompat.getDrawable(it, aboutData.icon) }) + binding!!.appVersion.text = this.context?.getString(R.string.version, aboutData.versionName) + + // Setup Easter Egg onClickListener + + binding!!.generalInfoCard.setOnClickListener { + if (firstTapMillis == null) { + firstTapMillis = System.currentTimeMillis() + } + + if (++tapCount == 3) { + tapCount = 0 + + if (firstTapMillis!! >= (System.currentTimeMillis() - 500)) { + startActivity(Intent(context, EasterEggActivity::class.java)) + } + + firstTapMillis = null + } + } + + // Update button onClickListeners + + setupInfoButton(aboutData.bugURL, binding!!.reportBugButton) + setupInfoButton(aboutData.donateURL, binding!!.donateButton) + setupInfoButton(aboutData.sourceCodeURL, binding!!.sourceCodeButton) + + binding!!.licensesButton.setOnClickListener { + startActivity(Intent(context, LicensesActivity::class.java)) + } + + binding!!.aboutKdeButton.setOnClickListener { + startActivity(Intent(context, AboutKDEActivity::class.java)) + } + + setupInfoButton(aboutData.websiteURL, binding!!.websiteButton) + + // Update authors + binding!!.authorsList.adapter = ListAdapter(this.context, aboutData.authors.map { AboutPersonEntryItem(it) }, false) + if (aboutData.authorsFooterText != null) { + binding!!.authorsFooterText.text = context?.getString(aboutData.authorsFooterText!!) + } + } + + private fun setupInfoButton(url: String?, button: FrameLayout) { + if (url == null) { + button.visibility = View.GONE + } else { + button.setOnClickListener { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/AboutKDEActivity.kt b/src/org/kde/kdeconnect/UserInterface/About/AboutKDEActivity.kt new file mode 100644 index 00000000..0c29284a --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AboutKDEActivity.kt @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.os.Bundle +import android.text.Html +import android.text.Spanned +import android.text.method.LinkMovementMethod +import androidx.appcompat.app.AppCompatActivity +import org.kde.kdeconnect.UserInterface.ThemeUtil +import org.kde.kdeconnect_tp.R +import org.kde.kdeconnect_tp.databinding.ActivityAboutKdeBinding + +class AboutKDEActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + ThemeUtil.setUserPreferredTheme(this) + super.onCreate(savedInstanceState) + + val binding = ActivityAboutKdeBinding.inflate(layoutInflater) + setContentView(binding.root) + + setSupportActionBar(binding.toolbarLayout.toolbar) + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + supportActionBar!!.setDisplayShowHomeEnabled(true) + + binding.aboutTextView.text = fromHtml(resources.getString(R.string.about_kde_about)) + binding.reportBugsOrWishesTextView.text = fromHtml(resources.getString(R.string.about_kde_report_bugs_or_wishes)) + binding.joinKdeTextView.text = fromHtml(resources.getString(R.string.about_kde_join_kde)) + binding.supportKdeTextView.text = fromHtml(resources.getString(R.string.about_kde_support_kde)) + + binding.aboutTextView.movementMethod = LinkMovementMethod.getInstance() + binding.reportBugsOrWishesTextView.movementMethod = LinkMovementMethod.getInstance() + binding.joinKdeTextView.movementMethod = LinkMovementMethod.getInstance() + binding.supportKdeTextView.movementMethod = LinkMovementMethod.getInstance() + } + + private fun fromHtml(html: String): Spanned { + return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY) + } else { + @Suppress("DEPRECATION") Html.fromHtml(html) + } + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/AboutPerson.kt b/src/org/kde/kdeconnect/UserInterface/About/AboutPerson.kt new file mode 100644 index 00000000..c64aa6a1 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AboutPerson.kt @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.os.Parcel +import android.os.Parcelable + +class AboutPerson @JvmOverloads constructor(val name: String, val task: Int? = null, val emailAddress: String? = null, val webAddress: String? = null) : Parcelable { + constructor(parcel: Parcel) : this(parcel.readString().toString(), if (parcel.readByte() == 0x01.toByte()) parcel.readInt() else null, parcel.readString(), parcel.readString()) + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(name) + + if (task != null) { + parcel.writeByte(0x01) + parcel.writeInt(task) + } else { + parcel.writeByte(0x00) + } + + parcel.writeString(emailAddress) + parcel.writeString(webAddress) + } + + override fun describeContents(): Int = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): AboutPerson = AboutPerson(parcel) + override fun newArray(size: Int): Array = arrayOfNulls(size) + } +} diff --git a/src/org/kde/kdeconnect/UserInterface/About/AboutPersonEntryItem.kt b/src/org/kde/kdeconnect/UserInterface/About/AboutPersonEntryItem.kt new file mode 100644 index 00000000..d7489def --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AboutPersonEntryItem.kt @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2014 Albert Vaca Cintora + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.content.Intent +import android.net.Uri +import android.view.LayoutInflater +import android.view.View +import androidx.appcompat.widget.TooltipCompat +import org.kde.kdeconnect.UserInterface.List.ListAdapter +import org.kde.kdeconnect_tp.R +import org.kde.kdeconnect_tp.databinding.AboutPersonListItemEntryBinding + +class AboutPersonEntryItem(val person: AboutPerson) : ListAdapter.Item { + override fun inflateView(layoutInflater: LayoutInflater): View { + val binding = AboutPersonListItemEntryBinding.inflate(layoutInflater) + + binding.aboutPersonListItemEntryName.text = person.name + + if (person.task != null) { + binding.aboutPersonListItemEntryTask.visibility = View.VISIBLE + binding.aboutPersonListItemEntryTask.text = layoutInflater.context.getString(person.task) + } + + if (person.emailAddress != null) { + binding.aboutPersonListItemEntryEmailButton.visibility = View.VISIBLE + TooltipCompat.setTooltipText(binding.aboutPersonListItemEntryEmailButton, layoutInflater.context.getString(R.string.email_contributor, person.emailAddress)) + binding.aboutPersonListItemEntryEmailButton.setOnClickListener { + layoutInflater.context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("mailto:" + person.emailAddress))) + } + } + + if (person.webAddress != null) { + binding.aboutPersonListItemEntryVisitHomepageButton.visibility = View.VISIBLE + TooltipCompat.setTooltipText(binding.aboutPersonListItemEntryVisitHomepageButton, layoutInflater.context.resources.getString(R.string.visit_contributors_homepage, person.webAddress)) + binding.aboutPersonListItemEntryVisitHomepageButton.setOnClickListener { + layoutInflater.context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(person.webAddress))) + } + } + + return binding.root + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/AdapterLinearLayout.kt b/src/org/kde/kdeconnect/UserInterface/About/AdapterLinearLayout.kt new file mode 100644 index 00000000..57c6da5f --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AdapterLinearLayout.kt @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.content.Context +import android.database.DataSetObserver +import android.util.AttributeSet +import android.widget.Adapter +import android.widget.LinearLayout + +class AdapterLinearLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : LinearLayout(context, attrs, defStyle) { + var adapter: Adapter? = null + set(adapter) { + if (field !== adapter) { + field = adapter + field?.registerDataSetObserver(dataSetObserver) + reloadChildViews() + } + } + + private val dataSetObserver: DataSetObserver = object : DataSetObserver() { + override fun onChanged() { + super.onChanged() + reloadChildViews() + } + } + + init { + orientation = VERTICAL + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + adapter?.unregisterDataSetObserver(dataSetObserver) + } + + private fun reloadChildViews() { + removeAllViews() + + if (adapter != null) { + for (position in 0 until adapter!!.count) { + adapter!!.getView(position, null, this)?.let { addView(it) } + } + + requestLayout() + } + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/ApplicationAboutData.kt b/src/org/kde/kdeconnect/UserInterface/About/ApplicationAboutData.kt new file mode 100644 index 00000000..fc662e72 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/ApplicationAboutData.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.content.Context +import org.kde.kdeconnect_tp.BuildConfig +import org.kde.kdeconnect_tp.R + +/** +* Add authors and credits here + */ +fun getApplicationAboutData(context: Context): AboutData { + val aboutData = AboutData(context.getString(R.string.kde_connect), R.string.app_description, R.drawable.icon, BuildConfig.VERSION_NAME, context.getString(R.string.copyright_statement), + context.getString(R.string.report_bug_url), context.getString(R.string.website_url), context.getString(R.string.source_code_url), context.getString(R.string.donate_url), + R.string.everyone_else) + + aboutData.authors += AboutPerson("Albert Vaca Cintora", R.string.maintainer_and_developer, "albertvaka+kde@gmail.com") + aboutData.authors += AboutPerson("Aleix Pol", R.string.developer, "aleixpol@kde.org") + aboutData.authors += AboutPerson("Inoki Shaw", R.string.apple_support, "veyx.shaw@gmail.com") + aboutData.authors += AboutPerson("Matthijs Tijink", R.string.developer, "matthijstijink@gmail.com") + aboutData.authors += AboutPerson("Nicolas Fella", R.string.developer, "nicolas.fella@gmx.de") + aboutData.authors += AboutPerson("Philip Cohn-Cort", R.string.developer, "cliabhach@gmail.com") + aboutData.authors += AboutPerson("Piyush Aggarwal", R.string.developer, "piyushaggarwal002@gmail.com") + aboutData.authors += AboutPerson("Simon Redman", R.string.developer, "simon@ergotech.com") + aboutData.authors += AboutPerson("Erik Duisters", R.string.developer, "e.duisters1@gmail.com") + aboutData.authors += AboutPerson("Isira Seneviratne", R.string.developer, "isirasen96@gmail.com") + aboutData.authors += AboutPerson("Vineet Garg", R.string.developer, "grg.vineet@gmail.com") + aboutData.authors += AboutPerson("Anjani Kumar", R.string.bug_fixes_and_general_improvements, "anjanik012@gmail.com") + aboutData.authors += AboutPerson("Samoilenko Yuri", R.string.samoilenko_yuri_task, "kinnalru@gmail.com") + aboutData.authors += AboutPerson("Aniket Kumar", R.string.aniket_kumar_task, "anikketkumar786@gmail.com") + aboutData.authors += AboutPerson("Àlex Fiestas", R.string.alex_fiestas_task, "afiestas@kde.org") + aboutData.authors += AboutPerson("Daniel Tang", R.string.bug_fixes_and_general_improvements, "danielzgtg.opensource@gmail.com") + aboutData.authors += AboutPerson("Maxim Leshchenko", R.string.maxim_leshchenko_task, "cnmaks90@gmail.com") + aboutData.authors += AboutPerson("Holger Kaelberer", R.string.holger_kaelberer_task, "holger.k@elberer.de") + aboutData.authors += AboutPerson("Saikrishna Arcot", R.string.saikrishna_arcot_task, "saiarcot895@gmail.com") + + return aboutData +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/AutoGridLayout.kt b/src/org/kde/kdeconnect/UserInterface/About/AutoGridLayout.kt new file mode 100644 index 00000000..2b18167d --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/AutoGridLayout.kt @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.content.Context +import android.util.AttributeSet +import androidx.gridlayout.widget.GridLayout +import org.kde.kdeconnect_tp.R +import kotlin.math.max + +/** +* GridLayout that adjusts the number of columns and rows to fill all screen space + */ +class AutoGridLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : GridLayout(context, attrs, defStyleAttr) { + private var defaultColumnCount = 0 + private var columnWidth = 0 + private var changeColumnCountIfTheyHaveOnlyOneElement = false + + init { + var typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoGridLayout, 0, defStyleAttr) + + try { + columnWidth = typedArray.getDimensionPixelSize(R.styleable.AutoGridLayout_columnWidth, 0) + changeColumnCountIfTheyHaveOnlyOneElement = typedArray.getBoolean(R.styleable.AutoGridLayout_changeColumnCountIfTheyHaveOnlyOneElement, false) + typedArray = context.obtainStyledAttributes(attrs, intArrayOf(android.R.attr.columnCount), 0, defStyleAttr) + defaultColumnCount = typedArray.getInt(0, 10) + } finally { + typedArray.recycle() + } + + columnCount = 1 + } + + override fun onMeasure(widthSpec: Int, heightSpec: Int) { + super.onMeasure(widthSpec, heightSpec) + val width = MeasureSpec.getSize(widthSpec) + + if (columnWidth > 0 && width > 0) { + val totalSpace = width - paddingRight - paddingLeft + var calculatedColumnCount = max(1, totalSpace / columnWidth) + + if (calculatedColumnCount < childCount && changeColumnCountIfTheyHaveOnlyOneElement) { + calculatedColumnCount = defaultColumnCount + } + + columnCount = calculatedColumnCount + } else { + columnCount = defaultColumnCount + } + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/EasterEggActivity.kt b/src/org/kde/kdeconnect/UserInterface/About/EasterEggActivity.kt new file mode 100644 index 00000000..21067d06 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/EasterEggActivity.kt @@ -0,0 +1,175 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.animation.ValueAnimator +import android.content.pm.ActivityInfo +import android.graphics.Color +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import org.kde.kdeconnect_tp.R +import org.kde.kdeconnect_tp.databinding.ActivityEasterEggBinding +import kotlin.math.PI +import kotlin.math.atan2 + +private val KDE_ICON_BACKGROUND_COLOR = Color.rgb(29, 153, 243) +private val KONQI_BACKGROUND_COLOR = Color.rgb(191, 255, 0) + +class EasterEggActivity : AppCompatActivity(), SensorEventListener { + private var binding: ActivityEasterEggBinding? = null + private lateinit var sensorManager: SensorManager + private val animator = ValueAnimator() + private var isAlreadyLongClicked = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityEasterEggBinding.inflate(layoutInflater) + setContentView(binding!!.root) + + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR + + // Make the status bar blue to make the Easter Egg beautiful + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + window.statusBarColor = KDE_ICON_BACKGROUND_COLOR + window.navigationBarColor = KDE_ICON_BACKGROUND_COLOR + setLightSystemWindowsEnabled(false) + } + + sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager + if (hasAccelerometer()) { + animator.addUpdateListener { + binding!!.logo.rotation = animator.animatedValue as Float + } + animator.duration = 300 + } else { + binding!!.angle.visibility = View.GONE + } + + // Make Easter Egg more fun + binding!!.easterEggLayout.setOnLongClickListener { + if (!isAlreadyLongClicked) { + isAlreadyLongClicked = true + + binding!!.easterEggLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.activity_background)) + binding!!.logo.setColorFilter(ContextCompat.getColor(this, R.color.text_color)) + binding!!.angle.setTextColor(ContextCompat.getColor(this, R.color.text_color)) + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + var typedArray = this.theme.obtainStyledAttributes(intArrayOf(android.R.attr.statusBarColor)) + window.statusBarColor = typedArray.getColor(0, Color.WHITE) + window.navigationBarColor = typedArray.getColor(0, Color.WHITE) + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { + typedArray = this.theme.obtainStyledAttributes(intArrayOf(android.R.attr.windowLightStatusBar)) + setLightSystemWindowsEnabled(typedArray.getBoolean(0, true)) + } + + typedArray.recycle() + } + } + + val icon = intArrayOf( + R.drawable.ic_action_keyboard_24dp, R.drawable.ic_action_refresh_24dp, + R.drawable.ic_action_image_edit_24dp, R.drawable.ic_arrow_upward_black_24dp, + R.drawable.ic_baseline_attach_money_24, R.drawable.ic_baseline_bug_report_24, + R.drawable.ic_baseline_code_24, R.drawable.ic_baseline_gavel_24, + R.drawable.ic_baseline_info_24, R.drawable.ic_baseline_web_24, + R.drawable.ic_baseline_send_24, R.drawable.ic_baseline_sms_24, + R.drawable.ic_accept_pairing_24dp, R.drawable.ic_share_white, + R.drawable.ic_camera, R.drawable.ic_delete, + R.drawable.ic_device_laptop_32dp, R.drawable.ic_device_phone_32dp, + R.drawable.ic_device_tablet_32dp, R.drawable.ic_device_tv_32dp, + R.drawable.ic_delete, R.drawable.ic_warning, + R.drawable.ic_volume_black, R.drawable.ic_wifi, + R.drawable.ic_add, R.drawable.touchpad_plugin_action_24dp, + R.drawable.konqi, R.drawable.run_command_plugin_icon_24dp, + R.drawable.ic_phonelink_36dp, R.drawable.ic_phonelink_off_36dp, + R.drawable.ic_error_outline_48dp, R.drawable.ic_home_black_24dp, + R.drawable.ic_settings_white_32dp, R.drawable.ic_stop, + R.drawable.ic_rewind_black, R.drawable.ic_play_black, + R.drawable.ic_mic_black, R.drawable.ic_pause_black, + R.drawable.ic_volume_mute_black, R.drawable.ic_arrow_upward_black_24dp, + R.drawable.ic_next_black, R.drawable.ic_previous_black, + R.drawable.ic_presenter_24dp, R.drawable.ic_key, + R.drawable.ic_keyboard_return_black_24dp, R.drawable.ic_keyboard_hide_36dp, + R.drawable.ic_kde_24dp, R.drawable.ic_album_art_placeholder, + R.drawable.ic_arrow_back_black_24dp, R.drawable.share_plugin_action_24dp + ).random() + + if (icon == R.drawable.konqi) { + binding!!.logo.clearColorFilter() + binding!!.easterEggLayout.setBackgroundColor(KONQI_BACKGROUND_COLOR) + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + window.statusBarColor = KONQI_BACKGROUND_COLOR + window.navigationBarColor = KONQI_BACKGROUND_COLOR + } + + isAlreadyLongClicked = false + } + + binding!!.logo.setImageResource(icon) + + true + } + } + + private fun hasAccelerometer(): Boolean = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null + + private fun setLightSystemWindowsEnabled(enabled: Boolean) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { + if (enabled) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } else { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() + } + } + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + if (enabled) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + } else { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() + } + } + } + + override fun onResume() { + super.onResume() + if (hasAccelerometer()) { + sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI) + } + } + + override fun onPause() { + if (hasAccelerometer()) { + sensorManager.unregisterListener(this) + } + super.onPause() + } + + override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { } + override fun onSensorChanged(event: SensorEvent) { + if (binding != null) { + val axisX = event.values[0] + val axisY = event.values[1] + + val angle = (atan2(axisX, axisY) / (PI / 180)).toInt() + binding!!.angle.text = angle.toString() + "°" + + animator.setFloatValues(binding!!.logo.rotation, angle.toFloat()) + animator.start() + } + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/LicensesActivity.kt b/src/org/kde/kdeconnect/UserInterface/About/LicensesActivity.kt new file mode 100644 index 00000000..418fc684 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/LicensesActivity.kt @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.os.Bundle +import android.util.DisplayMetrics +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSmoothScroller +import org.apache.commons.io.IOUtils +import org.kde.kdeconnect.UserInterface.ThemeUtil +import org.kde.kdeconnect_tp.R +import org.kde.kdeconnect_tp.databinding.ActivityLicensesBinding +import java.nio.charset.Charset + +class LicensesActivity : AppCompatActivity() { + private lateinit var binding: ActivityLicensesBinding + + override fun onCreate(savedInstanceState: Bundle?) { + ThemeUtil.setUserPreferredTheme(this) + super.onCreate(savedInstanceState) + + binding = ActivityLicensesBinding.inflate(layoutInflater) + setContentView(binding.root) + + setSupportActionBar(binding.toolbarLayout.toolbar) + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + supportActionBar!!.setDisplayShowHomeEnabled(true) + + binding.licensesText.layoutManager = LinearLayoutManager(this) + binding.licensesText.adapter = StringListAdapter(getLicenses().split("\n\n")) + } + + private fun getLicenses(): String = resources.openRawResource(R.raw.license).use { inputStream -> IOUtils.toString(inputStream, Charset.defaultCharset()) } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_licenses, menu) + return super.onCreateOptionsMenu(menu) + } + + private fun smoothScrollToPosition(position: Int) { + val linearSmoothScroller: LinearSmoothScroller = object : LinearSmoothScroller(this) { + override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float = 2.5F / displayMetrics.densityDpi + } + + linearSmoothScroller.targetPosition = position + binding.licensesText.layoutManager?.startSmoothScroll(linearSmoothScroller) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + R.id.menu_rise_up -> { + smoothScrollToPosition(0) + true + } + R.id.menu_rise_down -> { + smoothScrollToPosition(binding.licensesText.adapter!!.itemCount - 1) + true + } + else -> super.onOptionsItemSelected(item) + } +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/About/StringListAdapter.kt b/src/org/kde/kdeconnect/UserInterface/About/StringListAdapter.kt new file mode 100644 index 00000000..74b3ac56 --- /dev/null +++ b/src/org/kde/kdeconnect/UserInterface/About/StringListAdapter.kt @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2021 Maxim Leshchenko + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +package org.kde.kdeconnect.UserInterface.About + +import android.widget.TextView +import android.view.View +import android.view.ViewGroup +import androidx.core.view.setPadding +import androidx.recyclerview.widget.RecyclerView + +class StringListAdapter(private val stringList: List) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val textView = TextView(parent.context) + textView.setPadding(8) + return ViewHolder(textView) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + (holder.itemView as TextView).text = stringList[position] + } + + override fun getItemCount(): Int = stringList.size + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) +} \ No newline at end of file diff --git a/src/org/kde/kdeconnect/UserInterface/List/ListAdapter.java b/src/org/kde/kdeconnect/UserInterface/List/ListAdapter.java index e555c95e..4db173b0 100644 --- a/src/org/kde/kdeconnect/UserInterface/List/ListAdapter.java +++ b/src/org/kde/kdeconnect/UserInterface/List/ListAdapter.java @@ -23,10 +23,16 @@ public class ListAdapter extends ArrayAdapter { } private final List items; + private final boolean isEnabled; public ListAdapter(Context context, List items) { + this(context, items, true); + } + + public ListAdapter(Context context, List items, boolean isEnabled) { super(context, 0, (List) items); this.items = items; + this.isEnabled = isEnabled; } @NonNull @@ -35,4 +41,9 @@ public class ListAdapter extends ArrayAdapter { final Item i = items.get(position); return i.inflateView(LayoutInflater.from(parent.getContext())); } + + @Override + public boolean isEnabled(int position) { + return isEnabled; + } } diff --git a/src/org/kde/kdeconnect/UserInterface/MainActivity.java b/src/org/kde/kdeconnect/UserInterface/MainActivity.java index 7ff063cd..374386af 100644 --- a/src/org/kde/kdeconnect/UserInterface/MainActivity.java +++ b/src/org/kde/kdeconnect/UserInterface/MainActivity.java @@ -22,7 +22,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; @@ -35,16 +34,20 @@ import org.kde.kdeconnect.BackgroundService; import org.kde.kdeconnect.Device; import org.kde.kdeconnect.Helpers.DeviceHelper; import org.kde.kdeconnect.Plugins.SharePlugin.ShareSettingsFragment; +import org.kde.kdeconnect.UserInterface.About.AboutFragment; +import org.kde.kdeconnect.UserInterface.About.ApplicationAboutDataKt; import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.databinding.ActivityMainBinding; import java.util.Collection; import java.util.HashMap; +import java.util.Objects; public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private static final int MENU_ENTRY_ADD_DEVICE = 1; //0 means no-selection private static final int MENU_ENTRY_SETTINGS = 2; + private static final int MENU_ENTRY_ABOUT = 3; private static final int MENU_ENTRY_DEVICE_FIRST_ID = 1000; //All subsequent ids are devices in the menu private static final int MENU_ENTRY_DEVICE_UNKNOWN = 9999; //It's still a device, but we don't know which one yet private static final int STORAGE_lOCATION_CONFIGURED = 2020; @@ -129,6 +132,11 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences preferences.edit().putString(STATE_SELECTED_DEVICE, null).apply(); setContentFragment(new SettingsFragment()); break; + case MENU_ENTRY_ABOUT: + mCurrentDevice = null; + preferences.edit().putString(STATE_SELECTED_DEVICE, null).apply(); + setContentFragment(AboutFragment.newInstance(Objects.requireNonNull(ApplicationAboutDataKt.getApplicationAboutData(this)))); + break; default: String deviceId = mMapMenuToDeviceId.get(menuItem); onDeviceSelected(deviceId); @@ -187,6 +195,8 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences } else { if (mCurrentMenuEntry == MENU_ENTRY_SETTINGS) { setContentFragment(new SettingsFragment()); + } else if (mCurrentMenuEntry == MENU_ENTRY_ABOUT) { + setContentFragment(AboutFragment.newInstance(Objects.requireNonNull(ApplicationAboutDataKt.getApplicationAboutData(this)))); } else { setContentFragment(new PairingFragment()); } @@ -282,6 +292,10 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences settingsItem.setIcon(R.drawable.ic_settings_white_32dp); settingsItem.setCheckable(true); + MenuItem aboutItem = menu.add(Menu.FIRST, MENU_ENTRY_ABOUT, 1000, R.string.about); + aboutItem.setIcon(R.drawable.ic_baseline_info_24); + aboutItem.setCheckable(true); + //Ids might have changed if (mCurrentMenuEntry >= MENU_ENTRY_DEVICE_FIRST_ID) { mCurrentMenuEntry = deviceIdToMenuEntryId(mCurrentDevice); diff --git a/src/org/kde/kdeconnect/UserInterface/SettingsFragment.java b/src/org/kde/kdeconnect/UserInterface/SettingsFragment.java index 0f7f0adc..ee853919 100644 --- a/src/org/kde/kdeconnect/UserInterface/SettingsFragment.java +++ b/src/org/kde/kdeconnect/UserInterface/SettingsFragment.java @@ -1,6 +1,5 @@ package org.kde.kdeconnect.UserInterface; -import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -32,33 +31,6 @@ import java.nio.charset.Charset; public class SettingsFragment extends PreferenceFragmentCompat { - private static class LicenseTextSingleton { - private static volatile String licenseText; - - // Need these separate methods because Context is required to load the string - // Mixing Context and static here is fine because the license - // is a pure function of the project directory (i.e. doesn't depend on language, etc.) - - static synchronized String getOrLoadLicenseText(Context context) { - String licenseText = LicenseTextSingleton.licenseText; - if (licenseText != null) { - return licenseText; - } - try (InputStream is = context.getResources().openRawResource(R.raw.license)) { - licenseText = IOUtils.toString(is, Charset.defaultCharset()); - } catch (IOException ie) { - throw new RuntimeException(ie); - } - return LicenseTextSingleton.licenseText = licenseText; - } - - static synchronized void startLoadingLicenseText(Context context) { - if (licenseText == null) { - new Thread(() -> getOrLoadLicenseText(context)).start(); - } - } - } - private EditTextPreference renameDevice; @Override @@ -187,40 +159,6 @@ public class SettingsFragment extends PreferenceFragmentCompat { moreSettingsText.setSummary(R.string.settings_more_settings_text); screen.addPreference(moreSettingsText); - Preference bug = new Preference(context); - bug.setTitle(R.string.report_bug); - bug.setPersistent(false); - bug.setIcon(R.drawable.ic_baseline_bug_report_24); - bug.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.report_bug_url)))); - screen.addPreference(bug); - - Preference donate = new Preference(context); - donate.setTitle(R.string.donate); - donate.setPersistent(false); - donate.setIcon(R.drawable.ic_baseline_attach_money_24); - donate.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.donate_url)))); - screen.addPreference(donate); - - Preference source = new Preference(context); - source.setTitle(R.string.source_code); - source.setPersistent(false); - source.setIcon(R.drawable.ic_baseline_code_24); - source.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.source_code_url)))); - screen.addPreference(source); - - Preference licences = new Preference(context); - licences.setTitle(R.string.licenses); - licences.setPersistent(false); - licences.setIcon(R.drawable.ic_baseline_gavel_24); - licences.setOnPreferenceClickListener(preference -> { - new AlertDialog.Builder(context) - .setMessage(LicenseTextSingleton.getOrLoadLicenseText(context)) - .create().show(); - return true; - }); - LicenseTextSingleton.startLoadingLicenseText(context); - screen.addPreference(licences); - setPreferenceScreen(screen);

KDE is a world-wide community of software engineers, artists, writers, translators and creators who are committed to Free Software development. KDE produces the Plasma desktop environment, hundreds of applications, and the many software libraries that support them.