Fixing fragment instance restore

This commit is contained in:
Ernir Erlingsson
2016-06-13 23:06:38 +02:00
parent 192ee41600
commit 8a29207bd0
20 changed files with 213 additions and 205 deletions

View File

@@ -2,25 +2,29 @@ package org.briarproject.android;
import android.app.Activity; import android.app.Activity;
import org.briarproject.android.blogs.MyBlogsFragment;
import org.briarproject.android.contact.ContactListFragment;
import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.contact.ConversationActivity;
import org.briarproject.android.forum.AvailableForumsActivity; import org.briarproject.android.forum.AvailableForumsActivity;
import org.briarproject.android.forum.ContactSelectorFragment; import org.briarproject.android.forum.ContactSelectorFragment;
import org.briarproject.android.forum.CreateForumActivity; import org.briarproject.android.forum.CreateForumActivity;
import org.briarproject.android.forum.ForumActivity; import org.briarproject.android.forum.ForumActivity;
import org.briarproject.android.forum.ForumListFragment;
import org.briarproject.android.forum.ForumSharingStatusActivity; import org.briarproject.android.forum.ForumSharingStatusActivity;
import org.briarproject.android.forum.ShareForumActivity; import org.briarproject.android.forum.ShareForumActivity;
import org.briarproject.android.forum.ShareForumMessageFragment; import org.briarproject.android.forum.ShareForumMessageFragment;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.identity.CreateIdentityActivity;
import org.briarproject.android.introduction.ContactChooserFragment;
import org.briarproject.android.introduction.IntroductionActivity; import org.briarproject.android.introduction.IntroductionActivity;
import org.briarproject.android.introduction.IntroductionMessageFragment; import org.briarproject.android.introduction.IntroductionMessageFragment;
import org.briarproject.android.invitation.AddContactActivity; import org.briarproject.android.invitation.AddContactActivity;
import org.briarproject.android.keyagreement.ChooseIdentityFragment;
import org.briarproject.android.keyagreement.KeyAgreementActivity; import org.briarproject.android.keyagreement.KeyAgreementActivity;
import org.briarproject.android.keyagreement.ShowQrCodeFragment;
import org.briarproject.android.panic.PanicPreferencesActivity; import org.briarproject.android.panic.PanicPreferencesActivity;
import org.briarproject.android.panic.PanicResponderActivity; import org.briarproject.android.panic.PanicResponderActivity;
import javax.inject.Named;
import dagger.Component; import dagger.Component;
@ActivityScope @ActivityScope
@@ -66,33 +70,16 @@ public interface ActivityComponent {
void inject(IntroductionActivity activity); void inject(IntroductionActivity activity);
@Named("ContactListFragment") // Fragments
BaseFragment newContactListFragment(); void inject(ContactListFragment fragment);
void inject(ForumListFragment fragment);
void inject(BaseFragment fragment);
void inject(MyBlogsFragment fragment);
void inject(ChooseIdentityFragment fragment);
void inject(ShowQrCodeFragment fragment);
void inject(ContactChooserFragment fragment);
void inject(ContactSelectorFragment fragment);
void inject(ShareForumMessageFragment fragment);
void inject(IntroductionMessageFragment fragment);
@Named("ForumListFragment")
BaseFragment newForumListFragment();
@Named("BlogsFragment")
BaseFragment newBlogsFragment();
@Named("MyBlogsFragment")
BaseFragment newMyBlogsFragment();
@Named("ChooseIdentityFragment")
BaseFragment newChooseIdentityFragment();
@Named("ShowQrCodeFragment")
BaseFragment newShowQrCodeFragment();
@Named("ContactChooserFragment")
BaseFragment newContactChooserFragment();
@Named("ContactSelectorFragment")
ContactSelectorFragment newContactSelectorFragment();
@Named("ShareForumMessageFragment")
ShareForumMessageFragment newShareForumMessageFragment();
@Named("IntroductionMessageFragment")
IntroductionMessageFragment newIntroductionMessageFragment();
} }

View File

@@ -3,19 +3,13 @@ package org.briarproject.android;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle;
import org.briarproject.android.blogs.BlogsFragment;
import org.briarproject.android.blogs.MyBlogsFragment;
import org.briarproject.android.contact.ContactListFragment;
import org.briarproject.android.controller.BriarController; import org.briarproject.android.controller.BriarController;
import org.briarproject.android.controller.BriarControllerImpl; import org.briarproject.android.controller.BriarControllerImpl;
import org.briarproject.android.controller.ConfigController; import org.briarproject.android.controller.ConfigController;
import org.briarproject.android.controller.ConfigControllerImpl; import org.briarproject.android.controller.ConfigControllerImpl;
import org.briarproject.android.controller.DbController; import org.briarproject.android.controller.DbController;
import org.briarproject.android.controller.DbControllerImpl; import org.briarproject.android.controller.DbControllerImpl;
import org.briarproject.android.forum.ForumController;
import org.briarproject.android.forum.ForumControllerImpl;
import org.briarproject.android.controller.NavDrawerController; import org.briarproject.android.controller.NavDrawerController;
import org.briarproject.android.controller.NavDrawerControllerImpl; import org.briarproject.android.controller.NavDrawerControllerImpl;
import org.briarproject.android.controller.PasswordController; import org.briarproject.android.controller.PasswordController;
@@ -23,15 +17,9 @@ import org.briarproject.android.controller.PasswordControllerImpl;
import org.briarproject.android.controller.SetupController; import org.briarproject.android.controller.SetupController;
import org.briarproject.android.controller.SetupControllerImpl; import org.briarproject.android.controller.SetupControllerImpl;
import org.briarproject.android.controller.TransportStateListener; import org.briarproject.android.controller.TransportStateListener;
import org.briarproject.android.forum.ContactSelectorFragment; import org.briarproject.android.forum.ForumController;
import org.briarproject.android.forum.ForumListFragment; import org.briarproject.android.forum.ForumControllerImpl;
import org.briarproject.android.forum.ForumTestControllerImpl; import org.briarproject.android.forum.ForumTestControllerImpl;
import org.briarproject.android.forum.ShareForumMessageFragment;
import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.introduction.ContactChooserFragment;
import org.briarproject.android.introduction.IntroductionMessageFragment;
import org.briarproject.android.keyagreement.ChooseIdentityFragment;
import org.briarproject.android.keyagreement.ShowQrCodeFragment;
import javax.inject.Named; import javax.inject.Named;
@@ -137,78 +125,4 @@ public class ActivityModule {
return new BriarServiceConnection(); return new BriarServiceConnection();
} }
@Provides
@Named("ForumListFragment")
BaseFragment provideForumListFragment(ForumListFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ContactListFragment")
BaseFragment provideContactListFragment(ContactListFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("BlogsFragment")
BaseFragment provideBlogsFragment(BlogsFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("MyBlogsFragment")
BaseFragment provideMyBlogsFragment(MyBlogsFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ChooseIdentityFragment")
BaseFragment provideChooseIdentityFragment(
ChooseIdentityFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ShowQrCodeFragment")
BaseFragment provideShowQrCodeFragment(ShowQrCodeFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ContactChooserFragment")
BaseFragment provideContactChooserFragment(
ContactChooserFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ContactSelectorFragment")
ContactSelectorFragment provideContactSelectorFragment(
ContactSelectorFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("ShareForumMessageFragment")
ShareForumMessageFragment provideShareForumMessageFragment(
ShareForumMessageFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
@Provides
@Named("IntroductionMessageFragment")
IntroductionMessageFragment provideIntroductionMessageFragment(
IntroductionMessageFragment fragment) {
fragment.setArguments(new Bundle());
return fragment;
}
} }

View File

@@ -49,6 +49,10 @@ public abstract class BaseActivity extends AppCompatActivity {
} }
} }
public ActivityComponent getActivityComponent() {
return activityComponent;
}
// This exists to make test overrides easier // This exists to make test overrides easier
protected ActivityModule getActivityModule() { protected ActivityModule getActivityModule() {
return new ActivityModule(this); return new ActivityModule(this);

View File

@@ -52,13 +52,17 @@ public abstract class BriarFragmentActivity extends BriarActivity {
exiting. This models the typical Google navigation behaviour such exiting. This models the typical Google navigation behaviour such
as in Gmail/Inbox. as in Gmail/Inbox.
*/ */
startFragment(activityComponent.newContactListFragment()); startFragment(ContactListFragment.newInstance());
} else { } else {
super.onBackPressed(); super.onBackPressed();
} }
} }
public void onFragmentCreated(String tag) {
updateToolbarTitle(tag);
}
protected void startFragment(BaseFragment fragment) { protected void startFragment(BaseFragment fragment) {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) if (getSupportFragmentManager().getBackStackEntryCount() == 0)
startFragment(fragment, false); startFragment(fragment, false);
@@ -94,6 +98,5 @@ public abstract class BriarFragmentActivity extends BriarActivity {
trans.addToBackStack(fragment.getUniqueTag()); trans.addToBackStack(fragment.getUniqueTag());
} }
trans.commit(); trans.commit();
updateToolbarTitle(fragment.getUniqueTag());
} }
} }

View File

@@ -21,9 +21,12 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.blogs.BlogsFragment;
import org.briarproject.android.contact.ContactListFragment;
import org.briarproject.android.controller.NavDrawerController; import org.briarproject.android.controller.NavDrawerController;
import org.briarproject.android.controller.TransportStateListener; import org.briarproject.android.controller.TransportStateListener;
import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.android.controller.handler.UiResultHandler;
import org.briarproject.android.forum.ForumListFragment;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.util.CustomAnimations; import org.briarproject.android.util.CustomAnimations;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
@@ -49,8 +52,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
public static final String INTENT_CONTACTS = "intent_contacts"; public static final String INTENT_CONTACTS = "intent_contacts";
public static final String INTENT_FORUMS = "intent_forums"; public static final String INTENT_FORUMS = "intent_forums";
private static final String KEY_CURRENT_FRAGMENT_ID = "key_current_id";
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(NavDrawerActivity.class.getName()); Logger.getLogger(NavDrawerActivity.class.getName());
@@ -66,7 +67,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
private List<Transport> transports; private List<Transport> transports;
private BaseAdapter transportsAdapter; private BaseAdapter transportsAdapter;
private int currentFragmentId = R.id.nav_btn_contacts;
@Override @Override
protected void onNewIntent(Intent intent) { protected void onNewIntent(Intent intent) {
@@ -74,10 +74,12 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
exitIfStartupFailed(intent); exitIfStartupFailed(intent);
checkAuthorHandle(intent); checkAuthorHandle(intent);
clearBackStack(); clearBackStack();
if (intent.getBooleanExtra(INTENT_FORUMS, false)) if (intent.getBooleanExtra(INTENT_FORUMS, false)) {
startFragment(activityComponent.newForumListFragment()); startFragment(ForumListFragment.newInstance());
else if (intent.getBooleanExtra(INTENT_CONTACTS, false)) }
startFragment(activityComponent.newContactListFragment()); else if (intent.getBooleanExtra(INTENT_CONTACTS, false)) {
startFragment(ContactListFragment.newInstance());
}
} }
@Override @Override
@@ -109,22 +111,17 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
R.string.nav_drawer_close_description); R.string.nav_drawer_close_description);
drawerLayout.addDrawerListener(drawerToggle); drawerLayout.addDrawerListener(drawerToggle);
navigation.setNavigationItemSelectedListener(this); navigation.setNavigationItemSelectedListener(this);
if (state == null) {
navigation.setCheckedItem(R.id.nav_btn_contacts);
startFragment(activityComponent.newContactListFragment());
}
checkAuthorHandle(getIntent()); checkAuthorHandle(getIntent());
initializeTransports(getLayoutInflater()); initializeTransports(getLayoutInflater());
transportsView.setAdapter(transportsAdapter); transportsView.setAdapter(transportsAdapter);
welcomeMessageCheck(); welcomeMessageCheck();
}
@Override if (state == null) {
public void onSaveInstanceState(Bundle outState) { navigation.setCheckedItem(R.id.nav_btn_contacts);
super.onSaveInstanceState(outState); startFragment(ContactListFragment.newInstance());
outState.putInt(KEY_CURRENT_FRAGMENT_ID, currentFragmentId); }
} }
private void welcomeMessageCheck() { private void welcomeMessageCheck() {
@@ -171,16 +168,17 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
}); });
} }
private void loadCurrentFragment() { private void loadFragment(int fragmentId) {
switch (currentFragmentId) { // TODO re-use fragments from the manager when possible
switch (fragmentId) {
case R.id.nav_btn_contacts: case R.id.nav_btn_contacts:
startFragment(activityComponent.newContactListFragment()); startFragment(ContactListFragment.newInstance());
break; break;
case R.id.nav_btn_forums: case R.id.nav_btn_forums:
startFragment(activityComponent.newForumListFragment()); startFragment(ForumListFragment.newInstance());
break; break;
case R.id.nav_btn_blogs: case R.id.nav_btn_blogs:
startFragment(activityComponent.newBlogsFragment()); startFragment(BlogsFragment.newInstance());
break; break;
case R.id.nav_btn_settings: case R.id.nav_btn_settings:
startActivity(new Intent(this, SettingsActivity.class)); startActivity(new Intent(this, SettingsActivity.class));
@@ -195,8 +193,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
public boolean onNavigationItemSelected(MenuItem item) { public boolean onNavigationItemSelected(MenuItem item) {
drawerLayout.closeDrawer(START); drawerLayout.closeDrawer(START);
clearBackStack(); clearBackStack();
currentFragmentId = item.getItemId(); loadFragment(item.getItemId());
loadCurrentFragment();
return true; return true;
} }

View File

@@ -12,23 +12,23 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import javax.inject.Inject;
public class BlogsFragment extends BaseFragment { public class BlogsFragment extends BaseFragment {
public final static String TAG = BlogsFragment.class.getName(); public final static String TAG = BlogsFragment.class.getName();
// TODO add your first fragment here
//@Inject
//Lazy<MyBlogsFragment> myBlogsFragment;
private static final String SELECTED_TAB = "selectedTab"; private static final String SELECTED_TAB = "selectedTab";
private TabLayout tabLayout; private TabLayout tabLayout;
@Inject public static BlogsFragment newInstance() {
public BlogsFragment() {
Bundle args = new Bundle();
BlogsFragment fragment = new BlogsFragment();
fragment.setArguments(args);
return fragment;
} }
@Nullable @Nullable
@@ -72,6 +72,11 @@ public class BlogsFragment extends BaseFragment {
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
private static class TabAdapter extends FragmentStatePagerAdapter { private static class TabAdapter extends FragmentStatePagerAdapter {
private String[] titles; private String[] titles;

View File

@@ -8,10 +8,9 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
public class MyBlogsFragment extends BaseFragment { public class MyBlogsFragment extends BaseFragment {
@@ -52,4 +51,9 @@ public class MyBlogsFragment extends BaseFragment {
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
} }

View File

@@ -14,6 +14,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.keyagreement.KeyAgreementActivity; import org.briarproject.android.keyagreement.KeyAgreementActivity;
import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.android.util.BriarRecyclerView;
@@ -84,9 +85,13 @@ public class ContactListFragment extends BaseFragment implements EventListener {
@Inject @Inject
protected volatile ForumSharingManager forumSharingManager; protected volatile ForumSharingManager forumSharingManager;
@Inject public static ContactListFragment newInstance() {
public ContactListFragment() {
Bundle args = new Bundle();
ContactListFragment fragment = new ContactListFragment();
fragment.setArguments(args);
return fragment;
} }
@Override @Override
@@ -94,6 +99,11 @@ public class ContactListFragment extends BaseFragment implements EventListener {
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -154,7 +164,6 @@ public class ContactListFragment extends BaseFragment implements EventListener {
return contentView; return contentView;
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();

View File

@@ -13,6 +13,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.contact.BaseContactListAdapter; import org.briarproject.android.contact.BaseContactListAdapter;
import org.briarproject.android.contact.ContactListItem; import org.briarproject.android.contact.ContactListItem;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
@@ -64,15 +65,18 @@ public class ContactSelectorFragment extends BaseFragment implements
protected volatile GroupId groupId; protected volatile GroupId groupId;
public void initBundle(GroupId groupId) { public static ContactSelectorFragment newInstance(GroupId groupId) {
Bundle bundle = new Bundle();
bundle.putByteArray(GROUP_ID, groupId.getBytes()); Bundle args = new Bundle();
setArguments(bundle); args.putByteArray(GROUP_ID, groupId.getBytes());
ContactSelectorFragment fragment = new ContactSelectorFragment();
fragment.setArguments(args);
return fragment;
} }
@Inject @Override
public ContactSelectorFragment() { public void injectFragment(ActivityComponent component) {
component.inject(this);
} }
@Override @Override

View File

@@ -14,6 +14,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseEventFragment; import org.briarproject.android.fragment.BaseEventFragment;
import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.android.util.BriarRecyclerView;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
@@ -59,9 +60,13 @@ public class ForumListFragment extends BaseEventFragment implements
@Inject protected volatile ForumManager forumManager; @Inject protected volatile ForumManager forumManager;
@Inject protected volatile ForumSharingManager forumSharingManager; @Inject protected volatile ForumSharingManager forumSharingManager;
@Inject public static ForumListFragment newInstance() {
public ForumListFragment() {
Bundle args = new Bundle();
ForumListFragment fragment = new ForumListFragment();
fragment.setArguments(args);
return fragment;
} }
@Nullable @Nullable
@@ -96,6 +101,11 @@ public class ForumListFragment extends BaseEventFragment implements
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();

View File

@@ -15,6 +15,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
// TODO extend the BriarFragmentActivity ?
public class ShareForumActivity extends BriarActivity implements public class ShareForumActivity extends BriarActivity implements
BaseFragment.BaseFragmentListener { BaseFragment.BaseFragmentListener {
@@ -33,8 +34,7 @@ public class ShareForumActivity extends BriarActivity implements
if (savedInstanceState == null) { if (savedInstanceState == null) {
ContactSelectorFragment contactSelectorFragment = ContactSelectorFragment contactSelectorFragment =
activityComponent.newContactSelectorFragment(); ContactSelectorFragment.newInstance(groupId);
contactSelectorFragment.initBundle(groupId);
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.add(R.id.shareForumContainer, contactSelectorFragment) .add(R.id.shareForumContainer, contactSelectorFragment)
.commit(); .commit();
@@ -50,8 +50,7 @@ public class ShareForumActivity extends BriarActivity implements
Collection<ContactId> contacts) { Collection<ContactId> contacts) {
ShareForumMessageFragment messageFragment = ShareForumMessageFragment messageFragment =
activityComponent.newShareForumMessageFragment(); ShareForumMessageFragment.newInstance(groupId, contacts);
messageFragment.initBundle(groupId, contacts);
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, .setCustomAnimations(android.R.anim.fade_in,
@@ -86,7 +85,7 @@ public class ShareForumActivity extends BriarActivity implements
// turn contact integers from a bundle back to ContactIds // turn contact integers from a bundle back to ContactIds
List<ContactId> contacts = new ArrayList<>(intContacts.size()); List<ContactId> contacts = new ArrayList<>(intContacts.size());
for(Integer c : intContacts) { for (Integer c : intContacts) {
contacts.add(new ContactId(c)); contacts.add(new ContactId(c));
} }
return contacts; return contacts;
@@ -102,4 +101,9 @@ public class ShareForumActivity extends BriarActivity implements
// this is handled by the recycler view in ContactSelectorFragment // this is handled by the recycler view in ContactSelectorFragment
} }
@Override
public void onFragmentCreated(String tag) {
}
} }

View File

@@ -12,6 +12,7 @@ import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
@@ -46,16 +47,13 @@ public class ShareForumMessageFragment extends BaseFragment {
private volatile GroupId groupId; private volatile GroupId groupId;
private volatile Collection<ContactId> contacts; private volatile Collection<ContactId> contacts;
public void initBundle(GroupId groupId, Collection<ContactId> contacts) { public static ShareForumMessageFragment newInstance(GroupId groupId, Collection<ContactId> contacts) {
Bundle bundle = new Bundle(); Bundle args = new Bundle();
bundle.putByteArray(GROUP_ID, groupId.getBytes()); args.putByteArray(GROUP_ID, groupId.getBytes());
bundle.putIntegerArrayList(CONTACTS, getContactsFromIds(contacts)); args.putIntegerArrayList(CONTACTS, getContactsFromIds(contacts));
setArguments(bundle); ShareForumMessageFragment fragment = new ShareForumMessageFragment();
} fragment.setArguments(args);
return fragment;
@Inject
public ShareForumMessageFragment() {
} }
@Override @Override
@@ -119,6 +117,11 @@ public class ShareForumMessageFragment extends BaseFragment {
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
public void onButtonClick() { public void onButtonClick() {
// disable button to prevent accidental double invitations // disable button to prevent accidental double invitations
ui.button.setEnabled(false); ui.button.setEnabled(false);

View File

@@ -2,14 +2,19 @@ package org.briarproject.android.fragment;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import org.briarproject.android.ActivityComponent;
public abstract class BaseFragment extends Fragment { public abstract class BaseFragment extends Fragment {
protected BaseFragmentListener listener; protected BaseFragmentListener listener;
public abstract String getUniqueTag(); public abstract String getUniqueTag();
public abstract void injectFragment(ActivityComponent component);
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
@@ -26,6 +31,14 @@ public abstract class BaseFragment extends Fragment {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.injectFragment(listener.getActivityComponent());
listener.onFragmentCreated(getUniqueTag());
}
public interface BaseFragmentListener { public interface BaseFragmentListener {
void showLoadingScreen(boolean isBlocking, int stringId); void showLoadingScreen(boolean isBlocking, int stringId);
@@ -35,5 +48,9 @@ public abstract class BaseFragment extends Fragment {
void runOnUiThread(Runnable runnable); void runOnUiThread(Runnable runnable);
void runOnDbThread(Runnable runnable); void runOnDbThread(Runnable runnable);
ActivityComponent getActivityComponent();
void onFragmentCreated(String tag);
} }
} }

View File

@@ -12,6 +12,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.contact.ContactListAdapter; import org.briarproject.android.contact.ContactListAdapter;
import org.briarproject.android.contact.ContactListItem; import org.briarproject.android.contact.ContactListItem;
import org.briarproject.android.contact.ConversationItem; import org.briarproject.android.contact.ConversationItem;
@@ -66,9 +67,13 @@ public class ContactChooserFragment extends BaseFragment {
@Inject @Inject
protected volatile ConnectionRegistry connectionRegistry; protected volatile ConnectionRegistry connectionRegistry;
@Inject public static ContactChooserFragment newInstance() {
public ContactChooserFragment() {
Bundle args = new Bundle();
ContactChooserFragment fragment = new ContactChooserFragment();
fragment.setArguments(args);
return fragment;
} }
@Override @Override
@@ -142,6 +147,11 @@ public class ContactChooserFragment extends BaseFragment {
return TAG; return TAG;
} }
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
private void loadContacts() { private void loadContacts() {
introductionActivity.runOnDbThread(new Runnable() { introductionActivity.runOnDbThread(new Runnable() {
@Override @Override

View File

@@ -15,6 +15,7 @@ import org.briarproject.android.BriarActivity;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
// TODO extend the BriarFragmentActivity ?
public class IntroductionActivity extends BriarActivity implements public class IntroductionActivity extends BriarActivity implements
BaseFragment.BaseFragmentListener { BaseFragment.BaseFragmentListener {
@@ -37,7 +38,7 @@ public class IntroductionActivity extends BriarActivity implements
getSupportFragmentManager() getSupportFragmentManager()
.beginTransaction() .beginTransaction()
.add(R.id.introductionContainer, .add(R.id.introductionContainer,
activityComponent.newContactChooserFragment()) ContactChooserFragment.newInstance())
.commit(); .commit();
} }
} }
@@ -57,6 +58,11 @@ public class IntroductionActivity extends BriarActivity implements
// this is handled by the recycler view in ContactChooserFragment // this is handled by the recycler view in ContactChooserFragment
} }
@Override
public void onFragmentCreated(String tag) {
}
@Override @Override
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
// Handle presses on the action bar items // Handle presses on the action bar items
@@ -86,8 +92,8 @@ public class IntroductionActivity extends BriarActivity implements
public void showMessageScreen(View view, Contact c1, Contact c2) { public void showMessageScreen(View view, Contact c1, Contact c2) {
IntroductionMessageFragment messageFragment = IntroductionMessageFragment messageFragment =
activityComponent.newIntroductionMessageFragment(); IntroductionMessageFragment
messageFragment.initBundle(c1.getId().getInt(), c2.getId().getInt()); .newInstance(c1.getId().getInt(), c2.getId().getInt());
if (Build.VERSION.SDK_INT >= 21) { if (Build.VERSION.SDK_INT >= 21) {
messageFragment.setSharedElementEnterTransition(new ChangeBounds()); messageFragment.setSharedElementEnterTransition(new ChangeBounds());

View File

@@ -13,6 +13,7 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
@@ -51,19 +52,21 @@ public class IntroductionMessageFragment extends BaseFragment {
@Inject @Inject
protected volatile IntroductionManager introductionManager; protected volatile IntroductionManager introductionManager;
public void initBundle(int contactId1, int contactId2) { public static IntroductionMessageFragment newInstance(int contactId1, int contactId2) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt(CONTACT_ID_1, contactId1); args.putInt(CONTACT_ID_1, contactId1);
args.putInt(CONTACT_ID_2, contactId2); args.putInt(CONTACT_ID_2, contactId2);
setArguments(args); IntroductionMessageFragment fragment =
new IntroductionMessageFragment();
fragment.setArguments(args);
return fragment;
} }
@Inject @Override
public IntroductionMessageFragment() { public void injectFragment(ActivityComponent component) {
component.inject(this);
} }
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
@@ -94,6 +97,13 @@ public class IntroductionMessageFragment extends BaseFragment {
ui.text.setVisibility(GONE); ui.text.setVisibility(GONE);
ui.button.setEnabled(false); ui.button.setEnabled(false);
return v;
}
@Override
public void onStart() {
super.onStart();
// get contact IDs from fragment arguments // get contact IDs from fragment arguments
int contactId1 = getArguments().getInt(CONTACT_ID_1, -1); int contactId1 = getArguments().getInt(CONTACT_ID_1, -1);
int contactId2 = getArguments().getInt(CONTACT_ID_2, -1); int contactId2 = getArguments().getInt(CONTACT_ID_2, -1);
@@ -101,11 +111,8 @@ public class IntroductionMessageFragment extends BaseFragment {
throw new java.lang.InstantiationError( throw new java.lang.InstantiationError(
"You need to use newInstance() to instantiate"); "You need to use newInstance() to instantiate");
} }
// get contacts and then show view // get contacts and then show view
prepareToSetUpViews(contactId1, contactId2); prepareToSetUpViews(contactId1, contactId2);
return v;
} }
@Override @Override

View File

@@ -13,6 +13,7 @@ import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner; import android.widget.Spinner;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.identity.CreateIdentityActivity;
import org.briarproject.android.identity.LocalAuthorItem; import org.briarproject.android.identity.LocalAuthorItem;
@@ -57,9 +58,18 @@ public class ChooseIdentityFragment extends BaseFragment
@Inject @Inject
protected volatile IdentityManager identityManager; protected volatile IdentityManager identityManager;
@Inject public static ChooseIdentityFragment newInstance() {
public ChooseIdentityFragment() {
Bundle args = new Bundle();
ChooseIdentityFragment fragment = new ChooseIdentityFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
} }
@Override @Override
@@ -104,6 +114,11 @@ public class ChooseIdentityFragment extends BaseFragment
} }
}); });
}
@Override
public void onStart() {
super.onStart();
loadLocalAuthors(); loadLocalAuthors();
} }

View File

@@ -94,11 +94,11 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
STEPS)); STEPS));
switch (step) { switch (step) {
case STEP_QR: case STEP_QR:
startFragment(activityComponent.newShowQrCodeFragment()); startFragment(ShowQrCodeFragment.newInstance());
break; break;
case STEP_ID: case STEP_ID:
default: default:
startFragment(activityComponent.newChooseIdentityFragment()); startFragment(ChooseIdentityFragment.newInstance());
break; break;
} }
} }

View File

@@ -21,7 +21,7 @@ import android.widget.Toast;
import com.google.zxing.Result; import com.google.zxing.Result;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.AndroidComponent; import org.briarproject.android.ActivityComponent;
import org.briarproject.android.api.AndroidExecutor; import org.briarproject.android.api.AndroidExecutor;
import org.briarproject.android.fragment.BaseEventFragment; import org.briarproject.android.fragment.BaseEventFragment;
import org.briarproject.android.util.CameraView; import org.briarproject.android.util.CameraView;
@@ -86,9 +86,18 @@ public class ShowQrCodeFragment extends BaseEventFragment
private volatile KeyAgreementTask task; private volatile KeyAgreementTask task;
private volatile boolean waitingForBluetooth; private volatile boolean waitingForBluetooth;
@Inject public static ShowQrCodeFragment newInstance() {
public ShowQrCodeFragment() {
Bundle args = new Bundle();
ShowQrCodeFragment fragment = new ShowQrCodeFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
} }
@Override @Override

View File

@@ -14,7 +14,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'de.undercouch:gradle-download-task:2.1.0' classpath 'de.undercouch:gradle-download-task:2.1.0'
classpath files('briar-core/libs/gradle-witness.jar') classpath files('briar-core/libs/gradle-witness.jar')