diff --git a/org_apg/AndroidManifest.xml b/org_apg/AndroidManifest.xml
index 9ea2ac9d5..b96c442fe 100644
--- a/org_apg/AndroidManifest.xml
+++ b/org_apg/AndroidManifest.xml
@@ -206,6 +206,9 @@
android:excludeFromRecents="true"
android:label="@string/title_about"
android:theme="@style/Theme.Sherlock.Light.Dialog" />
+
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ android:src="@drawable/ic_menu_filebrowser" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/org_apg/res/layout/encrypt.xml b/org_apg/res/layout/encrypt.xml
index 7750ab129..9fc3da676 100644
--- a/org_apg/res/layout/encrypt.xml
+++ b/org_apg/res/layout/encrypt.xml
@@ -1,5 +1,19 @@
-
+
diff --git a/org_apg/res/layout/help_activity.xml b/org_apg/res/layout/help_activity.xml
new file mode 100644
index 000000000..12ac366d7
--- /dev/null
+++ b/org_apg/res/layout/help_activity.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/org_apg/res/raw/help.html b/org_apg/res/raw/help.html
new file mode 100644
index 000000000..aff1b0179
--- /dev/null
+++ b/org_apg/res/raw/help.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+Beta software
+This is beta software. It contains many remaining bugs!
+APG+
+Android Privacy Guard (APG) is a OpenPGP implementation for Android.
+
APG+ is a fork based on the original APG to introduce more features and a new user interface.
+I found a bug in APG+!
+Please report it in the issue tracker of APG+.
+
+
\ No newline at end of file
diff --git a/org_apg/res/values/strings.xml b/org_apg/res/values/strings.xml
index 4714fe190..724fe5671 100644
--- a/org_apg/res/values/strings.xml
+++ b/org_apg/res/values/strings.xml
@@ -46,7 +46,8 @@
Import from QR Code
Sign Key
About
-
+ Help
+
User IDs
Keys
diff --git a/org_apg/src/org/apg/Id.java b/org_apg/src/org/apg/Id.java
index f64038e48..6b721d3a8 100644
--- a/org_apg/src/org/apg/Id.java
+++ b/org_apg/src/org/apg/Id.java
@@ -47,7 +47,7 @@ public final class Id {
public static final int encrypt = 0x21070013;
public static final int encrypt_to_clipboard = 0x21070014;
public static final int decrypt = 0x21070015;
- public static final int decrypt_to_clipboard = 0x21070016;
+ public static final int reply = 0x21070016;
public static final int cancel = 0x21070017;
public static final int save = 0x21070018;
diff --git a/org_apg/src/org/apg/ui/DecryptActivity.java b/org_apg/src/org/apg/ui/DecryptActivity.java
index 2809a31d5..53df18867 100644
--- a/org_apg/src/org/apg/ui/DecryptActivity.java
+++ b/org_apg/src/org/apg/ui/DecryptActivity.java
@@ -117,13 +117,13 @@ public class DecryptActivity extends BaseActivity {
public boolean onCreateOptionsMenu(Menu menu) {
if (mDecryptEnabled) {
- menu.add(1, Id.menu.option.encrypt_to_clipboard, 0, mDecryptString)
+ menu.add(1, Id.menu.option.decrypt, 0, mDecryptString)
// .setIcon(R.drawable.ic_menu_encrypt)
.setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
if (mReplyEnabled) {
- menu.add(1, Id.menu.option.encrypt, 1, mReplyString)
+ menu.add(1, Id.menu.option.reply, 1, mReplyString)
// .setIcon(R.drawable.ic_menu_decrypt)
.setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
@@ -132,6 +132,26 @@ public class DecryptActivity extends BaseActivity {
return true;
}
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case Id.menu.option.decrypt: {
+ decryptClicked();
+
+ return true;
+ }
+ case Id.menu.option.reply: {
+ replyClicked();
+
+ return true;
+ }
+
+ default: {
+ return super.onOptionsItemSelected(item);
+ }
+ }
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -171,8 +191,6 @@ public class DecryptActivity extends BaseActivity {
mSourceLabel.setOnClickListener(nextSourceClickListener);
mMessage = (EditText) findViewById(R.id.message);
- // mDecryptButton = (Button) findViewById(R.id.btn_decrypt);
- // mReplyButton = (Button) findViewById(R.id.btn_reply);
mSignatureLayout = (LinearLayout) findViewById(R.id.signature);
mSignatureStatusImage = (ImageView) findViewById(R.id.ic_signature_status);
mUserId = (TextView) findViewById(R.id.mainUserId);
@@ -258,6 +276,9 @@ public class DecryptActivity extends BaseActivity {
mMessage.setText(textData);
mDecryptString = getString(R.string.btn_verify);
// mDecryptButton.setText(R.string.btn_verify);
+
+ // build new action bar
+ invalidateOptionsMenu();
} else {
Log.d(Constants.TAG, "Nothing matched!");
}
@@ -305,7 +326,8 @@ public class DecryptActivity extends BaseActivity {
mMessage.setText(data);
mDecryptString = getString(R.string.btn_verify);
- // mDecryptButton.setText(R.string.btn_verify);
+ // build new action bar
+ invalidateOptionsMenu();
}
}
}
@@ -348,21 +370,11 @@ public class DecryptActivity extends BaseActivity {
}
});
- // mDecryptButton.setOnClickListener(new OnClickListener() {
- // public void onClick(View v) {
- // decryptClicked();
- // }
- // });
- //
- // mReplyButton.setOnClickListener(new OnClickListener() {
- // public void onClick(View v) {
- // replyClicked();
- // }
- // });
- // mReplyButton.setVisibility(View.INVISIBLE);
-
mReplyEnabled = false;
+ // build new actionbar
+ invalidateOptionsMenu();
+
if (mReturnResult) {
mSourcePrevious.setClickable(false);
mSourcePrevious.setEnabled(false);
@@ -381,6 +393,7 @@ public class DecryptActivity extends BaseActivity {
if (mSource.getCurrentView().getId() == R.id.sourceMessage
&& (mMessage.getText().length() > 0 || mData != null || mContentUri != null)) {
// mDecryptButton.performClick();
+ // TODO: why was it performClick()???
decryptClicked();
}
}
@@ -416,16 +429,19 @@ public class DecryptActivity extends BaseActivity {
switch (mSource.getCurrentView().getId()) {
case R.id.sourceFile: {
mSourceLabel.setText(R.string.label_file);
- // mDecryptButton.setText(R.string.btn_decrypt);
mDecryptString = getString(R.string.btn_decrypt);
+
+ // build new action bar
+ invalidateOptionsMenu();
break;
}
case R.id.sourceMessage: {
mSourceLabel.setText(R.string.label_message);
- // mDecryptButton.setText(R.string.btn_decrypt);
mDecryptString = getString(R.string.btn_decrypt);
+ // build new action bar
+ invalidateOptionsMenu();
break;
}
@@ -633,9 +649,11 @@ public class DecryptActivity extends BaseActivity {
removeDialog(Id.dialog.decrypting);
mSignatureKeyId = 0;
mSignatureLayout.setVisibility(View.GONE);
- // mReplyButton.setVisibility(View.INVISIBLE);
mReplyEnabled = false;
+ // build new action bar
+ invalidateOptionsMenu();
+
String error = data.getString(Apg.EXTRA_ERROR);
if (error != null) {
Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT)
@@ -657,8 +675,10 @@ public class DecryptActivity extends BaseActivity {
String decryptedMessage = data.getString(Apg.EXTRA_DECRYPTED_MESSAGE);
mMessage.setText(decryptedMessage);
mMessage.setHorizontallyScrolling(false);
- // mReplyButton.setVisibility(View.VISIBLE);
mReplyEnabled = false;
+
+ // build new action bar
+ invalidateOptionsMenu();
break;
}
diff --git a/org_apg/src/org/apg/ui/HelpActivity.java b/org_apg/src/org/apg/ui/HelpActivity.java
new file mode 100644
index 000000000..9a4dc7f76
--- /dev/null
+++ b/org_apg/src/org/apg/ui/HelpActivity.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Dominik Schürmann
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apg.ui;
+
+import org.apg.R;
+import org.apg.util.Utils;
+
+import com.actionbarsherlock.app.ActionBar;
+import com.actionbarsherlock.app.SherlockActivity;
+import com.actionbarsherlock.view.MenuItem;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
+import android.widget.TextView;
+
+public class HelpActivity extends SherlockActivity {
+ Activity mActivity;
+ TextView mHelpText;
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+
+ case android.R.id.home:
+ startActivity(new Intent(this, MainActivity.class));
+ return true;
+
+ default:
+ break;
+
+ }
+ return false;
+ }
+
+ /**
+ * Instantiate View for this Activity
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.help_activity);
+
+ final ActionBar actionBar = getSupportActionBar();
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+
+ mActivity = this;
+
+ mHelpText = (TextView) findViewById(R.id.help_text);
+
+ // load html from html file from /res/raw
+ String helpText = Utils.readContentFromResource(mActivity, R.raw.help);
+
+ // set text from resources with html markup
+ mHelpText.setText(Html.fromHtml(helpText));
+ // make links work
+ mHelpText.setMovementMethod(LinkMovementMethod.getInstance());
+
+ }
+
+}
diff --git a/org_apg/src/org/apg/ui/MainActivity.java b/org_apg/src/org/apg/ui/MainActivity.java
index e096f477a..f19c76ad7 100644
--- a/org_apg/src/org/apg/ui/MainActivity.java
+++ b/org_apg/src/org/apg/ui/MainActivity.java
@@ -46,7 +46,6 @@ public class MainActivity extends BaseActivity {
public void myKeysOnClick(View view) {
startActivity(new Intent(this, SecretKeyListActivity.class));
-
}
public void encryptOnClick(View view) {
@@ -68,7 +67,7 @@ public class MainActivity extends BaseActivity {
}
public void helpOnClick(View view) {
- // TODO: implement help view
+ startActivity(new Intent(this, HelpActivity.class));
}
@Override
diff --git a/org_apg/src/org/apg/util/Utils.java b/org_apg/src/org/apg/util/Utils.java
new file mode 100644
index 000000000..45b18afd1
--- /dev/null
+++ b/org_apg/src/org/apg/util/Utils.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Dominik Schürmann
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apg.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import android.content.Context;
+
+public class Utils {
+
+ /**
+ * Reads html files from /res/raw/example.html to output them as string. See
+ * http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/
+ *
+ * @param context
+ * current context
+ * @param resourceID
+ * of html file to read
+ * @return content of html file with formatting
+ */
+ public static String readContentFromResource(Context context, int resourceID) {
+ InputStream raw = context.getResources().openRawResource(resourceID);
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ int i;
+ try {
+ i = raw.read();
+ while (i != -1) {
+ stream.write(i);
+ i = raw.read();
+ }
+ raw.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return stream.toString();
+ }
+
+}