[android] Replace PendingIntent with Activity.setResult()

PendingIntent is too low-level mechanism for this task.
Activity.setResult() is easier to use for API callers.

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2022-07-03 13:07:02 +03:00 committed by Alexander Borsuk
parent 288e9a3883
commit b7f48d354d
9 changed files with 73 additions and 106 deletions

View file

@ -17,6 +17,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.mapswithme.maps.api.ParsedMwmRequest;
import com.mapswithme.maps.base.BaseMwmFragmentActivity;
import com.mapswithme.maps.dialog.AlertDialog;
import com.mapswithme.maps.dialog.AlertDialogCallback;
@ -44,6 +45,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp
private static final String ERROR_LOADING_DIALOG_TAG = "error_loading_dialog";
private static final int ERROR_LOADING_DIALOG_REQ_CODE = 234;
private static final int REQ_CODE_API_RESULT = 10;
public static final String EXTRA_COUNTRY = "country";
// Error codes, should match the same codes in JNI
@ -89,7 +92,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp
private final IntentProcessor[] mIntentProcessors = {
new Factory.GeoIntentProcessor(),
new Factory.HttpGeoIntentProcessor(),
new Factory.MapsWithMeIntentProcessor(),
new Factory.ApiIntentProcessor(),
new Factory.HttpMapsIntentProcessor(),
new Factory.OpenCountryTaskProcessor(),
new Factory.KmzKmlProcessor(this),
@ -390,13 +393,32 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp
intent.putExtra(MwmActivity.EXTRA_TASK, mMapTaskToForward);
intent.putExtra(MwmActivity.EXTRA_LAUNCH_BY_DEEP_LINK, true);
mMapTaskToForward = null;
if (ParsedMwmRequest.getCurrentRequest() != null)
{
// Wait for the result from MwmActivity for API callers.
startActivityForResult(intent, REQ_CODE_API_RESULT);
return;
}
}
startActivity(intent);
finish();
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case REQ_CODE_API_RESULT:
setResult(resultCode, data);
finish();
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
private void finishFilesDownload(int result)
{
if (result == ERR_NO_MORE_FILES)

View file

@ -1127,7 +1127,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (request == null)
return;
request.setPointData(object.getLat(), object.getLon(), object.getTitle(), object.getApiId());
object.setSubtitle(request.getTitle());
}
}

View file

@ -12,6 +12,7 @@ import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import com.mapswithme.maps.api.Const;
import com.mapswithme.maps.base.BaseActivity;
import com.mapswithme.maps.base.BaseActivityDelegate;
import com.mapswithme.maps.location.LocationHelper;
@ -29,6 +30,8 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity
private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start";
public static final String EXTRA_INITIAL_INTENT = "extra_initial_intent";
private static final int REQUEST_PERMISSIONS = 1;
private static final int REQ_CODE_API_RESULT = 10;
private static final long DELAY = 100;
private boolean mCanceled = false;
@ -190,12 +193,32 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity
input.getParcelableExtra(EXTRA_INITIAL_INTENT) :
input;
result.putExtra(EXTRA_INITIAL_INTENT, initialIntent);
if (Const.ACTION_MWM_REQUEST.equals(initialIntent.getAction()))
{
// Wait for the result from MwmActivity for API callers.
startActivityForResult(result, REQ_CODE_API_RESULT);
return;
}
}
Counters.setFirstStartDialogSeen(this);
startActivity(result);
finish();
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case REQ_CODE_API_RESULT:
// Propagate the result to API callers
setResult(resultCode, data);
finish();
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
@NonNull
public Activity get()

View file

@ -7,8 +7,6 @@ public class Const
static final String AUTHORITY = "com.mapswithme.maps.api";
public static final String EXTRA_URL = AUTHORITY + ".url";
public static final String EXTRA_TITLE = AUTHORITY + ".title";
public static final String EXTRA_HAS_PENDING_INTENT = AUTHORITY + ".has_pen_intent";
public static final String EXTRA_CALLER_PENDING_INTENT = AUTHORITY + ".pending_intent";
public static final String EXTRA_PICK_POINT = AUTHORITY + ".pick_point";

View file

@ -1,12 +1,6 @@
package com.mapswithme.maps.api;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import com.mapswithme.maps.Framework;
public class ParsedMwmRequest
{
@ -15,33 +9,13 @@ public class ParsedMwmRequest
// title
private String mTitle;
// pending intent to call back
private PendingIntent mPendingIntent;
// pick point mode
private boolean mPickPoint;
// response data
private boolean mHasPoint;
private double mLat;
private double mLon;
private double mZoomLevel;
private String mName;
private String mId;
public double getLat() { return mLat; }
public double getLon() { return mLon; }
public String getName() { return mName;}
public static boolean isPickPointMode() { return hasRequest() && getCurrentRequest().mPickPoint; }
public boolean isPickPointMode() { return mPickPoint; }
public static ParsedMwmRequest getCurrentRequest() { return sCurrentRequest; }
public static boolean hasRequest() { return sCurrentRequest != null; }
public static void setCurrentRequest(ParsedMwmRequest request) { sCurrentRequest = request; }
/**
@ -54,9 +28,6 @@ public class ParsedMwmRequest
request.mTitle = data.getStringExtra(Const.EXTRA_TITLE);
request.mPickPoint = data.getBooleanExtra(Const.EXTRA_PICK_POINT, false);
if (data.getBooleanExtra(Const.EXTRA_HAS_PENDING_INTENT, false))
request.mPendingIntent = data.getParcelableExtra(Const.EXTRA_CALLER_PENDING_INTENT);
return request;
}
@ -64,63 +35,6 @@ public class ParsedMwmRequest
public String getTitle() { return mTitle; }
// Request data
public boolean hasPoint()
{
return mHasPoint;
}
public void setHasPoint(boolean hasPoint) { mHasPoint = hasPoint; }
public boolean hasPendingIntent() { return mPendingIntent != null; }
public void setPointData(double lat, double lon, String name, String id)
{
mLat = lat;
mLon = lon;
mName = name;
mId = id;
}
public boolean sendResponse(Context context, boolean success)
{
if (hasPendingIntent())
{
mZoomLevel = Framework.nativeGetDrawScale();
final Intent i = new Intent();
if (success)
{
i.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LAT, mLat)
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LON, mLon)
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_NAME, mName)
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_ID, mId)
.putExtra(Const.EXTRA_MWM_RESPONSE_ZOOM, mZoomLevel);
}
try
{
mPendingIntent.send(context, success ? Activity.RESULT_OK : Activity.RESULT_CANCELED, i);
return true;
} catch (final Exception e)
{
e.printStackTrace();
}
}
return false;
}
public void sendResponseAndFinish(final Activity activity, final boolean success)
{
activity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
sendResponse(activity, success);
activity.finish();
}
});
}
/**
* Do not use constructor externally. Use {@link ParsedMwmRequest#extractFromIntent(android.content.Intent)} instead.
*/

View file

@ -48,6 +48,9 @@ public class Factory
final String scheme = intent.getScheme();
if (!"geo".equals(scheme) && !"ge0".equals(scheme) && !"om".equals(scheme) && !"mapsme".equals(scheme))
return null;
SearchEngine.INSTANCE.cancelInteractiveSearch();
final ParsedMwmRequest request = ParsedMwmRequest.extractFromIntent(intent);
ParsedMwmRequest.setCurrentRequest(request);
return new OpenUrlTask(uri.toString());
}
}
@ -77,7 +80,7 @@ public class Factory
/**
* Use this to invoke API task.
*/
public static class MapsWithMeIntentProcessor implements IntentProcessor
public static class ApiIntentProcessor implements IntentProcessor
{
@Nullable
@Override
@ -94,7 +97,7 @@ public class Factory
final ParsedMwmRequest request = ParsedMwmRequest.extractFromIntent(intent);
ParsedMwmRequest.setCurrentRequest(request);
if (!ParsedMwmRequest.isPickPointMode())
if (request.isPickPointMode())
return new OpenUrlTask(apiUrl);
}

View file

@ -56,8 +56,9 @@ public class FloatingSearchToolbarController extends SearchToolbarController
public void refreshQuery()
{
showProgress(false);
CharSequence query = ParsedMwmRequest.hasRequest() ?
ParsedMwmRequest.getCurrentRequest().getTitle()
final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest();
CharSequence query = request != null ?
request.getTitle()
: SearchEngine.INSTANCE.getQuery();
if (!TextUtils.isEmpty(query))

View file

@ -177,7 +177,7 @@ public enum SearchEngine implements NativeSearchListener,
@MainThread
private static void cancelApiCall()
{
if (ParsedMwmRequest.hasRequest())
if (ParsedMwmRequest.getCurrentRequest() != null)
ParsedMwmRequest.setCurrentRequest(null);
Framework.nativeClearApiPoints();
}

View file

@ -1,6 +1,8 @@
package com.mapswithme.maps.widget.placepage;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.location.Location;
@ -36,6 +38,7 @@ import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.api.Const;
import com.mapswithme.maps.api.ParsedMwmRequest;
import com.mapswithme.maps.bookmarks.data.Bookmark;
import com.mapswithme.maps.bookmarks.data.BookmarkManager;
@ -529,16 +532,19 @@ public class PlacePageView extends NestedScrollViewClickFixed
return;
}
if (ParsedMwmRequest.hasRequest())
final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest();
if (request != null && request.isPickPointMode())
{
ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest();
if (ParsedMwmRequest.isPickPointMode())
request.setPointData(mMapObject.getLat(), mMapObject.getLon(), mMapObject.getTitle(), "");
request.sendResponseAndFinish(getActivity(), true);
final Intent result = new Intent();
result.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LAT, mMapObject.getLat())
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LON, mMapObject.getLon())
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_NAME, mMapObject.getTitle())
.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_ID, mMapObject.getApiId())
.putExtra(Const.EXTRA_MWM_RESPONSE_ZOOM, Framework.nativeGetDrawScale());
getActivity().setResult(Activity.RESULT_OK, result);
ParsedMwmRequest.setCurrentRequest(null);
}
else
getActivity().finish();
getActivity().finish();
}
private void onRouteFromBtnClicked()
@ -1139,7 +1145,8 @@ public class PlacePageView extends NestedScrollViewClickFixed
return;
}
if (showBackButton || ParsedMwmRequest.isPickPointMode())
final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest();
if (showBackButton || (request != null && request.isPickPointMode()))
buttons.add(PlacePageButtons.Item.BACK);
final boolean hasNumber = mapObject.hasPhoneNumber();