Create ViewModels directly after injection

This commit is contained in:
Sebastian Kürten
2021-04-19 06:52:50 +02:00
parent 4c11f93ee2
commit 2a48d43e5b
23 changed files with 68 additions and 101 deletions

View File

@@ -13,7 +13,6 @@ import com.google.android.material.textfield.TextInputLayout;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import javax.annotation.Nullable;
@@ -35,11 +34,6 @@ public class AuthorNameFragment extends SetupFragment {
return new AuthorNameFragment();
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,

View File

@@ -13,7 +13,6 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.account.PowerView.OnCheckedChangedListener;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.util.UiUtils;
import androidx.annotation.Nullable;
@@ -39,11 +38,6 @@ public class DozeFragment extends SetupFragment
return new DozeFragment();
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,

View File

@@ -15,7 +15,6 @@ import com.google.android.material.textfield.TextInputLayout;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.login.StrengthMeter;
import javax.annotation.Nullable;
@@ -43,11 +42,6 @@ public class SetPasswordFragment extends SetupFragment {
return new SetPasswordFragment();
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,

View File

@@ -1,6 +1,5 @@
package org.briarproject.briar.android.account;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
@@ -14,10 +13,12 @@ import android.widget.TextView.OnEditorActionListener;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import javax.inject.Inject;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
@@ -28,18 +29,17 @@ import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
abstract class SetupFragment extends BaseFragment implements TextWatcher,
public abstract class SetupFragment extends BaseFragment implements TextWatcher,
OnEditorActionListener, OnClickListener {
private final static String STATE_KEY_CLICKED = "setupFragmentClicked";
@Inject
ViewModelProvider.Factory viewModelFactory;
SetupViewModel viewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@CallSuper
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity())
.get(SetupViewModel.class);
}

View File

@@ -4,10 +4,8 @@ import android.app.Activity;
import org.briarproject.briar.android.AndroidComponent;
import org.briarproject.briar.android.StartupFailureActivity;
import org.briarproject.briar.android.account.AuthorNameFragment;
import org.briarproject.briar.android.account.DozeFragment;
import org.briarproject.briar.android.account.SetPasswordFragment;
import org.briarproject.briar.android.account.SetupActivity;
import org.briarproject.briar.android.account.SetupFragment;
import org.briarproject.briar.android.account.UnlockActivity;
import org.briarproject.briar.android.blog.BlogActivity;
import org.briarproject.briar.android.blog.BlogFragment;
@@ -178,11 +176,7 @@ public interface ActivityComponent {
// Fragments
void inject(AuthorNameFragment fragment);
void inject(SetPasswordFragment fragment);
void inject(DozeFragment fragment);
void inject(SetupFragment fragment);
void inject(PasswordFragment imageFragment);

View File

@@ -17,7 +17,6 @@ import javax.inject.Inject;
import androidx.appcompat.app.ActionBar;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.content.Intent.ACTION_SEND;
import static android.content.Intent.ACTION_VIEW;
@@ -36,6 +35,8 @@ public class AddContactActivity extends BriarActivity implements
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(AddContactViewModel.class);
}
@Override
@@ -48,8 +49,6 @@ public class AddContactActivity extends BriarActivity implements
ab.setDisplayHomeAsUpEnabled(true);
}
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(AddContactViewModel.class);
viewModel.onCreate();
viewModel.getRemoteLinkEntered().observeEvent(this, entered -> {
if (entered) {

View File

@@ -29,7 +29,6 @@ import javax.inject.Inject;
import androidx.core.app.ShareCompat.IntentBuilder;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.content.Context.CLIPBOARD_SERVICE;
import static android.widget.Toast.LENGTH_SHORT;
@@ -60,6 +59,8 @@ public class LinkExchangeFragment extends BaseFragment
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(getActivity(), viewModelFactory)
.get(AddContactViewModel.class);
}
@Nullable
@@ -69,9 +70,6 @@ public class LinkExchangeFragment extends BaseFragment
@Nullable Bundle savedInstanceState) {
if (getActivity() == null || getContext() == null) return null;
viewModel = ViewModelProviders.of(getActivity(), viewModelFactory)
.get(AddContactViewModel.class);
View v = inflater.inflate(R.layout.fragment_link_exchange,
container, false);

View File

@@ -23,7 +23,6 @@ import javax.inject.Inject;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import static com.google.android.material.snackbar.Snackbar.LENGTH_INDEFINITE;
@@ -46,6 +45,8 @@ public class PendingContactListActivity extends BriarActivity
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(PendingContactListViewModel.class);
}
@Override
@@ -59,8 +60,6 @@ public class PendingContactListActivity extends BriarActivity
ab.setDisplayHomeAsUpEnabled(true);
}
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(PendingContactListViewModel.class);
viewModel.onCreate();
viewModel.getPendingContacts()
.observe(this, this::onPendingContactsChanged);

View File

@@ -14,6 +14,7 @@ import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BaseActivity;
import javax.inject.Inject;
@@ -51,7 +52,14 @@ public class AliasDialogFragment extends AppCompatDialogFragment {
@Override
public void onAttach(Context ctx) {
super.onAttach(ctx);
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
injectFragment(
((BaseActivity) requireActivity()).getActivityComponent());
}
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ConversationViewModel.class);
}
@Override
@@ -59,9 +67,6 @@ public class AliasDialogFragment extends AppCompatDialogFragment {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, R.style.BriarDialogTheme);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ConversationViewModel.class);
}
@Override

View File

@@ -211,6 +211,13 @@ public class ConversationActivity extends BriarActivity
private volatile ContactId contactId;
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(ConversationViewModel.class);
}
@Override
public void onCreate(@Nullable Bundle state) {
if (SDK_INT >= 21) {
@@ -227,8 +234,6 @@ public class ConversationActivity extends BriarActivity
if (id == -1) throw new IllegalStateException();
contactId = new ContactId(id);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(ConversationViewModel.class);
viewModel.setContactId(contactId);
attachmentRetriever = viewModel.getAttachmentRetriever();
@@ -297,11 +302,6 @@ public class ConversationActivity extends BriarActivity
if (items > 0) list.scrollToPosition(items - 1);
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
protected void onActivityResult(int request, int result,
@Nullable Intent data) {

View File

@@ -85,8 +85,6 @@ public class ConversationSettingsDialog extends DialogFragment {
ContactId contactId = new ContactId(id);
FragmentActivity activity = requireActivity();
viewModel = new ViewModelProvider(activity, viewModelFactory)
.get(ConversationViewModel.class);
viewModel.setContactId(contactId);
Toolbar toolbar = view.findViewById(R.id.toolbar);

View File

@@ -36,7 +36,6 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.viewpager.widget.ViewPager;
import static android.content.Intent.ACTION_CREATE_DOCUMENT;
@@ -84,6 +83,8 @@ public class ImageActivity extends BriarActivity
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(ImageViewModel.class);
}
@Override
@@ -108,9 +109,7 @@ public class ImageActivity extends BriarActivity
long time = i.getLongExtra(DATE, 0);
byte[] messageIdBytes = requireNonNull(i.getByteArrayExtra(ITEM_ID));
// get View Model
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(ImageViewModel.class);
// connect to View Model
viewModel.expectAttachments(attachments);
viewModel.getSaveState().observeEvent(this,
this::onImageSaveStateChanged);

View File

@@ -17,6 +17,7 @@ import com.github.chrisbanes.photoview.PhotoView;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BaseActivity;
import org.briarproject.briar.android.attachment.AttachmentItem;
import org.briarproject.briar.android.conversation.glide.GlideApp;
@@ -29,7 +30,6 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.os.Build.VERSION.SDK_INT;
import static android.widget.ImageView.ScaleType.FIT_START;
@@ -58,6 +58,12 @@ public class ImageFragment extends Fragment
private ImageViewModel viewModel;
private PhotoView photoView;
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(),
viewModelFactory).get(ImageViewModel.class);
}
static ImageFragment newInstance(AttachmentItem a,
MessageId conversationMessageId, boolean isFirst) {
ImageFragment f = new ImageFragment();
@@ -72,7 +78,8 @@ public class ImageFragment extends Fragment
@Override
public void onAttach(Context ctx) {
super.onAttach(ctx);
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
injectFragment(
((BaseActivity) requireActivity()).getActivityComponent());
}
@Override
@@ -94,9 +101,6 @@ public class ImageFragment extends Fragment
View v = inflater.inflate(R.layout.fragment_image, container,
false);
viewModel = ViewModelProviders.of(requireActivity(),
viewModelFactory).get(ImageViewModel.class);
photoView = v.findViewById(R.id.photoView);
photoView.setScaleLevels(1, 2, 4);
photoView.setOnClickListener(view -> viewModel.clickImage());

View File

@@ -18,7 +18,6 @@ import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static org.briarproject.briar.android.login.StartupViewModel.State;
import static org.briarproject.briar.android.login.StartupViewModel.State.COMPACTING;
@@ -33,12 +32,16 @@ public class OpenDatabaseFragment extends BaseFragment {
@Inject
ViewModelProvider.Factory viewModelFactory;
private StartupViewModel viewModel;
private TextView textView;
private ImageView imageView;
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(),
viewModelFactory).get(StartupViewModel.class);
}
@Override
@@ -47,11 +50,10 @@ public class OpenDatabaseFragment extends BaseFragment {
@Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_open_database, container,
false);
textView = v.findViewById(R.id.textView);
imageView = v.findViewById(R.id.imageView);
StartupViewModel viewModel = ViewModelProviders.of(requireActivity(),
viewModelFactory).get(StartupViewModel.class);
LifecycleOwner owner = getViewLifecycleOwner();
viewModel.getState().observe(owner, this::onStateChanged);

View File

@@ -25,7 +25,6 @@ import javax.inject.Inject;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
@@ -56,6 +55,8 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(StartupViewModel.class);
}
@Override
@@ -65,9 +66,6 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
View v = inflater.inflate(R.layout.fragment_password, container,
false);
viewModel = ViewModelProviders.of(requireActivity(), viewModelFactory)
.get(StartupViewModel.class);
LifecycleOwner owner = getViewLifecycleOwner();
viewModel.getPasswordValidated().observeEvent(owner, result -> {
if (result != SUCCESS) onPasswordInvalid(result);

View File

@@ -17,7 +17,6 @@ import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
@@ -41,6 +40,8 @@ public class StartupActivity extends BaseActivity implements
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(StartupViewModel.class);
}
@Override
@@ -51,8 +52,6 @@ public class StartupActivity extends BaseActivity implements
setContentView(R.layout.activity_fragment_container);
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(StartupViewModel.class);
if (!viewModel.accountExists()) {
// TODO ideally we would not have to delete the account again
// The account needs to deleted again to remove the database folder,

View File

@@ -58,7 +58,6 @@ import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
@@ -122,6 +121,10 @@ public class NavDrawerActivity extends BriarActivity implements
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
ViewModelProvider provider =
new ViewModelProvider(this, viewModelFactory);
navDrawerViewModel = provider.get(NavDrawerViewModel.class);
pluginViewModel = provider.get(PluginViewModel.class);
}
@Override
@@ -130,11 +133,6 @@ public class NavDrawerActivity extends BriarActivity implements
exitIfStartupFailed(getIntent());
setContentView(R.layout.activity_nav_drawer);
ViewModelProvider provider =
ViewModelProviders.of(this, viewModelFactory);
navDrawerViewModel = provider.get(NavDrawerViewModel.class);
pluginViewModel = provider.get(PluginViewModel.class);
BriarApplication app = (BriarApplication) getApplication();
if (IS_DEBUG_BUILD && !app.isInstrumentationTest()) {
navDrawerViewModel.showExpiryWarning()

View File

@@ -37,7 +37,6 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
@@ -62,6 +61,13 @@ public class TransportsActivity extends BriarActivity {
private PluginViewModel viewModel;
private BaseAdapter transportsAdapter;
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(PluginViewModel.class);
}
@Override
public void onCreate(@Nullable Bundle state) {
super.onCreate(state);
@@ -74,20 +80,11 @@ public class TransportsActivity extends BriarActivity {
setContentView(R.layout.activity_transports);
ViewModelProvider provider =
ViewModelProviders.of(this, viewModelFactory);
viewModel = provider.get(PluginViewModel.class);
GridView grid = findViewById(R.id.grid);
initializeCards();
grid.setAdapter(transportsAdapter);
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {

View File

@@ -25,16 +25,11 @@ public class CrashFragment extends BaseFragment {
@Inject
ViewModelProvider.Factory viewModelFactory;
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
private ReportViewModel viewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ReportViewModel.class);
}

View File

@@ -45,6 +45,8 @@ public class CrashReportActivity extends BaseActivity
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(ReportViewModel.class);
}
@Override
@@ -52,8 +54,6 @@ public class CrashReportActivity extends BaseActivity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dev_report);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(ReportViewModel.class);
Intent intent = getIntent();
Throwable t = (Throwable) intent.getSerializableExtra(EXTRA_THROWABLE);
long appStartTime = intent.getLongExtra(EXTRA_APP_START_TIME, -1);

View File

@@ -53,14 +53,14 @@ public class ReportFormFragment extends BaseFragment {
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ReportViewModel.class);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ReportViewModel.class);
}
@Nullable