Merge branch 'nav-drawer-instance-restore-fix' into 'master'

Fixing fragment instance restore

Alas, it turns out that my neat way of integrating the Fragments into the dependency graph was not without problems. Me and @grote discovered that this presented us with a lot of problems on orientation changes as the Activity is re-created, and therefore parts of the dependency graph. The simplest solution was simply to abandon the idea, i.e. with this branch Fragments are no longer part of the dependency graph. 

See merge request !215
This commit is contained in:
Torsten Grote
2016-06-21 13:59:56 +00:00
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')