diff options
Diffstat (limited to 'app/src/main')
-rw-r--r-- | app/src/main/AndroidManifest.xml | 42 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/GitClone.java | 225 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/pwdstore.java | 50 | ||||
-rw-r--r-- | app/src/main/res/drawable-hdpi/ic_launcher.png | bin | 0 -> 9397 bytes | |||
-rw-r--r-- | app/src/main/res/drawable-mdpi/ic_launcher.png | bin | 0 -> 5237 bytes | |||
-rw-r--r-- | app/src/main/res/drawable-xhdpi/ic_launcher.png | bin | 0 -> 14383 bytes | |||
-rw-r--r-- | app/src/main/res/drawable-xxhdpi/ic_launcher.png | bin | 0 -> 19388 bytes | |||
-rw-r--r-- | app/src/main/res/layout/activity_git_clone.xml | 40 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_pwdstore.xml | 17 | ||||
-rw-r--r-- | app/src/main/res/menu/git_clone.xml | 8 | ||||
-rw-r--r-- | app/src/main/res/menu/pwdstore.xml | 8 | ||||
-rw-r--r-- | app/src/main/res/values-w820dp/dimens.xml | 6 | ||||
-rw-r--r-- | app/src/main/res/values/dimens.xml | 5 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 19 | ||||
-rw-r--r-- | app/src/main/res/values/strings_activity_git_clone.xml | 15 | ||||
-rw-r--r-- | app/src/main/res/values/styles.xml | 8 |
16 files changed, 443 insertions, 0 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..b26aba3f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.zeapo.pwdstore" > + + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.INTERNET" /> + + <application + android:allowBackup="true" + android:icon="@drawable/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + <activity + android:name=".pwdstore" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity + android:name=".GitClone" + android:label="@string/title_activity_git_clone" > + </activity> + </application> + + <!-- + To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. This disconnect + option is required to comply with the Google+ Sign-In developer policies + --> + <uses-permission android:name="android.permission.USE_CREDENTIALS" /> + + <!-- To retrieve the account name (email) as part of sign-in: --> + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + + <!-- To auto-complete the email text field in the login form with the user's emails --> + <uses-permission android:name="android.permission.READ_PROFILE" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> + +</manifest> diff --git a/app/src/main/java/com/zeapo/pwdstore/GitClone.java b/app/src/main/java/com/zeapo/pwdstore/GitClone.java new file mode 100644 index 00000000..7e2102a6 --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/GitClone.java @@ -0,0 +1,225 @@ +package com.zeapo.pwdstore; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.ListActivity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Message; +import android.text.InputType; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.zeapo.pwdstore.R; + +import org.eclipse.jgit.api.Git; + +import org.apache.commons.io.FileUtils; +import org.eclipse.jgit.diff.Edit; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +public class GitClone extends Activity implements AdapterView.OnItemSelectedListener { + + + /* The clone process has to be on a different thread than the main one */ + private class CloneTask extends AsyncTask<File, Integer, Long> { + private ProgressDialog dialog; + private Activity activity; + private Context context; + + public CloneTask(Activity activity) { + this.activity = activity; + context = activity; + dialog = new ProgressDialog(context); + } + + protected void onPreExecute() { + this.dialog.setMessage("Cloning..."); + this.dialog.setCancelable(false); + this.dialog.show(); + } + + protected void onPostExecute(Long result) { + this.dialog.dismiss(); + } + + + protected Long doInBackground(File... remote) { + int count = remote.length; + long totalSize = 0; + for (int i = 0; i < count; i++) { + try { + Git.cloneRepository(). + setCloneAllBranches(true). + setDirectory(remote[i]). + setURI(((TextView) findViewById(R.id.clone_uri)).getText().toString()) + .call(); + totalSize++; + } catch (Exception e) { + e.printStackTrace(); + totalSize++; + } + } + return totalSize; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_git_clone); + + // init the spinner + Spinner connection_mode_spinner = (Spinner) findViewById(R.id.connection_mode); + ArrayAdapter<CharSequence> connection_mode_adapter = ArrayAdapter.createFromResource(this, + R.array.connection_modes, android.R.layout.simple_spinner_item); + connection_mode_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + connection_mode_spinner.setAdapter(connection_mode_adapter); + connection_mode_spinner.setOnItemSelectedListener(this); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.git_clone, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + if (id == R.id.action_settings) { + return true; + } + return super.onOptionsItemSelected(item); + } + + public void cloneRepository(View view) { + + final File localDir = new File(getApplicationContext().getCacheDir().getAbsoluteFile() + "/store"); + + if (localDir.exists()) { + AlertDialog.Builder builder1 = new AlertDialog.Builder(this); + builder1.setMessage(R.string.dialog_delete_msg); + builder1.setCancelable(true); + builder1.setPositiveButton(R.string.dialog_delete, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + try { + FileUtils.deleteDirectory(localDir); + } catch (IOException e) { + //TODO Handle the exception correctly + e.printStackTrace(); + } + + dialog.cancel(); + } + } + ); + builder1.setNegativeButton(R.string.dialog_do_not_delete, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + } + ); + + AlertDialog alert11 = builder1.create(); + alert11.show(); + } + + + String connectionMode = ((Spinner) findViewById(R.id.connection_mode)).getSelectedItem().toString(); + if (connectionMode.equalsIgnoreCase("ssh-key")) { + + } else { + // Set an EditText view to get user input + final LinearLayout layout = new LinearLayout(this); + layout.setOrientation(LinearLayout.VERTICAL); + + final EditText username = new EditText(this); + username.setHint("Username"); + username.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); + + final EditText password = new EditText(this); + password.setHint("Password"); + password.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); + password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + + layout.addView(username); + layout.addView(password); + + + new AlertDialog.Builder(this) + .setTitle("Authenticate") + .setMessage("Please provide your usename and password for this repository") + .setView(layout) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + //TODO use Jsch to set the authentication method + + } + }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + // Do nothing. + } + }).show(); + } + + new CloneTask(this).execute(localDir); + } + + + public void selectConnectionMode(View view) { + + } + + /* when the connection mode is selected */ + @Override + public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { + String selection = ((Spinner) findViewById(R.id.connection_mode)).getSelectedItem().toString(); + + if (selection.equalsIgnoreCase("ssh-key")) { + new AlertDialog.Builder(this) + .setMessage("Authentication method not implemented yet") + .setPositiveButton("OK", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + } + ).show(); + ((Button) findViewById(R.id.clone_button)).setEnabled(false); + } else { + ((Button) findViewById(R.id.clone_button)).setEnabled(true); + } + } + + @Override + public void onNothingSelected(AdapterView<?> adapterView) { + + } +} diff --git a/app/src/main/java/com/zeapo/pwdstore/pwdstore.java b/app/src/main/java/com/zeapo/pwdstore/pwdstore.java new file mode 100644 index 00000000..5bf9ca3c --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/pwdstore.java @@ -0,0 +1,50 @@ +package com.zeapo.pwdstore; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.hardware.display.DisplayManager; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; + +import java.io.FileInputStream; +import java.io.FileOutputStream; + + +public class pwdstore extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pwdstore); + System.out.println("HEE"); + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.pwdstore, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + if (id == R.id.action_settings) { + return true; + } + return super.onOptionsItemSelected(item); + } + + public void getClone(View view){ + Intent intent = new Intent(this, GitClone.class); + startActivity(intent); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..96a442e5 --- /dev/null +++ b/app/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..359047df --- /dev/null +++ b/app/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..71c6d760 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..4df18946 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/app/src/main/res/layout/activity_git_clone.xml b/app/src/main/res/layout/activity_git_clone.xml new file mode 100644 index 00000000..01b18d26 --- /dev/null +++ b/app/src/main/res/layout/activity_git_clone.xml @@ -0,0 +1,40 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" + tools:context="com.zeapo.pwdstore.GitClone"> + + <LinearLayout + android:orientation="vertical" + android:layoutDirection="ltr" + android:layout_width="fill_parent" + android:layout_height="match_parent"> + <EditText + android:hint="Repository" + android:id="@+id/clone_uri" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + <Spinner + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/connection_mode"></Spinner> + + <LinearLayout + android:id="@+id/config_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content"></LinearLayout> + + <Button + android:id="@+id/clone_button" + android:text="Clone!" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:onClick="cloneRepository"/> + </LinearLayout> + + +</RelativeLayout> diff --git a/app/src/main/res/layout/activity_pwdstore.xml b/app/src/main/res/layout/activity_pwdstore.xml new file mode 100644 index 00000000..1420c906 --- /dev/null +++ b/app/src/main/res/layout/activity_pwdstore.xml @@ -0,0 +1,17 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" + tools:context=".pwdstore"> + + <Button + android:text="@string/clone" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:onClick="getClone"/> + +</RelativeLayout> diff --git a/app/src/main/res/menu/git_clone.xml b/app/src/main/res/menu/git_clone.xml new file mode 100644 index 00000000..2227d87d --- /dev/null +++ b/app/src/main/res/menu/git_clone.xml @@ -0,0 +1,8 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:context="com.zeapo.pwdstore.GitClone" > + <item android:id="@+id/action_settings" + android:title="@string/action_settings" + android:orderInCategory="100" + android:showAsAction="never" /> +</menu> diff --git a/app/src/main/res/menu/pwdstore.xml b/app/src/main/res/menu/pwdstore.xml new file mode 100644 index 00000000..db164db6 --- /dev/null +++ b/app/src/main/res/menu/pwdstore.xml @@ -0,0 +1,8 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:context=".pwdstore" > + <item android:id="@+id/action_settings" + android:title="@string/action_settings" + android:orderInCategory="100" + android:showAsAction="never" /> +</menu> diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 00000000..63fc8164 --- /dev/null +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ +<resources> + <!-- Example customization of dimensions originally defined in res/values/dimens.xml + (such as screen margins) for screens with more than 820dp of available width. This + would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> + <dimen name="activity_horizontal_margin">64dp</dimen> +</resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..47c82246 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..43246df8 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <string name="app_name">PwdStore</string> + <string name="clone">Clone!</string> + <string name="action_settings">Settings</string> + <string name="hello_world">Hello world!</string> + + <string name="dialog_delete_title">Remove dir</string> + <string name="dialog_delete_msg">Target directory already exist. Current version support only a single store. Do you want to delete the current password store directory?</string> + <string name="dialog_delete">Delete directory</string> + <string name="dialog_do_not_delete">Cancel</string> + + <string-array name="connection_modes"> + <item>username/password</item> + <item>ssh-key</item> + </string-array> + +</resources> diff --git a/app/src/main/res/values/strings_activity_git_clone.xml b/app/src/main/res/values/strings_activity_git_clone.xml new file mode 100644 index 00000000..bde00dba --- /dev/null +++ b/app/src/main/res/values/strings_activity_git_clone.xml @@ -0,0 +1,15 @@ +<resources> + <string name="title_activity_git_clone">Clone Repository</string> + + <!-- Strings related to login --> + <string name="prompt_email">Email</string> + <string name="prompt_password">Password (optional)</string> + <string name="action_sign_in">Sign in or register</string> + <string name="action_sign_in_short">Sign in</string> + <string name="plus_sign_out">Switch Google+ account</string> + <string name="plus_disconnect">Disconnect from Google+</string> + <string name="error_invalid_email">This email address is invalid</string> + <string name="error_invalid_password">This password is too short</string> + <string name="error_incorrect_password">This password is incorrect</string> + <string name="error_field_required">This field is required</string> +</resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..ff6c9d2c --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> + <!-- Customize your theme here. --> + </style> + +</resources> |