/* * Copyright (C) 2012 The CyanogenMod Project * * 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 com.android.settings.profiles; import java.util.ArrayList; import java.util.UUID; import android.app.AirplaneModeSettings; import android.app.AlertDialog; import android.app.ConnectionSettings; import android.app.Profile; import android.app.ProfileGroup; import android.app.ProfileManager; import android.app.RingModeSettings; import android.app.StreamSettings; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; import android.net.wimax.WimaxHelper; import android.nfc.NfcAdapter; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; public class ProfileConfig extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener { static final String TAG = "ProfileConfig"; public static final String PROFILE_SERVICE = "profile"; private ProfileManager mProfileManager; private static final int MENU_NFC_WRITE = Menu.FIRST; private static final int MENU_DELETE = Menu.FIRST + 1; private Profile mProfile; private NamePreference mNamePreference; private ListPreference mScreenLockModePreference; // constant value that can be used to check return code from sub activity. private static final int PROFILE_GROUP_DETAILS = 1; private StreamItem[] mStreams; private ArrayList<ConnectionItem> mConnections; private RingModeItem mRingMode; private AirplaneModeItem mAirplaneMode; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); mStreams = new StreamItem[] { new StreamItem(AudioManager.STREAM_ALARM, getString(R.string.alarm_volume_title)), new StreamItem(AudioManager.STREAM_MUSIC, getString(R.string.media_volume_title)), new StreamItem(AudioManager.STREAM_RING, getString(R.string.incoming_call_volume_title)), new StreamItem(AudioManager.STREAM_NOTIFICATION, getString(R.string.notification_volume_title)) }; mConnections = new ArrayList<ConnectionItem>(); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_MOBILEDATA, getString(R.string.toggleData))); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_BLUETOOTH, getString(R.string.toggleBluetooth))); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_GPS, getString(R.string.toggleGPS))); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_WIFI, getString(R.string.toggleWifi))); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_SYNC, getString(R.string.toggleSync))); mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_WIFIAP, getString(R.string.toggleWifiAp))); if (WimaxHelper.isWimaxSupported(getActivity())) { mConnections.add(new ConnectionItem(ConnectionSettings.PROFILE_CONNECTION_WIMAX, getString(R.string.toggleWimax))); } addPreferencesFromResource(R.xml.profile_config); mProfileManager = (ProfileManager) getActivity().getSystemService(PROFILE_SERVICE); final Bundle args = getArguments(); mProfile = (args != null) ? (Profile) args.getParcelable("Profile") : null; if (mProfile == null) { mProfile = new Profile(getString(R.string.new_profile_name)); mProfileManager.addProfile(mProfile); } setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (NfcAdapter.getDefaultAdapter(getActivity()) != null) { MenuItem nfc = menu.add(0, MENU_NFC_WRITE, 0, R.string.profile_write_nfc_tag) .setIcon(R.drawable.ic_menu_nfc_writer_dark); nfc.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } MenuItem delete = menu.add(0, MENU_DELETE, 1, R.string.profile_menu_delete) .setIcon(R.drawable.ic_menu_trash_holo_dark); delete.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_DELETE: deleteProfile(); return true; case MENU_NFC_WRITE: startNFCProfileWriter(); return true; default: return false; } } @Override public void onResume() { super.onResume(); mProfile = mProfileManager.getProfile(mProfile.getUuid()); fillList(); } @Override public void onPause() { super.onPause(); // Save profile here if (mProfile != null) { mProfileManager.updateProfile(mProfile); } } private void startNFCProfileWriter() { PreferenceActivity pa = (PreferenceActivity) getActivity(); Intent i = new Intent(this.getActivity(), NFCProfileWriter.class); i.putExtra(NFCProfileWriter.EXTRA_PROFILE_UUID, mProfile.getUuid().toString()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); pa.startActivity(i); } private void fillList() { PreferenceScreen prefSet = getPreferenceScreen(); // Add the General section PreferenceGroup generalPrefs = (PreferenceGroup) prefSet.findPreference("profile_general_section"); if (generalPrefs != null) { generalPrefs.removeAll(); // Name preference mNamePreference = new NamePreference(getActivity(), mProfile.getName()); mNamePreference.setOnPreferenceChangeListener(this); generalPrefs.addPreference(mNamePreference); } // Populate system settings PreferenceGroup systemPrefs = (PreferenceGroup) prefSet.findPreference("profile_system_settings"); if (systemPrefs != null) { systemPrefs.removeAll(); // Ring mode preference if (mRingMode == null) { mRingMode = new RingModeItem(); } RingModeSettings rms = mProfile.getRingMode(); if (rms == null) { rms = new RingModeSettings(); mProfile.setRingMode(rms); } mRingMode.mSettings = rms; ProfileRingModePreference rmp = new ProfileRingModePreference(getActivity()); rmp.setRingModeItem(mRingMode); rmp.setTitle(R.string.ring_mode_title); rmp.setPersistent(false); rmp.setSummary(getActivity()); rmp.setOnPreferenceChangeListener(this); mRingMode.mCheckbox = rmp; systemPrefs.addPreference(rmp); // Airplane mode preference if (mAirplaneMode == null) { mAirplaneMode = new AirplaneModeItem(); } AirplaneModeSettings ams = mProfile.getAirplaneMode(); if (ams == null) { ams = new AirplaneModeSettings(); mProfile.setAirplaneMode(ams); } mAirplaneMode.mSettings = ams; ProfileAirplaneModePreference amp = new ProfileAirplaneModePreference(getActivity()); amp.setAirplaneModeItem(mAirplaneMode); amp.setTitle(R.string.profile_airplanemode_title); amp.setPersistent(false); amp.setSummary(getActivity()); amp.setOnPreferenceChangeListener(this); mAirplaneMode.mCheckbox = amp; systemPrefs.addPreference(amp); // Lockscreen mode preference mScreenLockModePreference = new ListPreference(getActivity()); mScreenLockModePreference.setTitle(R.string.profile_lockmode_title); mScreenLockModePreference.setEntries(R.array.profile_lockmode_entries); mScreenLockModePreference.setEntryValues(R.array.profile_lockmode_values); mScreenLockModePreference.setPersistent(false); mScreenLockModePreference.setSummary(getResources().getStringArray( R.array.profile_lockmode_summaries)[mProfile.getScreenLockMode()]); mScreenLockModePreference.setValue(String.valueOf(mProfile.getScreenLockMode())); mScreenLockModePreference.setOnPreferenceChangeListener(this); systemPrefs.addPreference(mScreenLockModePreference); } // Populate the audio streams list final AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); PreferenceGroup streamList = (PreferenceGroup) prefSet.findPreference("profile_volumeoverrides"); if (streamList != null) { streamList.removeAll(); for (StreamItem stream : mStreams) { StreamSettings settings = mProfile.getSettingsForStream(stream.mStreamId); if (settings == null) { settings = new StreamSettings(stream.mStreamId); mProfile.setStreamSettings(settings); } stream.mSettings = settings; StreamVolumePreference pref = new StreamVolumePreference(getActivity()); pref.setKey("stream_" + stream.mStreamId); pref.setTitle(stream.mLabel); pref.setSummary(getString(R.string.volume_override_summary) + " " + settings.getValue() + "/" + am.getStreamMaxVolume(stream.mStreamId)); pref.setPersistent(false); pref.setStreamItem(stream); stream.mCheckbox = pref; streamList.addPreference(pref); } } // Populate Connections list PreferenceGroup connectionList = (PreferenceGroup) prefSet.findPreference("profile_connectionoverrides"); if (connectionList != null) { connectionList.removeAll(); for (ConnectionItem connection : mConnections) { ConnectionSettings settings = mProfile.getSettingsForConnection(connection.mConnectionId); if (settings == null) { settings = new ConnectionSettings(connection.mConnectionId); mProfile.setConnectionSettings(settings); } connection.mSettings = settings; ProfileConnectionPreference pref = new ProfileConnectionPreference(getActivity()); pref.setKey("connection_" + connection.mConnectionId); pref.setTitle(connection.mLabel); pref.setSummary(settings.getValue() == 1 ? getString(R.string.connection_state_enabled) : getString(R.string.connection_state_disabled)); pref.setPersistent(false); pref.setConnectionItem(connection); connection.mCheckbox = pref; connectionList.addPreference(pref); } } // Populate Application groups PreferenceGroup groupList = (PreferenceGroup) prefSet.findPreference("profile_appgroups"); if (groupList != null) { groupList.removeAll(); for (ProfileGroup profileGroup : mProfile.getProfileGroups()) { PreferenceScreen pref = new PreferenceScreen(getActivity(), null); UUID uuid = profileGroup.getUuid(); pref.setKey(uuid.toString()); pref.setTitle(mProfileManager.getNotificationGroup(uuid).getName()); //pref.setSummary(R.string.profile_summary); // summary is repetitive, consider removing pref.setPersistent(false); pref.setSelectable(true); groupList.addPreference(pref); } } } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference instanceof StreamVolumePreference) { for (StreamItem stream : mStreams) { if (preference == stream.mCheckbox) { stream.mSettings.setOverride((Boolean) newValue); } } } else if (preference instanceof ProfileConnectionPreference) { for (ConnectionItem connection : mConnections) { if (preference == connection.mCheckbox) { connection.mSettings.setOverride((Boolean) newValue); } } } else if (preference == mRingMode.mCheckbox) { mRingMode.mSettings.setOverride((Boolean) newValue); } else if (preference == mAirplaneMode.mCheckbox) { mAirplaneMode.mSettings.setOverride((Boolean) newValue); } else if (preference == mNamePreference) { String name = mNamePreference.getName().toString(); if (!name.equals(mProfile.getName())) { if (!mProfileManager.profileExists(name)) { mProfile.setName(name); } else { mNamePreference.setName(mProfile.getName()); Toast.makeText(getActivity(), R.string.duplicate_profile_name, Toast.LENGTH_LONG).show(); } } } else if (preference == mScreenLockModePreference) { mProfile.setScreenLockMode(Integer.valueOf((String) newValue)); mScreenLockModePreference.setSummary(getResources().getStringArray( R.array.profile_lockmode_summaries)[mProfile.getScreenLockMode()]); } return true; } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { Log.d(TAG, "onPreferenceTreeClick(): entered" + preferenceScreen.getKey() + preference.getKey()); if (preference instanceof PreferenceScreen) { startProfileGroupActivity(preference.getKey(), preference.getTitle().toString()); return true; } return super.onPreferenceTreeClick(preferenceScreen, preference); } private void startProfileGroupActivity(String key, String title) { Bundle args = new Bundle(); args.putString("ProfileGroup", key.toString()); args.putParcelable("Profile", mProfile); String header = mProfile.getName().toString() + ": " + title.toString(); PreferenceActivity pa = (PreferenceActivity) getActivity(); pa.startPreferencePanel(ProfileGroupConfig.class.getName(), args, 0, header, this, PROFILE_GROUP_DETAILS); } private void deleteProfile() { if (mProfile.getUuid().equals(mProfileManager.getActiveProfile().getUuid())) { Toast toast = Toast.makeText(getActivity(), getString(R.string.profile_cannot_delete), Toast.LENGTH_SHORT); toast.show(); } else { AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.setTitle(R.string.profile_menu_delete); alert.setIconAttribute(android.R.attr.alertDialogIcon); alert.setMessage(R.string.profile_delete_confirm); alert.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { doDelete(); } }); alert.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); alert.create().show(); } } private void doDelete() { mProfileManager.removeProfile(mProfile); mProfile = null; finish(); } static class StreamItem { int mStreamId; String mLabel; StreamSettings mSettings; StreamVolumePreference mCheckbox; public StreamItem(int streamId, String label) { mStreamId = streamId; mLabel = label; } } static class ConnectionItem { int mConnectionId; String mLabel; ConnectionSettings mSettings; ProfileConnectionPreference mCheckbox; public ConnectionItem(int connectionId, String label) { mConnectionId = connectionId; mLabel = label; } } static class RingModeItem { RingModeSettings mSettings; ProfileRingModePreference mCheckbox; public RingModeItem() { // nothing to do } } static class AirplaneModeItem { AirplaneModeSettings mSettings; ProfileAirplaneModePreference mCheckbox; public AirplaneModeItem() { // nothing to do } } }