package com.csound.wizard.fragment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.ListView;
import com.csound.wizard.App;
import com.csound.wizard.MainActivity;
import com.csound.wizard.Utils;
import com.csound.wizard.model.Model;
import com.csound.wizard.model.Playlist;
import com.example.proglayout.R;
public class ChooserFragment extends Fragment {
private static final String
TAG_TRACKS = "CHOOSE_TRACKS_FOR_";
private FragmentManager fm;
private HashMap<Integer,PlaylistSelection> selectedItems;
private ChooserAction action;
public ChooserFragment() {
}
public ChooserFragment(ChooserAction a) {
action = a;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
@Override
public void onDetach() {
App app = (App) getActivity().getApplication();
app.clearPlayerTrack();
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
super.onDetach();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View res = inflater.inflate(R.layout.fragment_chooser_main, container, false);
fm = getFragmentManager();
fm.beginTransaction()
.replace(R.id.chooser_container, new ChooserPlaylistFragment())
.commit();
selectedItems = new HashMap<Integer,PlaylistSelection>();
Button btnOk = (Button) res.findViewById(R.id.action_ok);
btnOk.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
action.act(selectedItems);
clearBackFragments();
((MainActivity) getActivity()).goToCurrentPlaylist();
}
});
Button btnCancel = (Button) res.findViewById(R.id.action_cancel);
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
clearBackFragments();
((MainActivity) getActivity()).goToCurrentPlaylist();
}
});
this.setRetainInstance(true);
return res;
}
private void clearBackFragments() {
fm.popBackStack();
}
public static class Add extends ChooserFragment {
public Add(final Context ctx) {
super(new ChooserFragment.ChooserAction() {
@Override
public void act(HashMap<Integer, PlaylistSelection> selectedItems) {
Model m = Utils.getModel((Activity) ctx);
for (Entry<Integer,PlaylistSelection> entry: selectedItems.entrySet()) {
Integer playlistId = entry.getKey();
PlaylistSelection selection = entry.getValue();
Playlist p = m.getPlaylistById(playlistId);
if (selection.getIsPlaylistSelected()) {
List<String> tracks = p.getTracks();
int n = tracks.size();
for (int i = 0; i < n; i++) {
String trackName = tracks.get(i);
m.saveLink(trackName);
}
} else {
for (Integer location: selection.getSelectedTracks()) {
m.saveLink(p.getTracks().get(location));
}
}
}
}
});
}
}
public static class Delete extends ChooserFragment {
public Delete(final Context ctx) {
super(new ChooserFragment.ChooserAction() {
@Override
public void act(HashMap<Integer, PlaylistSelection> selectedItems) {
Model m = Utils.getModel((Activity) ctx);
for (Entry<Integer,PlaylistSelection> entry: selectedItems.entrySet()) {
Integer playlistId = entry.getKey();
PlaylistSelection selection = entry.getValue();
if (selection.getIsPlaylistSelected()) {
m.removePlaylistById(playlistId);
} else {
Playlist p = m.getPlaylistById(playlistId);
int shift = 0;
for (Integer location: selection.getSelectedTracks()) {
m.removeTrackById(p, location - shift);
shift++;
}
}
}
}
});
}
}
public static interface ChooserAction {
void act(HashMap<Integer,PlaylistSelection> selectedItems);
}
public class ChooserPlaylistFragment extends Fragment {
public ChooserPlaylistFragment() {
super();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View res = inflater.inflate(R.layout.fragment_chooser_playlists, container, false);
ListView lv = (ListView) res.findViewById(R.id.browse_list);
List<String> ls = Utils.getModel(this).getPlaylistNames();
lv.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, ls)
);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
view.setSelected(true);
Integer item = (Integer) position;
Playlist p = Utils.getModel(ChooserFragment.this).getPlaylists().get(item);
if (!selectedItems.containsKey(item)) {
selectedItems.put(item, new PlaylistSelection());
}
fm.beginTransaction()
.replace(R.id.chooser_container, new ChooserTracksFragment(p, selectedItems.get(item)))
.addToBackStack(TAG_TRACKS)
.commit();
}
});
this.setRetainInstance(true);
return res;
}
}
public class ChooserTracksFragment extends Fragment {
private Playlist playlist = new Playlist();
private PlaylistSelection selection = new PlaylistSelection();
public ChooserTracksFragment() {
super();
}
public ChooserTracksFragment(Playlist p, PlaylistSelection s) {
super();
playlist = p;
selection = s;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View res = inflater.inflate(R.layout.fragment_chooser, container, false);
final ListView lv = (ListView) res.findViewById(R.id.browse_list);
List<String> ls = playlist.getTrackNames();
lv.setAdapter(
new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_multiple_choice, ls)
);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setFocusableInTouchMode(false);
lv.setOnItemClickListener(new OnItemClickListener() {@Override
public void onItemClick(AdapterView<?> arg0, View view,
int item, long arg3) {
CheckedTextView chk = (CheckedTextView) view;
if (chk.isChecked()) {
selection.getSelectedTracks().add(item);
} else {
selection.getSelectedTracks().remove((Integer) item);
}
}
});
for (Integer i: selection.getSelectedTracks()) {
lv.setItemChecked(i, true);
}
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox chk = (CheckBox) v;
int itemCount = lv.getCount();
for(int i=0 ; i < itemCount ; i++){
lv.setItemChecked(i, chk.isChecked());
}
if (chk.isChecked()) {
selection.setAllTracksSelected(playlist.getTracks().size());
} else {
selection.setNoneSelected();
}
}
};
CheckBox selectAll = (CheckBox) res.findViewById(R.id.select_all);
selectAll.setChecked(selection.getIsAllSelected());
selectAll.setOnClickListener(clickListener);
CheckBox selectPlaylist = (CheckBox) res.findViewById(R.id.select_playlist);
selectPlaylist.setChecked(selection.getIsPlaylistSelected());
selectPlaylist.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
selection.toggleSelectPlaylist();
}
});
this.setRetainInstance(true);
return res;
}
}
public static class PlaylistSelection {
private Boolean isPlaylistSelected, isAllSelected;
private List<Integer> selectedTracks;
public PlaylistSelection() {
isPlaylistSelected = false;
isAllSelected = false;
selectedTracks = new ArrayList<Integer>();
}
public Boolean getIsAllSelected() {
return isAllSelected;
}
public Boolean getIsPlaylistSelected() {
return isPlaylistSelected;
}
public List<Integer> getSelectedTracks() {
return selectedTracks;
}
public void setAllTracksSelected(int n) {
selectedTracks = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
selectedTracks.add(i);
}
isAllSelected = true;
}
public void setNoneSelected() {
selectedTracks = new ArrayList<Integer>();
isAllSelected = false;
}
public void toggleSelectPlaylist() {
isPlaylistSelected = !isPlaylistSelected;
}
}
}