Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to handle onActivityResult() with Mortar

Tags:

android

mortar

I am looking to integrate an application with Google Play Services and Mortar to retrieve the user's current location.

https://developer.android.com/training/location/retrieve-current.html#CheckServices

This requires handling onActivityResult() in the case that Google Play Services is not available.

My first instinct on how to do this is to make getFirstScreen() in Main.java return a blank loading screen. https://github.com/square/mortar/blob/master/mortar-sample/src/main/java/com/example/mortar/core/Main.java

After injection, during onCreate() perform the check to see if Google Play Services is available. If it is, then call flow.goTo(<location using screen>), if not, do nothing and wait for onActivityResult() to be called. Then, when onActivityResult() fires, simply call flow.goTo(<location using screen>).

The above seems slightly hacky to me. (Let me know if you need clarification). So I'm thinking the other solution might be to do something similar to this Mortar + Flow with third party libraries hooked to activity lifecycle and hook up onActivityResult() to the presenter. The problem with this is that I won't have access to the Activity from a presenter which makes it impossible to call GooglePlayServicesUtil.getErrorDialog(...) because it requires Activity.

I think onActivityResult() is very important. Perhaps it should be a part of the Mortar library?

like image 290
Nelson Osacky Avatar asked Jan 09 '23 20:01

Nelson Osacky


1 Answers

Here's how we generally deal with startActivityForResult in Square Register.

public SomePresenter extends Presenter<SomePresenter.Activity> {
  public interface Activity {
    void startActivityForResult(android.content.Intent intent, int requestCode);
  }

  public final void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Make sure it's the expected requestCode and resultCode and do your thing.
    // If it isn't, no-op, someone else will handle it.
  }
}

And the activity looks something like:

public MyActivity extends Activity implements SomePresenter.Activity {


  @Override protected void onCreate(Bundle bundle) {
    // Do the usual mortar init stuff

    somePresenter.takeView(this);
  }

  @Override protected void onActivityResult(int requestCode, int   resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    somePresenter.onActivityResult(requestCode, resultCode, data);
  }

  @Override protected void onDestroy() {
    somePresenter.dropView(this);
    super.onDestroy();
  }
}

That doesn't help you with the error dialog, but that sounds like a separate concern to me anyway. Seems like you can use a Popup / PopupPresenter pair there. (I'm not thrilled with Popup, but it gets the job done until we have a better idea.) Or maybe the activity should just go ahead and deal with it itself? I'm not super familiar with the Play Services, haven't dealt with them yet.

like image 55
rjrjr Avatar answered Jan 21 '23 13:01

rjrjr