/* * Copyright (C) 2011 University of Washington * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.odk.collect.android.preferences; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import org.odk.collect.android.R; import org.odk.collect.android.application.Collect; import org.odk.collect.android.utilities.CompatibilityUtils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; /** * Handles admin preferences, which are password-protectable and govern which app features and * general preferences the end user of the app will be able to see. * * @author Thomas Smyth, Sassafras Tech Collective (tom@sassafrastech.com; constraint behavior option) */ public class AdminPreferencesActivity extends PreferenceActivity { public static String ADMIN_PREFERENCES = "admin_prefs"; // key for this preference screen public static String KEY_ADMIN_PW = "admin_pw"; // keys for each preference // main menu public static String KEY_EDIT_SAVED = "edit_saved"; public static String KEY_SEND_FINALIZED = "send_finalized"; public static String KEY_GET_BLANK = "get_blank"; public static String KEY_DELETE_SAVED = "delete_saved"; // server public static String KEY_CHANGE_SERVER = "change_server"; public static String KEY_CHANGE_USERNAME = "change_username"; public static String KEY_CHANGE_PASSWORD = "change_password"; public static String KEY_CHANGE_GOOGLE_ACCOUNT = "change_google_account"; public static String KEY_CHANGE_PROTOCOL_SETTINGS = "change_protocol_settings"; // client public static String KEY_CHANGE_FONT_SIZE = "change_font_size"; public static String KEY_DEFAULT_TO_FINALIZED = "default_to_finalized"; public static String KEY_HIGH_RESOLUTION = "high_resolution"; public static String KEY_SHOW_SPLASH_SCREEN = "show_splash_screen"; public static String KEY_SELECT_SPLASH_SCREEN = "select_splash_screen"; public static String KEY_DELETE_AFTER_SEND = "delete_after_send"; // form entry public static String KEY_SAVE_MID = "save_mid"; public static String KEY_JUMP_TO = "jump_to"; public static String KEY_CHANGE_LANGUAGE = "change_language"; public static String KEY_ACCESS_SETTINGS = "access_settings"; public static String KEY_SAVE_AS = "save_as"; public static String KEY_MARK_AS_FINALIZED = "mark_as_finalized"; public static String KEY_AUTOSEND_WIFI = "autosend_wifi"; public static String KEY_AUTOSEND_NETWORK = "autosend_network"; public static String KEY_NAVIGATION = "navigation"; public static String KEY_CONSTRAINT_BEHAVIOR = "constraint_behavior"; private static final int SAVE_PREFS_MENU = Menu.FIRST; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(getString(R.string.app_name) + " > " + getString(R.string.admin_preferences)); PreferenceManager prefMgr = getPreferenceManager(); prefMgr.setSharedPreferencesName(ADMIN_PREFERENCES); prefMgr.setSharedPreferencesMode(MODE_WORLD_READABLE); addPreferencesFromResource(R.xml.admin_preferences); } @Override public boolean onCreateOptionsMenu(Menu menu) { Collect.getInstance().getActivityLogger() .logAction(this, "onCreateOptionsMenu", "show"); super.onCreateOptionsMenu(menu); CompatibilityUtils.setShowAsAction( menu.add(0, SAVE_PREFS_MENU, 0, R.string.save_preferences) .setIcon(R.drawable.ic_menu_save), MenuItem.SHOW_AS_ACTION_NEVER); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case SAVE_PREFS_MENU: File writeDir = new File(Collect.getInstance().getOdkRoot() + "/settings"); if (!writeDir.exists()) { if (!writeDir.mkdirs()) { Toast.makeText( this, "Error creating directory " + writeDir.getAbsolutePath(), Toast.LENGTH_SHORT).show(); return false; } } File dst = new File(writeDir.getAbsolutePath() + "/collect.settings"); boolean success = AdminPreferencesActivity.saveSharedPreferencesToFile(dst, this); if (success) { Toast.makeText( this, "Settings successfully written to " + dst.getAbsolutePath(), Toast.LENGTH_LONG) .show(); } else { Toast.makeText(this, "Error writing settings to " + dst.getAbsolutePath(), Toast.LENGTH_LONG).show(); } return true; } return super.onOptionsItemSelected(item); } public static boolean saveSharedPreferencesToFile(File dst, Context context) { // this should be in a thread if it gets big, but for now it's tiny boolean res = false; ObjectOutputStream output = null; try { output = new ObjectOutputStream(new FileOutputStream(dst)); SharedPreferences pref = PreferenceManager .getDefaultSharedPreferences(context); SharedPreferences adminPreferences = context.getSharedPreferences( AdminPreferencesActivity.ADMIN_PREFERENCES, 0); output.writeObject(pref.getAll()); output.writeObject(adminPreferences.getAll()); res = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (output != null) { output.flush(); output.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } }