Skip to content
This repository has been archived by the owner on Mar 24, 2020. It is now read-only.

Commit

Permalink
Fix onActivityResult dispatching
Browse files Browse the repository at this point in the history
  • Loading branch information
chalup committed May 12, 2015
1 parent d109fdf commit 0c8d6c8
Showing 1 changed file with 70 additions and 11 deletions.
81 changes: 70 additions & 11 deletions src/java/android/support/v4/app/FragmentActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

/**
* Base class for activities that want to use the support-based
Expand Down Expand Up @@ -147,17 +149,11 @@ static final class NonConfigurationInstances {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mFragments.noteStateNotSaved();
int index = requestCode>>16;
if (index != 0) {
index--;
if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) {
Log.w(TAG, "Activity result fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = mFragments.mActive.get(index);
int treeIndex = requestCode>>16;
if (treeIndex != 0) {
Fragment frag = findFragmentByTreeIndex(treeIndex - 1);
if (frag == null) {
Log.w(TAG, "Activity result no fragment exists for index: 0x"
Log.w(TAG, "Activity result no fragment exists for treeIndex: 0x"
+ Integer.toHexString(requestCode));
} else {
frag.onActivityResult(requestCode&0xffff, resultCode, data);
Expand Down Expand Up @@ -829,7 +825,70 @@ public void startActivityFromFragment(Fragment fragment, Intent intent,
if ((requestCode&0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff));
super.startActivityForResult(intent, (getFragmentTreeIndex(fragment)<<16) + (requestCode&0xffff));
}

private Fragment findFragmentByTreeIndex(int treeIndex) {
BreadthFirstFragmentIterator iterator = new BreadthFirstFragmentIterator(this);

while (iterator.hasNext() && treeIndex > 0) {
iterator.next();
treeIndex--;
}

return iterator.hasNext() ? iterator.next() : null;
}

private int getFragmentTreeIndex(Fragment fragment) {
int index = 0;

BreadthFirstFragmentIterator iterator = new BreadthFirstFragmentIterator(this);
while (iterator.hasNext()) {
index++;
if (iterator.next() == fragment) {
return index;
}
}

throw new IllegalArgumentException("Fragment " + fragment + " not found");
}

private final static class BreadthFirstFragmentIterator implements Iterator<Fragment> {
private final LinkedList<Fragment> mQueue = new LinkedList<Fragment>();

BreadthFirstFragmentIterator(FragmentActivity activity) {
addAll(activity.mFragments);
}

private void addAll(FragmentManagerImpl fragments) {
if (fragments != null) {
ArrayList<Fragment> activeChildFragments = fragments.mActive;
if (activeChildFragments != null) {
for (Fragment fragment : activeChildFragments) {
if (fragment != null) {
mQueue.add(fragment);
}
}
}
}
}

@Override
public boolean hasNext() {
return !mQueue.isEmpty();
}

@Override
public Fragment next() {
Fragment fragment = mQueue.remove();
addAll(fragment.mChildFragmentManager);
return fragment;
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}
}

void invalidateSupportFragment(String who) {
Expand Down

0 comments on commit 0c8d6c8

Please sign in to comment.