diff --git a/app/build.gradle b/app/build.gradle index b7afcbfe21..ec8e3e770c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "org.ole.planet.myplanet" minSdkVersion 21 targetSdkVersion 34 - versionCode 1717 - versionName "0.17.17" + versionCode 1718 + versionName "0.17.18" ndkVersion '21.3.6528147' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/org/ole/planet/myplanet/MainApplication.kt b/app/src/main/java/org/ole/planet/myplanet/MainApplication.kt index 5136440cdd..a33c2daf9e 100644 --- a/app/src/main/java/org/ole/planet/myplanet/MainApplication.kt +++ b/app/src/main/java/org/ole/planet/myplanet/MainApplication.kt @@ -11,6 +11,8 @@ import android.os.StrictMode import android.os.StrictMode.VmPolicy import android.provider.Settings import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatDelegate +import androidx.preference.PreferenceManager import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.PeriodicWorkRequest import androidx.work.WorkManager @@ -93,6 +95,9 @@ class MainApplication : Application(), Application.ActivityLifecycleCallbacks { context = this preferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE) + nightMode() + // UNCOMMENT BELOW TO FORCE DARK MODE FOR DARK MODE DEVELOPMENT + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) val builder = VmPolicy.Builder() StrictMode.setVmPolicy(builder.build()) builder.detectFileUriExposure() @@ -114,6 +119,16 @@ class MainApplication : Application(), Application.ActivityLifecycleCallbacks { onAppStarted() } + private fun nightMode() { + val preference = PreferenceManager.getDefaultSharedPreferences(this).getString("dark_mode", "Follow System") + val options = listOf(*resources.getStringArray(R.array.dark_mode_options)) + when (options.indexOf(preference)) { + 0 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + 1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + 2 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + } + } + private fun scheduleAutoSyncWork(syncInterval: Int?) { val autoSyncWork: PeriodicWorkRequest? = syncInterval?.let { PeriodicWorkRequest.Builder(AutoSyncWorker::class.java, it.toLong(), TimeUnit.SECONDS).build() } val workManager = WorkManager.getInstance(this) diff --git a/app/src/main/java/org/ole/planet/myplanet/base/BaseResourceFragment.kt b/app/src/main/java/org/ole/planet/myplanet/base/BaseResourceFragment.kt index e49bde2809..d6d528e653 100644 --- a/app/src/main/java/org/ole/planet/myplanet/base/BaseResourceFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/base/BaseResourceFragment.kt @@ -104,7 +104,7 @@ abstract class BaseResourceFragment : Fragment() { } val inflater = activity?.layoutInflater convertView = inflater?.inflate(R.layout.my_library_alertdialog, null) - val alertDialogBuilder = AlertDialog.Builder(requireContext()) + val alertDialogBuilder = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme) alertDialogBuilder.setView(convertView) .setTitle(R.string.download_suggestion) alertDialogBuilder.setPositiveButton(R.string.download_selected) { _: DialogInterface?, _: Int -> diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt index ae439e696c..7aca3a5fcb 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt @@ -3,12 +3,14 @@ package org.ole.planet.myplanet.ui import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.os.Bundle import android.view.MenuItem import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.Preference.OnPreferenceChangeListener @@ -70,6 +72,7 @@ class SettingActivity : AppCompatActivity() { @RequiresApi(Build.VERSION_CODES.O) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + requireContext().setTheme(R.style.PreferencesTheme) setPreferencesFromResource(R.xml.pref, rootKey) profileDbHandler = UserProfileDbHandler(requireActivity()) user = profileDbHandler.userModel @@ -85,6 +88,17 @@ class SettingActivity : AppCompatActivity() { } } + val darkMode = findPreference("dark_mode") + if (darkMode != null) { + darkMode.onPreferenceChangeListener = OnPreferenceChangeListener { preference: Preference?, newValue: Any? -> + if (preference?.key == "dark_mode") { + darkMode(newValue.toString()) + return@OnPreferenceChangeListener true + } + false + } + } + // Show Available space under the "Freeup Space" preference. val spacePreference = findPreference("freeup_space") if (spacePreference != null) { @@ -181,6 +195,14 @@ class SettingActivity : AppCompatActivity() { profileDbHandler.onDestory() } } + + private fun darkMode(key: String) { + when (key) { + "ON" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + "OFF" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + "Follow System" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + } + } } companion object { diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/community/HomeCommunityDialogFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/community/HomeCommunityDialogFragment.kt index d75943401e..0a702cd5f5 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/community/HomeCommunityDialogFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/community/HomeCommunityDialogFragment.kt @@ -37,8 +37,9 @@ class HomeCommunityDialogFragment : BottomSheetDialogFragment() { tab.text = (fragmentTeamDetailBinding.viewPager2.adapter as CommunityPagerAdapter).getPageTitle(position) }.attach() fragmentTeamDetailBinding.title.text = communityName - fragmentTeamDetailBinding.title.setTextColor(ContextCompat.getColor(requireContext(), R.color.md_black_1000)) - fragmentTeamDetailBinding.subtitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.md_black_1000)) + fragmentTeamDetailBinding.title.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) + fragmentTeamDetailBinding.subtitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.daynight_textColor)) fragmentTeamDetailBinding.subtitle.text = TimeUtils.getFormatedDateWithTime(Date().time) + fragmentTeamDetailBinding.appBar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.secondary_bg)) } } \ No newline at end of file diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt index 282ab47202..41786b36a0 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragment.kt @@ -162,7 +162,7 @@ open class BaseDashboardFragment : BaseDashboardFragmentPlugin(), NotificationCa val itemLibraryHomeBinding = ItemLibraryHomeBinding.inflate(LayoutInflater.from(activity)) val v = itemLibraryHomeBinding.root setTextColor(itemLibraryHomeBinding.title, itemCnt) - val colorResId = if (itemCnt % 2 == 0) R.color.md_white_1000 else R.color.md_grey_300 + val colorResId = if (itemCnt % 2 == 0) R.color.dashboard_item else R.color.dashboard_item_alternative val color = context?.let { ContextCompat.getColor(it, colorResId) } if (color != null) { v.setBackgroundColor(color) diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragmentPlugin.kt b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragmentPlugin.kt index 4ae63111b9..ba0a6eb7cc 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragmentPlugin.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/BaseDashboardFragmentPlugin.kt @@ -153,7 +153,7 @@ open class BaseDashboardFragmentPlugin : BaseContainerFragment() { if (count % 2 == 0) { v.setBackgroundResource(R.drawable.light_rect) } else { - v.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.md_grey_300)) + v.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.dashboard_item_alternative)) } } } \ No newline at end of file diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt index 3b260cece3..c11c4fc819 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt @@ -15,6 +15,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.WindowInsetsCompat @@ -300,7 +301,14 @@ class DashboardActivity : DashboardElementActivity(), OnHomeItemClickListener, N .build() val headerBackground = header.headerBackgroundView headerBackground.setPadding(30, 60, 30, 60) - headerBackground.setColorFilter(ContextCompat.getColor(this, R.color.md_white_1000), PorterDuff.Mode.SRC_IN) + val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO || + (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM && currentNightMode == Configuration.UI_MODE_NIGHT_NO)) { + headerBackground.setColorFilter( + ContextCompat.getColor(this, R.color.md_white_1000), + PorterDuff.Mode.SRC_IN + ) + } return header } diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt.lite b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt.lite index aab391a885..514c2c866c 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt.lite +++ b/app/src/main/java/org/ole/planet/myplanet/ui/dashboard/DashboardActivity.kt.lite @@ -15,6 +15,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.WindowInsetsCompat @@ -300,7 +301,14 @@ class DashboardActivity : DashboardElementActivity(), OnHomeItemClickListener, N .build() val headerBackground = header.headerBackgroundView headerBackground.setPadding(30, 60, 30, 60) - headerBackground.setColorFilter(ContextCompat.getColor(this, R.color.md_white_1000), PorterDuff.Mode.SRC_IN) + val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO || + (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM && currentNightMode == Configuration.UI_MODE_NIGHT_NO)) { + headerBackground.setColorFilter( + ContextCompat.getColor(this, R.color.md_white_1000), + PorterDuff.Mode.SRC_IN + ) + } return header } diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/news/AdapterNews.kt b/app/src/main/java/org/ole/planet/myplanet/ui/news/AdapterNews.kt index c98f195ffe..bdc2047eae 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/news/AdapterNews.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/news/AdapterNews.kt @@ -3,7 +3,6 @@ package org.ole.planet.myplanet.ui.news import android.app.Activity import android.content.Context import android.content.DialogInterface -import android.content.Intent import android.os.Build import android.view.LayoutInflater import android.view.MenuItem @@ -250,6 +249,7 @@ class AdapterNews(var context: Context, private val list: MutableList = mRealm.where(RealmNews::class.java).sort("time", Sort.DESCENDING).equalTo("replyTo", finalNews?.id, Case.INSENSITIVE).findAll() viewHolder.rowNewsBinding.btnShowReply.text = String.format(context.getString(R.string.show_replies) + " (%d)", replies.size) + viewHolder.rowNewsBinding.btnShowReply.setTextColor(context.getColor(R.color.daynight_textColor)) viewHolder.rowNewsBinding.btnShowReply.visibility = if (replies.isNotEmpty()) { View.VISIBLE } else { diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/onBoarding/OnBoardingAdapter.kt b/app/src/main/java/org/ole/planet/myplanet/ui/onBoarding/OnBoardingAdapter.kt index 5af78f6cb5..b6ef080113 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/onBoarding/OnBoardingAdapter.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/onBoarding/OnBoardingAdapter.kt @@ -1,11 +1,13 @@ package org.ole.planet.myplanet.ui.onBoarding import android.content.Context +import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.annotation.RequiresApi import androidx.viewpager.widget.PagerAdapter import org.ole.planet.myplanet.R @@ -19,6 +21,7 @@ class OnBoardingAdapter(private val mContext: Context, private val onBoardItems: return view == `object` } + @RequiresApi(Build.VERSION_CODES.M) override fun instantiateItem(container: ViewGroup, position: Int): Any { val itemView = LayoutInflater.from(mContext).inflate(R.layout.onboard_item, container, false) @@ -27,8 +30,10 @@ class OnBoardingAdapter(private val mContext: Context, private val onBoardItems: imageView.setImageResource(item.imageID) val tvTitle = itemView.findViewById(R.id.tv_header) tvTitle.text = item.title + tvTitle.setTextColor(mContext.getColor(R.color.daynight_textColor)) val tvContent = itemView.findViewById(R.id.tv_desc) tvContent.text = item.description + tvContent.setTextColor(mContext.getColor(R.color.daynight_textColor)) container.addView(itemView) return itemView diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/survey/SurveyFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/survey/SurveyFragment.kt index 54d47a5a41..e35b76a9e7 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/survey/SurveyFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/survey/SurveyFragment.kt @@ -1,5 +1,6 @@ package org.ole.planet.myplanet.ui.survey +import android.annotation.SuppressLint import android.os.Bundle import android.view.View import android.widget.AdapterView @@ -25,6 +26,7 @@ class SurveyFragment : BaseRecyclerFragment() { }!! } + @SuppressLint("ResourceAsColor") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) spn = requireView().findViewById(R.id.spn_sort) diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/sync/ProcessUserDataActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/sync/ProcessUserDataActivity.kt index f44d85a176..44d70ba0c1 100644 --- a/app/src/main/java/org/ole/planet/myplanet/ui/sync/ProcessUserDataActivity.kt +++ b/app/src/main/java/org/ole/planet/myplanet/ui/sync/ProcessUserDataActivity.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.SharedPreferences +import android.content.res.Configuration import android.graphics.Color import android.graphics.PorterDuff import android.net.Uri @@ -18,6 +19,7 @@ import android.widget.EditText import android.widget.ImageView import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import com.google.android.material.textfield.TextInputLayout import org.ole.planet.myplanet.R @@ -115,7 +117,11 @@ abstract class ProcessUserDataActivity : PermissionActivity(), SuccessListener { val green = Color.green(newColor) val blue = Color.blue(newColor) val alphaWhite = Color.argb(alpha, red, green, blue) - logo.setColorFilter(alphaWhite, PorterDuff.Mode.SRC_ATOP) + val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO || + (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM && currentNightMode == Configuration.UI_MODE_NIGHT_NO)) { + logo.setColorFilter(alphaWhite, PorterDuff.Mode.SRC_ATOP) + } } fun setUrlParts(url: String, password: String): String { diff --git a/app/src/main/java/org/ole/planet/myplanet/views/RoundedListPreference.kt b/app/src/main/java/org/ole/planet/myplanet/views/RoundedListPreference.kt new file mode 100644 index 0000000000..e326fcf96d --- /dev/null +++ b/app/src/main/java/org/ole/planet/myplanet/views/RoundedListPreference.kt @@ -0,0 +1,43 @@ +package org.ole.planet.myplanet.views + +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.util.AttributeSet +import android.view.ContextThemeWrapper +import androidx.preference.ListPreference +import org.ole.planet.myplanet.R + +class RoundedListPreference : ListPreference { + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super( + context, + attrs, + defStyleAttr + ) + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + + constructor(context: Context) : super(context) + + override fun onClick() { + val currentIndex = findIndexOfValue(value) + val dialog = AlertDialog.Builder(ContextThemeWrapper(context, R.style.CustomAlertDialogStyle)) + .setTitle(title) + .setSingleChoiceItems(entryValues, currentIndex) { dialog: DialogInterface, index: Int -> + if (callChangeListener(entryValues[index].toString())) { + setValueIndex(index) + } + dialog.dismiss() + } + .setNegativeButton(R.string.cancel) { dialog: DialogInterface, _: Int -> dialog.dismiss() }.create() + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + dialog.show() + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/alertdialog_background.xml b/app/src/main/res/drawable/alertdialog_background.xml new file mode 100644 index 0000000000..4d7ecdbec7 --- /dev/null +++ b/app/src/main/res/drawable/alertdialog_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/dialog_window_background.xml b/app/src/main/res/drawable/dialog_window_background.xml new file mode 100644 index 0000000000..26d2d4d9a6 --- /dev/null +++ b/app/src/main/res/drawable/dialog_window_background.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/light_rect.xml b/app/src/main/res/drawable/light_rect.xml index a879576c0a..d5728b32f0 100644 --- a/app/src/main/res/drawable/light_rect.xml +++ b/app/src/main/res/drawable/light_rect.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/drawable/non_selected_item_dot.xml b/app/src/main/res/drawable/non_selected_item_dot.xml index ebc327ddec..64032fbda1 100644 --- a/app/src/main/res/drawable/non_selected_item_dot.xml +++ b/app/src/main/res/drawable/non_selected_item_dot.xml @@ -8,5 +8,5 @@ android:width="8dp" android:height="8dp" /> - - \ No newline at end of file + + diff --git a/app/src/main/res/drawable/oval_white.xml b/app/src/main/res/drawable/oval_white.xml index cfbddd473e..84057907cb 100644 --- a/app/src/main/res/drawable/oval_white.xml +++ b/app/src/main/res/drawable/oval_white.xml @@ -3,5 +3,5 @@ android:shape="oval" > - - \ No newline at end of file + + diff --git a/app/src/main/res/drawable/selected_item_dot.xml b/app/src/main/res/drawable/selected_item_dot.xml index dbfb629211..149a7c01ee 100644 --- a/app/src/main/res/drawable/selected_item_dot.xml +++ b/app/src/main/res/drawable/selected_item_dot.xml @@ -7,5 +7,5 @@ android:width="8dp" android:height="8dp" /> - - \ No newline at end of file + + diff --git a/app/src/main/res/layout-night/activity_login.xml b/app/src/main/res/layout-night/activity_login.xml new file mode 100644 index 0000000000..9d3bf889ed --- /dev/null +++ b/app/src/main/res/layout-night/activity_login.xml @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +