Add fragmentForPage method to AndroidFrame interface.

This commit is contained in:
atanasovg
2016-05-30 16:10:46 +03:00
parent 153650fb47
commit 9a8542869e
3 changed files with 44 additions and 2 deletions

View File

@ -4,6 +4,7 @@ import LabelModule = require("ui/label");
import PageTestCommon = require("./page-tests-common"); import PageTestCommon = require("./page-tests-common");
import helper = require("../helper"); import helper = require("../helper");
import frame = require("ui/frame"); import frame = require("ui/frame");
import types = require("utils/types");
global.moduleMerge(PageTestCommon, exports); global.moduleMerge(PageTestCommon, exports);
@ -138,4 +139,22 @@ export var test_ChangePageCaching_BeforeNavigated_DoesNotThrow = function () {
finally { finally {
androidFrame.cachePagesOnNavigate = cachingBefore; androidFrame.cachePagesOnNavigate = cachingBefore;
} }
}
export var test_Resolve_Fragment_ForPage = function () {
var testPage: PageModule.Page;
var pageFactory = function () {
var testPage = new PageModule.Page();
testPage.content = new LabelModule.Label();
return testPage;
};
var topFrame = frame.topmost();
helper.navigate(pageFactory);
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === testPage);
var fragment = topFrame.android.fragmentForPage(testPage);
TKUnit.assertFalse(types.isNullOrUndefined(fragment), "Failed to resolve native fragment for page");
} }

View File

@ -16,6 +16,7 @@ let FRAMEID = "_frameId";
let navDepth = -1; let navDepth = -1;
let fragmentId = -1; let fragmentId = -1;
let activityInitialized = false; let activityInitialized = false;
const PAGE_FRAGMENT_TAG = "_fragmentTag";
function onFragmentShown(fragment: FragmentClass) { function onFragmentShown(fragment: FragmentClass) {
if (trace.enabled) { if (trace.enabled) {
@ -33,8 +34,9 @@ function onFragmentShown(fragment: FragmentClass) {
// TODO: consider putting entry and page in queue so we can safely extract them here. Pass the index of current navigation and extract it from here. // TODO: consider putting entry and page in queue so we can safely extract them here. Pass the index of current navigation and extract it from here.
// After extracting navigation info - remove this index from navigation stack. // After extracting navigation info - remove this index from navigation stack.
var frame = fragment.frame; var frame = fragment.frame;
var entry: definition.BackstackEntry = fragment.entry; var entry = fragment.entry;
var page: pages.Page = entry.resolvedPage; var page = entry.resolvedPage;
page[PAGE_FRAGMENT_TAG] = entry.fragmentTag;
let currentNavigationContext; let currentNavigationContext;
let navigationQueue = (<any>frame)._navigationQueue; let navigationQueue = (<any>frame)._navigationQueue;
@ -70,6 +72,7 @@ function onFragmentHidden(fragment: FragmentClass, destroyed: boolean) {
var isBack = fragment.entry.isBack; var isBack = fragment.entry.isBack;
fragment.entry.isBack = undefined; fragment.entry.isBack = undefined;
fragment.entry.resolvedPage[PAGE_FRAGMENT_TAG] = undefined;
// Handle page transitions. // Handle page transitions.
transitionModule._onFragmentHidden(fragment, isBack, destroyed); transitionModule._onFragmentHidden(fragment, isBack, destroyed);
@ -512,6 +515,20 @@ class AndroidFrame extends Observable implements definition.AndroidFrame {
// can go back only if it is not the main one. // can go back only if it is not the main one.
return this.activity.getIntent().getAction() !== android.content.Intent.ACTION_MAIN; return this.activity.getIntent().getAction() !== android.content.Intent.ACTION_MAIN;
} }
public fragmentForPage(page: pages.Page): any {
if(!page) {
return undefined;
}
let tag = page[PAGE_FRAGMENT_TAG];
if(tag) {
let manager = this.activity.getFragmentManager();
return manager.findFragmentByTag(tag);
}
return undefined;
}
} }
function findPageForFragment(fragment: android.app.Fragment, frame: Frame) { function findPageForFragment(fragment: android.app.Fragment, frame: Frame) {

View File

@ -294,6 +294,12 @@ declare module "ui/frame" {
* Gets or sets whether the page UI will be cached when navigating away from the page. * Gets or sets whether the page UI will be cached when navigating away from the page.
*/ */
cachePagesOnNavigate: boolean; cachePagesOnNavigate: boolean;
/**
* Finds the native android.app.Fragment instance created for the specified Page.
* @param page The Page instance to search for.
*/
fragmentForPage(page: pages.Page): any;
} }
/* tslint:disable */ /* tslint:disable */