package com.kedzie.vbox; import java.util.HashMap; import java.util.Map; import android.app.AlertDialog; import android.app.Application; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.net.Uri; import android.preference.PreferenceManager; import android.util.Log; import android.util.SparseArray; import com.kedzie.vbox.api.jaxb.MachineState; import com.kedzie.vbox.app.Utils; /** * Stores a resource map storing Operating System, VMAction, and MachineState Icons. * @author Marek Kedzierski * @apiviz.stereotype application */ public class VBoxApplication extends Application { private static final String TAG = "VBoxApplication"; private static final String APPLICATION_PRO_KEY_PACKAGE = "com.kedzie.vbox.pro"; private static final String APPLICATION_PACKAGE = "com.kedzie.vbox"; private Map<String,Integer> resources = new HashMap<String, Integer>(); private Map<String,Integer> resources_color = new HashMap<String, Integer>(); private SparseArray<Integer> generalResources = new SparseArray<Integer>(); private SparseArray<Integer> generalResources_color = new SparseArray<Integer>(); private Map<String, Integer> metricColor = new HashMap<String, Integer>(); private static VBoxApplication _instance; public static VBoxApplication getInstance() { return _instance; } @Override public void onCreate() { super.onCreate(); _instance=this; PreferenceManager.setDefaultValues(this, R.xml.general_preferences, true); PreferenceManager.setDefaultValues(this, R.xml.metric_preferences, true); Log.i(TAG, "Period: " + Utils.getIntPreference(this, SettingsActivity.PREF_PERIOD)); putResource(MachineState.RUNNING.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.STARTING.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.STOPPING.name(), R.drawable.ic_list_acpi, R.drawable.ic_list_acpi_c); putResource(MachineState.POWERED_OFF.name(), R.drawable.ic_list_acpi, R.drawable.ic_list_acpi_c); putResource(MachineState.PAUSED.name(), R.drawable.ic_list_pause, R.drawable.ic_list_pause_c); putResource(MachineState.LIVE_SNAPSHOTTING.name(), R.drawable.ic_list_snapshot, R.drawable.ic_list_snapshot_add_c); putResource(MachineState.DELETING_SNAPSHOT.name(), R.drawable.ic_list_snapshot_del, R.drawable.ic_list_snapshot_del_c); putResource(MachineState.DELETING_SNAPSHOT_ONLINE.name(), R.drawable.ic_list_snapshot_del, R.drawable.ic_list_snapshot_del_c); putResource(MachineState.DELETING_SNAPSHOT_PAUSED.name(), R.drawable.ic_list_snapshot_del, R.drawable.ic_list_snapshot_del_c); putResource(MachineState.RESTORING_SNAPSHOT.name(), R.drawable.ic_list_snapshot, R.drawable.ic_list_snapshot_c); putResource(MachineState.SAVING.name(), R.drawable.ic_list_save, R.drawable.ic_list_save_c); putResource(MachineState.SAVED.name(), R.drawable.ic_list_save, R.drawable.ic_list_save_c); putResource(MachineState.RESTORING.name(), R.drawable.ic_list_save, R.drawable.ic_list_save_c); putResource(MachineState.ABORTED.name(), R.drawable.ic_list_abort, R.drawable.ic_list_abort_c); putResource(MachineState.STUCK.name(), R.drawable.ic_list_stuck, R.drawable.ic_list_stuck_c); //TODO make new drawables for following states putResource(MachineState.TELEPORTED.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.TELEPORTING.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.TELEPORTING_IN.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.TELEPORTING_PAUSED_VM.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.FIRST_ONLINE.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.FIRST_TRANSIENT.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.LAST_ONLINE.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.LAST_TRANSIENT.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(MachineState.SETTING_UP.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource( VMAction.START.name(), R.drawable.ic_list_start , R.drawable.ic_list_start_c ); putResource(VMAction.POWER_OFF.name(), R.drawable.ic_list_poweroff, R.drawable.ic_list_poweroff_c); putResource(VMAction.PAUSE.name(), R.drawable.ic_list_pause, R.drawable.ic_list_pause_c); putResource(VMAction.RESUME.name(), R.drawable.ic_list_start, R.drawable.ic_list_start_c); putResource(VMAction.RESET.name(), R.drawable.ic_list_reset, R.drawable.ic_list_reset_c); putResource(VMAction.POWER_BUTTON.name(), R.drawable.ic_list_acpi , R.drawable.ic_list_acpi_c ); putResource(VMAction.SAVE_STATE.name(), R.drawable.ic_list_save, R.drawable.ic_list_save_c); putResource(VMAction.DISCARD_STATE.name(), R.drawable.ic_list_save, R.drawable.ic_list_save_c); putResource(VMAction.TAKE_SNAPSHOT.name(), R.drawable.ic_list_snapshot_add, R.drawable.ic_list_snapshot_add_c); putResource(VMAction.RESTORE_SNAPSHOT.name(), R.drawable.ic_list_snapshot, R.drawable.ic_list_snapshot_c); putResource(VMAction.DELETE_SNAPSHOT.name(), R.drawable.ic_list_snapshot_del, R.drawable.ic_list_snapshot_del_c); putResource(VMAction.VIEW_METRICS.name(), R.drawable.ic_menu_metrics, R.drawable.ic_menu_metrics); putResource(VMAction.TAKE_SCREENSHOT.name(), R.drawable.ic_list_snapshot_add, R.drawable.ic_list_snapshot_add_c); putResource(VMAction.EDIT_SETTINGS.name(), R.drawable.ic_menu_settings, R.drawable.ic_menu_edit_settings_c); putResource(R.drawable.ic_button_hdd, R.drawable.ic_button_hdd, R.drawable.ic_button_hdd_c); putResource(R.drawable.ic_menu_hdd_add, R.drawable.ic_menu_hdd_add, R.drawable.ic_menu_hdd_add_c); putResource(R.drawable.ic_button_dvd, R.drawable.ic_button_dvd, R.drawable.ic_button_dvd_c); putResource(R.drawable.ic_menu_dvd_add, R.drawable.ic_menu_dvd_add, R.drawable.ic_menu_dvd_add_c); } /** * Populate the drawable cache * @param name name of drawable resource * @param bwResource B/W drawable id * @param colorResource Color drawable id */ private void putResource(String name, int bwResource, int colorResource) { resources.put(name, bwResource); resources_color.put(name, colorResource); } /** * Populate the drawable cache * @param name name of drawable resource * @param bwResource B/W drawable id * @param colorResource Color drawable id */ private void putResource(int id, int bwResource, int colorResource) { generalResources.put(id, bwResource); generalResources_color.put(id, colorResource); } /** * Get correct drawable <code>Map</code> based on user's preferences * @return B/W or Color icons, depending on Shared Preferences */ private Map<String,Integer> getDrawables() { return Utils.getBooleanPreference(this, SettingsActivity.PREF_ICON_COLORS) ? resources_color : resources; } /** * Get correct drawable <code>Map</code> based on user's preferences * @return B/W or Color icons, depending on Shared Preferences */ private SparseArray<Integer> getGeneralDrawables() { return Utils.getBooleanPreference(this, SettingsActivity.PREF_ICON_COLORS) ? generalResources_color : generalResources; } /** * Get identifer of a <code>Drawable</code> resource from the name * @param name resource name * @return resource identifier */ private int getDrawable(String name) { if(!getDrawables().containsKey(name)) { int id = getResources().getIdentifier(name, "drawable", getPackageName()); getDrawables().put(name, id!=0 ? id : R.drawable.ic_list_os_other); } return getDrawables().get(name); } /** * Get {@link Drawable} for an Operating System * @param osTypeId Operating System type id * @return Android resource id */ public int getOSDrawable(String osTypeId) { return getDrawable("ic_list_os_"+osTypeId.toLowerCase()); } /** * Get {@link Drawable} for a given {@link VMAction} * @param name The {@link VMAction} * @return Android resource id */ public int getDrawable(VMAction name) { return getDrawables().get(name.name()); } /** * Get {@link Drawable} for given {@link MachineState} * @param state The {@link MachineState} * @return Android resource id */ public int getDrawable(MachineState state) { return getDrawables().get(state.name()); } /** * Get {@link Drawable} for given {@link MachineState} * @param state The {@link MachineState} * @return Android resource id */ public int getDrawable(int id) { return getGeneralDrawables().get(id); } /** * Get a color resource by name * @param context Android {@link Context} * @param name name of color resource * @return 4 byte color value <code>(0xAARRGGBB)</code> */ public int getColor(Context context, String name) { if(!metricColor.containsKey(name)) metricColor.put(name, context.getResources().getColor( context.getResources().getIdentifier(name, "color", context.getPackageName())) ); return metricColor.get(name); } /** * Is the Premium Key application installed? * @return <code>true</code> if premium user, <code>false</code> otherwise */ public boolean isPremiumVersion() { return getPackageManager().checkSignatures(APPLICATION_PACKAGE, APPLICATION_PRO_KEY_PACKAGE)==PackageManager.SIGNATURE_MATCH; } /** * Show a dialog offer user option to open Google Play Store to install 'VirtualBox Manager Premium Key' * @param context Android context */ public void showPremiumOffer(final Context context) { new AlertDialog.Builder(context) .setCancelable(true) .setTitle(R.string.pro_key_required_dialog_title) .setMessage(R.string.pro_key_required_dialog_message) .setPositiveButton(R.string.pro_key_required_dialog_ok_button, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); try { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+APPLICATION_PRO_KEY_PACKAGE))); } catch (ActivityNotFoundException e) { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id="+APPLICATION_PRO_KEY_PACKAGE))); } } }) .setNegativeButton(R.string.pro_key_required_dialog_cancel_button, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .show(); } }