Some refactoring and organisation for listview.. sooooon

This commit is contained in:
Zeapo 2014-07-27 18:58:42 +01:00
parent c75fd77fdf
commit a0b8301a49
9 changed files with 143 additions and 74 deletions

View file

@ -12,7 +12,7 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" > android:theme="@style/AppTheme" >
<activity <activity
android:name=".pwdstore" android:name=".PasswordStore"
android:label="@string/app_name" > android:label="@string/app_name" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View file

@ -31,9 +31,17 @@ import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.errors.NotSupportedException; import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.JschConfigSessionFactory; import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig; import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.SshSessionFactory; import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.Transport;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FS;
@ -246,7 +254,7 @@ public class GitClone extends Activity {
public void cloneRepository(View view) { public void cloneRepository(View view) {
localDir = new File(getApplicationContext().getCacheDir().getAbsoluteFile() + "/store"); localDir = new File(getApplicationContext().getFilesDir().getAbsoluteFile() + "/store");
hostname = ((TextView) findViewById(R.id.clone_uri)).getText().toString(); hostname = ((TextView) findViewById(R.id.clone_uri)).getText().toString();
// don't ask the user, take off the protocol that he puts in // don't ask the user, take off the protocol that he puts in
@ -355,10 +363,12 @@ public class GitClone extends Activity {
} }
}).show(); }).show();
} else { } else {
CloneCommand cmd = Git.cloneRepository(). CloneCommand cmd = Git.cloneRepository()
setCloneAllBranches(true). .setDirectory(localDir)
setDirectory(localDir). .setURI(hostname)
setURI(hostname); .setBare(false)
.setNoCheckout(false)
.setCloneAllBranches(true);
new CloneTask(activity).execute(cmd); new CloneTask(activity).execute(cmd);
} }

View file

@ -0,0 +1,41 @@
package com.zeapo.pwdstore;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import java.io.File;
import java.io.IOException;
/**
* Created by zeapo on 7/27/14.
*/
public class GitRepo {
private static Repository repository;
protected GitRepo(){ }
public static Repository getRepository(File localDir) {
if (repository == null) {
FileRepositoryBuilder builder = new FileRepositoryBuilder();
try {
repository = builder.setGitDir(localDir)
.readEnvironment()
.findGitDir()
.build();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return repository;
}
public static void closeRepository() {
repository.close();
}
}

View file

@ -0,0 +1,48 @@
package com.zeapo.pwdstore;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.zeapo.pwdstore.R;
import java.util.ArrayList;
public class PasswordAdapter extends ArrayAdapter<String> {
private final Context context;
private final ArrayList<String> values;
static class ViewHolder {
public TextView text;
}
public PasswordAdapter(Context context, ArrayList<String> values) {
super(context, R.layout.password_row_layout, values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse for performance, holder pattern!
if (rowView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.password_row_layout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.label);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.text.setText( values.get(position) );
return rowView;
}
}

View file

@ -11,13 +11,9 @@ import android.widget.AbsListView;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListAdapter; import android.widget.ListAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import java.util.ArrayList;
import com.zeapo.pwdstore.dummy.DummyContent;
import java.util.List;
/** /**
* A fragment representing a list of Items. * A fragment representing a list of Items.
@ -25,8 +21,6 @@ import java.util.List;
* Large screen devices (such as tablets) are supported by replacing the ListView * Large screen devices (such as tablets) are supported by replacing the ListView
* with a GridView. * with a GridView.
* <p /> * <p />
* Activities containing this fragment MUST implement the {@link Callbacks}
* interface.
*/ */
public class PasswordFragment extends Fragment implements AbsListView.OnItemClickListener { public class PasswordFragment extends Fragment implements AbsListView.OnItemClickListener {
@ -43,31 +37,17 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
*/ */
private ListAdapter mAdapter; private ListAdapter mAdapter;
// TODO: Rename and change types of parameters
public static PasswordFragment newInstance(String param1, String param2) {
PasswordFragment fragment = new PasswordFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
/** /**
* Mandatory empty constructor for the fragment manager to instantiate the * Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes). * fragment (e.g. upon screen orientation changes).
*/ */
public PasswordFragment() { public PasswordFragment() { }
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (getArguments() != null) { mAdapter = new PasswordAdapter(getActivity(), new ArrayList<String>());
}
String[] values = new String[] { "NOT", "YET", "IMPLEMENTED" };
// TODO: Change Adapter to display your content
mAdapter = new MySimpleArrayAdapter(getActivity(), values);
} }
@Override @Override
@ -76,7 +56,7 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
View view = inflater.inflate(R.layout.fragment_password, container, false); View view = inflater.inflate(R.layout.fragment_password, container, false);
// Set the adapter // Set the adapter
mListView = (AbsListView) view.findViewById(android.R.id.list); mListView = (AbsListView) view.findViewById(R.id.pass_list);
((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter); ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
// Set OnItemClickListener so we can be notified on item clicks // Set OnItemClickListener so we can be notified on item clicks
@ -112,44 +92,9 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
} }
} }
/**
* The default content for this Fragment has a TextView that is shown when
* the list is empty. If you would like to change the text, call this method
* to supply the text it should use.
*/
public void setEmptyText(CharSequence emptyText) {
View emptyView = mListView.getEmptyView();
if (emptyText instanceof TextView) {
((TextView) emptyView).setText(emptyText);
}
}
public interface OnFragmentInteractionListener { public interface OnFragmentInteractionListener {
// TODO: Update argument type and name // TODO: Update argument type and name
public void onFragmentInteraction(String id); public void onFragmentInteraction(String id);
} }
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;
public MySimpleArrayAdapter(Context context, String[] values) {
super(context, R.layout.password_row_layout, values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.password_row_layout, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.label);
textView.setText(values[position]);
return rowView;
}
}
} }

View file

@ -11,6 +11,8 @@ import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -19,6 +21,8 @@ import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.NotFileFilter; import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.commons.io.filefilter.TrueFileFilter;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder; import org.eclipse.jgit.lib.RepositoryBuilder;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
@ -28,9 +32,10 @@ import java.io.FileFilter;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.Collection; import java.util.Collection;
import java.util.List;
public class pwdstore extends Activity implements ToCloneOrNot.OnFragmentInteractionListener, PasswordFragment.OnFragmentInteractionListener { public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentInteractionListener, PasswordFragment.OnFragmentInteractionListener {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -83,12 +88,11 @@ public class pwdstore extends Activity implements ToCloneOrNot.OnFragmentIntera
private void checkLocalRepository() { private void checkLocalRepository() {
int status = 0; int status = 0;
final File localDir = new File(getCacheDir() + "/store"); final File localDir = new File(getFilesDir() + "/store/.git");
FragmentManager fragmentManager = getFragmentManager(); FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (localDir.exists()) { if (localDir.exists()) {
File[] folders = localDir.listFiles((FileFilter) FileFilterUtils.directoryFileFilter()); File[] folders = localDir.listFiles((FileFilter) FileFilterUtils.directoryFileFilter());
status = folders.length; status = folders.length;
@ -111,4 +115,12 @@ public class pwdstore extends Activity implements ToCloneOrNot.OnFragmentIntera
} }
} }
public void addItem(View view) {
ListView l = (ListView) findViewById(R.id.pass_list);
PasswordAdapter pad = (PasswordAdapter) l.getAdapter();
pad.add("Something");
}
} }

View file

@ -6,10 +6,15 @@
tools:context="com.zeapo.pwdstore.PasswordFragment"> tools:context="com.zeapo.pwdstore.PasswordFragment">
<ListView <ListView
android:id="@android:id/list" android:id="@+id/pass_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:dividerHeight="8dp" android:dividerHeight="8dp"
android:divider="@android:color/transparent"/> android:divider="@android:color/transparent"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add!"
android:onClick="addItem"/>
</FrameLayout> </FrameLayout>

View file

@ -7,8 +7,10 @@
<LinearLayout <LinearLayout
android:id="@+id/myRectangleView" android:id="@+id/myRectangleView"
android:layout_width="200dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginRight="18dp"
android:background="@drawable/rectangle" android:background="@drawable/rectangle"
android:layout_gravity="center" android:layout_gravity="center"
android:orientation="vertical"> android:orientation="vertical">
@ -16,7 +18,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:text="You have no git repository for the password store."/> android:gravity="center"
android:text="@string/clone_fragment_text"/>
<Button <Button
android:id="@+id/main_clone_button" android:id="@+id/main_clone_button"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -25,13 +28,13 @@
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:background="@android:color/holo_green_light" android:background="@android:color/holo_green_light"
android:onClick="getClone" android:onClick="getClone"
android:text="Clone!"/> android:text="@string/clone"/>
<Button <Button
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:background="@android:color/holo_red_light" android:background="@android:color/holo_red_light"
android:text="Initialize!"/> android:text="@string/initialize"/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View file

@ -2,7 +2,7 @@
<resources> <resources>
<string name="app_name">PwdStore</string> <string name="app_name">PwdStore</string>
<string name="clone">Clone!</string>
<string name="clone_settings">Clone</string> <string name="clone_settings">Clone</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string> <string name="hello_world">Hello world!</string>
@ -21,6 +21,11 @@
<item>http://</item> <item>http://</item>
</string-array> </string-array>
<!-- Clone fragment -->
<string name="clone_fragment_text">Password store empty</string>
<string name="clone">Clone a git repository</string>
<string name="initialize">Initialize a git repository</string>
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
</resources> </resources>