/* Defines base attributes of a bookmark object Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.freerdp.freerdpcore.domain; import android.content.SharedPreferences; import android.os.Parcel; import android.os.Parcelable; import com.freerdp.freerdpcore.application.GlobalApp; import java.util.Locale; public class BookmarkBase implements Parcelable, Cloneable { public static final int TYPE_INVALID = -1; public static final int TYPE_MANUAL = 1; public static final int TYPE_QUICKCONNECT = 2; public static final int TYPE_PLACEHOLDER = 3; public static final int TYPE_CUSTOM_BASE = 1000; public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public BookmarkBase createFromParcel(Parcel in) { return new BookmarkBase(in); } @Override public BookmarkBase[] newArray(int size) { return new BookmarkBase[size]; } }; protected int type; private long id; private String label; private String username; private String password; private String domain; private ScreenSettings screenSettings; private PerformanceFlags performanceFlags; private AdvancedSettings advancedSettings; private DebugSettings debugSettings; public BookmarkBase(Parcel parcel) { type = parcel.readInt(); id = parcel.readLong(); label = parcel.readString(); username = parcel.readString(); password = parcel.readString(); domain = parcel.readString(); screenSettings = parcel.readParcelable(ScreenSettings.class.getClassLoader()); performanceFlags = parcel.readParcelable(PerformanceFlags.class.getClassLoader()); advancedSettings = parcel.readParcelable(AdvancedSettings.class.getClassLoader()); debugSettings = parcel.readParcelable(DebugSettings.class.getClassLoader()); } public BookmarkBase() { init(); } private void init() { type = TYPE_INVALID; id = -1; label = ""; username = ""; password = ""; domain = ""; screenSettings = new ScreenSettings(); performanceFlags = new PerformanceFlags(); advancedSettings = new AdvancedSettings(); debugSettings = new DebugSettings(); } @SuppressWarnings("unchecked") public T get() { return (T)this; } public int getType() { return type; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDomain() { return domain; } public void setDomain(String domain) { this.domain = domain; } public ScreenSettings getScreenSettings() { return screenSettings; } public void setScreenSettings(ScreenSettings screenSettings) { this.screenSettings = screenSettings; } public PerformanceFlags getPerformanceFlags() { return performanceFlags; } public void setPerformanceFlags(PerformanceFlags performanceFlags) { this.performanceFlags = performanceFlags; } public AdvancedSettings getAdvancedSettings() { return advancedSettings; } public void setAdvancedSettings(AdvancedSettings advancedSettings) { this.advancedSettings = advancedSettings; } public DebugSettings getDebugSettings() { return debugSettings; } public void setDebugSettings(DebugSettings debugSettings) { this.debugSettings = debugSettings; } public ScreenSettings getActiveScreenSettings() { return (GlobalApp.ConnectedTo3G && advancedSettings.getEnable3GSettings()) ? advancedSettings.getScreen3G() : screenSettings; } public PerformanceFlags getActivePerformanceFlags() { return (GlobalApp.ConnectedTo3G && advancedSettings.getEnable3GSettings()) ? advancedSettings.getPerformance3G() : performanceFlags; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(type); out.writeLong(id); out.writeString(label); out.writeString(username); out.writeString(password); out.writeString(domain); out.writeParcelable(screenSettings, flags); out.writeParcelable(performanceFlags, flags); out.writeParcelable(advancedSettings, flags); out.writeParcelable(debugSettings, flags); } // write to shared preferences public void writeToSharedPreferences(SharedPreferences sharedPrefs) { Locale locale = Locale.ENGLISH; SharedPreferences.Editor editor = sharedPrefs.edit(); editor.clear(); editor.putString("bookmark.label", label); editor.putString("bookmark.username", username); editor.putString("bookmark.password", password); editor.putString("bookmark.domain", domain); editor.putInt("bookmark.colors", screenSettings.getColors()); editor.putString("bookmark.resolution", screenSettings.getResolutionString().toLowerCase(locale)); editor.putInt("bookmark.width", screenSettings.getWidth()); editor.putInt("bookmark.height", screenSettings.getHeight()); editor.putBoolean("bookmark.perf_remotefx", performanceFlags.getRemoteFX()); editor.putBoolean("bookmark.perf_gfx", performanceFlags.getGfx()); editor.putBoolean("bookmark.perf_gfx_h264", performanceFlags.getH264()); editor.putBoolean("bookmark.perf_wallpaper", performanceFlags.getWallpaper()); editor.putBoolean("bookmark.perf_font_smoothing", performanceFlags.getFontSmoothing()); editor.putBoolean("bookmark.perf_desktop_composition", performanceFlags.getDesktopComposition()); editor.putBoolean("bookmark.perf_window_dragging", performanceFlags.getFullWindowDrag()); editor.putBoolean("bookmark.perf_menu_animation", performanceFlags.getMenuAnimations()); editor.putBoolean("bookmark.perf_themes", performanceFlags.getTheming()); editor.putBoolean("bookmark.enable_3g_settings", advancedSettings.getEnable3GSettings()); editor.putInt("bookmark.colors_3g", advancedSettings.getScreen3G().getColors()); editor.putString("bookmark.resolution_3g", advancedSettings.getScreen3G().getResolutionString().toLowerCase(locale)); editor.putInt("bookmark.width_3g", advancedSettings.getScreen3G().getWidth()); editor.putInt("bookmark.height_3g", advancedSettings.getScreen3G().getHeight()); editor.putBoolean("bookmark.perf_remotefx_3g", advancedSettings.getPerformance3G().getRemoteFX()); editor.putBoolean("bookmark.perf_gfx_3g", advancedSettings.getPerformance3G().getGfx()); editor.putBoolean("bookmark.perf_gfx_h264_3g", advancedSettings.getPerformance3G().getH264()); editor.putBoolean("bookmark.perf_wallpaper_3g", advancedSettings.getPerformance3G().getWallpaper()); editor.putBoolean("bookmark.perf_font_smoothing_3g", advancedSettings.getPerformance3G().getFontSmoothing()); editor.putBoolean("bookmark.perf_desktop_composition_3g", advancedSettings.getPerformance3G().getDesktopComposition()); editor.putBoolean("bookmark.perf_window_dragging_3g", advancedSettings.getPerformance3G().getFullWindowDrag()); editor.putBoolean("bookmark.perf_menu_animation_3g", advancedSettings.getPerformance3G().getMenuAnimations()); editor.putBoolean("bookmark.perf_themes_3g", advancedSettings.getPerformance3G().getTheming()); editor.putBoolean("bookmark.redirect_sdcard", advancedSettings.getRedirectSDCard()); editor.putInt("bookmark.redirect_sound", advancedSettings.getRedirectSound()); editor.putBoolean("bookmark.redirect_microphone", advancedSettings.getRedirectMicrophone()); editor.putInt("bookmark.security", advancedSettings.getSecurity()); editor.putString("bookmark.remote_program", advancedSettings.getRemoteProgram()); editor.putString("bookmark.work_dir", advancedSettings.getWorkDir()); editor.putBoolean("bookmark.console_mode", advancedSettings.getConsoleMode()); editor.putBoolean("bookmark.async_channel", debugSettings.getAsyncChannel()); editor.putBoolean("bookmark.async_input", debugSettings.getAsyncInput()); editor.putBoolean("bookmark.async_update", debugSettings.getAsyncUpdate()); editor.putString("bookmark.debug_level", debugSettings.getDebugLevel()); editor.apply(); } // read from shared preferences public void readFromSharedPreferences(SharedPreferences sharedPrefs) { label = sharedPrefs.getString("bookmark.label", ""); username = sharedPrefs.getString("bookmark.username", ""); password = sharedPrefs.getString("bookmark.password", ""); domain = sharedPrefs.getString("bookmark.domain", ""); screenSettings.setColors(sharedPrefs.getInt("bookmark.colors", 16)); screenSettings.setResolution(sharedPrefs.getString("bookmark.resolution", "automatic"), sharedPrefs.getInt("bookmark.width", 800), sharedPrefs.getInt("bookmark.height", 600)); performanceFlags.setRemoteFX(sharedPrefs.getBoolean("bookmark.perf_remotefx", false)); performanceFlags.setGfx(sharedPrefs.getBoolean("bookmark.perf_gfx", false)); performanceFlags.setH264(sharedPrefs.getBoolean("bookmark.perf_gfx_h264", false)); performanceFlags.setWallpaper(sharedPrefs.getBoolean("bookmark.perf_wallpaper", false)); performanceFlags.setFontSmoothing( sharedPrefs.getBoolean("bookmark.perf_font_smoothing", false)); performanceFlags.setDesktopComposition( sharedPrefs.getBoolean("bookmark.perf_desktop_composition", false)); performanceFlags.setFullWindowDrag( sharedPrefs.getBoolean("bookmark.perf_window_dragging", false)); performanceFlags.setMenuAnimations( sharedPrefs.getBoolean("bookmark.perf_menu_animation", false)); performanceFlags.setTheming(sharedPrefs.getBoolean("bookmark.perf_themes", false)); advancedSettings.setEnable3GSettings( sharedPrefs.getBoolean("bookmark.enable_3g_settings", false)); advancedSettings.getScreen3G().setColors(sharedPrefs.getInt("bookmark.colors_3g", 16)); advancedSettings.getScreen3G().setResolution( sharedPrefs.getString("bookmark.resolution_3g", "automatic"), sharedPrefs.getInt("bookmark.width_3g", 800), sharedPrefs.getInt("bookmark.height_3g", 600)); advancedSettings.getPerformance3G().setRemoteFX( sharedPrefs.getBoolean("bookmark.perf_remotefx_3g", false)); advancedSettings.getPerformance3G().setGfx( sharedPrefs.getBoolean("bookmark.perf_gfx_3g", false)); advancedSettings.getPerformance3G().setH264( sharedPrefs.getBoolean("bookmark.perf_gfx_h264_3g", false)); advancedSettings.getPerformance3G().setWallpaper( sharedPrefs.getBoolean("bookmark.perf_wallpaper_3g", false)); advancedSettings.getPerformance3G().setFontSmoothing( sharedPrefs.getBoolean("bookmark.perf_font_smoothing_3g", false)); advancedSettings.getPerformance3G().setDesktopComposition( sharedPrefs.getBoolean("bookmark.perf_desktop_composition_3g", false)); advancedSettings.getPerformance3G().setFullWindowDrag( sharedPrefs.getBoolean("bookmark.perf_window_dragging_3g", false)); advancedSettings.getPerformance3G().setMenuAnimations( sharedPrefs.getBoolean("bookmark.perf_menu_animation_3g", false)); advancedSettings.getPerformance3G().setTheming( sharedPrefs.getBoolean("bookmark.perf_themes_3g", false)); advancedSettings.setRedirectSDCard( sharedPrefs.getBoolean("bookmark.redirect_sdcard", false)); advancedSettings.setRedirectSound(sharedPrefs.getInt("bookmark.redirect_sound", 0)); advancedSettings.setRedirectMicrophone( sharedPrefs.getBoolean("bookmark.redirect_microphone", false)); advancedSettings.setSecurity(sharedPrefs.getInt("bookmark.security", 0)); advancedSettings.setRemoteProgram(sharedPrefs.getString("bookmark.remote_program", "")); advancedSettings.setWorkDir(sharedPrefs.getString("bookmark.work_dir", "")); advancedSettings.setConsoleMode(sharedPrefs.getBoolean("bookmark.console_mode", false)); debugSettings.setAsyncChannel(sharedPrefs.getBoolean("bookmark.async_channel", true)); debugSettings.setAsyncInput(sharedPrefs.getBoolean("bookmark.async_input", true)); debugSettings.setAsyncUpdate(sharedPrefs.getBoolean("bookmark.async_update", true)); debugSettings.setDebugLevel(sharedPrefs.getString("bookmark.debug_level", "INFO")); } // Cloneable public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } // performance flags public static class PerformanceFlags implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public PerformanceFlags createFromParcel(Parcel in) { return new PerformanceFlags(in); } @Override public PerformanceFlags[] newArray(int size) { return new PerformanceFlags[size]; } }; private boolean remotefx; private boolean gfx; private boolean h264; private boolean wallpaper; private boolean theming; private boolean fullWindowDrag; private boolean menuAnimations; private boolean fontSmoothing; private boolean desktopComposition; public PerformanceFlags() { remotefx = false; gfx = false; h264 = false; wallpaper = false; theming = false; fullWindowDrag = false; menuAnimations = false; fontSmoothing = false; desktopComposition = false; } public PerformanceFlags(Parcel parcel) { remotefx = parcel.readInt() == 1; gfx = parcel.readInt() == 1; h264 = parcel.readInt() == 1; wallpaper = parcel.readInt() == 1; theming = parcel.readInt() == 1; fullWindowDrag = (parcel.readInt() == 1); menuAnimations = parcel.readInt() == 1; fontSmoothing = parcel.readInt() == 1; desktopComposition = parcel.readInt() == 1; } public boolean getRemoteFX() { return remotefx; } public void setRemoteFX(boolean remotefx) { this.remotefx = remotefx; } public boolean getGfx() { return gfx; } public void setGfx(boolean gfx) { this.gfx = gfx; } public boolean getH264() { return h264; } public void setH264(boolean h264) { this.h264 = h264; } public boolean getWallpaper() { return wallpaper; } public void setWallpaper(boolean wallpaper) { this.wallpaper = wallpaper; } public boolean getTheming() { return theming; } public void setTheming(boolean theming) { this.theming = theming; } public boolean getFullWindowDrag() { return fullWindowDrag; } public void setFullWindowDrag(boolean fullWindowDrag) { this.fullWindowDrag = fullWindowDrag; } public boolean getMenuAnimations() { return menuAnimations; } public void setMenuAnimations(boolean menuAnimations) { this.menuAnimations = menuAnimations; } public boolean getFontSmoothing() { return fontSmoothing; } public void setFontSmoothing(boolean fontSmoothing) { this.fontSmoothing = fontSmoothing; } public boolean getDesktopComposition() { return desktopComposition; } public void setDesktopComposition(boolean desktopComposition) { this.desktopComposition = desktopComposition; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(remotefx ? 1 : 0); out.writeInt(gfx ? 1 : 0); out.writeInt(h264 ? 1 : 0); out.writeInt(wallpaper ? 1 : 0); out.writeInt(theming ? 1 : 0); out.writeInt(fullWindowDrag ? 1 : 0); out.writeInt(menuAnimations ? 1 : 0); out.writeInt(fontSmoothing ? 1 : 0); out.writeInt(desktopComposition ? 1 : 0); } } // Screen Settings class public static class ScreenSettings implements Parcelable { public static final int FITSCREEN = -2; public static final int AUTOMATIC = -1; public static final int CUSTOM = 0; public static final int PREDEFINED = 1; public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public ScreenSettings createFromParcel(Parcel in) { return new ScreenSettings(in); } @Override public ScreenSettings[] newArray(int size) { return new ScreenSettings[size]; } }; private int resolution; private int colors; private int width; private int height; public ScreenSettings() { init(); } public ScreenSettings(Parcel parcel) { resolution = parcel.readInt(); colors = parcel.readInt(); width = parcel.readInt(); height = parcel.readInt(); } private void validate() { switch (colors) { case 32: case 24: case 16: case 15: case 8: break; default: colors = 32; break; } if ((width <= 0) || (width > 65536)) { width = 1024; } if ((height <= 0) || (height > 65536)) { height = 768; } switch (resolution) { case FITSCREEN: case AUTOMATIC: case CUSTOM: case PREDEFINED: break; default: resolution = AUTOMATIC; break; } } private void init() { resolution = AUTOMATIC; colors = 16; width = 0; height = 0; } public void setResolution(String resolution, int width, int height) { if (resolution.contains("x")) { String[] dimensions = resolution.split("x"); this.width = Integer.valueOf(dimensions[0]); this.height = Integer.valueOf(dimensions[1]); this.resolution = PREDEFINED; } else if (resolution.equalsIgnoreCase("custom")) { this.width = width; this.height = height; this.resolution = CUSTOM; } else if (resolution.equalsIgnoreCase("fitscreen")) { this.width = this.height = 0; this.resolution = FITSCREEN; } else { this.width = this.height = 0; this.resolution = AUTOMATIC; } } public int getResolution() { return resolution; } public void setResolution(int resolution) { this.resolution = resolution; if (resolution == AUTOMATIC || resolution == FITSCREEN) { width = 0; height = 0; } } public String getResolutionString() { if (isPredefined()) return (width + "x" + height); return (isFitScreen() ? "fitscreen" : isAutomatic() ? "automatic" : "custom"); } public boolean isPredefined() { validate(); return (resolution == PREDEFINED); } public boolean isAutomatic() { validate(); return (resolution == AUTOMATIC); } public boolean isFitScreen() { validate(); return (resolution == FITSCREEN); } public boolean isCustom() { validate(); return (resolution == CUSTOM); } public int getWidth() { validate(); return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { validate(); return height; } public void setHeight(int height) { this.height = height; } public int getColors() { validate(); return colors; } public void setColors(int colors) { this.colors = colors; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(resolution); out.writeInt(colors); out.writeInt(width); out.writeInt(height); } } public static class DebugSettings implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public DebugSettings createFromParcel(Parcel in) { return new DebugSettings(in); } @Override public DebugSettings[] newArray(int size) { return new DebugSettings[size]; } }; private String debug; private boolean asyncChannel; private boolean asyncTransport; private boolean asyncInput; private boolean asyncUpdate; public DebugSettings() { init(); } // Session Settings public DebugSettings(Parcel parcel) { asyncChannel = parcel.readInt() == 1; asyncTransport = parcel.readInt() == 1; asyncInput = parcel.readInt() == 1; asyncUpdate = parcel.readInt() == 1; debug = parcel.readString(); } private void init() { debug = "INFO"; asyncChannel = true; asyncTransport = false; asyncInput = true; asyncUpdate = true; } private void validate() { final String[] levels = { "OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" }; for (String level : levels) { if (level.equalsIgnoreCase(this.debug)) { return; } } this.debug = "INFO"; } public String getDebugLevel() { validate(); return debug; } public void setDebugLevel(String debug) { this.debug = debug; } public boolean getAsyncUpdate() { return asyncUpdate; } public void setAsyncUpdate(boolean enabled) { asyncUpdate = enabled; } public boolean getAsyncInput() { return asyncInput; } public void setAsyncInput(boolean enabled) { asyncInput = enabled; } public boolean getAsyncChannel() { return asyncChannel; } public void setAsyncChannel(boolean enabled) { asyncChannel = enabled; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(asyncChannel ? 1 : 0); out.writeInt(asyncTransport ? 1 : 0); out.writeInt(asyncInput ? 1 : 0); out.writeInt(asyncUpdate ? 1 : 0); out.writeString(debug); } } // Session Settings public static class AdvancedSettings implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public AdvancedSettings createFromParcel(Parcel in) { return new AdvancedSettings(in); } @Override public AdvancedSettings[] newArray(int size) { return new AdvancedSettings[size]; } }; private boolean enable3GSettings; private ScreenSettings screen3G; private PerformanceFlags performance3G; private boolean redirectSDCard; private int redirectSound; private boolean redirectMicrophone; private int security; private boolean consoleMode; private String remoteProgram; private String workDir; public AdvancedSettings() { init(); } public AdvancedSettings(Parcel parcel) { enable3GSettings = parcel.readInt() == 1; screen3G = parcel.readParcelable(ScreenSettings.class.getClassLoader()); performance3G = parcel.readParcelable(PerformanceFlags.class.getClassLoader()); redirectSDCard = parcel.readInt() == 1; redirectSound = parcel.readInt(); redirectMicrophone = parcel.readInt() == 1; security = parcel.readInt(); consoleMode = parcel.readInt() == 1; remoteProgram = parcel.readString(); workDir = parcel.readString(); } private void init() { enable3GSettings = false; screen3G = new ScreenSettings(); performance3G = new PerformanceFlags(); redirectSDCard = false; redirectSound = 0; redirectMicrophone = false; security = 0; consoleMode = false; remoteProgram = ""; workDir = ""; } private void validate() { switch (redirectSound) { case 0: case 1: case 2: break; default: redirectSound = 0; break; } switch (security) { case 0: case 1: case 2: case 3: break; default: security = 0; break; } } public boolean getEnable3GSettings() { return enable3GSettings; } public void setEnable3GSettings(boolean enable3GSettings) { this.enable3GSettings = enable3GSettings; } public ScreenSettings getScreen3G() { return screen3G; } public void setScreen3G(ScreenSettings screen3G) { this.screen3G = screen3G; } public PerformanceFlags getPerformance3G() { return performance3G; } public void setPerformance3G(PerformanceFlags performance3G) { this.performance3G = performance3G; } public boolean getRedirectSDCard() { return redirectSDCard; } public void setRedirectSDCard(boolean redirectSDCard) { this.redirectSDCard = redirectSDCard; } public int getRedirectSound() { validate(); return redirectSound; } public void setRedirectSound(int redirect) { this.redirectSound = redirect; } public boolean getRedirectMicrophone() { return redirectMicrophone; } public void setRedirectMicrophone(boolean redirect) { this.redirectMicrophone = redirect; } public int getSecurity() { validate(); return security; } public void setSecurity(int security) { this.security = security; } public boolean getConsoleMode() { return consoleMode; } public void setConsoleMode(boolean consoleMode) { this.consoleMode = consoleMode; } public String getRemoteProgram() { return remoteProgram; } public void setRemoteProgram(String remoteProgram) { this.remoteProgram = remoteProgram; } public String getWorkDir() { return workDir; } public void setWorkDir(String workDir) { this.workDir = workDir; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(enable3GSettings ? 1 : 0); out.writeParcelable(screen3G, flags); out.writeParcelable(performance3G, flags); out.writeInt(redirectSDCard ? 1 : 0); out.writeInt(redirectSound); out.writeInt(redirectMicrophone ? 1 : 0); out.writeInt(security); out.writeInt(consoleMode ? 1 : 0); out.writeString(remoteProgram); out.writeString(workDir); } } }