package akechi.projectl; import android.accounts.Account; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Toast; import com.google.api.client.repackaged.com.google.common.base.Strings; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import java.io.File; import java.util.List; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; public class SettingsFragment extends Fragment implements View.OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext()); { final IntentFilter ifilter= new IntentFilter(Event.AccountChange.ACTION); final BroadcastReceiver receiver= new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { SettingsFragment.this.loadSettings(); } }; lbMan.registerReceiver(receiver, ifilter); this.receivers.add(receiver); } } @Override public void onDestroy() { super.onDestroy(); final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext()); for(final BroadcastReceiver receiver : this.receivers) { lbMan.unregisterReceiver(receiver); } this.receivers.clear(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v= inflater.inflate(R.layout.fragment_settings, container, false); this.actionBarMode= (RadioGroup)v.findViewById(R.id.actionBarModeRadioGroup); this.iconCacheEnabledView= (CheckBox)v.findViewById(R.id.iconCacheCheck); this.inlineImageMode= (RadioGroup)v.findViewById(R.id.inlineImageModeRadioGroup); this.backgroundServiceEnabledView= (CheckBox)v.findViewById(R.id.backgroundServiceEnabledCheck); this.highlightPatternView= (EditText)v.findViewById(R.id.highlightPatternText); this.roomIdView= (EditText)v.findViewById(R.id.roomIdText); this.saveButton= (Button)v.findViewById(R.id.saveButton); this.saveButton.setOnClickListener(this); this.loadSettings(); { v.findViewById(R.id.clearCacheButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final AppContext appContext = (AppContext) SettingsFragment.this.getActivity().getApplicationContext(); final File iconCacheDir = appContext.getIconCacheDir(); if (!iconCacheDir.isDirectory()) { Toast.makeText(appContext, "Cleared", Toast.LENGTH_SHORT).show(); return; } Log.i("SettingsFragment", "clear dir " + iconCacheDir.getAbsolutePath()); if (this.deleteRecursive(iconCacheDir)) { Toast.makeText(appContext, "Cleared", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(appContext, "Didn't clear", Toast.LENGTH_SHORT).show(); } } private boolean deleteRecursive(File file) { if (file.isDirectory()) { final File[] children = file.listFiles(); if (children == null) { return false; } for (final File child : children) { if (!this.deleteRecursive(child)) { return false; } } return true; } else { return file.delete(); } } }); } { this.backgroundServiceEnabledView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { SettingsFragment.this.highlightPatternView.setEnabled(isChecked); } }); } return v; } @Override public void onClick(View v) { // validate { boolean hasError= false; try { final String patterns= this.highlightPatternView.getText().toString(); for(final String pattern : Splitter.on(System.getProperty("line.separator")).split(patterns)) { Pattern.compile(pattern); } this.highlightPatternView.setError(null); } catch(PatternSyntaxException e) { this.highlightPatternView.setError("Invalid regular expression"); hasError= true; } if(hasError) { return; } } final AppContext appContext= (AppContext)this.getActivity().getApplicationContext(); // general settings { final int modeId= this.actionBarMode.getCheckedRadioButtonId(); switch(modeId) { case R.id.modeDefaultRadio:{ appContext.setActionBarMode(AppContext.ActionBarMode.DEFAULT); break; } case R.id.modeCurrentRoomRadio:{ appContext.setActionBarMode(AppContext.ActionBarMode.CURRENT_ROOM); break; } case R.id.modeHiddenRadio:{ appContext.setActionBarMode(AppContext.ActionBarMode.HIDDEN); break; } } } { appContext.setIconCacheEnabled(this.iconCacheEnabledView.isChecked()); } { final int modeId= this.inlineImageMode.getCheckedRadioButtonId(); switch(modeId) { case R.id.inlineImageAlwaysRadio:{ appContext.setInlineImageMode(AppContext.InlineImageMode.ALWAYS); break; } case R.id.inlineImageWifiOnlyRadio:{ appContext.setInlineImageMode(AppContext.InlineImageMode.WIFI_ONLY); break; } case R.id.inlineImageNeverRadio:{ appContext.setInlineImageMode(AppContext.InlineImageMode.NEVER); break; } } } { appContext.setBackgroundServiceEnabled(this.backgroundServiceEnabledView.isChecked()); } { appContext.setHighlightPattern(this.highlightPatternView.getText()); } // account settings final Account account= appContext.getAccount(); { final String ids= this.roomIdView.getText().toString(); final Iterable<String> roomIds= Iterables.filter( Splitter.on(System.getProperty("line.separator")).split(ids), new Predicate<String>() { @Override public boolean apply(String input) { return !Strings.isNullOrEmpty(input); } } ); appContext.setRoomIds(account, roomIds); } Toast.makeText(this.getActivity(), "Saved", Toast.LENGTH_SHORT).show(); // notify others for preference changed { final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext()); final Intent intent= new Intent(Event.PreferenceChange.ACTION); lbMan.sendBroadcast(intent); } } private void loadSettings() { final AppContext appContext= (AppContext)this.getActivity().getApplicationContext(); // general settings { final AppContext.ActionBarMode mode= appContext.getActionBarMode(); switch(mode) { case DEFAULT:{ this.actionBarMode.check(R.id.modeDefaultRadio); break; } case CURRENT_ROOM:{ this.actionBarMode.check(R.id.modeCurrentRoomRadio); break; } case HIDDEN:{ this.actionBarMode.check(R.id.modeHiddenRadio); break; } default: throw new AssertionError("Unknown ActionBarMode " + mode); } } this.iconCacheEnabledView.setChecked(appContext.isIconCacheEnabled()); { final AppContext.InlineImageMode mode= appContext.getInlineImageMode(); switch(mode) { case ALWAYS:{ this.inlineImageMode.check(R.id.inlineImageAlwaysRadio); break; } case WIFI_ONLY:{ this.inlineImageMode.check(R.id.inlineImageWifiOnlyRadio); break; } case NEVER:{ this.inlineImageMode.check(R.id.inlineImageNeverRadio); break; } default: throw new AssertionError("Unknown InlineImageMode " + mode); } } this.backgroundServiceEnabledView.setChecked(appContext.isBackgroundServiceEnabled()); this.highlightPatternView.setText(appContext.getHighlightPattern()); this.highlightPatternView.setEnabled(appContext.isBackgroundServiceEnabled()); // account settings final Account account= appContext.getAccount(); if(account != null) { final Iterable<String> roomIds= appContext.getRoomIds(account); this.roomIdView.setText(Joiner.on(System.getProperty("line.separator")).join(roomIds)); } } private RadioGroup actionBarMode; private CheckBox iconCacheEnabledView; private RadioGroup inlineImageMode; private CheckBox backgroundServiceEnabledView; private EditText highlightPatternView; private EditText roomIdView; private Button saveButton; private final List<BroadcastReceiver> receivers= Lists.newLinkedList(); }