diff --git a/android/app/src/main/java/com/mattermost/share/ShareActivity.java b/android/app/src/main/java/com/mattermost/share/ShareActivity.java index 573f9ac83..640098538 100644 --- a/android/app/src/main/java/com/mattermost/share/ShareActivity.java +++ b/android/app/src/main/java/com/mattermost/share/ShareActivity.java @@ -17,4 +17,9 @@ public class ShareActivity extends ReactActivity { MainApplication app = (MainApplication) this.getApplication(); app.sharedExtensionIsOpened = true; } + + @Override + public void onBackPressed() { + finish(); + } } diff --git a/app/screens/channel/channel.android.js b/app/screens/channel/channel.android.js index 6dad2a820..7eccd0eb8 100644 --- a/app/screens/channel/channel.android.js +++ b/app/screens/channel/channel.android.js @@ -2,7 +2,7 @@ // See LICENSE.txt for license information. import React from 'react'; -import {StyleSheet, View} from 'react-native'; +import {StyleSheet, View, BackHandler, ToastAndroid} from 'react-native'; import {openMainSideMenu, openSettingsSideMenu} from '@actions/navigation'; import LocalConfig from '@assets/config'; @@ -12,12 +12,15 @@ import NetworkIndicator from '@components/network_indicator'; import PostDraft from '@components/post_draft'; import {NavigationTypes} from '@constants'; import EventEmitter from '@mm-redux/utils/event_emitter'; +import EphemeralStore from '@store/ephemeral_store'; import ChannelNavBar from './channel_nav_bar'; import ChannelPostList from './channel_post_list'; import ChannelBase, {ClientUpgradeListener} from './channel_base'; +let backPressedCount = 0; + export default class ChannelAndroid extends ChannelBase { openMainSidebar = () => { EventEmitter.emit(NavigationTypes.BLUR_POST_DRAFT); @@ -29,6 +32,33 @@ export default class ChannelAndroid extends ChannelBase { openSettingsSideMenu(); }; + componentDidMount() { + super.componentDidMount(); + BackHandler.addEventListener('hardwareBackPress', this.handleBackPress); + } + + handleBackPress = () => { + if (!backPressedCount && EphemeralStore.getNavigationTopComponentId() === 'Channel') { + const {formatMessage} = this.context.intl; + backPressedCount++; + ToastAndroid.show(formatMessage({ + id: 'mobile.android.back_handler_exit', + defaultMessage: 'Press back again to exit', + }), ToastAndroid.SHORT); + setTimeout(() => { + backPressedCount = 0; + }, 2000); + return true; + } + backPressedCount = 0; + return false; + }; + + componentWillUnmount() { + super.componentWillUnmount(); + BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress); + } + render() { const {theme} = this.props; let component = this.renderLoadingOrFailedChannel(); diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index 0c6fb8f53..ff367c690 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -140,6 +140,7 @@ "mobile.advanced_settings.timezone": "Timezone", "mobile.advanced_settings.title": "Advanced Settings", "mobile.alert_dialog.alertCancel": "Cancel", + "mobile.android.back_handler_exit": "Press back again to exit", "mobile.android.photos_permission_denied_description": "Upload photos to your Mattermost instance or save them to your device. Open Settings to grant Mattermost Read and Write access to your photo library.", "mobile.android.photos_permission_denied_title": "{applicationName} would like to access your photos", "mobile.android.videos_permission_denied_description": "Upload videos to your Mattermost instance or save them to your device. Open Settings to grant Mattermost Read and Write access to your video library.",