Added api for osmand settings customization

This commit is contained in:
crimean 2018-11-10 14:11:52 +03:00
parent 3d7df19a7b
commit e6066ef551
22 changed files with 582 additions and 103 deletions

View file

@ -67,6 +67,9 @@ import net.osmand.aidl.search.SearchResult;
import net.osmand.aidl.search.SearchParams; import net.osmand.aidl.search.SearchParams;
import net.osmand.aidl.navigation.NavigateSearchParams; import net.osmand.aidl.navigation.NavigateSearchParams;
import net.osmand.aidl.customization.SetWidgetsParams;
import net.osmand.aidl.customization.OsmandSettingsParams;
// NOTE: Add new methods at the end of file!!! // NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface { interface IOsmAndAidlInterface {
@ -140,4 +143,9 @@ interface IOsmAndAidlInterface {
boolean setDisabledIds(in List<String> ids); boolean setDisabledIds(in List<String> ids);
boolean setEnabledPatterns(in List<String> patterns); boolean setEnabledPatterns(in List<String> patterns);
boolean setDisabledPatterns(in List<String> patterns); boolean setDisabledPatterns(in List<String> patterns);
boolean regWidgetVisibility(in SetWidgetsParams params);
boolean regWidgetAvailability(in SetWidgetsParams params);
boolean customizeOsmandSettings(in OsmandSettingsParams params);
} }

View file

@ -14,6 +14,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -84,10 +85,12 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -1664,22 +1667,37 @@ public class OsmandAidlApi {
} }
boolean setEnabledIds(Collection<String> ids) { boolean setEnabledIds(Collection<String> ids) {
app.getAppCustomization().setEnabledIds(ids); app.getAppCustomization().setFeaturesEnabledIds(ids);
return true; return true;
} }
boolean setDisabledIds(Collection<String> ids) { boolean setDisabledIds(Collection<String> ids) {
app.getAppCustomization().setDisabledIds(ids); app.getAppCustomization().setFeaturesDisabledIds(ids);
return true; return true;
} }
boolean setEnabledPatterns(Collection<String> patterns) { boolean setEnabledPatterns(Collection<String> patterns) {
app.getAppCustomization().setEnabledPatterns(patterns); app.getAppCustomization().setFeaturesEnabledPatterns(patterns);
return true; return true;
} }
boolean setDisabledPatterns(Collection<String> patterns) { boolean setDisabledPatterns(Collection<String> patterns) {
app.getAppCustomization().setDisabledPatterns(patterns); app.getAppCustomization().setFeaturesDisabledPatterns(patterns);
return true;
}
boolean regWidgetVisibility(@NonNull String widgetId, @Nullable List<String> appModeKeys) {
app.getAppCustomization().regWidgetVisibility(widgetId, appModeKeys);
return true;
}
boolean regWidgetAvailability(@NonNull String widgetId, @Nullable List<String> appModeKeys) {
app.getAppCustomization().regWidgetAvailability(widgetId, appModeKeys);
return true;
}
boolean customizeOsmandSettings(@NonNull String sharedPreferencesName, @Nullable Bundle bundle) {
app.getAppCustomization().customizeOsmandSettings(sharedPreferencesName, bundle);
return true; return true;
} }

View file

@ -13,6 +13,8 @@ import android.support.annotation.Nullable;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.aidl.OsmandAidlApi.SearchCompleteCallback; import net.osmand.aidl.OsmandAidlApi.SearchCompleteCallback;
import net.osmand.aidl.calculateroute.CalculateRouteParams; import net.osmand.aidl.calculateroute.CalculateRouteParams;
import net.osmand.aidl.customization.OsmandSettingsParams;
import net.osmand.aidl.customization.SetWidgetsParams;
import net.osmand.aidl.favorite.AddFavoriteParams; import net.osmand.aidl.favorite.AddFavoriteParams;
import net.osmand.aidl.favorite.RemoveFavoriteParams; import net.osmand.aidl.favorite.RemoveFavoriteParams;
import net.osmand.aidl.favorite.UpdateFavoriteParams; import net.osmand.aidl.favorite.UpdateFavoriteParams;
@ -679,25 +681,25 @@ public class OsmandAidlService extends Service {
@Override @Override
public boolean setEnabledIds(List<String> ids) throws RemoteException { public boolean setEnabledIds(List<String> ids) throws RemoteException {
OsmandAidlApi api = getApi("setEnabledIds"); OsmandAidlApi api = getApi("setFeaturesEnabledIds");
return api != null && api.setEnabledIds(ids); return api != null && api.setEnabledIds(ids);
} }
@Override @Override
public boolean setDisabledIds(List<String> ids) throws RemoteException { public boolean setDisabledIds(List<String> ids) throws RemoteException {
OsmandAidlApi api = getApi("setDisabledIds"); OsmandAidlApi api = getApi("setFeaturesDisabledIds");
return api != null && api.setDisabledIds(ids); return api != null && api.setDisabledIds(ids);
} }
@Override @Override
public boolean setEnabledPatterns(List<String> patterns) throws RemoteException { public boolean setEnabledPatterns(List<String> patterns) throws RemoteException {
OsmandAidlApi api = getApi("setEnabledPatterns"); OsmandAidlApi api = getApi("setFeaturesEnabledPatterns");
return api != null && api.setEnabledPatterns(patterns); return api != null && api.setEnabledPatterns(patterns);
} }
@Override @Override
public boolean setDisabledPatterns(List<String> patterns) throws RemoteException { public boolean setDisabledPatterns(List<String> patterns) throws RemoteException {
OsmandAidlApi api = getApi("setDisabledPatterns"); OsmandAidlApi api = getApi("setFeaturesDisabledPatterns");
return api != null && api.setDisabledPatterns(patterns); return api != null && api.setDisabledPatterns(patterns);
} }
@ -719,5 +721,23 @@ public class OsmandAidlService extends Service {
} }
}, updateTimeMS); }, updateTimeMS);
} }
@Override
public boolean regWidgetVisibility(SetWidgetsParams params) throws RemoteException {
OsmandAidlApi api = getApi("regWidgetVisibility");
return api != null && api.regWidgetVisibility(params.getWidgetKey(), params.getAppModesKeys());
}
@Override
public boolean regWidgetAvailability(SetWidgetsParams params) throws RemoteException {
OsmandAidlApi api = getApi("regWidgetVisibility");
return api != null && api.regWidgetAvailability(params.getWidgetKey(), params.getAppModesKeys());
}
@Override
public boolean customizeOsmandSettings(OsmandSettingsParams params) throws RemoteException {
OsmandAidlApi api = getApi("customizeOsmandSettings");
return api != null && api.customizeOsmandSettings(params.getSharedPreferencesName(), params.getBundle());
}
}; };
} }

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.customization;
parcelable OsmandSettingsParams;

View file

@ -0,0 +1,60 @@
package net.osmand.aidl.customization;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class OsmandSettingsParams implements Parcelable {
private String sharedPreferencesName;
private Bundle bundle;
public OsmandSettingsParams(@NonNull String sharedPreferencesName, @Nullable Bundle bundle) {
this.sharedPreferencesName = sharedPreferencesName;
this.bundle = bundle;
}
public OsmandSettingsParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<OsmandSettingsParams> CREATOR = new Creator<OsmandSettingsParams>() {
@Override
public OsmandSettingsParams createFromParcel(Parcel in) {
return new OsmandSettingsParams(in);
}
@Override
public OsmandSettingsParams[] newArray(int size) {
return new OsmandSettingsParams[size];
}
};
public String getSharedPreferencesName() {
return sharedPreferencesName;
}
public Bundle getBundle() {
return bundle;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(sharedPreferencesName);
out.writeBundle(bundle);
}
@SuppressLint("ParcelClassLoader")
private void readFromParcel(Parcel in) {
sharedPreferencesName = in.readString();
bundle = in.readBundle();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.customization;
parcelable SetWidgetsParams;

View file

@ -0,0 +1,93 @@
package net.osmand.aidl.customization;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class SetWidgetsParams implements Parcelable {
private String widgetKey;
private List<String> appModesKeys;
public SetWidgetsParams(String widgetKey, @Nullable List<String> appModesKeys) {
this.widgetKey = widgetKey;
this.appModesKeys = appModesKeys;
}
public SetWidgetsParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<SetWidgetsParams> CREATOR = new Creator<SetWidgetsParams>() {
@Override
public SetWidgetsParams createFromParcel(Parcel in) {
return new SetWidgetsParams(in);
}
@Override
public SetWidgetsParams[] newArray(int size) {
return new SetWidgetsParams[size];
}
};
public String getWidgetKey() {
return widgetKey;
}
public List<String> getAppModesKeys() {
return appModesKeys;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(widgetKey);
writeStringList(out, appModesKeys);
}
private void readFromParcel(Parcel in) {
widgetKey = in.readString();
appModesKeys = readStringList(in);
}
@Override
public int describeContents() {
return 0;
}
private void writeStringList(Parcel out, List<String> val) {
if (val == null) {
out.writeInt(-1);
return;
}
int N = val.size();
int i = 0;
out.writeInt(N);
while (i < N) {
out.writeString(val.get(i));
i++;
}
}
private List<String> readStringList(Parcel in) {
List<String> list = new ArrayList<>();
int M = list.size();
int N = in.readInt();
if (N == -1) {
return null;
}
int i = 0;
for (; i < M && i < N; i++) {
list.set(i, in.readString());
}
for (; i < N; i++) {
list.add(in.readString());
}
for (; i < M; i++) {
list.remove(N);
}
return list;
}
}

View file

@ -187,19 +187,29 @@ public class ApplicationMode {
this.stringKey = stringKey; this.stringKey = stringKey;
} }
public static List<ApplicationMode> values(OsmandSettings settings) { public static List<ApplicationMode> values(OsmandApplication app) {
if (customizationListener == null) {
customizationListener = new OsmAndAppCustomization.OsmAndAppCustomizationListener() {
@Override
public void onOsmAndSettingsCustomized() {
cachedFilteredValues = new ArrayList<>();
}
};
app.getAppCustomization().addListener(customizationListener);
}
if (cachedFilteredValues.isEmpty()) { if (cachedFilteredValues.isEmpty()) {
OsmandSettings settings = app.getSettings();
if (listener == null) { if (listener == null) {
listener = new StateChangedListener<String>() { listener = new StateChangedListener<String>() {
@Override @Override
public void stateChanged(String change) { public void stateChanged(String change) {
cachedFilteredValues = new ArrayList<ApplicationMode>(); cachedFilteredValues = new ArrayList<>();
} }
}; };
settings.AVAILABLE_APP_MODES.addListener(listener); settings.AVAILABLE_APP_MODES.addListener(listener);
} }
String available = settings.AVAILABLE_APP_MODES.get(); String available = settings.AVAILABLE_APP_MODES.get();
cachedFilteredValues = new ArrayList<ApplicationMode>(); cachedFilteredValues = new ArrayList<>();
for (ApplicationMode v : values) { for (ApplicationMode v : values) {
if (available.indexOf(v.getStringKey() + ",") != -1 || v == DEFAULT) { if (available.indexOf(v.getStringKey() + ",") != -1 || v == DEFAULT) {
cachedFilteredValues.add(v); cachedFilteredValues.add(v);
@ -236,7 +246,10 @@ public class ApplicationMode {
return false; return false;
} }
public boolean isWidgetVisible(String key) { public boolean isWidgetVisible(OsmandApplication app, String key) {
if (app.getAppCustomization().areWidgetsCustomized()) {
return app.getAppCustomization().isWidgetVisible(key, this);
}
Set<ApplicationMode> set = widgetsVisibilityMap.get(key); Set<ApplicationMode> set = widgetsVisibilityMap.get(key);
if (set == null) { if (set == null) {
return false; return false;
@ -261,7 +274,10 @@ public class ApplicationMode {
return set; return set;
} }
public boolean isWidgetAvailable(String key) { public boolean isWidgetAvailable(OsmandApplication app, String key) {
if (app.getAppCustomization().areWidgetsCustomized()) {
return app.getAppCustomization().isWidgetAvailable(key, this);
}
Set<ApplicationMode> set = widgetsAvailabilityMap.get(key); Set<ApplicationMode> set = widgetsAvailabilityMap.get(key);
if (set == null) { if (set == null) {
return true; return true;
@ -393,4 +409,5 @@ public class ApplicationMode {
private int locationIconDayLost = R.drawable.map_pedestrian_location_lost; private int locationIconDayLost = R.drawable.map_pedestrian_location_lost;
private int locationIconNightLost = R.drawable.map_pedestrian_location_lost_night; private int locationIconNightLost = R.drawable.map_pedestrian_location_lost_night;
private static StateChangedListener<String> listener; private static StateChangedListener<String> listener;
private static OsmAndAppCustomization.OsmAndAppCustomizationListener customizationListener;
} }

View file

@ -4,6 +4,8 @@ import android.app.Activity;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
@ -25,9 +27,11 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -39,12 +43,43 @@ public class OsmAndAppCustomization {
private Bitmap navDrawerLogo; private Bitmap navDrawerLogo;
private Set<String> enabledIds = new HashSet<>(); private Set<String> featuresEnabledIds = new HashSet<>();
private Set<String> disabledIds = new HashSet<>(); private Set<String> featuresDisabledIds = new HashSet<>();
private Set<String> enabledPatterns = new HashSet<>(); private Set<String> featuresEnabledPatterns = new HashSet<>();
private Set<String> disabledPatterns = new HashSet<>(); private Set<String> featuresDisabledPatterns = new HashSet<>();
private Map<String, Set<ApplicationMode>> widgetsVisibilityMap = new LinkedHashMap<>();
private Map<String, Set<ApplicationMode>> widgetsAvailabilityMap = new LinkedHashMap<>();
private CustomOsmandSettings customOsmandSettings;
private boolean customizationEnabled; private boolean featuresCustomized;
private boolean widgetsCustomized;
private List<OsmAndAppCustomizationListener> listeners = new ArrayList<>();
public interface OsmAndAppCustomizationListener {
void onOsmAndSettingsCustomized();
}
public static class CustomOsmandSettings {
private String sharedPreferencesName;
private OsmandSettings settings;
CustomOsmandSettings(OsmandApplication app, String sharedPreferencesName, Bundle bundle) {
this.sharedPreferencesName = sharedPreferencesName;
this.settings = new OsmandSettings(app, new net.osmand.plus.api.SettingsAPIImpl(app), sharedPreferencesName);
if (bundle != null) {
for (String key : bundle.keySet()) {
Object object = bundle.get(key);
this.settings.setPreference(key, object);
}
}
}
public OsmandSettings getSettings() {
return settings;
}
}
public void setup(OsmandApplication app) { public void setup(OsmandApplication app) {
this.app = app; this.app = app;
@ -52,7 +87,25 @@ public class OsmAndAppCustomization {
} }
public OsmandSettings getOsmandSettings() { public OsmandSettings getOsmandSettings() {
return osmandSettings; return customOsmandSettings != null ? customOsmandSettings.getSettings() : osmandSettings;
}
public void customizeOsmandSettings(@NonNull String sharedPreferencesName, @Nullable Bundle bundle) {
customOsmandSettings = new CustomOsmandSettings(app, sharedPreferencesName, bundle);
OsmandSettings newSettings = customOsmandSettings.getSettings();
if (Build.VERSION.SDK_INT < 19) {
if (osmandSettings.isExternalStorageDirectorySpecifiedPre19()) {
File externalStorageDirectory = osmandSettings.getExternalStorageDirectoryPre19();
newSettings.setExternalStorageDirectoryPre19(externalStorageDirectory.getAbsolutePath());
}
} else if (osmandSettings.isExternalStorageDirectoryTypeSpecifiedV19()
&& osmandSettings.isExternalStorageDirectorySpecifiedV19()) {
int type = osmandSettings.getExternalStorageDirectoryTypeV19();
String directory = osmandSettings.getExternalStorageDirectoryV19();
newSettings.setExternalStorageDirectoryV19(type, directory);
}
app.setOsmandSettings(newSettings);
notifySettingsCustomized();
} }
// Activities // Activities
@ -145,49 +198,109 @@ public class OsmAndAppCustomization {
return true; return true;
} }
public void setEnabledIds(@NonNull Collection<String> ids) { public void setFeaturesEnabledIds(@NonNull Collection<String> ids) {
enabledIds.clear(); featuresEnabledIds.clear();
enabledIds.addAll(ids); featuresEnabledIds.addAll(ids);
updateCustomizationEnabled(); setFeaturesCustomized();
} }
public void setDisabledIds(@NonNull Collection<String> ids) { public void setFeaturesDisabledIds(@NonNull Collection<String> ids) {
disabledIds.clear(); featuresDisabledIds.clear();
disabledIds.addAll(ids); featuresDisabledIds.addAll(ids);
updateCustomizationEnabled(); setFeaturesCustomized();
} }
public void setEnabledPatterns(@NonNull Collection<String> patterns) { public void setFeaturesEnabledPatterns(@NonNull Collection<String> patterns) {
enabledPatterns.clear(); featuresEnabledPatterns.clear();
enabledPatterns.addAll(patterns); featuresEnabledPatterns.addAll(patterns);
updateCustomizationEnabled(); setFeaturesCustomized();
} }
public void setDisabledPatterns(@NonNull Collection<String> patterns) { public void setFeaturesDisabledPatterns(@NonNull Collection<String> patterns) {
disabledPatterns.clear(); featuresDisabledPatterns.clear();
disabledPatterns.addAll(patterns); featuresDisabledPatterns.addAll(patterns);
updateCustomizationEnabled(); setFeaturesCustomized();
}
public Set<ApplicationMode> regWidgetVisibility(@NonNull String widgetId, @Nullable List<String> appModeKeys) {
HashSet<ApplicationMode> set = getAppModesSet(appModeKeys);
widgetsVisibilityMap.put(widgetId, set);
setWidgetsCustomized();
return set;
}
public Set<ApplicationMode> regWidgetAvailability(@NonNull String widgetId, @Nullable List<String> appModeKeys) {
HashSet<ApplicationMode> set = getAppModesSet(appModeKeys);
widgetsAvailabilityMap.put(widgetId, set);
setWidgetsCustomized();
return set;
}
public boolean isWidgetVisible(@NonNull String key, ApplicationMode appMode) {
Set<ApplicationMode> set = widgetsVisibilityMap.get(key);
if (set == null) {
return false;
}
return set.contains(appMode);
}
public boolean isWidgetAvailable(@NonNull String key, ApplicationMode appMode) {
Set<ApplicationMode> set = widgetsAvailabilityMap.get(key);
if (set == null) {
return true;
}
return set.contains(appMode);
}
@NonNull
private HashSet<ApplicationMode> getAppModesSet(@Nullable List<String> appModeKeys) {
HashSet<ApplicationMode> set = new HashSet<>();
List<ApplicationMode> values = ApplicationMode.allPossibleValues();
if (appModeKeys == null) {
set.addAll(values);
} else {
for (String key : appModeKeys) {
ApplicationMode am = ApplicationMode.valueOfStringKey(key, null);
if (am != null) {
set.add(am);
}
}
}
for (ApplicationMode m : values) {
// add derived modes
if (set.contains(m.getParent())) {
set.add(m);
}
}
return set;
} }
public boolean isFeatureEnabled(@NonNull String id) { public boolean isFeatureEnabled(@NonNull String id) {
if (!customizationEnabled) { if (!featuresCustomized) {
return true; return true;
} }
if (enabledIds.contains(id)) { if (featuresEnabledIds.contains(id)) {
return true; return true;
} }
if (disabledIds.contains(id)) { if (featuresDisabledIds.contains(id)) {
return false; return false;
} }
if (isMatchesPattern(id, enabledPatterns)) { if (isMatchesPattern(id, featuresEnabledPatterns)) {
return true; return true;
} }
return !isMatchesPattern(id, disabledPatterns); return !isMatchesPattern(id, featuresDisabledPatterns);
} }
private void updateCustomizationEnabled() { public boolean areWidgetsCustomized() {
customizationEnabled = !enabledIds.isEmpty() || !disabledIds.isEmpty() return widgetsCustomized;
|| !enabledPatterns.isEmpty() || !disabledPatterns.isEmpty(); }
private void setFeaturesCustomized() {
featuresCustomized = true;
}
private void setWidgetsCustomized() {
widgetsCustomized = true;
} }
private boolean isMatchesPattern(@NonNull String id, @NonNull Set<String> patterns) { private boolean isMatchesPattern(@NonNull String id, @NonNull Set<String> patterns) {
@ -198,4 +311,24 @@ public class OsmAndAppCustomization {
} }
return false; return false;
} }
private void notifySettingsCustomized() {
app.uiHandler.post(new Runnable() {
@Override
public void run() {
for (OsmAndAppCustomizationListener l : listeners) {
l.onOsmAndSettingsCustomized();
}
}
});
}
public void addListener(OsmAndAppCustomizationListener listener) {
this.listeners.add(listener);
}
public void removeListener(OsmAndAppCustomizationListener listener) {
this.listeners.remove(listener);
}
} }

View file

@ -6,8 +6,8 @@ import android.app.Application;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -25,6 +25,7 @@ import android.view.accessibility.AccessibilityManager;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import net.osmand.CallbackWithObject; import net.osmand.CallbackWithObject;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.access.AccessibilityPlugin; import net.osmand.access.AccessibilityPlugin;
@ -271,6 +272,12 @@ public class OsmandApplication extends MultiDexApplication {
return osmandSettings; return osmandSettings;
} }
public void setOsmandSettings(OsmandSettings osmandSettings) {
//android.os.Process.killProcess(android.os.Process.myPid());
this.osmandSettings = osmandSettings;
OsmandPlugin.initPlugins(this);
}
public SavingTrackHelper getSavingTrackHelper() { public SavingTrackHelper getSavingTrackHelper() {
return savingTrackHelper; return savingTrackHelper;
} }

View file

@ -134,6 +134,7 @@ public abstract class OsmandPlugin {
OsmandSettings settings = app.getSettings(); OsmandSettings settings = app.getSettings();
Set<String> enabledPlugins = settings.getEnabledPlugins(); Set<String> enabledPlugins = settings.getEnabledPlugins();
allPlugins.clear();
allPlugins.add(new MapillaryPlugin(app)); allPlugins.add(new MapillaryPlugin(app));
enabledPlugins.add(MapillaryPlugin.ID); enabledPlugins.add(MapillaryPlugin.ID);

View file

@ -35,6 +35,8 @@ import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format;
import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.routing.RouteProvider.RouteService; import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.render.RenderingRulesStorage; import net.osmand.render.RenderingRulesStorage;
import net.osmand.search.core.ObjectType;
import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -119,7 +121,8 @@ public class OsmandSettings {
} }
// These settings are stored in SharedPreferences // These settings are stored in SharedPreferences
private static final String SHARED_PREFERENCES_NAME = "net.osmand.settings"; //$NON-NLS-1$ private static final String SHARED_PREFERENCES_NAME = "net.osmand.settings";
private static String CUSTOM_SHARED_PREFERENCES_NAME;
/// Settings variables /// Settings variables
@ -143,11 +146,19 @@ public class OsmandSettings {
initPrefs(); initPrefs();
} }
protected OsmandSettings(OsmandApplication clientContext, SettingsAPI settinsAPI, String sharedPreferencesName) {
ctx = clientContext;
this.settingsAPI = settinsAPI;
CUSTOM_SHARED_PREFERENCES_NAME = "net.osmand.customsettings." + sharedPreferencesName;
initPrefs();
}
private void initPrefs() { private void initPrefs() {
globalPreferences = settingsAPI.getPreferenceObject(SHARED_PREFERENCES_NAME); globalPreferences = settingsAPI.getPreferenceObject(getSharedPreferencesName(null));
defaultProfilePreferences = getProfilePreferences(ApplicationMode.DEFAULT); defaultProfilePreferences = getProfilePreferences(ApplicationMode.DEFAULT);
currentMode = readApplicationMode(); currentMode = readApplicationMode();
profilePreferences = getProfilePreferences(currentMode); profilePreferences = getProfilePreferences(currentMode);
registeredPreferences.put(APPLICATION_MODE.getId(), APPLICATION_MODE);
} }
public OsmandApplication getContext() { public OsmandApplication getContext() {
@ -164,10 +175,11 @@ public class OsmandSettings {
} }
public static String getSharedPreferencesName(ApplicationMode mode) { public static String getSharedPreferencesName(ApplicationMode mode) {
String sharedPreferencesName = !Algorithms.isEmpty(CUSTOM_SHARED_PREFERENCES_NAME) ? CUSTOM_SHARED_PREFERENCES_NAME : SHARED_PREFERENCES_NAME;
if (mode == null) { if (mode == null) {
return SHARED_PREFERENCES_NAME; return sharedPreferencesName;
} else { } else {
return SHARED_PREFERENCES_NAME + "." + mode.getStringKey().toLowerCase(); return sharedPreferencesName + "." + mode.getStringKey().toLowerCase();
} }
} }
@ -175,6 +187,81 @@ public class OsmandSettings {
return settingsAPI.getPreferenceObject(getSharedPreferencesName(mode)); return settingsAPI.getPreferenceObject(getSharedPreferencesName(mode));
} }
public boolean setPreference(String key, Object value) {
OsmandPreference<?> preference = registeredPreferences.get(key);
if (preference != null) {
if (preference == APPLICATION_MODE) {
if (value instanceof String) {
String appModeKey = (String) value;
ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, null);
if (appMode != null) {
APPLICATION_MODE.set(appMode);
return true;
}
}
} else if (preference == DEFAULT_APPLICATION_MODE) {
if (value instanceof String) {
String appModeKey = (String) value;
ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, null);
if (appMode != null) {
DEFAULT_APPLICATION_MODE.set(appMode);
return true;
}
}
} else if (preference == METRIC_SYSTEM) {
if (value instanceof String) {
String metricSystemName = (String) value;
MetricsConstants metricSystem;
try {
metricSystem = MetricsConstants.valueOf(metricSystemName);
} catch (IllegalArgumentException e) {
return false;
}
METRIC_SYSTEM.set(metricSystem);
return true;
}
} else if (preference == SPEED_SYSTEM) {
if (value instanceof String) {
String speedSystemName = (String) value;
SpeedConstants speedSystem;
try {
speedSystem = SpeedConstants.valueOf(speedSystemName);
} catch (IllegalArgumentException e) {
return false;
}
SPEED_SYSTEM.set(speedSystem);
return true;
}
} else if (preference instanceof BooleanPreference) {
if (value instanceof Boolean) {
((BooleanPreference) preference).set((Boolean) value);
return true;
}
} else if (preference instanceof StringPreference) {
if (value instanceof String) {
((StringPreference) preference).set((String) value);
return true;
}
} else if (preference instanceof FloatPreference) {
if (value instanceof Float) {
((FloatPreference) preference).set((Float) value);
return true;
}
} else if (preference instanceof IntPreference) {
if (value instanceof Integer) {
((IntPreference) preference).set((Integer) value);
return true;
}
} else if (preference instanceof LongPreference) {
if (value instanceof Long) {
((LongPreference) preference).set((Long) value);
return true;
}
}
}
return false;
}
public ApplicationMode LAST_ROUTING_APPLICATION_MODE = null; public ApplicationMode LAST_ROUTING_APPLICATION_MODE = null;
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name
@ -297,6 +384,7 @@ public class OsmandSettings {
public CommonPreference(String id, T defaultValue) { public CommonPreference(String id, T defaultValue) {
this.id = id; this.id = id;
this.defaultValue = defaultValue; this.defaultValue = defaultValue;
registeredPreferences.put(id, this);
} }
public CommonPreference<T> makeGlobal() { public CommonPreference<T> makeGlobal() {
@ -1596,7 +1684,7 @@ public class OsmandSettings {
return isWriteable; return isWriteable;
} }
public boolean isExternalStorageDirectorySpecifiedV19() { public boolean isExternalStorageDirectoryTypeSpecifiedV19() {
return settingsAPI.contains(globalPreferences, EXTERNAL_STORAGE_DIR_TYPE_V19); return settingsAPI.contains(globalPreferences, EXTERNAL_STORAGE_DIR_TYPE_V19);
} }
@ -1604,6 +1692,14 @@ public class OsmandSettings {
return settingsAPI.getInt(globalPreferences, EXTERNAL_STORAGE_DIR_TYPE_V19, -1); return settingsAPI.getInt(globalPreferences, EXTERNAL_STORAGE_DIR_TYPE_V19, -1);
} }
public boolean isExternalStorageDirectorySpecifiedV19() {
return settingsAPI.contains(globalPreferences, EXTERNAL_STORAGE_DIR_V19);
}
public String getExternalStorageDirectoryV19() {
return settingsAPI.getString(globalPreferences, EXTERNAL_STORAGE_DIR_V19, null);
}
public File getExternalStorageDirectoryPre19() { public File getExternalStorageDirectoryPre19() {
String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath(); String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath();
File rootFolder = new File(settingsAPI.getString(globalPreferences, EXTERNAL_STORAGE_DIR, File rootFolder = new File(settingsAPI.getString(globalPreferences, EXTERNAL_STORAGE_DIR,

View file

@ -65,6 +65,7 @@ import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener; import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener;
import net.osmand.plus.OnDismissDialogFragmentListener; import net.osmand.plus.OnDismissDialogFragmentListener;
import net.osmand.plus.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.OsmAndConstants; import net.osmand.plus.OsmAndConstants;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
@ -149,7 +150,7 @@ import java.util.regex.Pattern;
public class MapActivity extends OsmandActionBarActivity implements DownloadEvents, public class MapActivity extends OsmandActionBarActivity implements DownloadEvents,
OnRequestPermissionsResultCallback, IRouteInformationListener, OnRequestPermissionsResultCallback, IRouteInformationListener,
MapMarkerChangedListener, OnDismissDialogFragmentListener, OnDrawMapListener { MapMarkerChangedListener, OnDismissDialogFragmentListener, OnDrawMapListener, OsmAndAppCustomizationListener {
public static final String INTENT_KEY_PARENT_MAP_ACTIVITY = "intent_parent_map_activity_key"; public static final String INTENT_KEY_PARENT_MAP_ACTIVITY = "intent_parent_map_activity_key";
private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1;
@ -207,6 +208,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
private boolean mIsDestroyed = false; private boolean mIsDestroyed = false;
private boolean pendingPause = false; private boolean pendingPause = false;
private Timer splashScreenTimer; private Timer splashScreenTimer;
private boolean activityRestartNeeded = false;
private ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); private ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
@ -325,6 +327,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
registerReceiver(screenOffReceiver, filter); registerReceiver(screenOffReceiver, filter);
app.getAidlApi().onCreateMapActivity(this); app.getAidlApi().onCreateMapActivity(this);
app.getAppCustomization().addListener(this);
mIsDestroyed = false; mIsDestroyed = false;
} }
@ -466,7 +469,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
if (!settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.getModeValue(getRoutingHelper().getAppMode())) { if (!settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.getModeValue(getRoutingHelper().getAppMode())) {
final OsmandSettings.CommonPreference<Boolean> allowPrivate final OsmandSettings.CommonPreference<Boolean> allowPrivate
= settings.getCustomRoutingBooleanProperty(GeneralRouter.ALLOW_PRIVATE, false); = settings.getCustomRoutingBooleanProperty(GeneralRouter.ALLOW_PRIVATE, false);
final List<ApplicationMode> modes = ApplicationMode.values(settings); final List<ApplicationMode> modes = ApplicationMode.values(app);
for (ApplicationMode mode : modes) { for (ApplicationMode mode : modes) {
if (!allowPrivate.getModeValue(mode)) { if (!allowPrivate.getModeValue(mode)) {
settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.setModeValue(mode, true); settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.setModeValue(mode, true);
@ -633,6 +636,13 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (activityRestartNeeded) {
activityRestartNeeded = false;
recreate();
return;
}
long tm = System.currentTimeMillis(); long tm = System.currentTimeMillis();
if (app.getMapMarkersHelper().getPlanRouteContext().isFragmentVisible()) { if (app.getMapMarkersHelper().getPlanRouteContext().isFragmentVisible()) {
@ -1946,6 +1956,11 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
activityResultListeners.remove(listener); activityResultListeners.remove(listener);
} }
@Override
public void onOsmAndSettingsCustomized() {
activityRestartNeeded = true;
}
public enum ShowQuickSearchMode { public enum ShowQuickSearchMode {
NEW, NEW,
NEW_IF_EXPIRED, NEW_IF_EXPIRED,

View file

@ -940,7 +940,7 @@ public class MapActivityActions implements DialogProvider {
getMyApplication().stopNavigation(); getMyApplication().stopNavigation();
mapActivity.updateApplicationModeSettings(); mapActivity.updateApplicationModeSettings();
mapActivity.getDashboard().clearDeletedPoints(); mapActivity.getDashboard().clearDeletedPoints();
List<ApplicationMode> modes = ApplicationMode.values(settings); List<ApplicationMode> modes = ApplicationMode.values(getMyApplication());
for (ApplicationMode mode : modes) { for (ApplicationMode mode : modes) {
if (settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.getModeValue(mode)) { if (settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.getModeValue(mode)) {
settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.setModeValue(mode, false); settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.setModeValue(mode, false);

View file

@ -96,7 +96,7 @@ public class MapActivityLayers {
public MapActivityLayers(MapActivity activity) { public MapActivityLayers(MapActivity activity) {
this.activity = activity; this.activity = activity;
this.mapWidgetRegistry = new MapWidgetRegistry(activity.getMyApplication().getSettings()); this.mapWidgetRegistry = new MapWidgetRegistry(activity.getMyApplication());
this.quickActionRegistry = new QuickActionRegistry(activity.getMyApplication().getSettings()); this.quickActionRegistry = new QuickActionRegistry(activity.getMyApplication().getSettings());
} }

View file

@ -324,20 +324,21 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
settings = getMyApplication().getSettings(); OsmandApplication app = getMyApplication();
settings = app.getSettings();
getToolbar().setTitle(R.string.shared_string_settings); getToolbar().setTitle(R.string.shared_string_settings);
if (profileSettings) { if (profileSettings) {
modes.clear(); modes.clear();
for (ApplicationMode a : ApplicationMode.values(settings)) { for (ApplicationMode a : ApplicationMode.values(app)) {
if (a != ApplicationMode.DEFAULT) { if (a != ApplicationMode.DEFAULT) {
modes.add(a); modes.add(a);
} }
} }
List<String> s = new ArrayList<String>(); List<String> s = new ArrayList<String>();
for (ApplicationMode a : modes) { for (ApplicationMode a : modes) {
s.add(a.toHumanString(getMyApplication())); s.add(a.toHumanString(app));
} }
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(this, SpinnerAdapter spinnerAdapter = new SpinnerAdapter(this,
R.layout.spinner_item, s); R.layout.spinner_item, s);

View file

@ -1,30 +1,6 @@
package net.osmand.plus.activities; package net.osmand.plus.activities;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.osmand.IProgress;
import net.osmand.IndexConstants;
import net.osmand.data.PointDescription;
import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.DrivingRegion;
import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.dashboard.DashChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.ChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.MoveFilesToDifferentDirectory;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.render.RenderingRulesStorage;
import android.app.Dialog; import android.app.Dialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
@ -55,6 +31,31 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import net.osmand.IProgress;
import net.osmand.IndexConstants;
import net.osmand.data.PointDescription;
import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.DrivingRegion;
import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.dashboard.DashChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.ChooseAppDirFragment;
import net.osmand.plus.dashboard.DashChooseAppDirFragment.MoveFilesToDifferentDirectory;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.render.RenderingRulesStorage;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SettingsGeneralActivity extends SettingsBaseActivity implements OnRequestPermissionsResultCallback { public class SettingsGeneralActivity extends SettingsBaseActivity implements OnRequestPermissionsResultCallback {
@ -80,13 +81,13 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
String[] entries; String[] entries;
String[] entrieValues; String[] entrieValues;
PreferenceScreen screen = getPreferenceScreen(); PreferenceScreen screen = getPreferenceScreen();
settings = getMyApplication().getSettings(); OsmandApplication app = getMyApplication();
settings = app.getSettings();
ApplicationMode[] appModes = ApplicationMode.values(app).toArray(new ApplicationMode[0]);
ApplicationMode[] appModes = ApplicationMode.values(settings).toArray(new ApplicationMode[0]);
entries = new String[appModes.length]; entries = new String[appModes.length];
for (int i = 0; i < entries.length; i++) { for (int i = 0; i < entries.length; i++) {
entries[i] = appModes[i].toHumanString(getMyApplication()); entries[i] = appModes[i].toHumanString(app);
} }
registerListPreference(settings.DEFAULT_APPLICATION_MODE, screen, entries, appModes); registerListPreference(settings.DEFAULT_APPLICATION_MODE, screen, entries, appModes);

View file

@ -23,8 +23,9 @@ public class AppModeDialog {
public static View prepareAppModeView(Activity a, final Set<ApplicationMode> selected, boolean showDefault, public static View prepareAppModeView(Activity a, final Set<ApplicationMode> selected, boolean showDefault,
ViewGroup parent, final boolean singleSelection, boolean useListBg, boolean useMapTheme, final View.OnClickListener onClickListener) { ViewGroup parent, final boolean singleSelection, boolean useListBg, boolean useMapTheme, final View.OnClickListener onClickListener) {
OsmandSettings settings = ((OsmandApplication) a.getApplication()).getSettings(); OsmandApplication app = (OsmandApplication) a.getApplication();
final List<ApplicationMode> values = new ArrayList<ApplicationMode>(ApplicationMode.values(settings)); OsmandSettings settings = app.getSettings();
final List<ApplicationMode> values = new ArrayList<>(ApplicationMode.values(app));
if(!showDefault) { if(!showDefault) {
values.remove(ApplicationMode.DEFAULT); values.remove(ApplicationMode.DEFAULT);
} }
@ -38,8 +39,9 @@ public class AppModeDialog {
//needed because if there's more than 4 items - the don't fit in drawer //needed because if there's more than 4 items - the don't fit in drawer
public static View prepareAppModeDrawerView(Activity a, final Set<ApplicationMode> selected, public static View prepareAppModeDrawerView(Activity a, final Set<ApplicationMode> selected,
boolean useMapTheme, final View.OnClickListener onClickListener) { boolean useMapTheme, final View.OnClickListener onClickListener) {
OsmandSettings settings = ((OsmandApplication) a.getApplication()).getSettings(); OsmandApplication app = (OsmandApplication) a.getApplication();
final List<ApplicationMode> values = new ArrayList<ApplicationMode>(ApplicationMode.values(settings)); OsmandSettings settings = app.getSettings();
final List<ApplicationMode> values = new ArrayList<>(ApplicationMode.values(app));
selected.add(settings.getApplicationMode()); selected.add(settings.getApplicationMode());
return prepareAppModeView(a, values, selected, null, true, true, useMapTheme, onClickListener); return prepareAppModeView(a, values, selected, null, true, true, useMapTheme, onClickListener);
} }

View file

@ -226,7 +226,7 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
AlertDialog.Builder b = new AlertDialog.Builder(this); AlertDialog.Builder b = new AlertDialog.Builder(this);
final List<ApplicationMode> modes = ApplicationMode.allPossibleValues(); final List<ApplicationMode> modes = ApplicationMode.allPossibleValues();
modes.remove(ApplicationMode.DEFAULT); modes.remove(ApplicationMode.DEFAULT);
final Set<ApplicationMode> selected = new LinkedHashSet<ApplicationMode>(ApplicationMode.values(settings)); final Set<ApplicationMode> selected = new LinkedHashSet<ApplicationMode>(ApplicationMode.values(getMyApplication()));
selected.remove(ApplicationMode.DEFAULT); selected.remove(ApplicationMode.DEFAULT);
View v = AppModeDialog.prepareAppModeView(this, modes, selected, null, false, true, false, View v = AppModeDialog.prepareAppModeView(this, modes, selected, null, false, true, false,
new View.OnClickListener() { new View.OnClickListener() {

View file

@ -48,13 +48,13 @@ public class SnapToRoadBottomSheetDialogFragment extends android.support.design.
@Override @Override
public void setupDialog(Dialog dialog, int style) { public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style); super.setupDialog(dialog, style);
if (getMyApplication().getSettings().DO_NOT_USE_ANIMATIONS.get()) { OsmandApplication app = getMyApplication();
if (app.getSettings().DO_NOT_USE_ANIMATIONS.get()) {
dialog.getWindow().setWindowAnimations(R.style.Animations_NoAnimation); dialog.getWindow().setWindowAnimations(R.style.Animations_NoAnimation);
} }
nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls(); nightMode = app.getDaynightHelper().isNightModeForMapControls();
portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); portrait = AndroidUiHelper.isOrientationPortrait(getActivity());
final OsmandSettings settings = getMyApplication().getSettings();
final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
final View mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_snap_to_road_bottom_sheet_dialog, null); final View mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_snap_to_road_bottom_sheet_dialog, null);
@ -76,7 +76,7 @@ public class SnapToRoadBottomSheetDialogFragment extends android.support.design.
} }
LinearLayout container = (LinearLayout) mainView.findViewById(R.id.navigation_types_container); LinearLayout container = (LinearLayout) mainView.findViewById(R.id.navigation_types_container);
final List<ApplicationMode> modes = new ArrayList<>(ApplicationMode.values(settings)); final List<ApplicationMode> modes = new ArrayList<>(ApplicationMode.values(app));
if (removeDefaultMode) { if (removeDefaultMode) {
modes.remove(ApplicationMode.DEFAULT); modes.remove(ApplicationMode.DEFAULT);
} }

View file

@ -90,7 +90,7 @@ public class NauticalMapsPlugin extends OsmandPlugin {
} }
public void addBoatProfile(boolean flag) { public void addBoatProfile(boolean flag) {
Set<ApplicationMode> selectedProfiles = new LinkedHashSet<>(ApplicationMode.values(app.getSettings())); Set<ApplicationMode> selectedProfiles = new LinkedHashSet<>(ApplicationMode.values(app));
boolean isBoatEnabled = selectedProfiles.contains(ApplicationMode.BOAT); boolean isBoatEnabled = selectedProfiles.contains(ApplicationMode.BOAT);
if((!isBoatEnabled && flag) || (isBoatEnabled && !flag)) { if((!isBoatEnabled && flag) || (isBoatEnabled && !flag)) {
String s = app.getSettings().AVAILABLE_APP_MODES.get(); String s = app.getSettings().AVAILABLE_APP_MODES.get();

View file

@ -45,13 +45,14 @@ public class MapWidgetRegistry {
private Set<MapWidgetRegInfo> leftWidgetSet = new TreeSet<>(); private Set<MapWidgetRegInfo> leftWidgetSet = new TreeSet<>();
private Set<MapWidgetRegInfo> rightWidgetSet = new TreeSet<>(); private Set<MapWidgetRegInfo> rightWidgetSet = new TreeSet<>();
private Map<ApplicationMode, Set<String>> visibleElementsFromSettings = new LinkedHashMap<>(); private Map<ApplicationMode, Set<String>> visibleElementsFromSettings = new LinkedHashMap<>();
private final OsmandApplication app;
private final OsmandSettings settings; private final OsmandSettings settings;
public MapWidgetRegistry(OsmandApplication app) {
this.app = app;
this.settings = app.getSettings();
public MapWidgetRegistry(OsmandSettings settings) { for (ApplicationMode ms : ApplicationMode.values(app)) {
this.settings = settings;
for (ApplicationMode ms : ApplicationMode.values(settings)) {
String mpf = settings.MAP_INFO_CONTROLS.getModeValue(ms); String mpf = settings.MAP_INFO_CONTROLS.getModeValue(ms);
if (mpf.equals(SHOW_PREFIX)) { if (mpf.equals(SHOW_PREFIX)) {
visibleElementsFromSettings.put(ms, null); visibleElementsFromSettings.put(ms, null);
@ -193,9 +194,9 @@ public class MapWidgetRegistry {
} }
private void processVisibleModes(String key, MapWidgetRegInfo ii) { private void processVisibleModes(String key, MapWidgetRegInfo ii) {
for (ApplicationMode ms : ApplicationMode.values(settings)) { for (ApplicationMode ms : ApplicationMode.values(app)) {
boolean collapse = ms.isWidgetCollapsible(key); boolean collapse = ms.isWidgetCollapsible(key);
boolean def = ms.isWidgetVisible(key); boolean def = ms.isWidgetVisible(app, key);
Set<String> set = visibleElementsFromSettings.get(ms); Set<String> set = visibleElementsFromSettings.get(ms);
if (set != null) { if (set != null) {
if (set.contains(key)) { if (set.contains(key)) {
@ -288,7 +289,7 @@ public class MapWidgetRegistry {
for (MapWidgetRegInfo ri : set) { for (MapWidgetRegInfo ri : set) {
ri.visibleCollapsible.remove(mode); ri.visibleCollapsible.remove(mode);
ri.visibleModes.remove(mode); ri.visibleModes.remove(mode);
if (mode.isWidgetVisible(ri.key)) { if (mode.isWidgetVisible(app, ri.key)) {
if (mode.isWidgetCollapsible(ri.key)) { if (mode.isWidgetCollapsible(ri.key)) {
ri.visibleCollapsible.add(mode); ri.visibleCollapsible.add(mode);
} else { } else {
@ -457,7 +458,7 @@ public class MapWidgetRegistry {
private void addControls(final MapActivity mapActivity, final ContextMenuAdapter contextMenuAdapter, private void addControls(final MapActivity mapActivity, final ContextMenuAdapter contextMenuAdapter,
Set<MapWidgetRegInfo> groupTitle, final ApplicationMode mode) { Set<MapWidgetRegInfo> groupTitle, final ApplicationMode mode) {
for (final MapWidgetRegInfo r : groupTitle) { for (final MapWidgetRegInfo r : groupTitle) {
if (!mode.isWidgetAvailable(r.key)) { if (!mode.isWidgetAvailable(app, r.key)) {
continue; continue;
} }
@ -484,7 +485,7 @@ public class MapWidgetRegistry {
MenuInflater inflater = popup.getMenuInflater(); MenuInflater inflater = popup.getMenuInflater();
final Menu menu = popup.getMenu(); final Menu menu = popup.getMenu();
inflater.inflate(R.menu.widget_visibility_menu, menu); inflater.inflate(R.menu.widget_visibility_menu, menu);
UiUtilities ic = mapActivity.getMyApplication().getUIUtilities(); UiUtilities ic = app.getUIUtilities();
menu.findItem(R.id.action_show).setIcon(ic.getThemedIcon(R.drawable.ic_action_view)); menu.findItem(R.id.action_show).setIcon(ic.getThemedIcon(R.drawable.ic_action_view));
menu.findItem(R.id.action_hide).setIcon(ic.getThemedIcon(R.drawable.ic_action_hide)); menu.findItem(R.id.action_hide).setIcon(ic.getThemedIcon(R.drawable.ic_action_hide));
menu.findItem(R.id.action_collapse).setIcon(ic.getThemedIcon(R.drawable.ic_action_widget_collapse)); menu.findItem(R.id.action_collapse).setIcon(ic.getThemedIcon(R.drawable.ic_action_widget_collapse));