123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- package com.reactnativenavigation.controllers;
-
- import android.content.Intent;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.view.KeyEvent;
-
- import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
- import com.reactnativenavigation.NavigationApplication;
- import com.reactnativenavigation.layouts.Layout;
- import com.reactnativenavigation.layouts.LayoutFactory;
- import com.reactnativenavigation.params.ActivityParams;
- import com.reactnativenavigation.params.ScreenParams;
- import com.reactnativenavigation.params.TitleBarButtonParams;
- import com.reactnativenavigation.react.JsDevReloadHandler;
- import com.reactnativenavigation.react.NavigationReactInstance;
- import com.reactnativenavigation.react.RedboxPermission;
-
- import java.util.List;
-
- public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler, NavigationReactInstance.OnJsDevReloadListener {
-
- /**
- * Although we start multiple activities, we make sure to pass Intent.CLEAR_TASK | Intent.NEW_TASK
- * So that we actually have only 1 instance of the activity running at one time.
- * We hold the currentActivity (resume->pause) so we know when we need to destroy the javascript context
- * (when currentActivity is null, ie pause and destroy was called without resume).
- * This is somewhat weird, and in the future we better use a single activity with changing contentView similar to ReactNative impl.
- * Along with that, we should handle commands from the bridge using onNewIntent
- */
- static NavigationActivity currentActivity;
-
- private ActivityParams activityParams;
- private ModalController modalController;
- private Layout layout;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- RedboxPermission.permissionToShowRedboxIfNeeded(this);
-
- activityParams = NavigationCommandsHandler.getActivityParams(getIntent());
-
- createLayout();
- createModalController();
- }
-
- private void createModalController() {
- modalController = new ModalController(this);
- }
-
- private void createLayout() {
- layout = LayoutFactory.create(this, activityParams);
- setContentView(layout.asView());
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- currentActivity = this;
- getNavigationReactInstance().onResume(this, this, this);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- currentActivity = null;
- getNavigationReactInstance().onPause();
- }
-
- @Override
- protected void onDestroy() {
- modalController.onDestroy();
- layout.onDestroy();
- super.onDestroy();
- if (currentActivity == null || currentActivity.isFinishing()) {
- getNavigationReactInstance().onHostDestroy();
- }
- }
-
- @Override
- public void onJsDevReload() {
- layout.removeAllReactViews();
- }
-
- @Override
- public void invokeDefaultOnBackPressed() {
- super.onBackPressed();
- }
-
- @Override
- public void onBackPressed() {
- if (modalController.onBackPressed()) {
- return;
- }
- if (layout.onBackPressed()) {
- return;
- }
- getNavigationReactInstance().onBackPressed();
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- getNavigationReactInstance().onActivityResult(requestCode, resultCode, data);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- return JsDevReloadHandler.onKeyUp(getCurrentFocus(), keyCode) || super.onKeyUp(keyCode, event);
- }
-
- private NavigationReactInstance getNavigationReactInstance() {
- return NavigationApplication.instance.getNavigationReactInstance();
- }
-
- void push(ScreenParams params) {
- if (modalController.isShowing()) {
- modalController.push(params);
- } else {
- layout.push(params);
- }
- }
-
- void pop(ScreenParams params) {
- layout.pop(params);
- }
-
- void popToRoot(ScreenParams params) {
- layout.popToRoot(params);
- }
-
- void newStack(ScreenParams params) {
- layout.newStack(params);
- }
-
- void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
- layout.setTopBarVisible(screenInstanceId, hidden, animated);
- }
-
- void setTitleBarTitle(String screenInstanceId, String title) {
- layout.setTitleBarTitle(screenInstanceId, title);
- }
-
- public void setTitleBarButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
- layout.setTitleBarButtons(screenInstanceId, navigatorEventId, titleBarButtons);
- }
-
- void showModal(ScreenParams screenParams) {
- modalController.showModal(screenParams);
- }
- }
|