diff --git a/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt b/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt index 2a019b9..25d3bca 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/SubstUtil.kt @@ -21,8 +21,6 @@ import androidx.core.content.ContextCompat.checkSelfPermission import androidx.fragment.app.FragmentActivity import com.denizd.substitutionplan.R import com.denizd.substitutionplan.models.Colour -import com.denizd.substitutionplan.models.Food -import com.denizd.substitutionplan.models.Substitution import java.util.* import java.io.File import java.io.FileOutputStream @@ -132,6 +130,7 @@ internal object SubstUtil { return 0 } + // Could be merged with getColourString fun getIconForCourse(course: String): Int { return with (course.toLowerCase(Locale.ROOT)) { when { @@ -159,7 +158,7 @@ internal object SubstUtil { contains("gll") -> R.drawable.ic_gll contains("wat") -> R.drawable.ic_wat contains("för") -> R.drawable.ic_help - contains("wp") || contains("met") -> R.drawable.ic_pencil + contains("wp") || contains("met") -> R.drawable.ic_met else -> R.drawable.ic_empty } } @@ -416,8 +415,8 @@ internal object SubstUtil { } } - fun readPrefsFromXml(prefs: SharedPreferences, context: Context, activity: FragmentActivity) { - if (checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + fun readPrefsFromXml(prefs: SharedPreferences, context: Context): Boolean { + return if (checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { val localPrefTypes = ArrayList() for (i in prefKeys.indices) { localPrefTypes.add(prefTypes[i]) @@ -436,9 +435,10 @@ internal object SubstUtil { prefs.setPrefValue(key, value, localPrefTypes[i]) } Toast.makeText(context, context.getString(R.string.success), Toast.LENGTH_LONG).show() + true } else { Toast.makeText(context, context.getString(R.string.permission_denied), Toast.LENGTH_LONG).show() - requestPermissions(activity, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42) + false } } } diff --git a/app/src/main/java/com/denizd/substitutionplan/database/SettingsRepository.kt b/app/src/main/java/com/denizd/substitutionplan/database/SettingsRepository.kt index a14df73..8b7a498 100644 --- a/app/src/main/java/com/denizd/substitutionplan/database/SettingsRepository.kt +++ b/app/src/main/java/com/denizd/substitutionplan/database/SettingsRepository.kt @@ -3,10 +3,15 @@ package com.denizd.substitutionplan.database import android.app.Application import android.database.Cursor import android.media.RingtoneManager +import androidx.preference.PreferenceManager +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.models.Ringtone internal class SettingsRepository(private val application: Application) { + private val prefs = PreferenceManager.getDefaultSharedPreferences(application) + val notificationChannel = SubstUtil.getNotificationChannel(application, prefs) + val ringtones: List by lazy { lateinit var ringtoneCursor: Cursor val ringtoneManager = RingtoneManager(application).apply { @@ -27,5 +32,29 @@ internal class SettingsRepository(private val application: Application) { alarms } + fun getInt(key: String, default: Int = 0): Int { + return prefs.getInt(key, default) + } + + fun setAndApplyInt(key: String, value: Int) { + prefs.edit().putInt(key, value).apply() + } + + fun getBool(key: String, default: Boolean = false): Boolean { + return prefs.getBoolean(key, default) + } + + fun setAndApplyBool(key: String, value: Boolean) { + prefs.edit().putBoolean(key, value).apply() + } + + fun getString(key: String, default: String = ""): String? { + return prefs.getString(key, default) + } + + fun setAndApplyString(key: String, value: String) { + prefs.edit().putString(key, value).apply() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/database/SubstRepository.kt b/app/src/main/java/com/denizd/substitutionplan/database/SubstRepository.kt index 0a2ef58..d36dfb6 100644 --- a/app/src/main/java/com/denizd/substitutionplan/database/SubstRepository.kt +++ b/app/src/main/java/com/denizd/substitutionplan/database/SubstRepository.kt @@ -156,9 +156,19 @@ internal class SubstRepository(private val application: Application) { return true } } else { - if (coursePreference.contains(course.substring(0, questionMark - 1)) - || coursePreference.contains(course.substring(questionMark + 1))) { - return true + try { + /* + These if statements are separated for if, for example, this shows up: + "INF7?" + if they were nested in a single if statement, the function may not be + able to recognise the course and throw an exception instead + */ + if (coursePreference.contains(course.substring(0, questionMark - 1))) { + return true + } else if (coursePreference.contains(course.substring(questionMark + 1))) { + return true + } + } catch (e: Exception) { } } } diff --git a/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt b/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt index cb6e985..05282ee 100644 --- a/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/fragments/SettingsFragment.kt @@ -4,11 +4,9 @@ import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent -import android.content.SharedPreferences import android.net.Uri import android.os.Build import android.os.Bundle -import androidx.preference.PreferenceManager import android.provider.Settings import android.text.Editable import android.text.TextWatcher @@ -42,7 +40,6 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC RingtoneAdapter.OnRingtoneClickListener, ColourPickerAdapter.OnColourClickListener { private lateinit var mContext: Context - private lateinit var prefs: SharedPreferences private val customTabsIntent = CustomTabsIntent.Builder().build() as CustomTabsIntent private var customiseColoursButtonLongPressed = false private var versionCount = 0 @@ -58,7 +55,6 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC override fun onAttach(context: Context) { super.onAttach(context) mContext = context - prefs = PreferenceManager.getDefaultSharedPreferences(mContext) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -108,37 +104,37 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC switchAutoRefresh.setOnCheckedChangeListener(thisFragment) // Set checked - switchGreeting.isChecked = prefs.getBoolean("greeting", true) - switchNotifications.isChecked = prefs.getBoolean("notif", false) + switchGreeting.isChecked = viewModel.shouldGreet + switchNotifications.isChecked = viewModel.shouldReceiveNotifications - switchPersonalisedPlan.isChecked = prefs.getBoolean("defaultPersonalised", false) - switchAutoRefresh.isChecked = prefs.getBoolean("autoRefresh", false) + switchPersonalisedPlan.isChecked = viewModel.shouldOpenPersonalisedPlan + switchAutoRefresh.isChecked = viewModel.shouldAutoRefresh // Set edit text (+ listeners) - edittextName.setText(prefs.getString("username", "")) + edittextName.setText(viewModel.username) edittextName.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable) {} override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - prefs.edit().putString("username", edittextName.text.toString().trim()).apply() + viewModel.username = edittextName.text.toString().trim() } }) - edittextGroup.setText(prefs.getString("classes", "")) + edittextGroup.setText(viewModel.group) edittextGroup.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable) {} override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - prefs.edit().putString("classes", edittextGroup.text.toString()).apply() + viewModel.group = edittextGroup.text.toString() } }) - edittextCourses.setText(prefs.getString("courses", "")) + edittextCourses.setText(viewModel.courses) edittextCourses.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable) {} override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - prefs.edit().putString("courses", edittextCourses.text.toString()).apply() + viewModel.courses = edittextCourses.text.toString() } }) @@ -154,9 +150,9 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC R.layout.dropdown_item ) autocompleteDarkMode.setAdapter(darkModeAdapter) - autocompleteDarkMode.setText(autocompleteDarkMode.adapter.getItem(prefs.getInt("themeInt", 0)).toString(), false) + autocompleteDarkMode.setText(autocompleteDarkMode.adapter.getItem(viewModel.currentTheme).toString(), false) autocompleteDarkMode.setOnItemClickListener { _, _, position, _ -> - prefs.edit().putInt("themeInt", position).apply() + viewModel.currentTheme = position when (position) { 0 -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) @@ -174,14 +170,14 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC } } } - view.rootView.findViewById(R.id.bottom_nav).selectedItemId = if (prefs.getBoolean("defaultPersonalised", false)) { + view.rootView.findViewById(R.id.bottom_nav).selectedItemId = if (viewModel.shouldOpenPersonalisedPlan) { R.id.personal } else { R.id.plan } } - val selectedOrderingOption = if (prefs.getBoolean("app_specific_sorting", true)) 0 else 1 + val selectedOrderingOption = if (viewModel.shouldUseAppSorting) 0 else 1 val orderingArrayAdapter = ArrayAdapter.createFromResource( mContext, R.array.ordering_systems, @@ -190,7 +186,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC autocompleteOrder.setAdapter(orderingArrayAdapter) autocompleteOrder.setText(autocompleteOrder.adapter.getItem(selectedOrderingOption).toString(), false) autocompleteOrder.setOnItemClickListener { _, _, position, _ -> - prefs.edit().putBoolean("app_specific_sorting", position == 0).apply() + viewModel.shouldUseAppSorting = position == 0 } } } @@ -269,7 +265,8 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC true } R.id.button_forced_refresh -> { - prefs.edit().putString("timeNew", "").putString("newFoodTime", "").apply() + viewModel.setAndApplyString("timeNew", "") + viewModel.setAndApplyString("newFoodTime", "") makeToast(mContext.getString(R.string.force_refresh_cleared_times)) true } @@ -281,10 +278,10 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC if (v?.isPressed == true) { when (v.id) { R.id.switch_greeting -> { - prefs.edit().putBoolean("greeting", isChecked).apply() + viewModel.shouldGreet = isChecked } R.id.switch_notifications -> { - prefs.edit().putBoolean("notif", isChecked).apply() + viewModel.shouldReceiveNotifications = isChecked if (isChecked) { subscribeToTopic(SubstUtil.FB_TOPIC_ANDROID) } else { @@ -292,10 +289,10 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC } } R.id.switch_personalised_plan -> { - prefs.edit().putBoolean("defaultPersonalised", isChecked).apply() + viewModel.shouldOpenPersonalisedPlan = isChecked } R.id.switch_auto_refresh -> { - prefs.edit().putBoolean("autoRefresh", isChecked).apply() + viewModel.shouldAutoRefresh = isChecked } } } @@ -320,7 +317,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC } override fun onColourClick(position: Int, colourNoLang: String) { - prefs.edit().putString("card$currentCourseSelectedInColourPicker", colourNoLang).apply() + viewModel.setAndApplyString("card$currentCourseSelectedInColourPicker", colourNoLang) val recyclerViewState = colourRecycler.layoutManager?.onSaveInstanceState() colourRecycler.adapter = CourseColourAdapter(getColourList(), this) colourRecycler.layoutManager?.onRestoreInstanceState(recyclerViewState) @@ -328,10 +325,8 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC } override fun onRingtoneClick(position: Int, name: String, uri: String) { - prefs.edit().apply { - putString("ringtoneName", name) - putString("ringtoneUri", uri) - }.apply() + viewModel.setAndApplyString("ringtoneName", name) + viewModel.setAndApplyString("ringtoneUri", uri) setRingtoneText() ringtoneDialog.dismiss() } @@ -364,7 +359,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC private fun createRingtoneDialog() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - SubstUtil.getNotificationChannel(mContext, prefs) + viewModel.notificationChannel val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, mContext.applicationContext.packageName) putExtra(Settings.EXTRA_CHANNEL_ID, "general") @@ -418,12 +413,12 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC devDialogText.text = getDiagnosticsText() resetLaunchBtn.setOnClickListener { - prefs.edit().putInt("launchDev", 0).apply() + viewModel.setAndApplyInt("launchDev", 0) devDialogText.text = getDiagnosticsText() } resetNotificationBtn.setOnClickListener { - prefs.edit().putInt("pingFB", 0).apply() + viewModel.setAndApplyInt("pingFB", 0) devDialogText.text = getDiagnosticsText() } @@ -431,55 +426,65 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC alertDialogDev.show() } this == "_login" -> { - prefs.edit().putBoolean("successful_login", false).apply() + viewModel.setAndApplyBool("successful_login", false) makeToast("Login flag cleared") } this == "_firsttime" -> { - prefs.edit().putBoolean("firstTime", true).apply() + viewModel.setAndApplyBool("firstTime", true) makeToast("First time flag cleared") } this == "_testurls" -> { - val currentTest = !prefs.getBoolean("testUrls", false) - prefs.edit().putBoolean("testUrls", currentTest) - .putString("custom_test_url", "").apply() - makeToast("Cleared custom URL") + val currentTest = !viewModel.getBool("testUrls", false) + viewModel.setAndApplyBool("testUrls", currentTest) + if (viewModel.getString("custom_test_url") != "") { + viewModel.setAndApplyString("custom_test_url", "") + makeToast("Cleared custom URL") + } makeToast("Test URLs set to $currentTest") } length > 4 && substring(0, 4) == "_url" -> { - prefs.edit().putString("custom_test_url", substring(4, length)).apply() + viewModel.setAndApplyString("custom_test_url", substring(4, length)) makeToast("Successfully entered custom URL") } length == 4 && substring(0, 4) == "_url" -> { - prefs.edit().putString("custom_test_url", "").apply() + viewModel.setAndApplyString("custom_test_url", "") makeToast("Cleared custom URL") } this == "_devchannel" -> { - val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) { + val subscribedToDevelopmentChannel = viewModel.getBool("subscribedToFBDebugChannel") + val subbedText = if (subscribedToDevelopmentChannel) { unsubscribeFromTopic(SubstUtil.FB_TOPIC_DEVELOPMENT) "Unsubscribed from" } else { subscribeToTopic(SubstUtil.FB_TOPIC_DEVELOPMENT) "Subscribed to" } - prefs.edit().putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply() - makeToast("$subbed Firebase development channel") + viewModel.setAndApplyBool("subscribedToFBDebugChannel", !subscribedToDevelopmentChannel) + makeToast("$subbedText Firebase development channel") } this == "_ioschannel" -> { - val subbed = if (prefs.getBoolean("subscribedToiOSChannel", false)) { + val subscribedToIosChannel = viewModel.getBool("subscribedToiOSChannel") + val subbed = if (subscribedToIosChannel) { unsubscribeFromTopic(SubstUtil.FB_TOPIC_IOS) "Unsubscribed from" } else { subscribeToTopic(SubstUtil.FB_TOPIC_IOS) "Subscribed to" } - prefs.edit().putBoolean("subscribedToiOSChannel", !prefs.getBoolean("subscribedToiOSChannel", false)).apply() + viewModel.setAndApplyBool("subscribedToiOSChannel", !subscribedToIosChannel) makeToast("$subbed iOS channel") } this == "_viewstacktrace" -> { - createDialog("Debug Stack Trace", prefs.getString("debug_recent_exception", "") ?: "") + createDialog("Debug Stack Trace", viewModel.getString("debug_recent_exception")) } - this == "_write" -> SubstUtil.writePrefsToXml(prefs, mContext, activity!!) - this == "_read" -> SubstUtil.readPrefsFromXml(prefs, mContext, activity!!) +// this == "_write" -> SubstUtil.writePrefsToXml(prefs, mContext, requireActivity()) +// this == "_read" -> { +// if (!SubstUtil.readPrefsFromXml(prefs, mContext)) { +// ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42) +// } else { +// TODO("Figure this out or remove it outright as it is outdated") +// } +// } else -> makeToast(getString(R.string.invalid_code)) } } @@ -545,7 +550,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC R.drawable.ic_gll, R.drawable.ic_wat, R.drawable.ic_help, - R.drawable.ic_pencil + R.drawable.ic_met ) for (i in coursesNoLang.indices) { @@ -554,7 +559,7 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC courses[i], coursesNoLang[i], coursesIcons[i], - SubstUtil.getColourForString(prefs.getString("card${coursesNoLang[i]}", "") ?: "", mContext) + SubstUtil.getColourForString(viewModel.getString("card${coursesNoLang[i]}", ""), mContext) ) ) } @@ -566,8 +571,8 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC binding.textCustomiseRingtoneDesc.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mContext.getString(R.string.pick_ringtone_desc_o) } else { - val tone = if ((prefs.getString("ringtoneName", "") ?: "").isNotEmpty()) { - prefs.getString("ringtoneName", "") + val tone = if ((viewModel.getString("ringtoneName")).isNotEmpty()) { + viewModel.getString("ringtoneName") } else { mContext.getString(R.string.default_ringtone) } @@ -580,15 +585,15 @@ internal class SettingsFragment : Fragment(), View.OnClickListener, View.OnLongC } private fun getDiagnosticsText(): String { - return "First Launch: ${prefs.getString("firstTimeDev", "")}" + - "\n\nApp launched: ${prefs.getInt("launchDev", 0)}" + - "\n\nFirebase ping service fired: ${prefs.getInt("pingFB", 0)}" + + return "First Launch: ${viewModel.getString("firstTimeDev", "")}" + + "\n\nApp launched: ${viewModel.getInt("launchDev", 0)}" + + "\n\nFirebase ping service fired: ${viewModel.getInt("pingFB", 0)}" + "\n\nDevice Name: ${Build.DEVICE}" + "\n\nDevice Model: ${Build.MODEL}" + "\n\nAndroid Version: ${Build.VERSION.RELEASE}" + - "\n\nSubscribed to notification channel: ${prefs.getBoolean("notif", false)}" + - "\n\nSubscribed to iOS channel: ${prefs.getBoolean("subscribedToiOSChannel", false)}" + - "\n\nSubscribed to dev channel: ${prefs.getBoolean("subscribedToFBDebugChannel", false)}" + "\n\nSubscribed to notification channel: ${viewModel.getBool("notif", false)}" + + "\n\nSubscribed to iOS channel: ${viewModel.getBool("subscribedToiOSChannel", false)}" + + "\n\nSubscribed to dev channel: ${viewModel.getBool("subscribedToFBDebugChannel", false)}" } private fun subscribeToTopic(topic: String) = FirebaseMessaging.getInstance().subscribeToTopic(topic) diff --git a/app/src/main/java/com/denizd/substitutionplan/viewmodels/SettingsViewModel.kt b/app/src/main/java/com/denizd/substitutionplan/viewmodels/SettingsViewModel.kt index c1ffb1b..220874c 100644 --- a/app/src/main/java/com/denizd/substitutionplan/viewmodels/SettingsViewModel.kt +++ b/app/src/main/java/com/denizd/substitutionplan/viewmodels/SettingsViewModel.kt @@ -2,6 +2,7 @@ package com.denizd.substitutionplan.viewmodels import android.app.Application import androidx.lifecycle.AndroidViewModel +import com.denizd.substitutionplan.data.SubstUtil import com.denizd.substitutionplan.database.SettingsRepository import com.denizd.substitutionplan.models.Ringtone import kotlinx.coroutines.GlobalScope @@ -11,6 +12,38 @@ import kotlinx.coroutines.launch internal class SettingsViewModel(application: Application) : AndroidViewModel(application) { private val repo = SettingsRepository(application) + var shouldGreet: Boolean + get() = repo.getBool("greeting") + set(it) = repo.setAndApplyBool("greeting", it) + var shouldReceiveNotifications: Boolean + get() = repo.getBool("notif") + set(it) = repo.setAndApplyBool("notif", it) + var shouldOpenPersonalisedPlan: Boolean + get() = repo.getBool("defaultPersonalised") + set(it) = repo.setAndApplyBool("defaultPersonalised", it) + var shouldAutoRefresh: Boolean + get() = repo.getBool("autoRefresh") + set(it) = repo.setAndApplyBool("autoRefresh", it) + var shouldUseAppSorting: Boolean + get() = repo.getBool("app_specific_sorting") + set(it) = repo.setAndApplyBool("app_specific_sorting", it) + + + var username: String + get() = repo.getString("username") ?: "" + set(it) = repo.setAndApplyString("username", it) + var group: String + get() = repo.getString("classes") ?: "" + set(it) = repo.setAndApplyString("classes", it) + var courses: String + get() = repo.getString("courses") ?: "" + set(it) = repo.setAndApplyString("courses", it) + + var currentTheme: Int + get() = repo.getInt("themeInt") + set(it) = repo.setAndApplyInt("themeInt", it) + + val notificationChannel = repo.notificationChannel lateinit var ringtones: List val ringtonesInitialised = ::ringtones.isInitialized @@ -22,4 +55,11 @@ internal class SettingsViewModel(application: Application) : AndroidViewModel(ap updateUi() } } + + fun getInt(key: String, default: Int = 0) = repo.getInt(key, default) + fun setAndApplyInt(key: String, value: Int) = repo.setAndApplyInt(key, value) + fun getBool(key: String, default: Boolean = false) = repo.getBool(key, default) + fun setAndApplyBool(key: String, value: Boolean) = repo.setAndApplyBool(key, value) + fun getString(key: String, default: String = "", ifNull: String = "") = repo.getString(key, default) ?: ifNull + fun setAndApplyString(key: String, value: String) = repo.setAndApplyString(key, value) } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_compsci.xml b/app/src/main/res/drawable/ic_compsci.xml index 5900312..11181fb 100644 --- a/app/src/main/res/drawable/ic_compsci.xml +++ b/app/src/main/res/drawable/ic_compsci.xml @@ -1,7 +1,24 @@ - - - - - + + + + + + + diff --git a/app/src/main/res/drawable/ic_geography.xml b/app/src/main/res/drawable/ic_geography.xml index 94cb978..37ba074 100644 --- a/app/src/main/res/drawable/ic_geography.xml +++ b/app/src/main/res/drawable/ic_geography.xml @@ -1,4 +1,12 @@ - - + + + diff --git a/app/src/main/res/drawable/ic_gll.xml b/app/src/main/res/drawable/ic_gll.xml index a75395b..e446f8d 100644 --- a/app/src/main/res/drawable/ic_gll.xml +++ b/app/src/main/res/drawable/ic_gll.xml @@ -1,4 +1,9 @@ - - + + diff --git a/app/src/main/res/drawable/ic_latin.xml b/app/src/main/res/drawable/ic_latin.xml index e054482..83d61d5 100644 --- a/app/src/main/res/drawable/ic_latin.xml +++ b/app/src/main/res/drawable/ic_latin.xml @@ -1,8 +1,18 @@ - - - - - - + + + + + diff --git a/app/src/main/res/drawable/ic_met.xml b/app/src/main/res/drawable/ic_met.xml new file mode 100644 index 0000000..a93f775 --- /dev/null +++ b/app/src/main/res/drawable/ic_met.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_pencil.xml b/app/src/main/res/drawable/ic_pencil.xml deleted file mode 100644 index 3323522..0000000 --- a/app/src/main/res/drawable/ic_pencil.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_physics.xml b/app/src/main/res/drawable/ic_physics.xml index fe80a81..138bb00 100644 --- a/app/src/main/res/drawable/ic_physics.xml +++ b/app/src/main/res/drawable/ic_physics.xml @@ -1,5 +1,8 @@ - + diff --git a/app/src/main/res/drawable/ic_politics.xml b/app/src/main/res/drawable/ic_politics.xml index c1793fe..f36990c 100644 --- a/app/src/main/res/drawable/ic_politics.xml +++ b/app/src/main/res/drawable/ic_politics.xml @@ -1,4 +1,15 @@ - - + + + + diff --git a/app/src/main/res/drawable/ic_spanish.xml b/app/src/main/res/drawable/ic_spanish.xml index 61f9190..2767f6d 100644 --- a/app/src/main/res/drawable/ic_spanish.xml +++ b/app/src/main/res/drawable/ic_spanish.xml @@ -1,13 +1,12 @@ - - - - - - - - - - - + + +