package app.create.rpg; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeSet; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Parcel; import android.os.ResultReceiver; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.MimeTypeMap; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Spinner; import android.widget.Toast; import app.create.rpg.task.Task; import app.create.rpg.task.TaskCopyFile; import app.create.rpg.task.TaskResult; public class FragmentMaterialBase extends AbstractFragmentPage implements OnItemSelectedListener, OnItemClickListener, OnItemLongClickListener { public static class MyCreator extends CustomPagerAdapter.FragmentCreator { public MyCreator() { super(); } public MyCreator(Parcel source) { super(source); } @Override public Fragment newInstance(Context context) { return new FragmentMaterialBase(); } @Override public String getTitle(Context context) { return context.getString(R.string.menu_materialbase); } @Override public Class<?> getFragmentClass() { return FragmentMaterialBase.class; } @Override public boolean equals(Object object) { return object instanceof MyCreator; } public static final MyCreator EMPTY = new MyCreator(); public static final Creator<MyCreator> CREATOR = new Creator<MyCreator>() { public MyCreator[] newArray(int size) { return new MyCreator[size]; } public MyCreator createFromParcel(Parcel source) { return new MyCreator(source); } }; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setName(getString(R.string.menu_materialbase)); View view = inflater.inflate(R.layout.page_material, null); Spinner spinner = (Spinner) view.findViewById(R.id.spinMaterialTypes); spinner.setOnItemSelectedListener(this); final ListView listView = (ListView) view.findViewById(R.id.listMaterials); listView.setOnItemClickListener(this); listView.setLongClickable(true); listView.setOnItemLongClickListener(this); return view; } public void refresh() { Spinner spinner = (Spinner) getView().findViewById(R.id.spinMaterialTypes); onItemSelected(spinner, spinner.getSelectedView(), spinner.getSelectedItemPosition(), spinner.getSelectedItemId()); } @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { final ListView listView = (ListView) getView().findViewById(R.id.listMaterials); final String cat = ((Adapter) adapterView.getAdapter()).getItem(position).toString(); final File dirFile = mHelper.dirToProject(cat), dirFileRTP = mHelper.dirToRTP(cat); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> item; File[] files; item = new HashMap<String, Object>(); item.put("key", getString(R.string.str_import)); item.put("image", R.drawable.ic_btn_import); list.add(item); TreeSet<File> names; if (dirFileRTP.isDirectory()) { names = new TreeSet<File>(); files = dirFileRTP.listFiles(); for (File f : files) { if (f.isFile()) { names.add(f); } } for (File f : names) { item = new HashMap<String, Object>(); String name = f.getName(); int off = name.lastIndexOf('.'); if (off == -1) off = name.length(); item.put("key", name.substring(0, off)); item.put("image", R.drawable.ic_btn_file); item.put("file", f); list.add(item); } } if (dirFile.isDirectory()) { names = new TreeSet<File>(); files = dirFile.listFiles(); for (File f : files) { if (f.isFile()) { names.add(f); } } for (File f : names) { item = new HashMap<String, Object>(); String name = f.getName(); int off = name.lastIndexOf('.'); if (off == -1) off = name.length(); item.put("key", name.substring(0, off)); item.put("image", R.drawable.ic_btn_file); item.put("file", f); list.add(item); } } listView.setAdapter(new SimpleAdapter(getActivity(), list, R.layout.dialog_file_row, new String[]{"image", "key"}, new int[]{R.id.row_image, R.id.row_text})); } @Override public void onNothingSelected(AdapterView<?> arg0) { } public void onItemClick(AdapterView<?> p1, View p2, int p3, long p4) { File f = (File) ((Map<?, ?>) ((Adapter) p1.getAdapter()).getItem(p3)).get("file"); if (f == null) { startActivityForResult(new Intent(getActivity(), ActivityFileDialog.class) .putExtra(ActivityFileDialog.SELECTION_MODE_FLAGS, SelectionFlags.FLAG_ONLY_AVAILABLE), 9); return; } MimeTypeMap myMime = MimeTypeMap.getSingleton(); Intent newIntent = new Intent(Intent.ACTION_VIEW); String name = f.getName(), mimeType = "*/*"; int off = name.lastIndexOf('.') + 1; if (off > 0) mimeType = myMime.getMimeTypeFromExtension(name.substring(off).toLowerCase(Locale.ENGLISH)); newIntent.setDataAndType(Uri.fromFile(f), mimeType); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { getActivity().startActivity(newIntent); } catch (ActivityNotFoundException e) { Toast.makeText(getActivity(), "No handler for this type of file.", Toast.LENGTH_SHORT).show(); newIntent.setType("*/*"); try { getActivity().startActivity(newIntent); } catch (Throwable e1) { } } } public class MyResultReceiver extends ResultReceiver { public MyResultReceiver(Handler handler) { super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { refresh(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { File from, to; if (resultCode == Activity.RESULT_CANCELED || data == null) { super.onActivityResult(requestCode, resultCode, data); return; } if (requestCode == 9) { // Import Spinner spinner = (Spinner) getView().findViewById(R.id.spinMaterialTypes); from = new File(data.getStringExtra(ActivityFileDialog.FILE_PATH)).getAbsoluteFile(); to = new File(new File(((ActivityProject) getActivity()).getProjectDir(), spinner.getSelectedItem().toString()), from.getName()); to.getParentFile().mkdirs(); } else if (requestCode == 10) { // Export to = new File(data.getStringExtra(ActivityFileDialog.FILE_PATH)).getAbsoluteFile(); from = new File(data.getStringExtra("myFile")); } else { super.onActivityResult(requestCode, resultCode, data); return; } if (to.equals(from)) { Toast.makeText(getActivity(), "Error! Source and destination paths are equal.", Toast.LENGTH_SHORT).show(); return; } Task[] list = new Task[] { new TaskCopyFile(from.getAbsolutePath(), to.getAbsolutePath()), new TaskResult(new MyResultReceiver(new Handler(getActivity().getMainLooper()))) }; Intent svc = new Intent(ServiceFileTask.ACTION_PUSH_TASK); if (requestCode == 9) svc.putExtra("tasks", list); else svc.putExtra("task", list[0]); getActivity().startService(svc); } public boolean onItemLongClick(AdapterView<?> list, View p2, final int pos, long p4) { final ListView lv = (ListView) list; final Map<?, ?> item = (Map<?, ?>) lv.getItemAtPosition(pos); final File file = (File) item.get("file"); if (file == null) { onItemClick(list, p2, pos, p4); return true; } new AlertDialog.Builder(getActivity()) .setTitle(R.string.str_menu) .setItems(R.array.material_menu, new DialogInterface.OnClickListener() { public void onClick(DialogInterface p1, int which) { if (which == 0) { startActivityForResult(new Intent(getActivity(), ActivityFileDialog.class) .putExtra(ActivityFileDialog.SELECTION_MODE_FLAGS, 0) .putExtra("myFile", file.getAbsolutePath()) .putExtra(ActivityFileDialog.FILE_PATH, file.getName()), 10); } else { file.delete(); refresh(); } } }).show(); return true; } }