Refactored string resources

This commit is contained in:
Deniz Düzgören
2019-09-22 13:39:20 +02:00
parent 8684e763b1
commit 49eefe8131
18 changed files with 351 additions and 343 deletions
@@ -79,14 +79,12 @@ internal class FirstTime : AppCompatActivity(R.layout.activity_first_time) {
}
helpGradeButton.setOnClickListener {
createDialog(getString(R.string.enterGradeHelpTitle), getString(
R.string.enterGradeHelp
createDialog(getString(R.string.grade_help_dialog_title), getString(
R.string.grade_help_dialog_text
))
}
helpCoursesButton.setOnClickListener {
createDialog(getString(R.string.enterCoursesHelpTitle), getString(
R.string.enterCoursesHelp
))
createDialog(getString(R.string.courses_help_dialog_title), getString(R.string.courses_help_dialog_text))
}
val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
@@ -17,7 +17,6 @@ import android.webkit.WebView
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.constraintlayout.widget.ConstraintLayout
@@ -70,7 +69,6 @@ internal class Login : AppCompatActivity(R.layout.activity_login_webview), Login
webView.webViewClient = LoginWebViewClient(this@Login)
openLoginPage(webView)
handler.postDelayed({
webView.scrollY = -4000
}, 2000)
}
}
@@ -105,7 +105,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
if (!prefs.getBoolean("autoRefresh", false) && prefs.getInt("firstTimeOpening", 0) != 0) {
try {
Snackbar.make(contextView, "${getString(R.string.lastUpdated)} ${prefs.getString("timeNew", "")}", Snackbar.LENGTH_LONG).show()
Snackbar.make(contextView, "${getString(R.string.last_updated)} ${prefs.getString("timeNew", "")}", Snackbar.LENGTH_LONG).show()
} catch (e: IllegalArgumentException) {}
}
@@ -128,7 +128,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
} else {
defaultFragment = GeneralPlanFragment()
bottomNav.selectedItemId = R.id.plan
toolbarTxt.text = getString(R.string.appName)
toolbarTxt.text = getString(R.string.app_name)
}
loadFragment(defaultFragment)
@@ -138,7 +138,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
when (item.itemId) {
R.id.plan -> {
fragment = GeneralPlanFragment()
toolbarTxt.text = getString(R.string.appName)
toolbarTxt.text = getString(R.string.app_name)
}
R.id.personal -> {
fragment = PersonalPlanFragment()
@@ -146,7 +146,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
}
R.id.menu -> {
fragment = FoodFragment()
toolbarTxt.text = getString(R.string.foodMenu)
toolbarTxt.text = getString(R.string.food_menu)
}
R.id.openinfopanel -> {
openInfoDialog()
@@ -202,14 +202,14 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
private fun getGreetingString(): String {
val gen = Random()
return String.format(when (Calendar.getInstance().get(Calendar.HOUR_OF_DAY)) {
in 5..10 -> resources.getStringArray(R.array.greetingsMorning)[gen.nextInt(resources.getStringArray(
R.array.greetingsMorning
in 5..10 -> resources.getStringArray(R.array.greetings_morning)[gen.nextInt(resources.getStringArray(
R.array.greetings_morning
).size)]
in 11..17 -> resources.getStringArray(R.array.greetingsNoon)[gen.nextInt(resources.getStringArray(
R.array.greetingsNoon
in 11..17 -> resources.getStringArray(R.array.greetings_noon)[gen.nextInt(resources.getStringArray(
R.array.greetings_noon
).size)]
else -> resources.getStringArray(R.array.greetingsEvening)[gen.nextInt(resources.getStringArray(
R.array.greetingsEvening
else -> resources.getStringArray(R.array.greetings_evening)[gen.nextInt(resources.getStringArray(
R.array.greetings_evening
).size)]
}, prefs.getString("username", ""))
}
@@ -220,7 +220,7 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
R.string.information
)
val dialogText = "${getString(R.string.lastUpdated)} ${prefs.getString("timeNew", "")}.\n\n${prefs.getString("informational", "")}".trim()
val dialogText = "${getString(R.string.last_updated)} ${prefs.getString("timeNew", "")}.\n\n${prefs.getString("informational", "")}".trim()
dialogView.findViewById<TextView>(R.id.dialogtext).text = dialogText
dialog.setView(dialogView).show()
}
@@ -247,9 +247,9 @@ internal class Main : AppCompatActivity(R.layout.app_bar_main) {
getString(R.string.yourPlan)
} else {
if (user.endsWith("s", true) || user.endsWith("x", true) || user.endsWith("z", true)) {
"$user${getString(R.string.noSPlan)}"
"$user${getString(R.string.no_s_plan)}"
} else {
"$user${getString(R.string.SPlan)}"
"$user${getString(R.string.s_plan)}"
}
}
}
@@ -47,7 +47,7 @@ internal class CardAdapter(private var mSubst: List<Subst>, private val prefs: S
CustomTabsIntent.Builder().build().launchUrl(card.context,
Uri.parse(date.text.toString().substring(3)))
} catch (e: ActivityNotFoundException) {
Toast.makeText(card.context, card.context.getString(R.string.chromeCompatibleNotFound), Toast.LENGTH_LONG).show()
Toast.makeText(card.context, card.context.getString(R.string.chrome_not_found), Toast.LENGTH_LONG).show()
}
}
}
@@ -95,7 +95,7 @@ internal class CardAdapter(private var mSubst: List<Subst>, private val prefs: S
holder.date.visibility = if (currentItem.date.isNotEmpty() && currentItem.date.substring(0, 3) == "psa") {
psa = true
holder.time.text = " "
holder.time.text = " " // creating a margin on the right side
icon = R.drawable.ic_idea
cardBackgroundColour = R.color.colorAccent
View.GONE
@@ -74,12 +74,12 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole
if (plan || menu) {
mView.get()?.let { v: View ->
var snackText = "${mContext.get()?.getText(R.string.lastUpdated)} ${when {
var snackText = "${mContext.get()?.getText(R.string.last_updated)} ${when {
plan -> currentTime
menu -> currentFoodTime
else -> "---"
}}"
snackText = if (forceRefresh) mContext.get()?.getString(R.string.forcedRefresh) ?: "" else snackText
snackText = if (forceRefresh) mContext.get()?.getString(R.string.force_refresh_successful) ?: "" else snackText
val snackBarView = v.findViewById<View>(R.id.coordination)
Snackbar.make(snackBarView, snackText, Snackbar.LENGTH_LONG).show()
}
@@ -87,7 +87,7 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole
} catch (e: Exception) {
mView.get()?.let { v: View ->
val snackBarView = v.findViewById<View>(R.id.coordination)
Snackbar.make(snackBarView, mContext.get()?.getString(R.string.noInternet) ?: "", Snackbar.LENGTH_LONG).setBackgroundTint(ContextCompat.getColor(mContext.get()!!,
Snackbar.make(snackBarView, mContext.get()?.getString(R.string.no_internet_connection) ?: "", Snackbar.LENGTH_LONG).setBackgroundTint(ContextCompat.getColor(mContext.get()!!,
R.color.colorError
)).show()
}
@@ -197,7 +197,7 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole
}
}
if (countOfMoreNotificationItems > 0) {
notificationText += mContext.get()?.resources?.getQuantityString(R.plurals.moreMessages, countOfMoreNotificationItems, countOfMoreNotificationItems)
notificationText += mContext.get()?.resources?.getQuantityString(R.plurals.notification_more_messages, countOfMoreNotificationItems, countOfMoreNotificationItems)
}
}
@@ -218,7 +218,7 @@ internal class DataFetcher(isPlan: Boolean, isMenu: Boolean, isJobService: Boole
val notificationLayout = RemoteViews(context.packageName, R.layout.notification)
notificationLayout.setTextViewText(R.id.notification_title, context.getString(
R.string.substitutionPlan
R.string.substitution_plan
))
notificationLayout.setTextViewText(R.id.notification_textview, notificationText)
@@ -225,7 +225,7 @@ internal object HelperFunctions {
out.close()
Toast.makeText(context, context.getString(R.string.success), Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context, context.getString(R.string.permissionDenied), Toast.LENGTH_LONG).show()
Toast.makeText(context, context.getString(R.string.permission_denied), Toast.LENGTH_LONG).show()
requestPermissions(activity, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42)
}
}
@@ -251,7 +251,7 @@ internal object HelperFunctions {
}
Toast.makeText(context, context.getString(R.string.success), Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context, context.getString(R.string.permissionDenied), Toast.LENGTH_LONG).show()
Toast.makeText(context, context.getString(R.string.permission_denied), Toast.LENGTH_LONG).show()
requestPermissions(activity, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42)
}
}
@@ -23,6 +23,7 @@ internal class LoginWebViewClient(successListener: OnLoginSuccessListener) : Web
*/
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
view?.scrollY = -4000
val cookies = CookieManager.getInstance().getCookie(url)
if (cookies.contains("joomla_user_state=logged_in")) {
@@ -36,7 +37,7 @@ internal class LoginWebViewClient(successListener: OnLoginSuccessListener) : Web
internal interface OnLoginSuccessListener {
/**
* the function that can be overridden to check whether a successful login has occurred
* this function can be overridden to execute code when a login has been successful
*
* @param success boolean value that returns true if the cookie could be found,
* false otherwise
@@ -97,13 +97,13 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
forceRefreshButton.setOnClickListener(this)
forceRefreshButton.setOnLongClickListener {
prefs.edit().putString("timeNew", "").putString("newFoodTime", "").apply()
makeToast(mContext.getString(R.string.forcedRefreshTimes))
makeToast(mContext.getString(R.string.force_refresh_cleared_times))
true
}
val darkModeDropDown = view.findViewById<AutoCompleteTextView>(R.id.darkModeDropDownText)
val darkModeList = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
R.array.themesPreQ
R.array.themes_pre_q
} else {
R.array.themes
}
@@ -184,73 +184,34 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
})
versionButton.setOnLongClickListener {
makeToast(getString(R.string.madeBy))
debugMenu()
}
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.chipHelpCourses -> createDialog(getString(R.string.enterCoursesHelpTitle), getString(
R.string.enterCoursesHelp
))
R.id.chipHelpClasses -> createDialog(getString(R.string.enterGradeHelpTitle), getString(
R.string.enterGradeHelp
R.id.chipHelpCourses -> createDialog(getString(R.string.courses_help_dialog_title), getString(R.string.courses_help_dialog_text))
R.id.chipHelpClasses -> createDialog(getString(R.string.grade_help_dialog_title), getString(
R.string.grade_help_dialog_text
))
R.id.btnCustomiseColours -> createColourDialog()
R.id.btnNoNotif -> createDialog(mContext.getString(R.string.notReceivingNotifications1), mContext.getString(R.string.notReceivingNotificationsHelp))
R.id.btnNoNotif -> createDialog(mContext.getString(R.string.no_notifications_title), mContext.getString(R.string.no_notifications_dialog_text))
R.id.btnCustomiseRingtone -> createRingtoneDialog()
R.id.btnWebsite -> {
try {
customTabsIntent.launchUrl(mContext, Uri.parse("http://307.joomla.schule.bremen.de"))
} catch (e: ActivityNotFoundException) {
makeToast(getString(R.string.chromeCompatibleNotFound))
makeToast(getString(R.string.chrome_not_found))
}
}
R.id.btnLicences -> {
createDialog("Licences", "Libraries:\n • jsoup HTML parser © 2009-2018 Jonathan Hedley, licensed under the open source MIT Licence" +
"\n\nFont:\n • Manrope © 2018-2019 Michael Sharanda, licensed under the SIL Open Font Licence 1.1" +
"\n\nIcons:\n • bqlqn\n • fjstudio\n • Freepik\n • Smashicons\n • © 2013-2019 Freepik Company S.L., licensed under Creative Commons BY 3.0" +
"\n\nAdditional help:\n • Leon Becker\n • Alex Lick\n • Batuhan Özcan\n • Erich Kerkesner")
createDialog(mContext.getString(R.string.licences_title), licences)
}
R.id.btnTerms -> {
createDialog("Terms & Conditions", "These terms automatically apply to anyone using this app - therefore, please make sure to read them carefully before using the app. Copying or modifying parts of the app or the entire app, as well as creating derivative versions, is prohibited without permission. This app is intellectual property of the developer.\n" +
"\nThe developer reserves the right to make changes to the app at any given time and for any reason. The user will be informed of any changes made accordingly.\n" +
"\nTampering with the end device, in the form of rooting or otherwise modifying the operating system may result in malfunction of the software. In this case, the developer does not provide support, as the user is responsible for keeping the device free of software that may compromise its security.\n" +
"\nFull functionality of the app relies on a steady internet connection. The developer does not take responsibility for malfunction of these services, nor for any errors caused by the end device. The user is responsible for ensuring that their device is fully updated and fully functioning.\n" +
"\nAs the app relies on third-parties, information provided in-app may be delayed or incorrect at times. The developer accepts no liability for any information mistakenly provided in the app.\n" +
"\nThe developer may wish to update the app at any point. Should such action arise, then the user is advised to update the app to ensure proper functionality. However, the developer does not promise that the app will be continuously updated, and may stop providing the app at any point. Unless told otherwise, upon any termination, (a) the rights and licenses granted to the user in these terms will end; (b) the user must stop using the app, and (if needed) delete it from their device.\n" +
"\nChanges to these Terms & Conditions\n" +
"\nThe developer may update these Terms & Conditions from time to time. Thus, the user is advised to review this page periodically for any changes. Any changes are effective immediately after they are posted on this page.\n" +
"\nContact Us\n" +
"\nIn case of questions or suggestions regarding these Terms & Conditions, the user is advised to contact the developer of this app. Contact information is provided through the Play Store.\n" +
"\n---\n" +
"\nThese Terms & Conditions were modified upon the template provided by App Privacy Policy Generator. This service is in no way affiliated with AvH Plan or the developer.")
createDialog("Terms & Conditions", termsAndConditions)
}
R.id.btnPrivacyP -> {
createDialog("Privacy Policy", "The app \"Alexander-von-Humboldt-Plan\", hereby abbreviated to AvH Plan, is provided as a free service by the developer for use as is.\n" +
"\nThis page is used to inform visitors and users regarding policies with the collection, use, and disclosure of personal information, if they choose to make use of the service.\n" +
"\nAvH Plan does not collect, store, share, or in any other way use personal information retrieved from its users. Any information asked for within the app is only used to improve the user experience and as such, is stored locally and cannot be accessed by third-parties or be used to identify the user.\n" +
"\nInformation Collection and Use\n" +
"\nAt this moment, AvH Plan does not require personally identifiable information for its core functionality. Certain features do require entering information that may be personally identifiable, however, this data will be retained on the user's device and is therefore not accessible outside the app\n" +
"\nLog Data\n" +
"\nIn the case of an error in the app, device-specific data may be collected and stored on your phone. This data is called Log Data. This Log Data may include information, such as your device's Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilising the service, the time and date when the last usage occured, and other statistics. This data can not be used to personally identify any user.\n" +
"\nCookies\n" +
"\nCookies are files with small amounts of data that are commonly used as anonymous unique identifiers on the web. AvH Plan strives to not make use of cookies for its functionality, however, as its functionality requires access to third-party-websites, cookies may be unintentionally collected by the device's web browser. AvH Plan does not make use of these cookies in any way.\n" +
"\nService Providers\n" +
"\nNo third-parties are employed for providing any functionality or services of the AvH Plan-app and as such, all functionality is accessible without directly sharing personal data with third-parties.\n" +
"\nSecurity\n" +
"\nWhile absolute security cannot be ensured due to the internet functionality the app employs, no information is shared over any transmission methods.\n" +
"\nLinks to Other Sites\n" +
"\nThis Service may contain links to other sites, which are not operated by the developer of AvH Plan. The user is advised to review the privacy policy of any webpage they may access through the app. No responsibility for the content of these third-party websites is provided by the app developer.\n" +
"\nChildrens Privacy\n" +
"\nThe service does not address anyone under the age of 13. As the app does not collect any information from its users, no data is collected from users that may be under the age of 13.\n" +
"\nChanges to This Privacy Policy\n" +
"\nThis privacy policy may be updated as the AvH Plan app is updated with new features. As such, the user is advised to review this page periodically for any changes. Any changes that may be made are effective immediately upon publishing.\n" +
"\nContact Us\n" +
"\nIn case of questions or suggestions regarding this privacy policy, the user is advised to contact the developer of this app. Contact information is provided through the Play Store.\n" +
"\n---\n" +
"\nThis privacy policy was modified upon the template provided by privacypolicytemplate.net and App Privacy Policy Generator. These services are in no way affiliated with AvH Plan or the developer.")
createDialog("Privacy Policy", privacyPolicy)
}
R.id.btnForceRefresh -> {
DataFetcher(
@@ -305,7 +266,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
titleText.text = getString(R.string.customiseColoursTitle)
titleText.text = getString(R.string.customise_colours_title)
colourRecycler = dialogView.findViewById(R.id.recyclerView)
colourRecycler.apply {
hasFixedSize()
@@ -320,23 +281,23 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
private fun getColourList(): ArrayList<Colour> {
val colours = ArrayList<Colour>()
val coursesNoLang = HelperFunctions.languageIndependentCourses
val courses = arrayOf(getString(R.string.courseDeu), getString(
R.string.courseEng
), getString(R.string.courseFra), getString(R.string.courseSpa), getString(
R.string.courseLat
), getString(R.string.courseTue), getString(R.string.courseChi), getString(
R.string.courseKun
), getString(R.string.courseMus), getString(R.string.courseDar), getString(
R.string.courseGeg
), getString(R.string.courseGes), getString(R.string.coursePol), getString(
R.string.coursePhi
), getString(R.string.courseRel), getString(R.string.courseMat), getString(
R.string.courseBio
), getString(R.string.courseChe), getString(R.string.coursePhy), getString(
R.string.courseInf
), getString(R.string.courseSpo), getString(R.string.courseGll), getString(
R.string.courseWat
), getString(R.string.courseFor), getString(R.string.courseWp))
val courses = arrayOf(getString(R.string.course_deu), getString(
R.string.course_eng
), getString(R.string.course_fra), getString(R.string.course_spa), getString(
R.string.course_lat
), getString(R.string.course_tue), getString(R.string.course_chi), getString(
R.string.course_kun
), getString(R.string.course_mus), getString(R.string.course_dar), getString(
R.string.course_geg
), getString(R.string.course_ges), getString(R.string.course_pol), getString(
R.string.course_phi
), getString(R.string.course_rel), getString(R.string.course_mat), getString(
R.string.course_bio
), getString(R.string.course_che), getString(R.string.course_phy), getString(
R.string.course_inf
), getString(R.string.course_spo), getString(R.string.course_gll), getString(
R.string.course_wat
), getString(R.string.course_foer), getString(R.string.course_wp))
val coursesIcons = intArrayOf(R.drawable.ic_german, R.drawable.ic_english, R.drawable.ic_french,
R.drawable.ic_spanish, R.drawable.ic_latin, R.drawable.ic_turkish, R.drawable.ic_chinese,
R.drawable.ic_arts, R.drawable.ic_music, R.drawable.ic_drama, R.drawable.ic_geography,
@@ -372,7 +333,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
val dialogView = View.inflate(mContext, R.layout.recycler_dialog, null)
val titleText = dialogView.findViewById<TextView>(R.id.empty_textviewtitle)
titleText.text = getString(R.string.pickRingtone)
titleText.text = getString(R.string.pick_ringtone_dialog_title)
val recycler = dialogView.findViewById<RecyclerView>(R.id.recyclerView)
recycler.apply {
@@ -421,14 +382,14 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
private fun setRingtoneText() {
currentRingtone.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.getString(R.string.deviceSettingsRedirect)
mContext.getString(R.string.pick_ringtone_desc_o)
} else {
val tone = if ((prefs.getString("ringtoneName", "") ?: "").isNotEmpty()) {
prefs.getString("ringtoneName", "")
} else {
mContext.getString(R.string.defaultRingtone)
mContext.getString(R.string.default_ringtone)
}
mContext.getString(R.string.setRingtone2, tone)
mContext.getString(R.string.pick_ringtone_desc, tone)
}
}
@@ -469,10 +430,10 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
val dialogButton = dialogView.findViewById<Button>(R.id.dialog_button)
dialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
R.string.experimentalMenu
R.string.experimental_menu_dialog_title
)
dialogView.findViewById<TextView>(R.id.dialogtext).text = getString(
R.string.menuForTests
R.string.experimental_menu_dialog_text
)
dialogButton.setOnClickListener {
when (dialogEditText.text.toString()) {
@@ -484,7 +445,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
val resetNotificationBtn = devDialogView.findViewById<Button>(R.id.btnResetNotif)
devDialogView.findViewById<TextView>(R.id.textviewtitle).text = getString(
R.string.diagnosticsMenu
R.string.diagnostics_dialog_title
)
devDialogText.text = getDiagnosticsText()
@@ -507,7 +468,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).setPackage("com.google.android.youtube")
startActivity(intent)
} catch (e: ActivityNotFoundException) {
makeToast(getString(R.string.youtubeNotFound))
makeToast(getString(R.string.youtube_not_found))
}
}
"_FIRSTTIME" -> {
@@ -543,7 +504,7 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
}
"_WRITE" -> HelperFunctions.writePrefsToXml(prefs, mContext, activity!!)
"_READ" -> HelperFunctions.readPrefsFromXml(prefs, mContext, activity!!)
else -> makeToast(getString(R.string.invalidCode))
else -> makeToast(getString(R.string.invalid_code))
}
}
alertDialog.setView(dialogView)
@@ -569,4 +530,55 @@ internal class SettingsFragment : Fragment(R.layout.content_settings), View.OnCl
private fun subscribeToTopic(topic: Topic) = FirebaseMessaging.getInstance().subscribeToTopic(topic.tag)
private fun unsubscribeFromTopic(topic: Topic) = FirebaseMessaging.getInstance().unsubscribeFromTopic(topic.tag)
private val licences = "Libraries:" +
"\n • jsoup HTML parser © 2009-2018 Jonathan Hedley, licensed under the open source MIT Licence" +
"\n\nFont:" +
"\n • Manrope © 2018-2019 Michael Sharanda, licensed under the SIL Open Font Licence 1.1" +
"\n\nIcons:" +
"\n • bqlqn\n • fjstudio\n • Freepik\n • Smashicons" +
"\n • © 2013-2019 Freepik Company S.L., licensed under Creative Commons BY 3.0" +
"\n\nHuman resources:" +
"\n • Deniz Düzgören (Development & publishing)" +
"\n • Leon Becker (Initial marketing)" +
"\n • Alex Lick (Marketing & Play Store account)" +
"\n • Batuhan Özcan (Marketing & Play Store account)" +
"\n • Erich Kerkesner (Marketing & Play Store account)"
private val termsAndConditions = "These terms automatically apply to anyone using this app - therefore, please make sure to read them carefully before using the app. Copying or modifying parts of the app or the entire app, as well as creating derivative versions, is prohibited without permission. This app is intellectual property of the developer.\n" +
"\nThe developer reserves the right to make changes to the app at any given time and for any reason. The user will be informed of any changes made accordingly.\n" +
"\nTampering with the end device, in the form of rooting or otherwise modifying the operating system may result in malfunction of the software. In this case, the developer does not provide support, as the user is responsible for keeping the device free of software that may compromise its security.\n" +
"\nFull functionality of the app relies on a steady internet connection. The developer does not take responsibility for malfunction of these services, nor for any errors caused by the end device. The user is responsible for ensuring that their device is fully updated and fully functioning.\n" +
"\nAs the app relies on third-parties, information provided in-app may be delayed or incorrect at times. The developer accepts no liability for any information mistakenly provided in the app.\n" +
"\nThe developer may wish to update the app at any point. Should such action arise, then the user is advised to update the app to ensure proper functionality. However, the developer does not promise that the app will be continuously updated, and may stop providing the app at any point. Unless told otherwise, upon any termination, (a) the rights and licenses granted to the user in these terms will end; (b) the user must stop using the app, and (if needed) delete it from their device.\n" +
"\nChanges to these Terms & Conditions\n" +
"\nThe developer may update these Terms & Conditions from time to time. Thus, the user is advised to review this page periodically for any changes. Any changes are effective immediately after they are posted on this page.\n" +
"\nContact Us\n" +
"\nIn case of questions or suggestions regarding these Terms & Conditions, the user is advised to contact the developer of this app. Contact information is provided through the Play Store.\n" +
"\n---\n" +
"\nThese Terms & Conditions were modified upon the template provided by App Privacy Policy Generator. This service is in no way affiliated with AvH Plan or the developer."
private val privacyPolicy = "The app \"Alexander-von-Humboldt-Plan\", hereby abbreviated to AvH Plan, is provided as a free service by the developer for use as is.\n" +
"\nThis page is used to inform visitors and users regarding policies with the collection, use, and disclosure of personal information, if they choose to make use of the service.\n" +
"\nAvH Plan does not collect, store, share, or in any other way use personal information retrieved from its users. Any information asked for within the app is only used to improve the user experience and as such, is stored locally and cannot be accessed by third-parties or be used to identify the user.\n" +
"\nInformation Collection and Use\n" +
"\nAt this moment, AvH Plan does not require personally identifiable information for its core functionality. Certain features do require entering information that may be personally identifiable, however, this data will be retained on the user's device and is therefore not accessible outside the app\n" +
"\nLog Data\n" +
"\nIn the case of an error in the app, device-specific data may be collected and stored on your phone. This data is called Log Data. This Log Data may include information, such as your device's Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilising the service, the time and date when the last usage occured, and other statistics. This data can not be used to personally identify any user.\n" +
"\nCookies\n" +
"\nCookies are files with small amounts of data that are commonly used as anonymous unique identifiers on the web. AvH Plan strives to not make use of cookies for its functionality, however, as its functionality requires access to third-party-websites, cookies may be unintentionally collected by the device's web browser. AvH Plan does not make use of these cookies in any way.\n" +
"\nService Providers\n" +
"\nNo third-parties are employed for providing any functionality or services of the AvH Plan-app and as such, all functionality is accessible without directly sharing personal data with third-parties.\n" +
"\nSecurity\n" +
"\nWhile absolute security cannot be ensured due to the internet functionality the app employs, no information is shared over any transmission methods.\n" +
"\nLinks to Other Sites\n" +
"\nThis Service may contain links to other sites, which are not operated by the developer of AvH Plan. The user is advised to review the privacy policy of any webpage they may access through the app. No responsibility for the content of these third-party websites is provided by the app developer.\n" +
"\nChildrens Privacy\n" +
"\nThe service does not address anyone under the age of 13. As the app does not collect any information from its users, no data is collected from users that may be under the age of 13.\n" +
"\nChanges to This Privacy Policy\n" +
"\nThis privacy policy may be updated as the AvH Plan app is updated with new features. As such, the user is advised to review this page periodically for any changes. Any changes that may be made are effective immediately upon publishing.\n" +
"\nContact Us\n" +
"\nIn case of questions or suggestions regarding this privacy policy, the user is advised to contact the developer of this app. Contact information is provided through the Play Store.\n" +
"\n---\n" +
"\nThis privacy policy was modified upon the template provided by privacypolicytemplate.net and App Privacy Policy Generator. These services are in no way affiliated with AvH Plan or the developer."
}