From c2d2473b1618a9a002344ec6be1e67004fdb1f94 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 28 Feb 2013 17:43:12 +0100 Subject: New Layout for main screen --- src/de/blinkt/openvpn/ConfigParser.java | 2 - src/de/blinkt/openvpn/FileSelect.java | 5 +- src/de/blinkt/openvpn/FileSelectLayout.java | 1 + src/de/blinkt/openvpn/FileSelectionFragment.java | 65 +++++++------ src/de/blinkt/openvpn/FragmentGeneralSettings.java | 12 +++ src/de/blinkt/openvpn/MainActivity.java | 102 ++++++++++++++++----- src/de/blinkt/openvpn/OpenVPN.java | 5 +- src/de/blinkt/openvpn/SendDumpActivity.java | 74 --------------- src/de/blinkt/openvpn/SendDumpFragment.java | 100 ++++++++++++++++++++ src/de/blinkt/openvpn/VPNProfileList.java | 9 +- 10 files changed, 233 insertions(+), 142 deletions(-) create mode 100644 src/de/blinkt/openvpn/FragmentGeneralSettings.java delete mode 100644 src/de/blinkt/openvpn/SendDumpActivity.java create mode 100644 src/de/blinkt/openvpn/SendDumpFragment.java (limited to 'src/de/blinkt/openvpn') diff --git a/src/de/blinkt/openvpn/ConfigParser.java b/src/de/blinkt/openvpn/ConfigParser.java index e5713c3f..57649547 100644 --- a/src/de/blinkt/openvpn/ConfigParser.java +++ b/src/de/blinkt/openvpn/ConfigParser.java @@ -7,8 +7,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.Vector; -import android.text.TextUtils; - //! Openvpn Config FIle Parser, probably not 100% accurate but close enough // And rember, this is valid :) diff --git a/src/de/blinkt/openvpn/FileSelect.java b/src/de/blinkt/openvpn/FileSelect.java index 18448706..e1a89b87 100644 --- a/src/de/blinkt/openvpn/FileSelect.java +++ b/src/de/blinkt/openvpn/FileSelect.java @@ -130,8 +130,11 @@ public class FileSelect extends Activity { data += new String(filedata); mData =data; + + /* mInlineFragment.setData(data); - getActionBar().selectTab(inlineFileTab); + getActionBar().selectTab(inlineFileTab); */ + saveInlineData(data); } catch (FileNotFoundException e) { fe = e; } catch (IOException e) { diff --git a/src/de/blinkt/openvpn/FileSelectLayout.java b/src/de/blinkt/openvpn/FileSelectLayout.java index 93e438fc..b7e28b5c 100644 --- a/src/de/blinkt/openvpn/FileSelectLayout.java +++ b/src/de/blinkt/openvpn/FileSelectLayout.java @@ -38,6 +38,7 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener { mSelectButton = (Button) findViewById(R.id.file_select_button); mSelectButton.setOnClickListener(this); + ta.recycle(); } public void setFragment(Fragment fragment, int i) diff --git a/src/de/blinkt/openvpn/FileSelectionFragment.java b/src/de/blinkt/openvpn/FileSelectionFragment.java index 5badc6e0..f750d91a 100644 --- a/src/de/blinkt/openvpn/FileSelectionFragment.java +++ b/src/de/blinkt/openvpn/FileSelectionFragment.java @@ -15,6 +15,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; +import android.widget.CheckBox; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; @@ -30,8 +31,8 @@ public class FileSelectionFragment extends ListFragment { private static final String ITEM_KEY = "key"; private static final String ITEM_IMAGE = "image"; private static final String ROOT = "/"; - - + + private List path = null; private TextView myPath; private ArrayList> mList; @@ -48,18 +49,28 @@ public class FileSelectionFragment extends ListFragment { private File selectedFile; private HashMap lastPositions = new HashMap(); private String mStartPath; - private Button mImportFile; + private CheckBox mInlineImport; private Button mClearButton; private boolean mHideImport=false; - + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.file_dialog_main, container,false); - + myPath = (TextView) v.findViewById(R.id.path); + mInlineImport = (CheckBox) v.findViewById(R.id.doinline); + mInlineImport.setEnabled(false); + + if(mHideImport== true) { + mInlineImport.setVisibility(View.GONE); + mInlineImport.setChecked(false); + } + + + selectButton = (Button) v.findViewById(R.id.fdButtonSelect); selectButton.setEnabled(false); selectButton.setOnClickListener(new OnClickListener() { @@ -67,15 +78,18 @@ public class FileSelectionFragment extends ListFragment { @Override public void onClick(View v) { if (selectedFile != null) { - ((FileSelect) getActivity()).setFile(selectedFile.getPath()); - + if(mInlineImport.isChecked()) + + ((FileSelect) getActivity()).importFile(selectedFile.getPath()); + else + ((FileSelect) getActivity()).setFile(selectedFile.getPath()); } } }); mClearButton = (Button) v.findViewById(R.id.fdClear); mClearButton.setOnClickListener(new OnClickListener() { - + @Override public void onClick(View v) { ((FileSelect) getActivity()).clearData(); @@ -85,35 +99,21 @@ public class FileSelectionFragment extends ListFragment { mClearButton.setVisibility(View.GONE); mClearButton.setEnabled(false); } - - - mImportFile = (Button) v.findViewById(R.id.importfile); - mImportFile.setEnabled(false); - mImportFile.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - ((FileSelect) getActivity()).importFile(selectedFile.getPath()); - } - }); - if(mHideImport== true) { - mImportFile.setVisibility(View.GONE); - } - + return v; } - + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - + mStartPath = ((FileSelect) getActivity()).getSelectPath(); getDir(mStartPath); } - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -154,7 +154,7 @@ public class FileSelectionFragment extends ListFragment { f = new File(currentPath); files = f.listFiles(); } - + myPath.setText(getText(R.string.location) + ": " + currentPath); if (!currentPath.equals(ROOT)) { @@ -209,7 +209,7 @@ public class FileSelectionFragment extends ListFragment { path.addAll(filesPathMap.tailMap("").values()); SimpleAdapter fileList = new SimpleAdapter(getActivity(), mList, R.layout.file_dialog_row, new String[] { - ITEM_KEY, ITEM_IMAGE }, new int[] { R.id.fdrowtext, R.id.fdrowimage }); + ITEM_KEY, ITEM_IMAGE }, new int[] { R.id.fdrowtext, R.id.fdrowimage }); for (String dir : dirsMap.tailMap("").values()) { addItem(dir, R.drawable.folder); @@ -240,26 +240,25 @@ public class FileSelectionFragment extends ListFragment { if (file.isDirectory()) { selectButton.setEnabled(false); - mImportFile.setEnabled(false); - + if (file.canRead()) { lastPositions.put(currentPath, position); getDir(path.get(position)); } else { new AlertDialog.Builder(getActivity()).setIcon(R.drawable.icon) - .setTitle("[" + file.getName() + "] " + getText(R.string.cant_read_folder)) - .setPositiveButton("OK", null).show(); + .setTitle("[" + file.getName() + "] " + getText(R.string.cant_read_folder)) + .setPositiveButton("OK", null).show(); } } else { selectedFile = file; v.setSelected(true); selectButton.setEnabled(true); - mImportFile.setEnabled(true); } } public void setNoInLine() { mHideImport=true; + } } diff --git a/src/de/blinkt/openvpn/FragmentGeneralSettings.java b/src/de/blinkt/openvpn/FragmentGeneralSettings.java new file mode 100644 index 00000000..800fb82a --- /dev/null +++ b/src/de/blinkt/openvpn/FragmentGeneralSettings.java @@ -0,0 +1,12 @@ +package de.blinkt.openvpn; + +import android.os.Bundle; +import android.preference.PreferenceFragment; + +public class FragmentGeneralSettings extends PreferenceFragment { +@Override +public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.general_settings); +} +} diff --git a/src/de/blinkt/openvpn/MainActivity.java b/src/de/blinkt/openvpn/MainActivity.java index 57506c4f..c5ae21c8 100644 --- a/src/de/blinkt/openvpn/MainActivity.java +++ b/src/de/blinkt/openvpn/MainActivity.java @@ -1,42 +1,94 @@ package de.blinkt.openvpn; -import java.util.List; - +import android.app.ActionBar; +import android.app.ActionBar.Tab; +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentTransaction; import android.content.Intent; -import android.preference.PreferenceActivity; -public class MainActivity extends PreferenceActivity { - @Override - public void onBuildHeaders(List
target) { - loadHeadersFromResource(R.xml.main_headers, target); - +public class MainActivity extends Activity { + + protected void onCreate(android.os.Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActionBar bar = getActionBar(); + bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); + + Tab vpnListTab = bar.newTab().setText(R.string.vpn_list_title); + Tab generalTab = bar.newTab().setText(R.string.generalsettings); + Tab faqtab = bar.newTab().setText(R.string.faq); + Tab abouttab = bar.newTab().setText(R.string.about); + + vpnListTab.setTabListener(new TabListener("profiles", VPNProfileList.class)); + generalTab.setTabListener(new TabListener("settings", FragmentGeneralSettings.class)); + faqtab.setTabListener(new TabListener("faq", FaqFragment.class)); + abouttab.setTabListener(new TabListener("about", AboutFragment.class)); - String translatedby = getString(R.string.translationby); - if(!translatedby.equals("") && !translatedby.contains("Arne Schwabe")) { - Header translation = new Header(); - translation.title = getString(R.string.translation); - translation.summary = translatedby; - target.add(translation); + bar.addTab(vpnListTab); + bar.addTab(generalTab); + bar.addTab(faqtab); + bar.addTab(abouttab); + + if(SendDumpFragment.getLastestDump(this)!=null) { + Tab sendDump = bar.newTab().setText(R.string.crashdump); + sendDump.setTabListener(new TabListener("crashdump",SendDumpFragment.class)); + bar.addTab(sendDump); } - if(SendDumpActivity.getLastestDump(this)!=null) { - Header sendDump = new Header(); - sendDump.titleRes = R.string.send_minidump; - sendDump.summaryRes = R.string.send_minidump_summary; - sendDump.intent = new Intent(this,SendDumpActivity.class); - target.add(sendDump); + }; + + protected class TabListener implements ActionBar.TabListener + { + private Fragment mFragment; + private String mTag; + private Class mClass; + + + public TabListener(String tag, Class clz) { + mTag = tag; + mClass = clz; + + // Check to see if we already have a fragment for this tab, probably + // from a previously saved state. If so, deactivate it, because our + // initial state is that a tab isn't shown. + mFragment = getFragmentManager().findFragmentByTag(mTag); + if (mFragment != null && !mFragment.isDetached()) { + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.detach(mFragment); + ft.commit(); + } + } + + public void onTabSelected(Tab tab, FragmentTransaction ft) { + if (mFragment == null) { + mFragment = Fragment.instantiate(MainActivity.this, mClass.getName()); + ft.add(android.R.id.content, mFragment, mTag); + } else { + ft.attach(mFragment); + } + } + + public void onTabUnselected(Tab tab, FragmentTransaction ft) { + if (mFragment != null) { + ft.detach(mFragment); + } + } + + + @Override + public void onTabReselected(Tab tab, FragmentTransaction ft) { + } - } - + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - + System.out.println(data); - - + + } diff --git a/src/de/blinkt/openvpn/OpenVPN.java b/src/de/blinkt/openvpn/OpenVPN.java index 4d5ae269..da25b8a5 100644 --- a/src/de/blinkt/openvpn/OpenVPN.java +++ b/src/de/blinkt/openvpn/OpenVPN.java @@ -11,6 +11,7 @@ import java.util.LinkedList; import java.util.Locale; import java.util.Vector; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -165,7 +166,9 @@ public class OpenVPN { } } } - + + // The lint is wrong here + @SuppressLint("StringFormatMatches") private String getMobileInfoString(Context c) { c.getPackageManager(); String apksign="error getting package signature"; diff --git a/src/de/blinkt/openvpn/SendDumpActivity.java b/src/de/blinkt/openvpn/SendDumpActivity.java deleted file mode 100644 index 74d1a2f8..00000000 --- a/src/de/blinkt/openvpn/SendDumpActivity.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.blinkt.openvpn; - -import java.io.File; -import java.util.ArrayList; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.Uri; - -public class SendDumpActivity extends Activity { - - protected void onStart() { - super.onStart(); - emailMiniDumps(); - finish(); - }; - - public void emailMiniDumps() - { - //need to "send multiple" to get more than one attachment - final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); - emailIntent.setType("*/*"); - emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, - new String[]{"Arne Schwabe "}); - - String version; - String name="ics-openvpn"; - try { - PackageInfo packageinfo = getPackageManager().getPackageInfo(getPackageName(), 0); - version = packageinfo.versionName; - name = packageinfo.applicationInfo.name; - } catch (NameNotFoundException e) { - version = "error fetching version"; - } - - - emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("%s %s Minidump",name,version)); - - emailIntent.putExtra(Intent.EXTRA_TEXT, "Please describe the issue you have experienced"); - - ArrayList uris = new ArrayList(); - - File ldump = getLastestDump(this); - if(ldump==null) { - OpenVPN.logError("No Minidump found!"); - } - - uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.getName())); - uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.getName() + ".log")); - - emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - startActivity(emailIntent); - } - - static public File getLastestDump(Context c) { - long newestDumpTime=0; - File newestDumpFile=null; - - for(File f:c.getCacheDir().listFiles()) { - if(!f.getName().endsWith(".dmp")) - continue; - - if (newestDumpTime < f.lastModified()) { - newestDumpTime = f.lastModified(); - newestDumpFile=f; - } - } - return newestDumpFile; - } -} diff --git a/src/de/blinkt/openvpn/SendDumpFragment.java b/src/de/blinkt/openvpn/SendDumpFragment.java new file mode 100644 index 00000000..0ff7f48f --- /dev/null +++ b/src/de/blinkt/openvpn/SendDumpFragment.java @@ -0,0 +1,100 @@ +package de.blinkt.openvpn; + +import java.io.File; +import java.util.ArrayList; + +import android.app.Fragment; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; + +public class SendDumpFragment extends Fragment implements OnClickListener { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View v = inflater.inflate(R.layout.fragment_senddump, container, false); + v.findViewById(R.id.senddump).setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + emailMiniDumps(); + } + }); + return v; + } + + public void emailMiniDumps() + { + //need to "send multiple" to get more than one attachment + final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); + emailIntent.setType("*/*"); + emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, + new String[]{"Arne Schwabe "}); + + String version; + String name="ics-openvpn"; + try { + PackageInfo packageinfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); + version = packageinfo.versionName; + name = packageinfo.applicationInfo.name; + } catch (NameNotFoundException e) { + version = "error fetching version"; + } + + + emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("%s %s Minidump",name,version)); + + emailIntent.putExtra(Intent.EXTRA_TEXT, "Please describe the issue you have experienced"); + + ArrayList uris = new ArrayList(); + + File ldump = getLastestDump(getActivity()); + if(ldump==null) { + OpenVPN.logError("No Minidump found!"); + } + + uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.getName())); + uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.getName() + ".log")); + + emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + startActivity(emailIntent); + } + + static public File getLastestDump(Context c) { + long newestDumpTime=0; + File newestDumpFile=null; + + for(File f:c.getCacheDir().listFiles()) { + if(!f.getName().endsWith(".dmp")) + continue; + + if (newestDumpTime < f.lastModified()) { + newestDumpTime = f.lastModified(); + newestDumpFile=f; + } + } + // Ignore old dumps + //if(System.currentTimeMillis() - 48 * 60 * 1000 > newestDumpTime ) + //return null; + + return newestDumpFile; + } + + + + @Override + public void onClick(View v) { + // TODO Auto-generated method stub + + } +} diff --git a/src/de/blinkt/openvpn/VPNProfileList.java b/src/de/blinkt/openvpn/VPNProfileList.java index 1e24bfe7..6c10e736 100644 --- a/src/de/blinkt/openvpn/VPNProfileList.java +++ b/src/de/blinkt/openvpn/VPNProfileList.java @@ -92,8 +92,6 @@ public class VPNProfileList extends ListFragment { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - // Debug load JNI - //OpenVPN.foo(); } @@ -172,15 +170,14 @@ public class VPNProfileList extends ListFragment { menu.add(0, MENU_ADD_PROFILE, 0, R.string.menu_add_profile) .setIcon(android.R.drawable.ic_menu_add) .setAlphabeticShortcut('a') - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM - | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + .setTitleCondensed(getActivity().getString(R.string.add)) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT); menu.add(0, MENU_IMPORT_PROFILE, 0, R.string.menu_import) .setIcon(R.drawable.ic_menu_archive) .setAlphabeticShortcut('i') .setTitleCondensed(getActivity().getString(R.string.menu_import_short)) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM - | MenuItem.SHOW_AS_ACTION_WITH_TEXT ); + .setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT ); } -- cgit v1.2.3