diff --git a/app/core/src/main/java/com/fsck/k9/K9.kt b/app/core/src/main/java/com/fsck/k9/K9.kt index 5af58bbee5d02623b5fffabfb02cc171007e898d..1fe5fafaa4132876a6166163dd41e3f7cd8632dd 100644 --- a/app/core/src/main/java/com/fsck/k9/K9.kt +++ b/app/core/src/main/java/com/fsck/k9/K9.kt @@ -140,6 +140,16 @@ object K9 : EarlyInit { @JvmStatic var isConfirmSpam = false + @JvmStatic + var appTheme = AppTheme.FOLLOW_SYSTEM + + var messageViewTheme = SubTheme.USE_GLOBAL + var messageComposeTheme = SubTheme.USE_GLOBAL + + @JvmStatic + var isFixedMessageViewTheme = true + + @JvmStatic var isConfirmDeleteFromNotification = true diff --git a/app/core/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java b/app/core/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java deleted file mode 100644 index a8f4f865f5ac99853b16a07d56828fbd3ee65796..0000000000000000000000000000000000000000 --- a/app/core/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.fsck.k9.notification; - - -import android.app.PendingIntent; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; - -import com.fsck.k9.Account; - -import static com.fsck.k9.notification.NotificationHelper.NOTIFICATION_LED_BLINK_FAST; -import static com.fsck.k9.notification.NotificationHelper.NOTIFICATION_LED_FAILURE_COLOR; - - -class CertificateErrorNotifications { - private final NotificationHelper notificationHelper; - private final NotificationActionCreator actionCreator; - private final NotificationResourceProvider resourceProvider; - - - public CertificateErrorNotifications(NotificationHelper notificationHelper, - NotificationActionCreator actionCreator, NotificationResourceProvider resourceProvider) { - this.notificationHelper = notificationHelper; - this.actionCreator = actionCreator; - this.resourceProvider = resourceProvider; - } - - public void showCertificateErrorNotification(Account account, boolean incoming) { - int notificationId = NotificationIds.getCertificateErrorNotificationId(account, incoming); - - PendingIntent editServerSettingsPendingIntent = createContentIntent(account, incoming); - String title = resourceProvider.certificateErrorTitle(account.getDescription()); - String text = resourceProvider.certificateErrorBody(); - - NotificationCompat.Builder builder = notificationHelper - .createNotificationBuilder(account, NotificationChannelManager.ChannelType.MISCELLANEOUS) - .setSmallIcon(resourceProvider.getIconWarning()) - .setWhen(System.currentTimeMillis()) - .setAutoCancel(true) - .setTicker(title) - .setContentTitle(title) - .setContentText(text) - .setContentIntent(editServerSettingsPendingIntent) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setCategory(NotificationCompat.CATEGORY_ERROR); - - notificationHelper.configureNotification(builder, null, null, - NOTIFICATION_LED_FAILURE_COLOR, - NOTIFICATION_LED_BLINK_FAST, true); - - getNotificationManager().notify(notificationId, builder.build()); - } - - public void clearCertificateErrorNotifications(Account account, boolean incoming) { - int notificationId = NotificationIds.getCertificateErrorNotificationId(account, incoming); - getNotificationManager().cancel(notificationId); - } - - PendingIntent createContentIntent(Account account, boolean incoming) { - return incoming ? - actionCreator.getEditIncomingServerSettingsIntent(account) : - actionCreator.getEditOutgoingServerSettingsIntent(account); - } - - private NotificationManagerCompat getNotificationManager() { - return notificationHelper.getNotificationManager(); - } -} diff --git a/app/core/src/main/java/com/fsck/k9/notification/NotificationIds.kt b/app/core/src/main/java/com/fsck/k9/notification/NotificationIds.kt index cd95643d483677a8d5658bd23387e88d06e0db37..a074c61774b8d3299f890213de8c5e9d9ea7895a 100644 --- a/app/core/src/main/java/com/fsck/k9/notification/NotificationIds.kt +++ b/app/core/src/main/java/com/fsck/k9/notification/NotificationIds.kt @@ -44,6 +44,7 @@ internal object NotificationIds { return getBaseNotificationId(account) + OFFSET_SEND_FAILED_NOTIFICATION } + fun getCertificateErrorNotificationId(account: Account, incoming: Boolean): Int { val offset = if (incoming) OFFSET_CERTIFICATE_ERROR_INCOMING else OFFSET_CERTIFICATE_ERROR_OUTGOING diff --git a/app/core/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java b/app/core/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java deleted file mode 100644 index 660a50b9f1aafb0c7293903b9e432baba3e17ea9..0000000000000000000000000000000000000000 --- a/app/core/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.fsck.k9.notification; - - -import android.app.PendingIntent; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; - -import com.fsck.k9.Account; -import com.fsck.k9.helper.ExceptionHelper; - -import static com.fsck.k9.notification.NotificationHelper.NOTIFICATION_LED_BLINK_FAST; -import static com.fsck.k9.notification.NotificationHelper.NOTIFICATION_LED_FAILURE_COLOR; - - -class SendFailedNotifications { - private final NotificationHelper notificationHelper; - private final NotificationActionCreator actionBuilder; - private final NotificationResourceProvider resourceProvider; - - - public SendFailedNotifications(NotificationHelper notificationHelper, NotificationActionCreator actionBuilder, - NotificationResourceProvider resourceProvider) { - this.notificationHelper = notificationHelper; - this.actionBuilder = actionBuilder; - this.resourceProvider = resourceProvider; - } - - public void showSendFailedNotification(Account account, Exception exception) { - String title = resourceProvider.sendFailedTitle(); - String text = ExceptionHelper.getRootCauseMessage(exception); - - int notificationId = NotificationIds.getSendFailedNotificationId(account); - PendingIntent folderListPendingIntent = actionBuilder.createViewFolderListPendingIntent( - account, notificationId); - - NotificationCompat.Builder builder = notificationHelper - .createNotificationBuilder(account, NotificationChannelManager.ChannelType.MISCELLANEOUS) - .setSmallIcon(resourceProvider.getIconWarning()) - .setWhen(System.currentTimeMillis()) - .setAutoCancel(true) - .setTicker(title) - .setContentTitle(title) - .setContentText(text) - .setContentIntent(folderListPendingIntent) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setCategory(NotificationCompat.CATEGORY_ERROR); - - notificationHelper.configureNotification(builder, null, null, NOTIFICATION_LED_FAILURE_COLOR, - NOTIFICATION_LED_BLINK_FAST, true); - - getNotificationManager().notify(notificationId, builder.build()); - } - - public void clearSendFailedNotification(Account account) { - int notificationId = NotificationIds.getSendFailedNotificationId(account); - getNotificationManager().cancel(notificationId); - } - - private NotificationManagerCompat getNotificationManager() { - return notificationHelper.getNotificationManager(); - } -} diff --git a/app/k9mail/src/main/AndroidManifest.xml b/app/k9mail/src/main/AndroidManifest.xml index 70ee5d303a2e94cdf75732771d39f4f79c1339a6..85e38be8ddf6c7f51957ae78afbdcc45e37587e6 100644 --- a/app/k9mail/src/main/AndroidManifest.xml +++ b/app/k9mail/src/main/AndroidManifest.xml @@ -347,7 +347,7 @@ diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index 572d53d47534e8348609b346d8d1d4329c0ce700..7c5e0965567839d5eb75252ea4d117d7e18ea4d7 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -45,7 +45,7 @@ import com.fsck.k9.fragment.MessageListFragment.MessageListFragmentListener import com.fsck.k9.helper.Contacts import com.fsck.k9.helper.ParcelableUtil import com.fsck.k9.mailstore.SearchStatusManager -import com.fsck.k9.mailstore.StorageManager.StorageListener + import com.fsck.k9.notification.NotificationChannelManager import com.fsck.k9.preferences.GeneralSettingsManager import com.fsck.k9.search.LocalSearch @@ -103,7 +103,7 @@ open class MessageList : private val generalSettingsManager: GeneralSettingsManager by inject() private val messagingController: MessagingController by inject() - private val storageListener: StorageListener = StorageListenerImplementation() + private val permissionUiHelper: PermissionUiHelper = K9PermissionUiHelper(this) private lateinit var actionBar: ActionBar @@ -145,7 +145,7 @@ open class MessageList : public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val accounts = preferences.accounts + var accounts = preferences.accounts deleteIncompleteAccounts(accounts) accountManager = AccountManager.get(this) @@ -415,10 +415,6 @@ open class MessageList : messageReference = launchData.messageReference messageViewOnly = launchData.messageViewOnly - if (!account.isAvailable(this)) { - onAccountUnavailable() - return false - } return true } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt index d14f3bba99b580586a2286f526bb1ab89fa5ead5..7c8262c284f1c3cd9762afee01ece61271b283eb 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt @@ -366,7 +366,7 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K folderList.unifiedInbox?.let { unifiedInbox -> val unifiedInboxItem = PrimaryDrawerItem().apply { - iconRes = getResId(R.attr.iconUnifiedInbox) + iconRes = R.drawable.ic_inbox_multiple //getResId(R.attr.iconUnifiedInbox) identifier = DRAWER_ID_UNIFIED_INBOX nameRes = R.string.integrated_inbox_title selectedColorInt = selectedBackgroundColor diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/OnboardingActivity.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/OnboardingActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..00952cd438a4214a5ceb91169bd34036925c8a05 --- /dev/null +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/OnboardingActivity.kt @@ -0,0 +1,43 @@ +package com.fsck.k9.ui.onboarding + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import androidx.navigation.NavController +import androidx.navigation.ui.AppBarConfiguration +import androidx.navigation.ui.setupActionBarWithNavController +import com.fsck.k9.ui.R +import com.fsck.k9.ui.base.K9Activity +import com.fsck.k9.ui.base.extensions.findNavController + +class OnboardingActivity : K9Activity() { + private lateinit var navController: NavController + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setLayout(R.layout.activity_onboarding) + setTitle(R.string.account_setup_basics_title) + + initializeActionBar() + } + + private fun initializeActionBar() { + val appBarConfiguration = AppBarConfiguration(topLevelDestinationIds = setOf(R.id.welcomeScreen)) + + navController = findNavController(R.id.nav_host_fragment) + setupActionBarWithNavController(navController, appBarConfiguration) + } + + override fun onSupportNavigateUp(): Boolean { + return navController.navigateUp() || super.onSupportNavigateUp() + } + + companion object { + @JvmStatic fun launch(activity: Activity) { + val intent = Intent(activity, OnboardingActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + activity.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..41629b9b6dd5f9dbc375e9f3edfbbe7f9b1ef3ba --- /dev/null +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt @@ -0,0 +1,62 @@ +package com.fsck.k9.ui.onboarding + +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.fsck.k9.ui.BuildConfig +import com.fsck.k9.ui.R +import com.fsck.k9.ui.helper.HtmlToSpanned +import com.fsck.k9.ui.observeNotNull +import com.fsck.k9.ui.settings.import.SettingsImportResultViewModel +import com.fsck.k9.ui.settings.import.SettingsImportSuccess +import org.koin.android.ext.android.inject +import org.koin.androidx.viewmodel.ext.android.sharedViewModel + +class WelcomeFragment : Fragment() { + private val htmlToSpanned: HtmlToSpanned by inject() + private val importResultViewModel: SettingsImportResultViewModel by sharedViewModel() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_welcome_message, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val welcome: TextView = view.findViewById(R.id.welcome_message) + welcome.text = htmlToSpanned.convert(getString(R.string.accounts_welcome)) + welcome.movementMethod = LinkMovementMethod.getInstance() + + view.findViewById(R.id.next).setOnClickListener { launchAccountSetup() } + view.findViewById(R.id.import_settings).setOnClickListener { launchImportSettings() } + + importResultViewModel.settingsImportResult.observeNotNull(this) { + if (it == SettingsImportSuccess) { + launchMessageList() + } + } + } + + private fun launchAccountSetup() { + if (BuildConfig.USE_NEW_SETUP_UI_FOR_ONBOARDING) { + findNavController().navigate(R.id.action_welcomeScreen_to_newAddAccountScreen) + } else { + findNavController().navigate(R.id.action_welcomeScreen_to_addAccountScreen) + requireActivity().finish() + } + } + + private fun launchImportSettings() { + findNavController().navigate(R.id.action_welcomeScreen_to_settingsImportScreen) + } + + private fun launchMessageList() { + findNavController().navigate(R.id.action_welcomeScreen_to_messageListScreen) + requireActivity().finish() + } +} \ No newline at end of file diff --git a/app/ui/legacy/src/main/res/navigation/navigation_onboarding.xml b/app/ui/legacy/src/main/res/navigation/navigation_onboarding.xml new file mode 100644 index 0000000000000000000000000000000000000000..03d12ab54b1656f2122c782de50c48c80cdc2d1d --- /dev/null +++ b/app/ui/legacy/src/main/res/navigation/navigation_onboarding.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file