[android] Added the dialog of network usage confirmation, clicks on the "turn on internet" button / discovery screen and PP

This commit is contained in:
Dmitry Donskoy 2019-08-02 16:44:25 +03:00 committed by Aleksey Belousov
parent 96e87ea63b
commit 66af7909dc
9 changed files with 191 additions and 118 deletions

View file

@ -27,7 +27,6 @@ import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.gallery.GalleryAdapter;
import com.mapswithme.maps.gallery.ItemSelectedListener;
import com.mapswithme.maps.gallery.Items;
import com.mapswithme.maps.gallery.impl.BaseItemSelectedListener;
import com.mapswithme.maps.gallery.impl.Factory;
import com.mapswithme.maps.gallery.impl.LoggableItemSelectedListener;
import com.mapswithme.maps.metrics.UserActionsLogger;
@ -132,12 +131,6 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment implements Discove
{
RecyclerView catalogPromoRecycler = getGallery(R.id.catalog_promo_recycler);
setLayoutManagerAndItemDecoration(requireContext(), catalogPromoRecycler);
RecyclerView promoRecycler = getGallery(R.id.catalog_promo_recycler);
GalleryAdapter galleryAdapter = mOnlineMode
? Factory.createCatalogPromoLoadingAdapter(new CatalogPromoSelectedListener(requireActivity()))
: Factory.createCatalogPromoErrorAdapter(new ErrorCatalogPromoListener<>(requireActivity()));
promoRecycler.setAdapter(galleryAdapter);
}
private static void setLayoutManagerAndItemDecoration(@NonNull Context context,
@ -195,12 +188,14 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment implements Discove
private void requestDiscoveryInfoAndInitAdapters()
{
NetworkPolicy.checkNetworkPolicy(getFragmentManager(), policy ->
{
mOnlineMode = policy.canUseNetwork();
initNetworkBasedAdapters();
requestDiscoveryInfo();
});
NetworkPolicy.checkNetworkPolicy(getFragmentManager(), this::onNetworkPolicyResult);
}
private void onNetworkPolicyResult(@NonNull NetworkPolicy policy)
{
mOnlineMode = policy.canUseNetwork();
initNetworkBasedAdapters();
requestDiscoveryInfo();
}
private void initSearchBasedAdapters()
@ -212,12 +207,15 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment implements Discove
private void initNetworkBasedAdapters()
{
if (!mOnlineMode)
return;
RecyclerView promoRecycler = getGallery(R.id.catalog_promo_recycler);
BaseItemSelectedListener<Items.Item> listener = new CatalogPromoSelectedListener(requireActivity());
promoRecycler.setAdapter(Factory.createCatalogPromoLoadingAdapter(listener));
ItemSelectedListener<Items.Item> listener = mOnlineMode
? new CatalogPromoSelectedListener(requireActivity())
: new ErrorCatalogPromoListener<>(requireActivity(),
this::onNetworkPolicyResult);
GalleryAdapter adapter = mOnlineMode ? Factory.createCatalogPromoLoadingAdapter()
: Factory.createCatalogPromoNoConnectionAdapter(listener);
promoRecycler.setAdapter(adapter);
}
private void requestDiscoveryInfo()
@ -296,8 +294,6 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment implements Discove
@Override
public void onCatalogPromoResultReceived(@NonNull PromoCityGallery gallery)
{
updateViewsVisibility(gallery.getItems(), R.id.catalog_promo_recycler,
R.id.catalog_promo_title);
if (gallery.getItems().length == 0)
return;
@ -332,9 +328,7 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment implements Discove
Statistics.INSTANCE.trackGalleryError(LOCAL_EXPERTS, DISCOVERY, null);
break;
case PROMO:
ErrorCatalogPromoListener<Items.Item> listener =
new ErrorCatalogPromoListener<>(requireActivity());
GalleryAdapter adapter = Factory.createCatalogPromoErrorAdapter(listener);
GalleryAdapter adapter = Factory.createCatalogPromoErrorAdapter(null);
RecyclerView gallery = getGallery(R.id.catalog_promo_recycler);
gallery.setAdapter(adapter);
Statistics.INSTANCE.trackGalleryError(PROMO, DISCOVERY, null);

View file

@ -506,7 +506,7 @@ public class Holders
super.bind(item);
getTitle().setText(R.string.gallery_pp_download_guides_offline_title);
mSubTitle.setText(R.string.gallery_pp_download_guides_offline_subtitle);
UiUtils.hide(getButton());
UiUtils.invisible(getButton());
}
}

View file

@ -3,11 +3,13 @@ package com.mapswithme.maps.gallery.impl;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import com.mapswithme.maps.R;
import com.mapswithme.maps.discovery.LocalExpert;
import com.mapswithme.maps.gallery.Constants;
import com.mapswithme.maps.gallery.GalleryAdapter;
import com.mapswithme.maps.gallery.Holders;
import com.mapswithme.maps.gallery.ItemSelectedListener;
import com.mapswithme.maps.gallery.Items;
import com.mapswithme.maps.promo.PromoCityGallery;
@ -105,18 +107,39 @@ public class Factory
}
@NonNull
public static GalleryAdapter createCatalogPromoLoadingAdapter(@NonNull ItemSelectedListener<Items.Item> listener)
public static GalleryAdapter createCatalogPromoLoadingAdapter()
{
CatalogPromoLoadingAdapterStrategy strategy = new CatalogPromoLoadingAdapterStrategy(null, null);
return new GalleryAdapter<>(strategy);
}
@NonNull
public static GalleryAdapter createCatalogPromoErrorAdapter(@NonNull ItemSelectedListener<Items.Item> listener)
public static GalleryAdapter createCatalogPromoNoConnectionAdapter(@Nullable ItemSelectedListener<Items.Item> listener)
{
return new GalleryAdapter<>(new CatalogPromoErrorAdapterStrategy(listener));
}
@NonNull
public static GalleryAdapter createCatalogPromoErrorAdapter(@Nullable ItemSelectedListener<Items.Item> listener)
{
return new GalleryAdapter<>(new CatalogPromoErrorAdapterStrategy(listener)
{
@Override
protected Holders.SimpleViewHolder createViewHolder(@NonNull View itemView)
{
return new Holders.CatalogErrorHolder(itemView, mItems, getListener())
{
@Override
public void bind(@NonNull Items.Item item)
{
super.bind(item);
getButton().setVisibility(View.INVISIBLE);
}
};
}
});
}
private static <Product> void trackProductGalleryShownOrError(@NonNull Product[] products,
@NonNull GalleryType type,
@NonNull GalleryState state,

View file

@ -519,10 +519,10 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment
if (mobilePref == null)
return;
int curValue = Config.getUseMobileDataSettings();
NetworkPolicy.Type curValue = Config.getUseMobileDataSettings();
if (curValue != NetworkPolicy.NOT_TODAY && curValue != NetworkPolicy.TODAY
&& curValue != NetworkPolicy.NONE)
if (curValue != NetworkPolicy.Type.NOT_TODAY && curValue != NetworkPolicy.Type.TODAY
&& curValue != NetworkPolicy.Type.NONE)
{
mobilePref.setValue(String.valueOf(curValue));
mobilePref.setSummary(mobilePref.getEntry());
@ -537,20 +537,16 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment
public boolean onPreferenceChange(Preference preference, Object newValue)
{
String valueStr = (String)newValue;
switch (Integer.parseInt(valueStr))
{
case NetworkPolicy.ASK:
Config.setUseMobileDataSettings(NetworkPolicy.ASK);
break;
case NetworkPolicy.ALWAYS:
Config.setUseMobileDataSettings(NetworkPolicy.ALWAYS);
break;
case NetworkPolicy.NEVER:
Config.setUseMobileDataSettings(NetworkPolicy.NEVER);
break;
default:
throw new AssertionError("Wrong NetworkPolicy type!");
}
int value = Integer.parseInt(valueStr);
NetworkPolicy.Type type = NetworkPolicy.Type.values()[value];
if (type == NetworkPolicy.Type.ALWAYS
|| type == NetworkPolicy.Type.ASK
|| type == NetworkPolicy.Type.NEVER)
Config.setUseMobileDataSettings(type);
else
throw new AssertionError("Wrong NetworkPolicy type, value = " + valueStr);
UiThread.runLater(new Runnable()
{

View file

@ -32,7 +32,7 @@ public class StackedButtonDialogFragment extends DialogFragment
@Override
public void onClick(DialogInterface dialog, int which)
{
Config.setUseMobileDataSettings(NetworkPolicy.ALWAYS);
Config.setUseMobileDataSettings(NetworkPolicy.Type.ALWAYS);
if (mListener != null)
mListener.onResult(NetworkPolicy.newInstance(true));
}
@ -42,7 +42,7 @@ public class StackedButtonDialogFragment extends DialogFragment
@Override
public void onClick(DialogInterface dialog, int which)
{
Config.setUseMobileDataSettings(NetworkPolicy.NOT_TODAY);
Config.setUseMobileDataSettings(NetworkPolicy.Type.NOT_TODAY);
Config.setMobileDataTimeStamp(System.currentTimeMillis());
if (mListener != null)
mListener.onResult(NetworkPolicy.newInstance(false));
@ -53,7 +53,7 @@ public class StackedButtonDialogFragment extends DialogFragment
@Override
public void onClick(DialogInterface dialog, int which)
{
Config.setUseMobileDataSettings(NetworkPolicy.TODAY);
Config.setUseMobileDataSettings(NetworkPolicy.Type.TODAY);
Config.setMobileDataTimeStamp(System.currentTimeMillis());
if (mListener != null)
mListener.onResult(NetworkPolicy.newInstance(true));

View file

@ -1,19 +1,25 @@
package com.mapswithme.maps.widget.placepage;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import com.mapswithme.maps.gallery.Items;
import com.mapswithme.util.ConnectionState;
import com.mapswithme.util.NetworkPolicy;
import com.mapswithme.util.Utils;
public class ErrorCatalogPromoListener<T extends Items.Item> implements com.mapswithme.maps.gallery.ItemSelectedListener<T>
{
@NonNull
private final Activity mActivity;
private final FragmentActivity mActivity;
@NonNull
private final NetworkPolicy.NetworkPolicyListener mListener;
public ErrorCatalogPromoListener(@NonNull Activity activity)
public ErrorCatalogPromoListener(@NonNull FragmentActivity activity,
@NonNull NetworkPolicy.NetworkPolicyListener listener)
{
mActivity = activity;
mListener = listener;
}
@Override
@ -29,11 +35,14 @@ public class ErrorCatalogPromoListener<T extends Items.Item> implements com.maps
@Override
public void onItemSelected(@NonNull T item, int position)
{
Utils.showSystemSettings(getActivity());
if (ConnectionState.isConnected())
NetworkPolicy.checkNetworkPolicy(mActivity.getSupportFragmentManager(), mListener, true);
else
Utils.showSystemSettings(getActivity());
}
@NonNull
protected Activity getActivity()
protected FragmentActivity getActivity()
{
return mActivity;
}

View file

@ -397,8 +397,7 @@ public class PlacePageView extends NestedScrollView
@Override
public void onErrorReceived()
{
ErrorCatalogPromoListener<Items.Item> listener = new ErrorCatalogPromoListener<>(getActivity());
com.mapswithme.maps.gallery.GalleryAdapter adapter = Factory.createCatalogPromoErrorAdapter(listener);
com.mapswithme.maps.gallery.GalleryAdapter adapter = Factory.createCatalogPromoErrorAdapter(null);
mCatalogPromoRecycler.setAdapter(adapter);
Statistics.INSTANCE.trackGalleryError(GalleryType.PROMO, GalleryPlacement.PLACEPAGE,
Statistics.ParamValue.NO_PRODUCTS);
@ -875,8 +874,7 @@ public class PlacePageView extends NestedScrollView
mCatalogPromoTitleView = findViewById(R.id.catalog_promo_title);
BaseItemSelectedListener<Items.Item> listener =
new BaseItemSelectedListener<>(getActivity());
com.mapswithme.maps.gallery.GalleryAdapter adapter =
Factory.createCatalogPromoLoadingAdapter(listener);
com.mapswithme.maps.gallery.GalleryAdapter adapter = Factory.createCatalogPromoLoadingAdapter();
mCatalogPromoRecycler.setNestedScrollingEnabled(false);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(),
LinearLayoutManager.HORIZONTAL,
@ -1254,11 +1252,18 @@ public class PlacePageView extends NestedScrollView
if (mSponsored == null || mMapObject == null)
return;
if (hasPromoGallery)
if (hasPromoGallery && policy.canUseNetwork())
{
Promo.INSTANCE.nativeRequestCityGallery(policy, mMapObject.getLat(), mMapObject.getLon(),
UTM.UTM_PLACEPAGE_GALLERY);
}
else if (hasPromoGallery)
{
ErrorCatalogPromoListener<Items.Item> listener =
new ErrorCatalogPromoListener<>(getActivity(), this::onNetworkPolicyResult);
com.mapswithme.maps.gallery.GalleryAdapter adapter = Factory.createCatalogPromoNoConnectionAdapter(listener);
mCatalogPromoRecycler.setAdapter(adapter);
}
mSponsored.updateId(mMapObject);
mSponsoredPrice = mSponsored.getPrice();
@ -1274,6 +1279,16 @@ public class PlacePageView extends NestedScrollView
Sponsored.requestInfo(mSponsored, Locale.getDefault().toString(), policy);
}
private void onNetworkPolicyResult(@NonNull NetworkPolicy policy)
{
if (policy.canUseNetwork())
{
Promo.INSTANCE.nativeRequestCityGallery(policy, mMapObject.getLat(), mMapObject.getLon(),
UTM.UTM_PLACEPAGE_GALLERY);
mCatalogPromoRecycler.setAdapter(Factory.createCatalogPromoLoadingAdapter());
}
}
private boolean isNetworkNeeded()
{
return mMapObject != null && (isSponsored() || mMapObject.getBanners() != null);

View file

@ -251,31 +251,23 @@ public final class Config
nativeSetLargeFontsSize(value);
}
@NetworkPolicy.NetworkPolicyDef
public static int getUseMobileDataSettings()
@NonNull
public static NetworkPolicy.Type getUseMobileDataSettings()
{
switch(getInt(KEY_MISC_USE_MOBILE_DATA, NetworkPolicy.NONE))
{
case NetworkPolicy.ASK:
return NetworkPolicy.ASK;
case NetworkPolicy.ALWAYS:
return NetworkPolicy.ALWAYS;
case NetworkPolicy.NEVER:
return NetworkPolicy.NEVER;
case NetworkPolicy.NOT_TODAY:
return NetworkPolicy.NOT_TODAY;
case NetworkPolicy.TODAY:
return NetworkPolicy.TODAY;
case NetworkPolicy.NONE:
return NetworkPolicy.NONE;
}
int value = getInt(KEY_MISC_USE_MOBILE_DATA, NetworkPolicy.NONE);
throw new AssertionError("Wrong NetworkPolicy type!");
if ((value != NetworkPolicy.NONE && value < 0) || value >= NetworkPolicy.Type.values().length)
throw new AssertionError("Wrong NetworkPolicy type : " + value);
if (value == NetworkPolicy.NONE)
return NetworkPolicy.Type.NONE;
return NetworkPolicy.Type.values()[value];
}
public static void setUseMobileDataSettings(@NetworkPolicy.NetworkPolicyDef int value)
public static void setUseMobileDataSettings(@NonNull NetworkPolicy.Type value)
{
setInt(KEY_MISC_USE_MOBILE_DATA, value);
setInt(KEY_MISC_USE_MOBILE_DATA, value.ordinal());
setBool(KEY_MISC_USE_MOBILE_DATA_ROAMING, ConnectionState.isInRoaming());
}

View file

@ -12,23 +12,87 @@ import java.util.concurrent.TimeUnit;
public final class NetworkPolicy
{
public enum Type
{
ASK,
ALWAYS
{
@Override
public void apply(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{
boolean nowInRoaming = ConnectionState.isInRoaming();
boolean acceptedInRoaming = Config.getMobileDataRoaming();
if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener);
else
listener.onResult(new NetworkPolicy(true));
}
},
NEVER
{
@Override
public void apply(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{
if (isDialogAllowed)
showDialog(fragmentManager, listener);
else
listener.onResult(new NetworkPolicy(false));
}
},
NOT_TODAY
{
@Override
public void apply(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{
if (isDialogAllowed)
showDialog(fragmentManager, listener);
else
showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false));
}
},
TODAY
{
@Override
public void apply(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicyListener listener, boolean isDialogAllowed)
{
boolean nowInRoaming = ConnectionState.isInRoaming();
boolean acceptedInRoaming = Config.getMobileDataRoaming();
if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener);
else
showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(true));
}
},
NONE;
public void apply(@NonNull FragmentManager fragmentManager,
@NonNull final NetworkPolicyListener listener,
boolean isDialogAllowed)
{
showDialog(fragmentManager, listener);
}
}
public static final int NONE = -1;
public static final int ASK = 0;
public static final int ALWAYS = 1;
public static final int NEVER = 2;
public static final int NOT_TODAY = 3;
public static final int TODAY = 4;
private static final String TAG_NETWORK_POLICY = "network_policy";
@Retention(RetentionPolicy.SOURCE)
@IntDef({ NONE, ASK, ALWAYS, NEVER, NOT_TODAY, TODAY })
@interface NetworkPolicyDef
{
}
public static void checkNetworkPolicy(@NonNull FragmentManager fragmentManager,
@NonNull final NetworkPolicyListener listener)
@NonNull final NetworkPolicyListener listener,
boolean isDialogAllowed)
{
if (ConnectionState.isWifiConnected())
{
@ -42,34 +106,14 @@ public final class NetworkPolicy
return;
}
boolean nowInRoaming = ConnectionState.isInRoaming();
boolean acceptedInRoaming = Config.getMobileDataRoaming();
int type = Config.getUseMobileDataSettings();
switch (type)
{
case ASK:
case NONE:
showDialog(fragmentManager, listener);
break;
case ALWAYS:
if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener);
else
listener.onResult(new NetworkPolicy(true));
break;
case NEVER:
listener.onResult(new NetworkPolicy(false));
break;
case NOT_TODAY:
showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(false));
break;
case TODAY:
if (nowInRoaming && !acceptedInRoaming)
showDialog(fragmentManager, listener);
else
showDialogIfNeeded(fragmentManager, listener, new NetworkPolicy(true));
break;
}
Type type = Config.getUseMobileDataSettings();
type.apply(fragmentManager, listener, isDialogAllowed);
}
public static void checkNetworkPolicy(@NonNull FragmentManager fragmentManager,
@NonNull final NetworkPolicyListener listener)
{
checkNetworkPolicy(fragmentManager, listener, false);
}
public static boolean getCurrentNetworkUsageStatus()
@ -85,8 +129,8 @@ public final class NetworkPolicy
if (nowInRoaming && !acceptedInRoaming)
return false;
int type = Config.getUseMobileDataSettings();
return type == ALWAYS || (type == TODAY && isToday());
Type type = Config.getUseMobileDataSettings();
return type == Type.ALWAYS || (type == Type.TODAY && isToday());
}
private static boolean isToday()