diff --git a/app/file.svg b/app/file.svg new file mode 100644 index 0000000..c6288f3 --- /dev/null +++ b/app/file.svg @@ -0,0 +1,651 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Generic Text + + + text + plaintext + regular + document + + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/folder.svg b/app/folder.svg new file mode 100644 index 0000000..b5b925b --- /dev/null +++ b/app/folder.svg @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Folder Icon + + + + Jakub Steiner + + + + http://jimmac.musichall.cz + + + folder + directory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/www/about.html b/app/src/main/assets/www/about.html index 640193a..e528451 100755 --- a/app/src/main/assets/www/about.html +++ b/app/src/main/assets/www/about.html @@ -14,6 +14,7 @@
  • Android-logging-log4j (https://code.google.com/p/android-logging-log4j/)
  • Log4j (http://logging.apache.org/log4j)
  • dom4J (http://dom4j.sourceforge.net/)
  • +
  • Tango Desktop Project(http://tango.freedesktop.org/)
  • \ No newline at end of file diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java b/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java index 6d9c4c9..16e6cee 100755 --- a/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java +++ b/app/src/main/java/com/ericsson/uecontrol/gui/MainActivity.java @@ -20,6 +20,7 @@ import com.ericsson.uecontrol.core.behaviour.UeBehaviourSleep; import com.ericsson.uecontrol.core.behaviour.UeBehaviourSurfing; import com.ericsson.uecontrol.gui.fragments.BehaviourListFragment; import com.ericsson.uecontrol.gui.fragments.FileBrowserDialog; +import com.ericsson.uecontrol.gui.fragments.FileBrowserDialog.OnFileSelectionListener; import com.ericsson.uecontrol.gui.fragments.StatusFragment; import com.ericsson.uecontrol.gui.util.CSVWriter; @@ -31,7 +32,8 @@ import java.io.File; import de.mindpipe.android.logging.log4j.LogConfigurator; -public class MainActivity extends FragmentActivity implements OnSharedPreferenceChangeListener{ +public class MainActivity extends FragmentActivity implements OnSharedPreferenceChangeListener, + OnFileSelectionListener { private static final Logger log = Logger.getLogger(MainActivity.class); public static final String DEFAULT_LOG_PATH = "/sdcard/uecontrol/"; public static final String BEHAVIOUR_SAVE_FILE = "behaviour_list.json"; @@ -203,7 +205,8 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference return true; } else if (id == R.id.action_import) { - //TODO: + FileBrowserDialog browser = FileBrowserDialog.newInstance("/sdcard"); + browser.show(this.getFragmentManager(), "import"); } else if (id == R.id.action_export) { //TODO: @@ -214,6 +217,16 @@ public class MainActivity extends FragmentActivity implements OnSharedPreference } return super.onOptionsItemSelected(item); } + public void onFileSelection(String tag, File file){ + try { + if(tag.equals("import")) { + currentExecutor.read(file.getAbsolutePath()); + } + } catch (Exception e) { + log.error("Unable to import from: "+file.getAbsolutePath(), e); + Toast.makeText(this, "Unable to import from file", Toast.LENGTH_SHORT).show(); + } + } private void updateExecutionState(){ diff --git a/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java new file mode 100755 index 0000000..7d9a31a --- /dev/null +++ b/app/src/main/java/com/ericsson/uecontrol/gui/fragments/FileBrowserDialog.java @@ -0,0 +1,233 @@ +package com.ericsson.uecontrol.gui.fragments; + + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.ContextThemeWrapper; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.ericsson.uecontrol.R; + +import org.apache.log4j.Logger; + + +/** Allow user to select destination directory and to enter filename. + * + * */ +public class FileBrowserDialog extends DialogFragment + implements OnItemClickListener, DialogInterface.OnKeyListener { + public static final Logger log = Logger.getLogger(FileBrowserDialog.class); + public static final int FOLDER_ICON = R.drawable.folder; + public static final int FILE_ICON = R.drawable.file; + + public static interface OnFileSelectionListener{ + public void onFileSelection(String tag, File file); + } + + private File root; + private File path; + private File selection; + private ListView fileListView; + private TextView pathView; + private OnFileSelectionListener callback; + + + + public static FileBrowserDialog newInstance(String root) { + FileBrowserDialog browser = new FileBrowserDialog(); + Bundle bundle = new Bundle(); + bundle.putString("root", root); + + browser.setArguments(bundle); + return browser; + } + + + @Override + public void onAttach(Activity activity) { + if(!(activity instanceof OnFileSelectionListener)) + throw new ClassCastException(activity.toString() + " must implement OnFileSelectionListener"); + + Bundle bundle = this.getArguments(); + root = new File(bundle.getString("root")); + callback = (OnFileSelectionListener) activity; + + super.onAttach(activity); + } + + /** Build the popup. + * */ + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Fix for CopyPaste bar not visible + final Context context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light); + + LinearLayout rootView = new LinearLayout(context); + rootView.setOrientation(LinearLayout.VERTICAL); + rootView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT)); + int padding = getResources().getDimensionPixelSize(R.dimen.standard_padding); + rootView.setPadding(padding, padding, padding, padding); + + + pathView = new TextView(context); + pathView.setText(root.getAbsolutePath()); + pathView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT)); + rootView.addView(pathView); + + fileListView = new ListView(context); + fileListView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT)); + fileListView.setOnItemClickListener(this); + fileListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + + updateFileList(root); + rootView.addView(fileListView); + + /*EditText fileNameView = new EditText(context); + fileNameView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT)); + fileNameView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + rootView.addView(fileNameView); + */ + + // Create dialog + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.configure_behaviour); + builder.setOnKeyListener(this); + builder.setPositiveButton(R.string.action_select, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + if(selection != null) + callback.onFileSelection(FileBrowserDialog.this.getTag(), selection); + else + Toast.makeText(context, "No File Selected", Toast.LENGTH_SHORT).show(); + } + }); + builder.setNegativeButton(R.string.action_cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + FileBrowserDialog.this.getDialog().cancel(); + } + }); + builder.setView(rootView); + + AlertDialog dialog = builder.create(); + dialog.show(); + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + return dialog; + } + + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + File file = (File)fileListView.getAdapter().getItem(position); + if(file.isDirectory()){ + updateFileList(file); + } + else{ + log.debug("File selected: "+ file.getAbsolutePath()); + ((AlertDialog)this.getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); + selection = file; + ((FileListAdapter)fileListView.getAdapter()).notifyDataSetChanged(); + } + } + + + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + if(root.equals(path)) + dialog.dismiss(); + else + updateFileList(path.getParentFile()); + return true; + } + return false; + } + + + private void updateFileList(File dir){ + if(!dir.isDirectory()) + dir = dir.getParentFile(); + if(dir.compareTo(root) <= 0) + dir = root; + + log.debug("Browsing folder: "+ dir.getAbsolutePath()); + ArrayList folders = new ArrayList(); + ArrayList files = new ArrayList(); + for(File file : dir.listFiles()){ + if(file.isDirectory()) + folders.add(file); + else + files.add(file); + } + Collections.sort(folders); + Collections.sort(files); + folders.addAll(files); + + path = dir; + pathView.setText(dir.getAbsolutePath()); + fileListView.setAdapter(new FileListAdapter(this.getActivity(), folders)); + + // Reset selection + selection = null; + if(this.getDialog() != null) + ((AlertDialog)this.getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + } + + protected class FileListAdapter extends ArrayAdapter{ + private List fileList; + + public FileListAdapter(Context context, List fileList) { + super(context, android.R.layout.simple_list_item_1, fileList); + this.fileList = fileList; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TextView textview = (TextView) super.getView( position, convertView, parent ); + textview.setPadding(5, 10, 10, 10); + + File file = fileList.get(position); + textview.setText(file.getName()); + + Drawable icon = getActivity().getResources().getDrawable( + ( file.isDirectory() ? FOLDER_ICON : FILE_ICON ) + ); + textview.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null ); + + // Is selected? + if (position == fileList.indexOf(selection)) + textview.setBackgroundResource(android.R.color.darker_gray); + else + textview.setBackgroundResource(android.R.color.transparent); + + return textview; + } + } +} diff --git a/app/src/main/res/drawable-hdpi/file.png b/app/src/main/res/drawable-hdpi/file.png new file mode 100644 index 0000000..6fa1c3c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/file.png differ diff --git a/app/src/main/res/drawable-hdpi/folder.png b/app/src/main/res/drawable-hdpi/folder.png new file mode 100644 index 0000000..4dc9c4c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/folder.png differ diff --git a/app/src/main/res/drawable-mdpi/file.png b/app/src/main/res/drawable-mdpi/file.png new file mode 100644 index 0000000..819a09e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/file.png differ diff --git a/app/src/main/res/drawable-mdpi/folder.png b/app/src/main/res/drawable-mdpi/folder.png new file mode 100644 index 0000000..b5760df Binary files /dev/null and b/app/src/main/res/drawable-mdpi/folder.png differ diff --git a/app/src/main/res/drawable-xhdpi/file.png b/app/src/main/res/drawable-xhdpi/file.png new file mode 100644 index 0000000..861d551 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/file.png differ diff --git a/app/src/main/res/drawable-xhdpi/folder.png b/app/src/main/res/drawable-xhdpi/folder.png new file mode 100644 index 0000000..ff958de Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/folder.png differ diff --git a/app/src/main/res/drawable-xxhdpi/file.png b/app/src/main/res/drawable-xxhdpi/file.png new file mode 100644 index 0000000..e1ead69 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/file.png differ diff --git a/app/src/main/res/drawable-xxhdpi/folder.png b/app/src/main/res/drawable-xxhdpi/folder.png new file mode 100644 index 0000000..f9b8d37 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/folder.png differ diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 6d58d6b..6e365b4 100755 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -23,7 +23,7 @@ android:title="@string/action_import" android:orderInCategory="100" android:showAsAction="never" - android:enabled="false" /> + android:enabled="true" />