Plugin installed dialog initial commit

This commit is contained in:
Chumva 2019-11-14 18:29:27 +02:00
parent b932b629c4
commit 5649ca145d
6 changed files with 404 additions and 2 deletions

View file

@ -11,6 +11,12 @@
Thx - Hardy Thx - Hardy
--> -->
<string name="suggested_maps">Suggested maps</string>
<string name="suggested_maps_descr">Those maps are required to use with plugin</string>
<string name="added_profiles">Added profiles</string>
<string name="added_profiles_descr">Plugin adds new profile to OsmAnd</string>
<string name="shared_string_turn_off">Turn off</string>
<string name="new_plugin_added">New plugin added</string>
<string name="clear_confirmation_msg">Clear %1$s?</string> <string name="clear_confirmation_msg">Clear %1$s?</string>
<string name="shared_string_revert">Revert</string> <string name="shared_string_revert">Revert</string>
<string name="track_saved">Track saved</string> <string name="track_saved">Track saved</string>

View file

@ -23,6 +23,7 @@ import net.osmand.plus.activities.TabActivity.TabItem;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin; import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.dashboard.tools.DashFragmentData; import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.development.OsmandDevelopmentPlugin; import net.osmand.plus.development.OsmandDevelopmentPlugin;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController;
@ -41,11 +42,15 @@ import org.apache.commons.logging.Log;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
public abstract class OsmandPlugin { public abstract class OsmandPlugin {
public static final String PLUGIN_ID_KEY = "plugin_id";
private static List<OsmandPlugin> allPlugins = new ArrayList<OsmandPlugin>(); private static List<OsmandPlugin> allPlugins = new ArrayList<OsmandPlugin>();
private static final Log LOG = PlatformUtil.getLog(OsmandPlugin.class); private static final Log LOG = PlatformUtil.getLog(OsmandPlugin.class);
@ -104,6 +109,14 @@ public abstract class OsmandPlugin {
return installURL; return installURL;
} }
public List<ApplicationMode> getAddedAppModes() {
return Collections.emptyList();
}
public List<IndexItem> getSuggestedMaps() {
return Collections.emptyList();
}
/** /**
* Plugin was installed * Plugin was installed
*/ */

View file

@ -0,0 +1,298 @@
package net.osmand.plus.dialogs;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemTitleWithDescrAndButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadValidationManager;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.settings.BaseSettingsFragment;
import org.apache.commons.logging.Log;
import java.util.List;
import static net.osmand.plus.OsmandPlugin.PLUGIN_ID_KEY;
public class PluginInstalledBottomSheetDialog extends MenuBottomSheetDialogFragment implements DownloadIndexesThread.DownloadEvents {
public static final String TAG = PluginInstalledBottomSheetDialog.class.getName();
private static final Log LOG = PlatformUtil.getLog(PluginInstalledBottomSheetDialog.class);
private static final int COLLAPSED_DESCRIPTION_LINES = 7;
private String pluginId;
private boolean descriptionExpanded;
private BottomSheetItemTitleWithDescrAndButton descrItem;
@Override
public void createMenuItems(Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication();
Context context = getContext();
if (context == null || app == null) {
return;
}
if (savedInstanceState != null) {
pluginId = savedInstanceState.getString(PLUGIN_ID_KEY);
} else {
Bundle args = getArguments();
if (args != null) {
pluginId = args.getString(PLUGIN_ID_KEY);
}
}
OsmandPlugin plugin = OsmandPlugin.getPlugin(pluginId);
if (plugin == null) {
return;
}
items.add(new TitleItem(getString(R.string.new_plugin_added)));
BaseBottomSheetItem pluginTitle = new SimpleBottomSheetItem.Builder()
.setTitle(plugin.getName())
.setTitleColorId(nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light)
.setIcon(getContentIcon(R.drawable.ic_extension_dark))
.setLayoutId(R.layout.bottom_sheet_item_simple_56dp)
.create();
items.add(pluginTitle);
descrItem = (BottomSheetItemTitleWithDescrAndButton) new BottomSheetItemTitleWithDescrAndButton.Builder()
.setButtonTitle(getString(R.string.show_full_description))
.setOnButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
descriptionExpanded = !descriptionExpanded;
descrItem.setButtonText(getString(descriptionExpanded
? R.string.hide_full_description : R.string.show_full_description));
descrItem.setDescriptionMaxLines(descriptionExpanded
? Integer.MAX_VALUE : COLLAPSED_DESCRIPTION_LINES);
setupHeightAndBackground(getView());
}
})
.setDescription(plugin.getDescription())
.setDescriptionMaxLines(COLLAPSED_DESCRIPTION_LINES)
.setLayoutId(R.layout.bottom_sheet_item_with_expandable_descr)
.create();
items.add(descrItem);
List<ApplicationMode> addedAppModes = plugin.getAddedAppModes();
if (!addedAppModes.isEmpty()) {
createAddedAppModesItems(addedAppModes);
}
List<IndexItem> suggestedMaps = plugin.getSuggestedMaps();
if (!suggestedMaps.isEmpty()) {
createSuggestedMapsItems(suggestedMaps);
}
}
@Override
public void newDownloadIndexes() {
updateItems();
}
@Override
public void downloadInProgress() {
final OsmandApplication app = getMyApplication();
if (app == null) {
return;
}
DownloadIndexesThread downloadThread = app.getDownloadThread();
IndexItem downloadIndexItem = downloadThread.getCurrentDownloadingItem();
if (downloadIndexItem != null) {
for (BaseBottomSheetItem item : items) {
if (item instanceof BottomSheetItemWithDescription) {
Object tag = item.getTag();
if (tag instanceof IndexItem) {
IndexItem indexItem = (IndexItem) tag;
BottomSheetItemWithDescription mapItem = (BottomSheetItemWithDescription) item;
ProgressBar progressBar = mapItem.getView().findViewById(R.id.ProgressBar);
if (downloadIndexItem.equals(indexItem)) {
progressBar.setProgress(downloadThread.getCurrentDownloadingItemProgress());
progressBar.setIndeterminate(false);
} else if (indexItem.isDownloaded()) {
AndroidUiHelper.updateVisibility(progressBar, false);
}
}
}
}
}
}
@Override
public void downloadHasFinished() {
updateItems();
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_turn_off;
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.shared_string_ok;
}
@Override
protected void onRightBottomButtonClick() {
dismiss();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(PLUGIN_ID_KEY, pluginId);
}
private void createAddedAppModesItems(List<ApplicationMode> addedAppModes) {
final OsmandApplication app = requiredMyApplication();
items.add(new DividerItem(getContext()));
BaseBottomSheetItem addedAppProfiles = new BottomSheetItemWithDescription.Builder()
.setDescription(getString(R.string.added_profiles_descr))
.setTitle(getString(R.string.added_profiles))
.setLayoutId(R.layout.bottom_sheet_item_with_descr_56dp)
.create();
items.add(addedAppProfiles);
for (final ApplicationMode mode : addedAppModes) {
final BottomSheetItemWithCompoundButton[] appModeItem = new BottomSheetItemWithCompoundButton[1];
appModeItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
.setChecked(ApplicationMode.values(app).contains(mode))
.setDescription(BaseSettingsFragment.getAppModeDescription(app, mode))
.setTitle(mode.toHumanString(app))
.setIcon(getActiveIcon(mode.getIconRes()))
.setLayoutId(R.layout.bottom_sheet_item_with_descr_and_switch_56dp)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = !appModeItem[0].isChecked();
appModeItem[0].setChecked(checked);
ApplicationMode.changeProfileAvailability(mode, checked, app);
}
})
.create();
items.add(appModeItem[0]);
}
}
private void createSuggestedMapsItems(List<IndexItem> suggestedMaps) {
final OsmandApplication app = requiredMyApplication();
items.add(new DividerItem(getContext()));
BaseBottomSheetItem addedAppProfiles = new BottomSheetItemWithDescription.Builder()
.setDescription(getString(R.string.suggested_maps_descr))
.setTitle(getString(R.string.suggested_maps))
.setLayoutId(R.layout.bottom_sheet_item_with_descr_56dp)
.create();
items.add(addedAppProfiles);
final DownloadIndexesThread downloadThread = app.getDownloadThread();
for (final IndexItem indexItem : suggestedMaps) {
View view = UiUtilities.getInflater(app, nightMode).inflate(R.layout.list_item_icon_and_download, null);
AndroidUtils.setBackground(view, UiUtilities.getSelectableDrawable(app));
final ImageView secondaryIcon = view.findViewById(R.id.secondary_icon);
final ProgressBar progressBar = view.findViewById(R.id.ProgressBar);
AndroidUiHelper.updateVisibility(secondaryIcon, true);
AndroidUiHelper.updateVisibility(progressBar, downloadThread.isDownloading(indexItem));
if (indexItem == downloadThread.getCurrentDownloadingItem()) {
progressBar.setProgress(downloadThread.getCurrentDownloadingItemProgress());
progressBar.setIndeterminate(false);
secondaryIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_remove_dark));
} else {
progressBar.setIndeterminate(downloadThread.isDownloading());
secondaryIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_import));
}
BaseBottomSheetItem mapIndexItem = new BottomSheetItemWithDescription.Builder()
.setDescription(indexItem.getType().getString(app) + "" + indexItem.getSizeDescription(app))
.setTitle(indexItem.getVisibleName(app, app.getRegions(), false))
.setIcon(getContentIcon(indexItem.getType().getIconResource()))
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (downloadThread.isDownloading(indexItem)) {
downloadThread.cancelDownload(indexItem);
AndroidUiHelper.updateVisibility(progressBar, false);
secondaryIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_import));
} else {
AndroidUiHelper.updateVisibility(progressBar, true);
progressBar.setIndeterminate(downloadThread.isDownloading());
secondaryIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_remove_dark));
new DownloadValidationManager(app).startDownload(getActivity(), indexItem);
}
}
})
.setTag(indexItem)
.setCustomView(view)
.create();
items.add(mapIndexItem);
}
}
private void updateItems() {
View mainView = getView();
if (mainView != null) {
LinearLayout itemsContainer = (LinearLayout) mainView.findViewById(useScrollableItemsContainer()
? R.id.scrollable_items_container : R.id.non_scrollable_items_container);
if (itemsContainer != null) {
itemsContainer.removeAllViews();
}
items.clear();
createMenuItems(null);
for (BaseBottomSheetItem item : items) {
item.inflate(getMyApplication(), itemsContainer, nightMode);
}
setupHeightAndBackground(mainView);
}
}
public static void showInstance(@NonNull FragmentManager fm, String pluginId, Boolean usedOnMap) {
try {
Bundle args = new Bundle();
args.putString(PLUGIN_ID_KEY, pluginId);
PluginInstalledBottomSheetDialog dialog = new PluginInstalledBottomSheetDialog();
dialog.setArguments(args);
dialog.setUsedOnMap(usedOnMap);
dialog.show(fm, PluginInstalledBottomSheetDialog.TAG);
} catch (RuntimeException e) {
LOG.error("showInstance", e);
}
}
}

View file

@ -6,6 +6,8 @@ import android.content.DialogInterface.OnClickListener;
import android.content.Intent; import android.content.Intent;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
@ -15,9 +17,13 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadResources; import net.osmand.plus.download.DownloadResources;
import java.util.Collections;
import java.util.List;
public class NauticalMapsPlugin extends OsmandPlugin { public class NauticalMapsPlugin extends OsmandPlugin {
@ -89,7 +95,17 @@ public class NauticalMapsPlugin extends OsmandPlugin {
@Override @Override
public void onInstall(@NonNull OsmandApplication app, @Nullable Activity activity) { public void onInstall(@NonNull OsmandApplication app, @Nullable Activity activity) {
ApplicationMode.changeProfileAvailability(ApplicationMode.BOAT, true, app); ApplicationMode.changeProfileAvailability(ApplicationMode.BOAT, true, app);
app.getSettings().APPLICATION_MODE.set(ApplicationMode.BOAT); if (activity instanceof FragmentActivity) {
FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
if (fragmentManager != null) {
PluginInstalledBottomSheetDialog.showInstance(fragmentManager, getId(), activity instanceof MapActivity);
}
}
}
@Override
public List<ApplicationMode> getAddedAppModes() {
return Collections.singletonList(ApplicationMode.BOAT);
} }
@Override @Override

View file

@ -3,11 +3,18 @@ package net.osmand.plus.skimapsplugin;
import android.app.Activity; import android.app.Activity;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
import java.util.Collections;
import java.util.List;
public class SkiMapsPlugin extends OsmandPlugin { public class SkiMapsPlugin extends OsmandPlugin {
@ -58,7 +65,17 @@ public class SkiMapsPlugin extends OsmandPlugin {
@Override @Override
public void onInstall(@NonNull OsmandApplication app, @Nullable Activity activity) { public void onInstall(@NonNull OsmandApplication app, @Nullable Activity activity) {
ApplicationMode.changeProfileAvailability(ApplicationMode.SKI, true, app); ApplicationMode.changeProfileAvailability(ApplicationMode.SKI, true, app);
app.getSettings().APPLICATION_MODE.set(ApplicationMode.SKI); if (activity instanceof FragmentActivity) {
FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
if (fragmentManager != null) {
PluginInstalledBottomSheetDialog.showInstance(fragmentManager, getId(), activity instanceof MapActivity);
}
}
}
@Override
public List<ApplicationMode> getAddedAppModes() {
return Collections.singletonList(ApplicationMode.SKI);
} }
@Override @Override

View file

@ -4,11 +4,15 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.data.LatLon;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem; import net.osmand.plus.ContextMenuItem;
@ -20,13 +24,20 @@ import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.activities.SettingsActivity;
import net.osmand.plus.dashboard.DashboardOnMap; import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadResources;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.render.RenderingRuleProperty; import net.osmand.render.RenderingRuleProperty;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES;
@ -102,6 +113,16 @@ public class SRTMPlugin extends OsmandPlugin {
return true; return true;
} }
@Override
public void onInstall(@NonNull OsmandApplication app, @Nullable Activity activity) {
if (activity instanceof FragmentActivity) {
FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
if (fragmentManager != null) {
PluginInstalledBottomSheetDialog.showInstance(fragmentManager, getId(), activity instanceof MapActivity);
}
}
}
@Override @Override
public void registerLayers(MapActivity activity) { public void registerLayers(MapActivity activity) {
if (hillshadeLayer != null) { if (hillshadeLayer != null) {
@ -251,6 +272,37 @@ public class SRTMPlugin extends OsmandPlugin {
.createItem()); .createItem());
} }
@Override
public List<IndexItem> getSuggestedMaps() {
List<IndexItem> suggestedMaps = new ArrayList<>();
DownloadIndexesThread downloadThread = app.getDownloadThread();
if (!downloadThread.getIndexes().isDownloadedFromInternet && settings.isInternetConnectionAvailable()) {
downloadThread.runReloadIndexFiles();
}
boolean downloadIndexes = settings.isInternetConnectionAvailable()
&& !downloadThread.getIndexes().isDownloadedFromInternet
&& !downloadThread.getIndexes().downloadFromInternetFailed;
if (!downloadIndexes) {
LatLon latLon = app.getMapViewTrackingUtilities().getMapLocation();
suggestedMaps.addAll(getMapsForType(latLon, DownloadActivityType.SRTM_COUNTRY_FILE));
suggestedMaps.addAll(getMapsForType(latLon, DownloadActivityType.HILLSHADE_FILE));
}
return suggestedMaps;
}
private List<IndexItem> getMapsForType(LatLon latLon, DownloadActivityType type) {
try {
return DownloadResources.findIndexItemsAt(app, latLon, type);
} catch (IOException e) {
e.printStackTrace();
}
return Collections.emptyList();
}
public void toggleContourLines(final MapActivity activity, public void toggleContourLines(final MapActivity activity,
final boolean isChecked, final boolean isChecked,
final Runnable callback) { final Runnable callback) {