From ec353b0c390f7b3f45b950171e56c6ddcd0a9607 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Thu, 26 Feb 2015 21:58:25 +0530 Subject: initial Log Display function --- .../keychain/ui/LogDisplayFragment.java | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 2baebc83d..a44274c67 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -23,8 +23,13 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.ListFragment; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.widget.SearchView; import android.util.TypedValue; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -32,12 +37,26 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; +import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogLevel; import org.sufficientlysecure.keychain.operations.results.OperationResult.SubLogEntryParcel; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.KeychainDatabase; +import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.util.ExportHelper; +import org.sufficientlysecure.keychain.util.FileHelper; +import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Preferences; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Iterator; public class LogDisplayFragment extends ListFragment implements OnItemClickListener { @@ -46,6 +65,12 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe OperationResult mResult; public static final String EXTRA_RESULT = "log"; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setHasOptionsMenu(true); + } @Override public void onActivityCreated(Bundle savedInstanceState) { @@ -70,6 +95,83 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe getListView().setFastScrollEnabled(true); getListView().setDividerHeight(0); + + } + + @Override + public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { + Toast.makeText(this.getActivity(),"Options created",Toast.LENGTH_SHORT).show(); + inflater.inflate(R.menu.log_display, menu); + + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch(item.getItemId()) { + case R.id.menu_log_display_export_log: + exportLog(); + break; + } + + return super.onOptionsItemSelected(item); + } + + private void exportLog() { + Toast.makeText(this.getActivity(),"Exporting log",Toast.LENGTH_LONG).show(); + showExportLogDialog(new File(Constants.Path.APP_DIR, "export.log")); + } + + private void writeToLogFile(final OperationResult.OperationLog operationLog, final File f) { + + PrintWriter pw = null; + try { + pw = new PrintWriter(f); + } catch(IOException e) { + e.printStackTrace(); + } + + Iterator logIterator = operationLog.iterator(); + + while(logIterator.hasNext()) { + + pw.println(getPrintableLogEntry(logIterator.next())); + } + + pw.close(); + } + + /** + * returns an indented String of a LogEntryParcel + * @param entry log entry whose String representation is to be obtained + * @return the passed log entry in a readable format + */ + private String getPrintableLogEntry(OperationResult.LogEntryParcel entry) { + String printable = ""; + + return entry.toString(); + } + + private void showExportLogDialog(final File exportFile) { + + String title = this.getString(R.string.title_export_log); + + String message = this.getString(R.string.specify_file_to_export_log_to); + + FileHelper.saveFile(new FileHelper.FileDialogCallback() { + @Override + public void onFileSelected(File file, boolean checked) { + writeToLogFile(getOperationLog(),file); + } + }, this.getActivity().getSupportFragmentManager(), title, message, exportFile, null); + } + + private OperationResult.OperationLog getOperationLog(){ + OperationResult operationResult = this.getActivity().getIntent().getParcelableExtra( + LogDisplayFragment.EXTRA_RESULT); + OperationResult.OperationLog operationResultLog = operationResult.getLog(); + + return operationResultLog; } @Override -- cgit v1.2.3 From d776bd2888907b3bc953f48e9c490afe8275c4e1 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Sat, 28 Feb 2015 01:30:17 +0530 Subject: refined log output --- .../keychain/ui/LogDisplayFragment.java | 75 ++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index ec7eee3ac..94d9a60c9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -147,9 +147,75 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe * @return the passed log entry in a readable format */ private String getPrintableLogEntry(OperationResult.LogEntryParcel entry) { - String printable = ""; + String subLogText=null; + if (entry instanceof SubLogEntryParcel) { + Log.d("ADI DisplayFragment",entry.toString()); + + OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); + LogEntryParcel subEntry = result.getLog().getLast(); + if (subEntry != null) { + String subPadding=""; + for(int i=0;i 0 + && subEntry.mParameters[0] instanceof Integer) { + subLogText+=getResources().getQuantityString(subEntry.mType.getMsgId(), + (Integer) subEntry.mParameters[0], + subEntry.mParameters); + } else { + subLogText+=getResources().getString(subEntry.mType.getMsgId(), + subEntry.mParameters); + } + } + + } else { + Log.d("ADIExportLogDisplayFragment","NOTSUBLOG:"+entry.toString()); + } + + String logText = ""; + switch (entry.mType.mLevel) { + case DEBUG: logText="[DEBUG]"; break; + case INFO: logText="[INFO]"; break; + case WARN: logText="[WARN]"; break; + case ERROR: logText="[WARN]"; break; + case START: logText="[START]"; break; + case OK: logText="[OK]"; break; + case CANCELLED: logText="[CANCELLED]"; break; + } - return entry.toString(); + // special case: first parameter may be a quantity + if (entry.mParameters != null && entry.mParameters.length > 0 + && entry.mParameters[0] instanceof Integer) { + logText += getResources().getQuantityString(entry.mType.getMsgId(), + (Integer) entry.mParameters[0], + entry.mParameters); + } else { + logText += getResources().getString(entry.mType.getMsgId(), + entry.mParameters); + } + + String padding = ""; + for(int i =0;i Date: Sat, 28 Feb 2015 02:11:39 +0530 Subject: cleaned up log export --- .../keychain/ui/LogDisplayFragment.java | 29 +++++++--------------- 1 file changed, 9 insertions(+), 20 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 94d9a60c9..997b977ff 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -118,7 +118,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe } private void exportLog() { - Toast.makeText(this.getActivity(),"Exporting log",Toast.LENGTH_LONG).show(); + showExportLogDialog(new File(Constants.Path.APP_DIR, "export.log")); } @@ -149,7 +149,6 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe private String getPrintableLogEntry(OperationResult.LogEntryParcel entry) { String subLogText=null; if (entry instanceof SubLogEntryParcel) { - Log.d("ADI DisplayFragment",entry.toString()); OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); LogEntryParcel subEntry = result.getLog().getLast(); @@ -158,7 +157,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe for(int i=0;i parent, View view, int position, long id) { LogEntryParcel parcel = mAdapter.getItem(position); @@ -300,7 +291,6 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe if (entry instanceof SubLogEntryParcel) { ih.mSub.setVisibility(View.VISIBLE); convertView.setClickable(false); - Log.d("ADI DisplayFragment",entry.toString()); convertView.setPadding((entry.mIndent) * dipFactor, 0, 0, 0); OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); @@ -332,7 +322,6 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe } } else { - Log.d("ADI DisplayFragment","NOT:"+entry.toString()); ih.mSub.setVisibility(View.GONE); ih.mSecond.setVisibility(View.GONE); convertView.setClickable(true); -- cgit v1.2.3 From 95e9e2ac30407722ac08fff055ac9839babbffc4 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Sun, 1 Mar 2015 02:02:39 +0530 Subject: added logging, notify for log export --- .../operations/results/OperationResult.java | 7 +++ .../keychain/ui/LogDisplayFragment.java | 72 ++++++++++++++++------ 2 files changed, 59 insertions(+), 20 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index f79900aab..aef61075f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -707,6 +707,13 @@ public abstract class OperationResult implements Parcelable { MSG_DEL_CONSOLIDATE (LogLevel.DEBUG, R.string.msg_del_consolidate), MSG_DEL_OK (LogLevel.OK, R.plurals.msg_del_ok), MSG_DEL_FAIL (LogLevel.WARN, R.plurals.msg_del_fail), + + //export log + MSG_EXPORT_LOG(LogLevel.START,R.string.msg_export_log_start), + MSG_EXPORT_LOG_EXPORT_ERROR_NO_FILE(LogLevel.ERROR,R.string.msg_export_log_error_no_file), + MSG_EXPORT_LOG_EXPORT_ERROR_FOPEN(LogLevel.ERROR,R.string.msg_export_log_error_fopen), + MSG_EXPORT_LOG_EXPORT_ERROR_WRITING(LogLevel.ERROR,R.string.msg_export_log_error_writing), + MSG_EXPORT_LOG_EXPORT_SUCCESS (LogLevel.OK, R.string.msg_export_log_success), ; public final int mMsgId; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 997b977ff..bd77294c1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -22,9 +22,8 @@ import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.os.Parcel; import android.support.v4.app.ListFragment; -import android.support.v4.view.MenuItemCompat; -import android.support.v7.widget.SearchView; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; @@ -37,7 +36,6 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -45,16 +43,11 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogLevel; import org.sufficientlysecure.keychain.operations.results.OperationResult.SubLogEntryParcel; -import org.sufficientlysecure.keychain.provider.KeychainContract; -import org.sufficientlysecure.keychain.provider.KeychainDatabase; -import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.util.ExportHelper; import org.sufficientlysecure.keychain.util.FileHelper; import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.Preferences; import java.io.File; -import java.io.IOException; +import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Iterator; @@ -100,7 +93,6 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { - Toast.makeText(this.getActivity(),"Options created",Toast.LENGTH_SHORT).show(); inflater.inflate(R.menu.log_display, menu); super.onCreateOptionsMenu(menu, inflater); @@ -123,24 +115,64 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe } private void writeToLogFile(final OperationResult.OperationLog operationLog, final File f) { + OperationResult.OperationLog currLog = new OperationResult.OperationLog(); + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG,0); + + boolean error = false; PrintWriter pw = null; - try { - pw = new PrintWriter(f); - } catch(IOException e) { - e.printStackTrace(); - } Iterator logIterator = operationLog.iterator(); + try { + pw = new PrintWriter(f); - while(logIterator.hasNext()) { + while(logIterator.hasNext()) { - pw.println(getPrintableLogEntry(logIterator.next())); + pw.println(getPrintableLogEntry(logIterator.next())); + if(pw.checkError()) {//IOException + Log.e(Constants.TAG, "Log Export I/O Exception "+f.getAbsolutePath()); + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING,1); + error = true; + break; + } + } + } catch(FileNotFoundException e) { + Log.e(Constants.TAG, "File not found for exporting log "+f.getAbsolutePath()); + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_FOPEN, 1); + error = true; } + if(pw!=null) { + pw.close(); + error = error && pw.checkError();//check for errors on closing PrintWriter object too + } + + if(!error) currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_SUCCESS,1); - pw.close(); + int opResultCode = error?OperationResult.RESULT_ERROR:OperationResult.RESULT_OK; + OperationResult opResult = new LogExportResult(opResultCode,currLog); + opResult.createNotify(getActivity()).show(); } + private static class LogExportResult extends OperationResult { + public LogExportResult(int result, OperationLog log) { + super(result, log); + } + + /** trivial but necessary to implement the Parcelable protocol. */ + public LogExportResult(Parcel source) { + super(source); + } + + public static Creator CREATOR = new Creator() { + public LogExportResult createFromParcel(final Parcel source) { + return new LogExportResult(source); + } + + public LogExportResult[] newArray(final int size) { + return new LogExportResult[size]; + } + }; + } /** * returns an indented String of a LogEntryParcel * @param entry log entry whose String representation is to be obtained @@ -162,7 +194,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe case DEBUG: subLogText+="[DEBUG]"; break; case INFO: subLogText+="[INFO]"; break; case WARN: subLogText+="[WARN]"; break; - case ERROR: subLogText+="[WARN]"; break; + case ERROR: subLogText+="[ERROR]"; break; case START: subLogText+="[START]"; break; case OK: subLogText+="[OK]"; break; case CANCELLED: subLogText+="[CANCELLED]"; break; @@ -192,7 +224,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe case DEBUG: logText="[DEBUG]"; break; case INFO: logText="[INFO]"; break; case WARN: logText="[WARN]"; break; - case ERROR: logText="[WARN]"; break; + case ERROR: logText="[ERROR]"; break; case START: logText="[START]"; break; case OK: logText="[OK]"; break; case CANCELLED: logText="[CANCELLED]"; break; -- cgit v1.2.3 From e69ee812d2a73ef6d4a1c2df3e180bb61fa050e3 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Sun, 1 Mar 2015 11:31:46 +0530 Subject: supports sub logs in log export --- .../keychain/ui/LogDisplayFragment.java | 123 +++++++++------------ 1 file changed, 55 insertions(+), 68 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index bd77294c1..ad5f9d53c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -121,21 +121,14 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe boolean error = false; PrintWriter pw = null; - - Iterator logIterator = operationLog.iterator(); try { pw = new PrintWriter(f); - - while(logIterator.hasNext()) { - - pw.println(getPrintableLogEntry(logIterator.next())); + pw.print(getPrintableOperationLog(operationLog,"")); if(pw.checkError()) {//IOException Log.e(Constants.TAG, "Log Export I/O Exception "+f.getAbsolutePath()); currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING,1); error = true; - break; } - } } catch(FileNotFoundException e) { Log.e(Constants.TAG, "File not found for exporting log "+f.getAbsolutePath()); currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_FOPEN, 1); @@ -143,7 +136,10 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe } if(pw!=null) { pw.close(); - error = error && pw.checkError();//check for errors on closing PrintWriter object too + if(!error && pw.checkError()) {//check if it is only pw.close() which generated error + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING,1); + error = true; + } } if(!error) currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_SUCCESS,1); @@ -173,78 +169,69 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe } }; } + /** - * returns an indented String of a LogEntryParcel - * @param entry log entry whose String representation is to be obtained - * @return the passed log entry in a readable format + * returns an indented String of an entire OperationLog + * @param operationLog log to be converted to indented, printable format + * @param basePadding padding to add at the start of all log entries, made for use with SubLogs + * @return printable, indented version of passed operationLog */ - private String getPrintableLogEntry(OperationResult.LogEntryParcel entry) { - String subLogText=null; - if (entry instanceof SubLogEntryParcel) { - - OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); - LogEntryParcel subEntry = result.getLog().getLast(); - if (subEntry != null) { - String subPadding=""; - for(int i=0;i 0 - && subEntry.mParameters[0] instanceof Integer) { - subLogText+=getResources().getQuantityString(subEntry.mType.getMsgId(), - (Integer) subEntry.mParameters[0], - subEntry.mParameters); - } else { - subLogText+=getResources().getString(subEntry.mType.getMsgId(), - subEntry.mParameters); - } - } - + private String getPrintableOperationLog(OperationResult.OperationLog operationLog, String basePadding) { + String log = ""; + Iterator logIterator = operationLog.iterator(); + while(logIterator.hasNext()) { + log += getPrintableLogEntry(logIterator.next(), basePadding)+"\n"; } + log = log.substring(0,log.length()-1);//gets rid of extra new line + return log; + } + /** + * returns an indented String of a LogEntryParcel including any sub-logs it may contain + * @param entryParcel log entryParcel whose String representation is to be obtained + * @return indented version of passed log entryParcel in a readable format + */ + private String getPrintableLogEntry(OperationResult.LogEntryParcel entryParcel, + String basePadding) { String logText = ""; + final String indent = " ";//4 spaces = 1 Indent level - String padding = ""; - for(int i =0;i 0 - && entry.mParameters[0] instanceof Integer) { - logText += getResources().getQuantityString(entry.mType.getMsgId(), - (Integer) entry.mParameters[0], - entry.mParameters); + if (entryParcel.mParameters != null && entryParcel.mParameters.length > 0 + && entryParcel.mParameters[0] instanceof Integer) { + logText += getResources().getQuantityString(entryParcel.mType.getMsgId(), + (Integer) entryParcel.mParameters[0], + entryParcel.mParameters); } else { - logText += getResources().getString(entry.mType.getMsgId(), - entry.mParameters); + logText += getResources().getString(entryParcel.mType.getMsgId(), + entryParcel.mParameters); } - logText = padding + logText; + if (entryParcel instanceof SubLogEntryParcel) { - if(subLogText!=null) //subLog exists - logText = logText+"\n"+padding+subLogText; + OperationResult subResult = ((SubLogEntryParcel) entryParcel).getSubResult(); + LogEntryParcel subEntry = subResult.getLog().getLast(); + if (subEntry != null) { + //the first line of log of subResult is same as entryParcel, so replace logText + logText = getPrintableOperationLog(subResult.getLog(),padding); + } + } return logText; } @@ -300,7 +287,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe mSecondImg = secondImg; } } - //adithyaphilip: Check if convertView.setPadding is redundant + // Check if convertView.setPadding is redundant @Override public View getView(int position, View convertView, ViewGroup parent) { LogEntryParcel entry = getItem(position); -- cgit v1.2.3 From 7e4c39c79d1adb58f3181c9674309b1faaecc864 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 2 Mar 2015 18:44:09 +0100 Subject: rescale qr code bitmap in background --- .../org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 0be6c26f6..83e928ec6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -633,16 +633,15 @@ public class ViewKeyActivity extends BaseActivity implements protected Bitmap doInBackground(Void... unused) { String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint; // render with minimal size - return QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0); + Bitmap qrCode = QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0); + // scale the image up to our actual size. we do this in code rather + // than let the ImageView do this because we don't require filtering. + return Bitmap.createScaledBitmap(qrCode, mQrCode.getHeight(), + mQrCode.getHeight(), false); } protected void onPostExecute(Bitmap qrCode) { - // scale the image up to our actual size. we do this in code rather - // than let the ImageView do this because we don't require filtering. - Bitmap scaled = Bitmap.createScaledBitmap(qrCode, - mQrCode.getHeight(), mQrCode.getHeight(), - false); - mQrCode.setImageBitmap(scaled); + mQrCode.setImageBitmap(qrCode); // simple fade-in animation AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); -- cgit v1.2.3 From 363d41ed1d4910fa5b8651d3bd95d1c61bc0352c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 00:26:15 +0100 Subject: Cleanup of contact sync, debugging --- .../keychain/KeychainApplication.java | 30 ++-- .../keychain/util/ContactHelper.java | 190 ++++++++++++--------- 2 files changed, 126 insertions(+), 94 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 01f6735ea..a4dc12a37 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -140,20 +140,22 @@ public class KeychainApplication extends Application { } static void brandGlowEffect(Context context, int brandColor) { - try { - // terrible hack to brand the edge overscroll glow effect - // https://gist.github.com/menny/7878762#file-brandgloweffect_full-java - - //glow - int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android"); - Drawable androidGlow = context.getResources().getDrawable(glowDrawableId); - androidGlow.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); - //edge - int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android"); - Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId); - androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); - } catch (Resources.NotFoundException e) { - // no hack on Android 5 + // no hack on Android 5 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + try { + // terrible hack to brand the edge overscroll glow effect + // https://gist.github.com/menny/7878762#file-brandgloweffect_full-java + + //glow + int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android"); + Drawable androidGlow = context.getResources().getDrawable(glowDrawableId); + androidGlow.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); + //edge + int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android"); + Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId); + androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); + } catch (Resources.NotFoundException e) { + } } } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 3cf201ed7..28480cee5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -20,15 +20,18 @@ package org.sufficientlysecure.keychain.util; import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.TargetApi; +import android.content.ContentProviderClient; import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentUris; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; +import android.os.RemoteException; import android.provider.ContactsContract; import android.util.Patterns; @@ -125,33 +128,33 @@ public class ContactHelper { * @return */ private static Set getContactNamesFromEmails(Context context, Set emails) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - Set names = new HashSet<>(); - for (String email : emails) { - ContentResolver resolver = context.getContentResolver(); - Cursor profileCursor = resolver.query( - ContactsContract.CommonDataKinds.Email.CONTENT_URI, - new String[]{ContactsContract.CommonDataKinds.Email.ADDRESS, - ContactsContract.Contacts.DISPLAY_NAME}, - ContactsContract.CommonDataKinds.Email.ADDRESS + "=?", - new String[]{email}, null - ); - if (profileCursor == null) return null; - - Set currNames = new HashSet<>(); - while (profileCursor.moveToNext()) { - String name = profileCursor.getString(1); - if (name != null) { - currNames.add(name); - } + Set names = new HashSet<>(); + for (String email : emails) { + ContentResolver resolver = context.getContentResolver(); + Cursor profileCursor = resolver.query( + ContactsContract.CommonDataKinds.Email.CONTENT_URI, + new String[]{ + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.Contacts.DISPLAY_NAME + }, + ContactsContract.CommonDataKinds.Email.ADDRESS + "=?", + new String[]{email}, null + ); + if (profileCursor == null) { + return null; + } + + Set currNames = new HashSet<>(); + while (profileCursor.moveToNext()) { + String name = profileCursor.getString(1); + if (name != null) { + currNames.add(name); } - profileCursor.close(); - names.addAll(currNames); } - return names; - } else { - return new HashSet<>(); + profileCursor.close(); + names.addAll(currNames); } + return names; } /** @@ -162,38 +165,37 @@ public class ContactHelper { * @return */ private static Set getMainProfileContactEmails(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - ContentResolver resolver = context.getContentResolver(); - Cursor profileCursor = resolver.query( - Uri.withAppendedPath( - ContactsContract.Profile.CONTENT_URI, - ContactsContract.Contacts.Data.CONTENT_DIRECTORY), - new String[]{ContactsContract.CommonDataKinds.Email.ADDRESS, - ContactsContract.CommonDataKinds.Email.IS_PRIMARY}, - - // Selects only email addresses - ContactsContract.Contacts.Data.MIMETYPE + "=?", - new String[]{ - ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, - }, - // Show primary rows first. Note that there won't be a primary email address if the - // user hasn't specified one. - ContactsContract.Contacts.Data.IS_PRIMARY + " DESC" - ); - if (profileCursor == null) return null; + ContentResolver resolver = context.getContentResolver(); + Cursor profileCursor = resolver.query( + Uri.withAppendedPath( + ContactsContract.Profile.CONTENT_URI, + ContactsContract.Contacts.Data.CONTENT_DIRECTORY), + new String[]{ + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.CommonDataKinds.Email.IS_PRIMARY + }, + // Selects only email addresses + ContactsContract.Contacts.Data.MIMETYPE + "=?", + new String[]{ + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, + }, + // Show primary rows first. Note that there won't be a primary email address if the + // user hasn't specified one. + ContactsContract.Contacts.Data.IS_PRIMARY + " DESC" + ); + if (profileCursor == null) { + return null; + } - Set emails = new HashSet<>(); - while (profileCursor.moveToNext()) { - String email = profileCursor.getString(0); - if (email != null) { - emails.add(email); - } + Set emails = new HashSet<>(); + while (profileCursor.moveToNext()) { + String email = profileCursor.getString(0); + if (email != null) { + emails.add(email); } - profileCursor.close(); - return emails; - } else { - return new HashSet<>(); } + profileCursor.close(); + return emails; } /** @@ -204,26 +206,27 @@ public class ContactHelper { * @return */ private static List getMainProfileContactName(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - ContentResolver resolver = context.getContentResolver(); - Cursor profileCursor = resolver.query(ContactsContract.Profile.CONTENT_URI, - new String[]{ContactsContract.Profile.DISPLAY_NAME}, - null, null, null); - if (profileCursor == null) return null; + ContentResolver resolver = context.getContentResolver(); + Cursor profileCursor = resolver.query( + ContactsContract.Profile.CONTENT_URI, + new String[]{ + ContactsContract.Profile.DISPLAY_NAME + }, + null, null, null); + if (profileCursor == null) { + return null; + } - Set names = new HashSet<>(); - // should only contain one entry! - while (profileCursor.moveToNext()) { - String name = profileCursor.getString(0); - if (name != null) { - names.add(name); - } + Set names = new HashSet<>(); + // should only contain one entry! + while (profileCursor.moveToNext()) { + String name = profileCursor.getString(0); + if (name != null) { + names.add(name); } - profileCursor.close(); - return new ArrayList<>(names); - } else { - return new ArrayList<>(); } + profileCursor.close(); + return new ArrayList<>(names); } public static List getContactMails(Context context) { @@ -231,7 +234,9 @@ public class ContactHelper { Cursor mailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Email.DATA}, null, null, null); - if (mailCursor == null) return new ArrayList<>(); + if (mailCursor == null) { + return new ArrayList<>(); + } Set mails = new HashSet<>(); while (mailCursor.moveToNext()) { @@ -249,7 +254,9 @@ public class ContactHelper { Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts.DISPLAY_NAME}, null, null, null); - if (cursor == null) return new ArrayList<>(); + if (cursor == null) { + return new ArrayList<>(); + } Set names = new HashSet<>(); while (cursor.moveToNext()) { @@ -276,7 +283,9 @@ public class ContactHelper { } public static Bitmap photoFromFingerprint(ContentResolver contentResolver, String fingerprint) { - if (fingerprint == null) return null; + if (fingerprint == null) { + return null; + } if (!photoCache.containsKey(fingerprint)) { photoCache.put(fingerprint, loadPhotoFromFingerprint(contentResolver, fingerprint)); } @@ -287,12 +296,16 @@ public class ContactHelper { if (fingerprint == null) return null; try { int rawContactId = findRawContactId(contentResolver, fingerprint); - if (rawContactId == -1) return null; + if (rawContactId == -1) { + return null; + } Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); Uri contactUri = ContactsContract.RawContacts.getContactLookupUri(contentResolver, rawContactUri); InputStream photoInputStream = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, contactUri); - if (photoInputStream == null) return null; + if (photoInputStream == null) { + return null; + } return BitmapFactory.decodeStream(photoInputStream); } catch (Throwable ignored) { return null; @@ -304,7 +317,19 @@ public class ContactHelper { */ public static void writeKeysToContacts(Context context) { ContentResolver resolver = context.getContentResolver(); - Set contactFingerprints = getRawContactFingerprints(resolver); + Set deletedKeys = getRawContactFingerprints(resolver); + +// ContentProviderClient client = resolver.acquireContentProviderClient(ContactsContract.AUTHORITY_URI); +// ContentValues values = new ContentValues(); +// Account account = new Account(Constants.ACCOUNT_NAME, Constants.ACCOUNT_TYPE); +// values.put(ContactsContract.Settings.ACCOUNT_NAME, account.name); +// values.put(ContactsContract.Settings.ACCOUNT_TYPE, account.type); +// values.put(ContactsContract.Settings.UNGROUPED_VISIBLE, true); +// try { +// client.insert(ContactsContract.Settings.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), values); +// } catch (RemoteException e) { +// e.printStackTrace(); +// } // Load all Keys from OK Cursor cursor = resolver.query(KeychainContract.KeyRings.buildUnifiedKeyRingsUri(), KEYS_TO_CONTACT_PROJECTION, @@ -313,7 +338,10 @@ public class ContactHelper { while (cursor.moveToNext()) { String[] primaryUserId = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID)); String fingerprint = KeyFormattingUtils.convertFingerprintToHex(cursor.getBlob(INDEX_FINGERPRINT)); - contactFingerprints.remove(fingerprint); + deletedKeys.remove(fingerprint); + + Log.d(Constants.TAG, "fingerprint: " + fingerprint); + String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_KEY_ID)); long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); boolean isExpired = !cursor.isNull(INDEX_EXPIRY) @@ -322,10 +350,11 @@ public class ContactHelper { int rawContactId = findRawContactId(resolver, fingerprint); ArrayList ops = new ArrayList<>(); - Log.d(Constants.TAG, "raw contact id: "+rawContactId); + Log.d(Constants.TAG, "raw contact id: " + rawContactId); // Do not store expired or revoked keys in contact db - and remove them if they already exist if (isExpired || isRevoked) { + Log.d(Constants.TAG, "Expired or revoked: Deleting " + rawContactId); if (rawContactId != -1) { resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ID_SELECTION, new String[]{Integer.toString(rawContactId)}); @@ -334,6 +363,8 @@ public class ContactHelper { // Create a new rawcontact with corresponding key if it does not exist yet if (rawContactId == -1) { + Log.d(Constants.TAG, "Insert new raw contact with fingerprint " + fingerprint); + insertContact(ops, context, fingerprint); writeContactKey(ops, context, rawContactId, masterKeyId, keyIdShort); } @@ -353,11 +384,10 @@ public class ContactHelper { } // Delete fingerprints that are no longer present in OK - for (String fingerprint : contactFingerprints) { + for (String fingerprint : deletedKeys) { resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ACCOUNT_TYPE_AND_SOURCE_ID_SELECTION, new String[]{Constants.ACCOUNT_TYPE, fingerprint}); } - } /** -- cgit v1.2.3 From d3f54d3ace1cc4d81a89df5b3c48a2af959b5119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 00:26:36 +0100 Subject: Revert "rescale qr code bitmap in background" size of view may not be available in background thread. This reverts commit 7e4c39c79d1adb58f3181c9674309b1faaecc864. --- .../org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 83e928ec6..0be6c26f6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -633,15 +633,16 @@ public class ViewKeyActivity extends BaseActivity implements protected Bitmap doInBackground(Void... unused) { String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint; // render with minimal size - Bitmap qrCode = QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0); - // scale the image up to our actual size. we do this in code rather - // than let the ImageView do this because we don't require filtering. - return Bitmap.createScaledBitmap(qrCode, mQrCode.getHeight(), - mQrCode.getHeight(), false); + return QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0); } protected void onPostExecute(Bitmap qrCode) { - mQrCode.setImageBitmap(qrCode); + // scale the image up to our actual size. we do this in code rather + // than let the ImageView do this because we don't require filtering. + Bitmap scaled = Bitmap.createScaledBitmap(qrCode, + mQrCode.getHeight(), mQrCode.getHeight(), + false); + mQrCode.setImageBitmap(scaled); // simple fade-in animation AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); -- cgit v1.2.3 From 73a1ceb7323f951e92cdb5ce577689adf880d799 Mon Sep 17 00:00:00 2001 From: Morgan Gangwere Date: Tue, 3 Mar 2015 00:51:44 -0700 Subject: Fix root cause of #1077 When importing lots of keys, lots of messages about the status of keys is generated, including some debug slime and general fluff that isn't really needed a lot of the time. As a result, a serious bug can come along after key imports or certain operations which cause a log to become parceled. This commit implements a pool to "dehydrate" logs into: they are placed into the pool (a ConcurrentHashMap) and a UUID assigned to them, which is parceled along. When the OperationResult is un-parceled, it reads in the appropriate UUID bits and rehydrates the appropriate log. In order to avoid any memory leaks, the log pool removes a reference to the log itself, allowing the log to die a natural death at the hands of the GC.. --- .../operations/results/OperationResult.java | 76 ++++++++++++++++++++-- 1 file changed, 70 insertions(+), 6 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index f79900aab..02379e917 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -38,6 +38,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; /** Represent the result of an operation. * @@ -52,6 +54,63 @@ public abstract class OperationResult implements Parcelable { public static final String EXTRA_RESULT = "operation_result"; + + /** + * A HashMap of UUID:OperationLog which contains logs that we don't need + * to care about. This is used such that when we become parceled, we are + * well below the 1Mbit boundary that is specified. + */ + private static ConcurrentHashMap dehydratedLogs; + static { + // Static initializer for ConcurrentHashMap + dehydratedLogs = new ConcurrentHashMap(); + } + + /** + * Dehydrate a log (such that it is available after deparcelization) + * + * Returns the NULL uuid (0) if you hand it null. + * @param log An OperationLog to dehydrate + * @return a UUID, the ticket for your dehydrated log + * + */ + private static UUID dehydrateLog(OperationLog log) { + if(log == null) { + return new UUID(0,0); + } + else { + UUID ticket = UUID.randomUUID(); + dehydratedLogs.put(ticket, log); + return ticket; + } + } + + /*** + * Rehydrate a log after going through parcelization, invalidating its place in the + * dehydration pool. + * This is used such that when parcelized, the parcel is no larger than 1mbit. + * @param ticket A UUID ticket that identifies the log in question. + * @return An OperationLog. + */ + private static OperationLog rehydrateLog(UUID ticket) { + if(ticket.getMostSignificantBits() == 0 && ticket.getLeastSignificantBits() == 0) { + return null; + } + else + { + OperationLog log = dehydratedLogs.get(ticket); + invalidateDehydrateTicket(ticket); + return log; + } + } + private static void invalidateDehydrateTicket(UUID ticket) { + if(ticket.getLeastSignificantBits() != 0 && ticket.getMostSignificantBits() != 0 + && dehydratedLogs.containsKey(ticket)) + { + dehydratedLogs.remove(ticket); + } + } + /** Holds the overall result, the number specifying varying degrees of success: * - The first bit is 0 on overall success, 1 on overall failure * - The second bit indicates if the action was cancelled - may still be an error or success! @@ -65,7 +124,7 @@ public abstract class OperationResult implements Parcelable { public static final int RESULT_WARNINGS = 4; /// A list of log entries tied to the operation result. - final OperationLog mLog; + protected OperationLog mLog; public OperationResult(int result, OperationLog log) { mResult = result; @@ -74,8 +133,11 @@ public abstract class OperationResult implements Parcelable { public OperationResult(Parcel source) { mResult = source.readInt(); - mLog = new OperationLog(); - mLog.addAll(source.createTypedArrayList(LogEntryParcel.CREATOR)); + long mostSig = source.readLong(); + long leastSig = source.readLong(); + UUID mTicket = new UUID(mostSig, leastSig); + // fetch the dehydrated log out of storage (this removes it from the dehydration pool) + mLog = rehydrateLog(mTicket); } public int getResult() { @@ -739,9 +801,11 @@ public abstract class OperationResult implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mResult); - if (mLog != null) { - dest.writeTypedList(mLog.toList()); - } + // Get a ticket for our log. + UUID mTicket = dehydrateLog(mLog); + // And write out the UUID most and least significant bits. + dest.writeLong(mTicket.getMostSignificantBits()); + dest.writeLong(mTicket.getLeastSignificantBits()); } public static class OperationLog implements Iterable { -- cgit v1.2.3 From 06d76ccd0cdf510196a2f52efc7abd3b2b127b3c Mon Sep 17 00:00:00 2001 From: Ishan Khanna Date: Tue, 3 Mar 2015 14:46:28 +0530 Subject: Fixes Issue #1081 The App crashed because the Adapter was trying to call a method on a null object. Where was the null object? CheckBox was null because in the Layout file view_key_adv_user_id_item.xml There is no such widget with id = user_id_item_check_box Fix : I removed the two lines which were causing the bug, and now the screen loads perfectly. --- .../sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java | 3 --- 1 file changed, 3 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java index 01218a4e4..970855c77 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java @@ -24,7 +24,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.CheckBox; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; @@ -73,10 +72,8 @@ public class UserIdsAddedAdapter extends ArrayAdapter { holder.vDelete.setVisibility(View.VISIBLE); // always visible // not used: - CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.user_id_item_check_box); View certifiedLayout = convertView.findViewById(R.id.user_id_item_certified_layout); ImageView editImage = (ImageView) convertView.findViewById(R.id.user_id_item_edit_image); - checkBox.setVisibility(View.GONE); certifiedLayout.setVisibility(View.GONE); editImage.setVisibility(View.GONE); -- cgit v1.2.3 From 2ea0f609f29bf8458fd4f5b5170caad8fc0525cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 13:16:56 +0100 Subject: Remove old min sdk check --- .../keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java index f46e253c0..fc618c9eb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java @@ -151,9 +151,7 @@ public class EditSubkeyExpiryDialogFragment extends DialogFragment { ); } - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { - datePicker.setMinDate(creationCal.getTime().getTime()); - } + datePicker.setMinDate(creationCal.getTime().getTime()); alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override -- cgit v1.2.3 From ba5eb3543e9ba8ad90c1cc3a84e8aacf651ec604 Mon Sep 17 00:00:00 2001 From: Morgan Gangwere Date: Tue, 3 Mar 2015 08:47:16 -0700 Subject: Cleanup for style Some nitpicks were had. Also, change the null UUID to a constant. --- .../keychain/operations/results/OperationResult.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index 02379e917..519efcd62 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -53,7 +53,7 @@ import java.util.concurrent.ConcurrentHashMap; public abstract class OperationResult implements Parcelable { public static final String EXTRA_RESULT = "operation_result"; - + public static final UUID NULL_UUID = new UUID(0,0); /** * A HashMap of UUID:OperationLog which contains logs that we don't need @@ -76,7 +76,7 @@ public abstract class OperationResult implements Parcelable { */ private static UUID dehydrateLog(OperationLog log) { if(log == null) { - return new UUID(0,0); + return NULL_UUID; } else { UUID ticket = UUID.randomUUID(); @@ -93,21 +93,14 @@ public abstract class OperationResult implements Parcelable { * @return An OperationLog. */ private static OperationLog rehydrateLog(UUID ticket) { - if(ticket.getMostSignificantBits() == 0 && ticket.getLeastSignificantBits() == 0) { + // UUID.equals isn't well documented; we use compareTo instead. + if( NULL_UUID.compareTo(ticket) == 0 ) { return null; } - else - { + else { OperationLog log = dehydratedLogs.get(ticket); - invalidateDehydrateTicket(ticket); - return log; - } - } - private static void invalidateDehydrateTicket(UUID ticket) { - if(ticket.getLeastSignificantBits() != 0 && ticket.getMostSignificantBits() != 0 - && dehydratedLogs.containsKey(ticket)) - { dehydratedLogs.remove(ticket); + return log; } } -- cgit v1.2.3 From f1950551076866d800754ba1a2f66b0975d41f85 Mon Sep 17 00:00:00 2001 From: jiangkai Date: Tue, 3 Mar 2015 12:19:00 -0800 Subject: icon name changes in UI files --- .../main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java | 2 +- .../org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index 8723c7255..846acb9cb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -176,7 +176,7 @@ public abstract class DecryptFragment extends Fragment { setSignatureLayoutVisibility(View.VISIBLE); mSignatureAction.setText(R.string.decrypt_result_action_Lookup); - mSignatureAction.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_action_download, 0); + mSignatureAction.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_file_download_grey_24dp, 0); mSignatureLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java index afec3bf06..6f19d1de9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java @@ -136,7 +136,7 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T mSearchView.setId(SEARCH_ID); mSearchView.setHint(R.string.menu_search); mSearchView.setCompoundDrawablesWithIntrinsicBounds( - getResources().getDrawable(R.drawable.ic_action_search), null, null, null); + getResources().getDrawable(R.drawable.ic_search_grey_24dp), null, null, null); linearLayout.addView(mSearchView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); -- cgit v1.2.3 From 188559bbcd5d4a9c5aac00ab6e20deb4e52988d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 22:27:14 +0100 Subject: Prettify passphrase dialog, it no longer resizes on unlocking the key --- .../keychain/ui/PassphraseDialogActivity.java | 49 +++++++++++----------- 1 file changed, 25 insertions(+), 24 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java index d5ca08936..18d574956 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java @@ -149,6 +149,7 @@ public class PassphraseDialogActivity extends FragmentActivity { public static class PassphraseDialogFragment extends DialogFragment implements TextView.OnEditorActionListener { private EditText mPassphraseEditText; + private TextView mPassphraseText; private View mInput, mProgress; private CanonicalizedSecretKeyRing mSecretRing = null; @@ -167,7 +168,7 @@ public class PassphraseDialogActivity extends FragmentActivity { // if the dialog is displayed from the application class, design is missing // hack to get holo design (which is not automatically applied due to activity's Theme.NoDisplay ContextThemeWrapper theme = new ContextThemeWrapper(activity, - R.style.Theme_AppCompat_Light); + R.style.Theme_AppCompat_Light_Dialog); mSubKeyId = getArguments().getLong(EXTRA_SUBKEY_ID); mServiceIntent = getArguments().getParcelable(EXTRA_DATA); @@ -176,13 +177,30 @@ public class PassphraseDialogActivity extends FragmentActivity { alert.setTitle(R.string.title_unlock); + LayoutInflater inflater = LayoutInflater.from(theme); + View view = inflater.inflate(R.layout.passphrase_dialog, null); + alert.setView(view); + + mPassphraseText = (TextView) view.findViewById(R.id.passphrase_text); + mPassphraseEditText = (EditText) view.findViewById(R.id.passphrase_passphrase); + mInput = view.findViewById(R.id.input); + mProgress = view.findViewById(R.id.progress); + + alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + String userId; CanonicalizedSecretKey.SecretKeyType keyType = CanonicalizedSecretKey.SecretKeyType.PASSPHRASE; + String message; if (mSubKeyId == Constants.key.symmetric || mSubKeyId == Constants.key.none) { - alert.setMessage(R.string.passphrase_for_symmetric_encryption); + message = getString(R.string.passphrase_for_symmetric_encryption); } else { - String message; try { ProviderHelper helper = new ProviderHelper(activity); mSecretRing = helper.getCanonicalizedSecretKeyRing( @@ -228,33 +246,16 @@ public class PassphraseDialogActivity extends FragmentActivity { alert.setCancelable(false); return alert.create(); } - - alert.setMessage(message); } - LayoutInflater inflater = LayoutInflater.from(theme); - View view = inflater.inflate(R.layout.passphrase_dialog, null); - alert.setView(view); - - mPassphraseEditText = (EditText) view.findViewById(R.id.passphrase_passphrase); - mInput = view.findViewById(R.id.input); - mProgress = view.findViewById(R.id.progress); - - alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - + mPassphraseText.setText(message); if (keyType == CanonicalizedSecretKey.SecretKeyType.PATTERN) { // start pattern dialog and show progress circle here... // Intent patternActivity = new Intent(getActivity(), LockPatternActivity.class); // patternActivity.putExtra(LockPatternActivity.EXTRA_PATTERN, "123"); // startActivityForResult(patternActivity, REQUEST_CODE_ENTER_PATTERN); - mInput.setVisibility(View.GONE); + mInput.setVisibility(View.INVISIBLE); mProgress.setVisibility(View.VISIBLE); } else { // Hack to open keyboard. @@ -322,7 +323,7 @@ public class PassphraseDialogActivity extends FragmentActivity { return; } - mInput.setVisibility(View.GONE); + mInput.setVisibility(View.INVISIBLE); mProgress.setVisibility(View.VISIBLE); positive.setEnabled(false); @@ -364,7 +365,7 @@ public class PassphraseDialogActivity extends FragmentActivity { mPassphraseEditText.setText(""); mPassphraseEditText.setError(getString(R.string.wrong_passphrase)); mInput.setVisibility(View.VISIBLE); - mProgress.setVisibility(View.GONE); + mProgress.setVisibility(View.INVISIBLE); positive.setEnabled(true); return; } -- cgit v1.2.3 From 7b0e067f63f6f463cd7775347a7bf1c6e3c232c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 22:44:32 +0100 Subject: Fix expiry dialog, reorder layouts --- .../ui/dialog/AddSubkeyDialogFragment.java | 12 ++-- .../ui/dialog/EditSubkeyExpiryDialogFragment.java | 78 ++++++++++++---------- .../ui/dialog/SetPassphraseDialogFragment.java | 1 - 3 files changed, 47 insertions(+), 44 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java index d5376cbdc..0b1d39fc1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java @@ -137,12 +137,10 @@ public class AddSubkeyDialogFragment extends DialogFragment { } }); - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { - // date picker works based on default time zone - Calendar minDateCal = Calendar.getInstance(TimeZone.getDefault()); - minDateCal.add(Calendar.DAY_OF_YEAR, 1); // at least one day after creation (today) - mExpiryDatePicker.setMinDate(minDateCal.getTime().getTime()); - } + // date picker works based on default time zone + Calendar minDateCal = Calendar.getInstance(TimeZone.getDefault()); + minDateCal.add(Calendar.DAY_OF_YEAR, 1); // at least one day after creation (today) + mExpiryDatePicker.setMinDate(minDateCal.getTime().getTime()); { ArrayList> choices = new ArrayList<>(); @@ -283,7 +281,7 @@ public class AddSubkeyDialogFragment extends DialogFragment { // For EC keys, add a curve if (algorithm == Algorithm.ECDH || algorithm == Algorithm.ECDSA) { curve = ((Choice) mCurveSpinner.getSelectedItem()).getId(); - // Otherwise, get a keysize + // Otherwise, get a keysize } else { keySize = getProperKeyLength(algorithm, getSelectedKeyLength()); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java index fc618c9eb..37e05a61d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java @@ -25,11 +25,14 @@ import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.support.v4.app.DialogFragment; +import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.DatePicker; +import android.widget.LinearLayout; +import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -97,61 +100,64 @@ public class EditSubkeyExpiryDialogFragment extends DialogFragment { final CheckBox noExpiry = (CheckBox) view.findViewById(R.id.edit_subkey_expiry_no_expiry); final DatePicker datePicker = (DatePicker) view.findViewById(R.id.edit_subkey_expiry_date_picker); + final TextView currentExpiry = (TextView) view.findViewById(R.id.edit_subkey_expiry_current_expiry); + final LinearLayout expiryLayout = (LinearLayout) view.findViewById(R.id.edit_subkey_expiry_layout); noExpiry.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { - datePicker.setVisibility(View.GONE); + expiryLayout.setVisibility(View.GONE); } else { - datePicker.setVisibility(View.VISIBLE); + expiryLayout.setVisibility(View.VISIBLE); } } }); - // init date picker with default selected date if (expiry == 0L) { noExpiry.setChecked(true); - datePicker.setVisibility(View.GONE); - - Calendar todayCal = Calendar.getInstance(TimeZone.getDefault()); - if (creationCal.after(todayCal)) { - // Note: This is just for the rare cases where creation is _after_ today - - // set it to creation date +1 day (don't set it to creationCal, it would break crash - // datePicker.setMinDate() execution with IllegalArgumentException - Calendar creationCalPlusOne = (Calendar) creationCal.clone(); - creationCalPlusOne.add(Calendar.DAY_OF_YEAR, 1); - datePicker.init( - creationCalPlusOne.get(Calendar.YEAR), - creationCalPlusOne.get(Calendar.MONTH), - creationCalPlusOne.get(Calendar.DAY_OF_MONTH), - null - ); - - } else { - // normally, just init with today - datePicker.init( - todayCal.get(Calendar.YEAR), - todayCal.get(Calendar.MONTH), - todayCal.get(Calendar.DAY_OF_MONTH), - null - ); - } + expiryLayout.setVisibility(View.GONE); + + currentExpiry.setText(R.string.btn_no_date); } else { noExpiry.setChecked(false); - datePicker.setVisibility(View.VISIBLE); + expiryLayout.setVisibility(View.VISIBLE); + + // convert from UTC to time zone of device + Calendar expiryCalTimeZone = (Calendar) expiryCal.clone(); + expiryCalTimeZone.setTimeZone(TimeZone.getDefault()); + currentExpiry.setText(DateFormat.getDateFormat( + getActivity()).format(expiryCalTimeZone.getTime())); + } + + // date picker works based on default time zone + Calendar todayCal = Calendar.getInstance(TimeZone.getDefault()); + if (creationCal.after(todayCal)) { + // NOTE: This is just for the rare cases where creation is _after_ today + // Min Date: Creation date + 1 day - // set date picker to current expiry + Calendar creationCalPlusOne = (Calendar) creationCal.clone(); + creationCalPlusOne.add(Calendar.DAY_OF_YEAR, 1); + datePicker.setMinDate(creationCalPlusOne.getTime().getTime()); datePicker.init( - expiryCal.get(Calendar.YEAR), - expiryCal.get(Calendar.MONTH), - expiryCal.get(Calendar.DAY_OF_MONTH), + creationCalPlusOne.get(Calendar.YEAR), + creationCalPlusOne.get(Calendar.MONTH), + creationCalPlusOne.get(Calendar.DAY_OF_MONTH), null ); - } + } else { + // Min Date: today + 1 day - datePicker.setMinDate(creationCal.getTime().getTime()); + // at least one day after creation (today) + todayCal.add(Calendar.DAY_OF_YEAR, 1); + datePicker.setMinDate(todayCal.getTime().getTime()); + datePicker.init( + todayCal.get(Calendar.YEAR), + todayCal.get(Calendar.MONTH), + todayCal.get(Calendar.DAY_OF_MONTH), + null + ); + } alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java index a05719072..a3ffe250b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java @@ -92,7 +92,6 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity); alert.setTitle(title); - alert.setMessage(R.string.enter_passphrase_twice); LayoutInflater inflater = activity.getLayoutInflater(); View view = inflater.inflate(R.layout.passphrase_repeat_dialog, null); -- cgit v1.2.3 From c00a1f1ec39dbdd60302f2ec04ce6356d0e89101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 3 Mar 2015 23:43:25 +0100 Subject: Show name only in passphrase dialog --- .../keychain/ui/PassphraseDialogActivity.java | 9 ++++++++- .../keychain/ui/dialog/CustomAlertDialogBuilder.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java index 18d574956..bb669f6b8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java @@ -46,6 +46,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing; +import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; @@ -209,7 +210,13 @@ public class PassphraseDialogActivity extends FragmentActivity { // above can't be statically verified to have been set in all cases because // the catch clause doesn't return. try { - userId = mSecretRing.getPrimaryUserIdWithFallback(); + String mainUserId = mSecretRing.getPrimaryUserIdWithFallback(); + String[] mainUserIdSplit = KeyRing.splitUserId(mainUserId); + if (mainUserIdSplit[0] != null) { + userId = mainUserIdSplit[0]; + } else { + userId = getString(R.string.user_id_no_name); + } } catch (PgpKeyNotFoundException e) { userId = null; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java index d405b1dda..794af5b15 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2014 Dominik Schürmann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package org.sufficientlysecure.keychain.ui.dialog; import android.app.AlertDialog; -- cgit v1.2.3 From 024ba19499f6975e2e153ca496d94cb5124f5dd8 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Wed, 4 Mar 2015 04:14:28 +0530 Subject: corrected code style --- .../keychain/ui/LogDisplayFragment.java | 133 ++++++++++++--------- 1 file changed, 75 insertions(+), 58 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index ad5f9d53c..138f2f4e7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -100,7 +100,7 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe @Override public boolean onOptionsItemSelected(MenuItem item) { - switch(item.getItemId()) { + switch (item.getItemId()) { case R.id.menu_log_display_export_log: exportLog(); break; @@ -116,100 +116,94 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe private void writeToLogFile(final OperationResult.OperationLog operationLog, final File f) { OperationResult.OperationLog currLog = new OperationResult.OperationLog(); - currLog.add(OperationResult.LogType.MSG_EXPORT_LOG,0); + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG, 0); boolean error = false; PrintWriter pw = null; try { - pw = new PrintWriter(f); - pw.print(getPrintableOperationLog(operationLog,"")); - if(pw.checkError()) {//IOException - Log.e(Constants.TAG, "Log Export I/O Exception "+f.getAbsolutePath()); - currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING,1); - error = true; - } - } catch(FileNotFoundException e) { - Log.e(Constants.TAG, "File not found for exporting log "+f.getAbsolutePath()); + pw = new PrintWriter(f); + pw.print(getPrintableOperationLog(operationLog, "")); + if (pw.checkError()) {//IOException + Log.e(Constants.TAG, "Log Export I/O Exception " + f.getAbsolutePath()); + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING, 1); + error = true; + } + } catch (FileNotFoundException e) { + Log.e(Constants.TAG, "File not found for exporting log " + f.getAbsolutePath()); currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_FOPEN, 1); error = true; } - if(pw!=null) { + if (pw != null) { pw.close(); - if(!error && pw.checkError()) {//check if it is only pw.close() which generated error - currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING,1); + if (!error && pw.checkError()) {//check if it is only pw.close() which generated error + currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_ERROR_WRITING, 1); error = true; } } - if(!error) currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_SUCCESS,1); + if (!error) currLog.add(OperationResult.LogType.MSG_EXPORT_LOG_EXPORT_SUCCESS, 1); - int opResultCode = error?OperationResult.RESULT_ERROR:OperationResult.RESULT_OK; - OperationResult opResult = new LogExportResult(opResultCode,currLog); + int opResultCode = error ? OperationResult.RESULT_ERROR : OperationResult.RESULT_OK; + OperationResult opResult = new LogExportResult(opResultCode, currLog); opResult.createNotify(getActivity()).show(); } - private static class LogExportResult extends OperationResult { - - public LogExportResult(int result, OperationLog log) { - super(result, log); - } - - /** trivial but necessary to implement the Parcelable protocol. */ - public LogExportResult(Parcel source) { - super(source); - } - - public static Creator CREATOR = new Creator() { - public LogExportResult createFromParcel(final Parcel source) { - return new LogExportResult(source); - } - - public LogExportResult[] newArray(final int size) { - return new LogExportResult[size]; - } - }; - } /** * returns an indented String of an entire OperationLog - * @param operationLog log to be converted to indented, printable format + * + * @param opLog log to be converted to indented, printable format * @param basePadding padding to add at the start of all log entries, made for use with SubLogs * @return printable, indented version of passed operationLog */ - private String getPrintableOperationLog(OperationResult.OperationLog operationLog, String basePadding) { + private String getPrintableOperationLog(OperationResult.OperationLog opLog, String basePadding) { String log = ""; - Iterator logIterator = operationLog.iterator(); - while(logIterator.hasNext()) { - log += getPrintableLogEntry(logIterator.next(), basePadding)+"\n"; + for (Iterator logIterator = opLog.iterator(); logIterator.hasNext(); ) { + log += getPrintableLogEntry(logIterator.next(), basePadding) + "\n"; } - log = log.substring(0,log.length()-1);//gets rid of extra new line + log = log.substring(0, log.length() - 1);//gets rid of extra new line return log; } + /** * returns an indented String of a LogEntryParcel including any sub-logs it may contain + * * @param entryParcel log entryParcel whose String representation is to be obtained * @return indented version of passed log entryParcel in a readable format */ private String getPrintableLogEntry(OperationResult.LogEntryParcel entryParcel, String basePadding) { - String logText = ""; final String indent = " ";//4 spaces = 1 Indent level String padding = basePadding; - for(int i =0;i CREATOR = new Creator() { + public LogExportResult createFromParcel(final Parcel source) { + return new LogExportResult(source); + } + + public LogExportResult[] newArray(final int size) { + return new LogExportResult[size]; + } + }; + + public LogExportResult(int result, OperationLog log) { + super(result, log); + } + + /** + * trivial but necessary to implement the Parcelable protocol. + */ + public LogExportResult(Parcel source) { + super(source); + } + } + @Override public void onItemClick(AdapterView parent, View view, int position, long id) { LogEntryParcel parcel = mAdapter.getItem(position); -- cgit v1.2.3 From aba6569dd203a537c8c9491dd93131a2cf8d44cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 11:36:26 +0100 Subject: Simplify dialogs according to Material Design --- .../keychain/ui/dialog/DeleteFileDialogFragment.java | 5 +---- .../keychain/ui/dialog/DeleteKeyDialogFragment.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java index 879e3f6da..07462b4ff 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java @@ -62,12 +62,9 @@ public class DeleteFileDialogFragment extends DialogFragment { CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity); - - alert.setIcon(R.drawable.ic_dialog_alert_holo_light); - alert.setTitle(R.string.warning); alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFilename)); - alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + alert.setPositiveButton(R.string.btn_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java index 802f0c11b..32789d53b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java @@ -83,8 +83,6 @@ public class DeleteKeyDialogFragment extends DialogFragment { mMainMessage = (TextView) mInflateView.findViewById(R.id.mainMessage); - builder.setTitle(R.string.warning); - final boolean hasSecret; // If only a single key has been selected @@ -110,12 +108,14 @@ public class DeleteKeyDialogFragment extends DialogFragment { } hasSecret = ((Long) data.get(KeyRings.HAS_ANY_SECRET)) == 1; - // Set message depending on which key it is. - mMainMessage.setText(getString( - hasSecret ? R.string.secret_key_deletion_confirmation - : R.string.public_key_deletetion_confirmation, - name - )); + if (hasSecret) { + // show title only for secret key deletions, + // see http://www.google.com/design/spec/components/dialogs.html#dialogs-behavior + builder.setTitle(getString(R.string.title_delete_secret_key, name)); + mMainMessage.setText(getString(R.string.secret_key_deletion_confirmation, name)); + } else { + mMainMessage.setText(getString(R.string.public_key_deletetion_confirmation, name)); + } } catch (ProviderHelper.NotFoundException e) { dismiss(); return null; @@ -125,7 +125,6 @@ public class DeleteKeyDialogFragment extends DialogFragment { hasSecret = false; } - builder.setIcon(R.drawable.ic_dialog_alert_holo_light); builder.setPositiveButton(R.string.btn_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { -- cgit v1.2.3 From ff42dfc9db62f351bb30dacaa469f417018689f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 15:02:51 +0100 Subject: Use master key id instead of fingerprint in sync adapter, use IS_EXPIRED instead of EXPIRY where possible --- .../keychain/ui/KeyListFragment.java | 8 +- .../keychain/ui/ViewKeyActivity.java | 20 +-- .../keychain/ui/ViewKeyAdvActivity.java | 9 +- .../keychain/ui/ViewKeyAdvShareFragment.java | 4 +- .../keychain/ui/ViewKeyAdvUserIdsFragment.java | 4 +- .../keychain/ui/ViewKeyFragment.java | 4 +- .../keychain/ui/ViewKeyTrustFragment.java | 7 +- .../ui/widget/EncryptKeyCompletionView.java | 2 +- .../keychain/util/ContactHelper.java | 190 +++++++++++---------- 9 files changed, 129 insertions(+), 119 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index b56da463a..2e571a7db 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -77,7 +77,6 @@ import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; import java.io.IOException; -import java.util.Date; import java.util.HashMap; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; @@ -268,7 +267,7 @@ public class KeyListFragment extends LoaderFragment KeyRings.MASTER_KEY_ID, KeyRings.USER_ID, KeyRings.IS_REVOKED, - KeyRings.EXPIRY, + KeyRings.IS_EXPIRED, KeyRings.VERIFIED, KeyRings.HAS_ANY_SECRET }; @@ -276,7 +275,7 @@ public class KeyListFragment extends LoaderFragment static final int INDEX_MASTER_KEY_ID = 1; static final int INDEX_USER_ID = 2; static final int INDEX_IS_REVOKED = 3; - static final int INDEX_EXPIRY = 4; + static final int INDEX_IS_EXPIRED = 4; static final int INDEX_VERIFIED = 5; static final int INDEX_HAS_ANY_SECRET = 6; @@ -708,8 +707,7 @@ public class KeyListFragment extends LoaderFragment long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); boolean isSecret = cursor.getInt(INDEX_HAS_ANY_SECRET) != 0; boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; - boolean isExpired = !cursor.isNull(INDEX_EXPIRY) - && new Date(cursor.getLong(INDEX_EXPIRY) * 1000).before(new Date()); + boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0; boolean isVerified = cursor.getInt(INDEX_VERIFIED) > 0; h.mMasterKeyId = masterKeyId; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 0be6c26f6..9b0f1b319 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -83,7 +83,6 @@ import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; public class ViewKeyActivity extends BaseActivity implements @@ -750,7 +749,7 @@ public class ViewKeyActivity extends BaseActivity implements KeychainContract.KeyRings.MASTER_KEY_ID, KeychainContract.KeyRings.USER_ID, KeychainContract.KeyRings.IS_REVOKED, - KeychainContract.KeyRings.EXPIRY, + KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.VERIFIED, KeychainContract.KeyRings.HAS_ANY_SECRET, KeychainContract.KeyRings.FINGERPRINT, @@ -760,7 +759,7 @@ public class ViewKeyActivity extends BaseActivity implements static final int INDEX_MASTER_KEY_ID = 1; static final int INDEX_USER_ID = 2; static final int INDEX_IS_REVOKED = 3; - static final int INDEX_EXPIRY = 4; + static final int INDEX_IS_EXPIRED = 4; static final int INDEX_VERIFIED = 5; static final int INDEX_HAS_ANY_SECRET = 6; static final int INDEX_FINGERPRINT = 7; @@ -810,8 +809,7 @@ public class ViewKeyActivity extends BaseActivity implements mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0; mHasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0; boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0; - boolean isExpired = !data.isNull(INDEX_EXPIRY) - && new Date(data.getLong(INDEX_EXPIRY) * 1000).before(new Date()); + boolean isExpired = data.getInt(INDEX_IS_EXPIRED) != 0; mIsVerified = data.getInt(INDEX_VERIFIED) > 0; // if the refresh animation isn't playing @@ -821,10 +819,10 @@ public class ViewKeyActivity extends BaseActivity implements // this is done at the end of the animation otherwise } - AsyncTask photoTask = - new AsyncTask() { - protected Bitmap doInBackground(String... fingerprint) { - return ContactHelper.photoFromFingerprint(getContentResolver(), fingerprint[0]); + AsyncTask photoTask = + new AsyncTask() { + protected Bitmap doInBackground(Long... mMasterKeyId) { + return ContactHelper.photoFromMasterKeyId(getContentResolver(), mMasterKeyId[0]); } protected void onPostExecute(Bitmap photo) { @@ -871,7 +869,7 @@ public class ViewKeyActivity extends BaseActivity implements if ( !mFingerprint.equals(oldFingerprint)) { loadQrCode(mFingerprint); } - photoTask.execute(mFingerprint); + photoTask.execute(mMasterKeyId); mQrCodeLayout.setVisibility(View.VISIBLE); // and place leftOf qr code @@ -917,7 +915,7 @@ public class ViewKeyActivity extends BaseActivity implements KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, KeyFormattingUtils.STATE_VERIFIED, R.color.icons, true); color = getResources().getColor(R.color.primary); - photoTask.execute(mFingerprint); + photoTask.execute(mMasterKeyId); mFab.setVisibility(View.GONE); } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java index 9d79b377c..9390e8a69 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java @@ -43,8 +43,6 @@ import org.sufficientlysecure.keychain.util.ContactHelper; import org.sufficientlysecure.keychain.util.ExportHelper; import org.sufficientlysecure.keychain.util.Log; -import java.util.Date; - public class ViewKeyAdvActivity extends BaseActivity implements LoaderManager.LoaderCallbacks { @@ -159,7 +157,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements KeychainContract.KeyRings.MASTER_KEY_ID, KeychainContract.KeyRings.USER_ID, KeychainContract.KeyRings.IS_REVOKED, - KeychainContract.KeyRings.EXPIRY, + KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.VERIFIED, KeychainContract.KeyRings.HAS_ANY_SECRET }; @@ -167,7 +165,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements static final int INDEX_MASTER_KEY_ID = 1; static final int INDEX_USER_ID = 2; static final int INDEX_IS_REVOKED = 3; - static final int INDEX_EXPIRY = 4; + static final int INDEX_IS_EXPIRED = 4; static final int INDEX_VERIFIED = 5; static final int INDEX_HAS_ANY_SECRET = 6; @@ -212,8 +210,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements boolean isSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0; boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0; - boolean isExpired = !data.isNull(INDEX_EXPIRY) - && new Date(data.getLong(INDEX_EXPIRY) * 1000).before(new Date()); + boolean isExpired = data.getInt(INDEX_IS_EXPIRED) != 0; boolean isVerified = data.getInt(INDEX_VERIFIED) > 0; // Note: order is important diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java index 8d0a2dd1d..95a6faea9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java @@ -260,7 +260,7 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements static final String[] UNIFIED_PROJECTION = new String[]{ KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, KeyRings.USER_ID, KeyRings.FINGERPRINT, - KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, + KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.IS_EXPIRED, }; static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; @@ -270,7 +270,7 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements static final int INDEX_UNIFIED_ALGORITHM = 5; static final int INDEX_UNIFIED_KEY_SIZE = 6; static final int INDEX_UNIFIED_CREATION = 7; - static final int INDEX_UNIFIED_EXPIRY = 8; + static final int INDEX_UNIFIED_ID_EXPIRED = 8; public Loader onCreateLoader(int id, Bundle args) { setContentShown(false); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java index c4e6639a8..7bfebaf62 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java @@ -114,12 +114,12 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements static final String[] UNIFIED_PROJECTION = new String[]{ KeyRings._ID, KeyRings.MASTER_KEY_ID, - KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, KeyRings.EXPIRY, KeyRings.HAS_ENCRYPT + KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, KeyRings.IS_EXPIRED, KeyRings.HAS_ENCRYPT }; static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2; static final int INDEX_UNIFIED_IS_REVOKED = 3; - static final int INDEX_UNIFIED_EXPIRY = 4; + static final int INDEX_UNIFIED_IS_EXPIRED = 4; static final int INDEX_UNIFIED_HAS_ENCRYPT = 5; public Loader onCreateLoader(int id, Bundle args) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java index 32630b459..628970b27 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java @@ -121,7 +121,7 @@ public class ViewKeyFragment extends LoaderFragment implements KeychainContract.KeyRings.MASTER_KEY_ID, KeychainContract.KeyRings.USER_ID, KeychainContract.KeyRings.IS_REVOKED, - KeychainContract.KeyRings.EXPIRY, + KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.VERIFIED, KeychainContract.KeyRings.HAS_ANY_SECRET, KeychainContract.KeyRings.FINGERPRINT, @@ -131,7 +131,7 @@ public class ViewKeyFragment extends LoaderFragment implements static final int INDEX_MASTER_KEY_ID = 1; static final int INDEX_USER_ID = 2; static final int INDEX_IS_REVOKED = 3; - static final int INDEX_EXPIRY = 4; + static final int INDEX_IS_EXPIRED = 4; static final int INDEX_VERIFIED = 5; static final int INDEX_HAS_ANY_SECRET = 6; static final int INDEX_FINGERPRINT = 7; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java index 25edc7a02..d22f01a48 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -115,12 +115,12 @@ public class ViewKeyTrustFragment extends LoaderFragment implements } static final String[] TRUST_PROJECTION = new String[]{ - KeyRings._ID, KeyRings.FINGERPRINT, KeyRings.IS_REVOKED, KeyRings.EXPIRY, + KeyRings._ID, KeyRings.FINGERPRINT, KeyRings.IS_REVOKED, KeyRings.IS_EXPIRED, KeyRings.HAS_ANY_SECRET, KeyRings.VERIFIED }; static final int INDEX_TRUST_FINGERPRINT = 1; static final int INDEX_TRUST_IS_REVOKED = 2; - static final int INDEX_TRUST_EXPIRY = 3; + static final int INDEX_TRUST_IS_EXPIRED = 3; static final int INDEX_UNIFIED_HAS_ANY_SECRET = 4; static final int INDEX_VERIFIED = 5; @@ -169,8 +169,7 @@ public class ViewKeyTrustFragment extends LoaderFragment implements nothingSpecial = false; } else { - Date expiryDate = new Date(data.getLong(INDEX_TRUST_EXPIRY) * 1000); - if (!data.isNull(INDEX_TRUST_EXPIRY) && expiryDate.before(new Date())) { + if (data.getInt(INDEX_TRUST_IS_EXPIRED) != 0) { // if expired, don’t trust it! message.append(getString(R.string.key_trust_expired)). diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index f05f5f96b..48648f2cf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -90,7 +90,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { } private void setImageByKey(ImageView view, EncryptionKey key) { - Bitmap photo = ContactHelper.photoFromFingerprint(getContext().getContentResolver(), key.getFingerprint()); + Bitmap photo = ContactHelper.photoFromMasterKeyId(getContext().getContentResolver(), key.getKeyId()); if (photo != null) { view.setImageBitmap(photo); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 28480cee5..2658f3ba0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -20,18 +20,15 @@ package org.sufficientlysecure.keychain.util; import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.TargetApi; -import android.content.ContentProviderClient; import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentUris; -import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; -import android.os.RemoteException; import android.provider.ContactsContract; import android.util.Patterns; @@ -44,7 +41,6 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import java.io.InputStream; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -54,39 +50,17 @@ import java.util.Set; public class ContactHelper { public static final String[] KEYS_TO_CONTACT_PROJECTION = new String[]{ - KeychainContract.KeyRings.USER_ID, - KeychainContract.KeyRings.FINGERPRINT, - KeychainContract.KeyRings.KEY_ID, KeychainContract.KeyRings.MASTER_KEY_ID, - KeychainContract.KeyRings.EXPIRY, + KeychainContract.KeyRings.USER_ID, + KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.IS_REVOKED}; - public static final int INDEX_USER_ID = 0; - public static final int INDEX_FINGERPRINT = 1; - public static final int INDEX_KEY_ID = 2; - public static final int INDEX_MASTER_KEY_ID = 3; - public static final int INDEX_EXPIRY = 4; - public static final int INDEX_IS_REVOKED = 5; - - public static final String[] USER_IDS_PROJECTION = new String[]{ - UserPackets.USER_ID - }; - - public static final int INDEX_USER_IDS_USER_ID = 0; + public static final int INDEX_MASTER_KEY_ID = 0; + public static final int INDEX_USER_ID = 1; + public static final int INDEX_IS_EXPIRED = 2; + public static final int INDEX_IS_REVOKED = 3; - public static final String NON_REVOKED_SELECTION = UserPackets.IS_REVOKED + "=0"; - - public static final String[] ID_PROJECTION = new String[]{ContactsContract.RawContacts._ID}; - public static final String[] SOURCE_ID_PROJECTION = new String[]{ContactsContract.RawContacts.SOURCE_ID}; - - public static final String ACCOUNT_TYPE_AND_SOURCE_ID_SELECTION = - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?"; - public static final String ACCOUNT_TYPE_SELECTION = ContactsContract.RawContacts.ACCOUNT_TYPE + "=?"; - public static final String RAW_CONTACT_AND_MIMETYPE_SELECTION = - ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?"; - public static final String ID_SELECTION = ContactsContract.RawContacts._ID + "=?"; - - private static final Map photoCache = new HashMap<>(); + private static final Map photoCache = new HashMap<>(); public static List getPossibleUserEmails(Context context) { Set accountMails = getAccountEmails(context); @@ -282,20 +256,22 @@ public class ContactHelper { return null; } - public static Bitmap photoFromFingerprint(ContentResolver contentResolver, String fingerprint) { - if (fingerprint == null) { + public static Bitmap photoFromMasterKeyId(ContentResolver contentResolver, long masterKeyId) { + if (masterKeyId == -1) { return null; } - if (!photoCache.containsKey(fingerprint)) { - photoCache.put(fingerprint, loadPhotoFromFingerprint(contentResolver, fingerprint)); + if (!photoCache.containsKey(masterKeyId)) { + photoCache.put(masterKeyId, loadPhotoFromFingerprint(contentResolver, masterKeyId)); } - return photoCache.get(fingerprint); + return photoCache.get(masterKeyId); } - private static Bitmap loadPhotoFromFingerprint(ContentResolver contentResolver, String fingerprint) { - if (fingerprint == null) return null; + private static Bitmap loadPhotoFromFingerprint(ContentResolver contentResolver, long masterKeyId) { + if (masterKeyId == -1) { + return null; + } try { - int rawContactId = findRawContactId(contentResolver, fingerprint); + long rawContactId = findRawContactId(contentResolver, masterKeyId); if (rawContactId == -1) { return null; } @@ -313,11 +289,13 @@ public class ContactHelper { } /** - * Write the current Keychain to the contact db + * Write/Update the current OpenKeychain keys to the contact db */ public static void writeKeysToContacts(Context context) { ContentResolver resolver = context.getContentResolver(); - Set deletedKeys = getRawContactFingerprints(resolver); + Set deletedKeys = getRawContactMasterKeyIds(resolver); + + debugDeleteRawContacts(resolver); // ContentProviderClient client = resolver.acquireContentProviderClient(ContactsContract.AUTHORITY_URI); // ContentValues values = new ContentValues(); @@ -336,18 +314,18 @@ public class ContactHelper { null, null, null); if (cursor != null) { while (cursor.moveToNext()) { + long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); String[] primaryUserId = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID)); - String fingerprint = KeyFormattingUtils.convertFingerprintToHex(cursor.getBlob(INDEX_FINGERPRINT)); - deletedKeys.remove(fingerprint); + String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_MASTER_KEY_ID)); + boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0; + boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; - Log.d(Constants.TAG, "fingerprint: " + fingerprint); + Log.d(Constants.TAG, "masterKeyId: " + masterKeyId); - String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_KEY_ID)); - long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); - boolean isExpired = !cursor.isNull(INDEX_EXPIRY) - && new Date(cursor.getLong(INDEX_EXPIRY) * 1000).before(new Date()); - boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; - int rawContactId = findRawContactId(resolver, fingerprint); + deletedKeys.remove(masterKeyId); + + // get raw contact to this master key id + long rawContactId = findRawContactId(resolver, masterKeyId); ArrayList ops = new ArrayList<>(); Log.d(Constants.TAG, "raw contact id: " + rawContactId); @@ -356,16 +334,19 @@ public class ContactHelper { if (isExpired || isRevoked) { Log.d(Constants.TAG, "Expired or revoked: Deleting " + rawContactId); if (rawContactId != -1) { - resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ID_SELECTION, - new String[]{Integer.toString(rawContactId)}); + resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts._ID + "=?", + new String[]{ + Long.toString(rawContactId) + }); } } else if (primaryUserId[0] != null) { // Create a new rawcontact with corresponding key if it does not exist yet if (rawContactId == -1) { - Log.d(Constants.TAG, "Insert new raw contact with fingerprint " + fingerprint); + Log.d(Constants.TAG, "Insert new raw contact with masterKeyId " + masterKeyId); - insertContact(ops, context, fingerprint); + insertContact(ops, context, masterKeyId); writeContactKey(ops, context, rawContactId, masterKeyId, keyIdShort); } @@ -383,42 +364,72 @@ public class ContactHelper { cursor.close(); } - // Delete fingerprints that are no longer present in OK - for (String fingerprint : deletedKeys) { - resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ACCOUNT_TYPE_AND_SOURCE_ID_SELECTION, - new String[]{Constants.ACCOUNT_TYPE, fingerprint}); + // Delete master key ids that are no longer present in OK + for (Long masterKeyId : deletedKeys) { + Log.d(Constants.TAG, "Delete raw contact with fingerprint " + masterKeyId); + resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?", + new String[]{ + Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) + }); } } /** - * @return a set of all key fingerprints currently present in the contact db + * Delete all raw contacts associated to OpenKeychain. + * + * TODO: Does this work? + */ + private static int debugDeleteRawContacts(ContentResolver resolver) { + Log.d(Constants.TAG, "Deleting all raw contacts associated to OK..."); + return resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", + new String[]{ + Constants.ACCOUNT_TYPE + }); + } + + /** + * @return a set of all key master key ids currently present in the contact db */ - private static Set getRawContactFingerprints(ContentResolver resolver) { - HashSet result = new HashSet<>(); - Cursor fingerprints = resolver.query(ContactsContract.RawContacts.CONTENT_URI, SOURCE_ID_PROJECTION, - ACCOUNT_TYPE_SELECTION, new String[]{Constants.ACCOUNT_TYPE}, null); - if (fingerprints != null) { - while (fingerprints.moveToNext()) { - result.add(fingerprints.getString(0)); + private static Set getRawContactMasterKeyIds(ContentResolver resolver) { + HashSet result = new HashSet<>(); + Cursor masterKeyIds = resolver.query(ContactsContract.RawContacts.CONTENT_URI, + new String[]{ + ContactsContract.RawContacts.SOURCE_ID + }, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", + new String[]{ + Constants.ACCOUNT_TYPE + }, null); + if (masterKeyIds != null) { + while (masterKeyIds.moveToNext()) { + result.add(masterKeyIds.getLong(0)); } - fingerprints.close(); + masterKeyIds.close(); } return result; } /** - * This will search the contact db for a raw contact with a given fingerprint + * This will search the contact db for a raw contact with a given master key id * * @return raw contact id or -1 if not found */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - private static int findRawContactId(ContentResolver resolver, String fingerprint) { - int rawContactId = -1; - Cursor raw = resolver.query(ContactsContract.RawContacts.CONTENT_URI, ID_PROJECTION, - ACCOUNT_TYPE_AND_SOURCE_ID_SELECTION, new String[]{Constants.ACCOUNT_TYPE, fingerprint}, null, null); + private static long findRawContactId(ContentResolver resolver, long masterKeyId) { + long rawContactId = -1; + Cursor raw = resolver.query(ContactsContract.RawContacts.CONTENT_URI, + new String[]{ + ContactsContract.RawContacts._ID + }, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?", + new String[]{ + Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) + }, null, null); if (raw != null) { if (raw.moveToNext()) { - rawContactId = raw.getInt(0); + rawContactId = raw.getLong(0); } raw.close(); } @@ -428,11 +439,11 @@ public class ContactHelper { /** * Creates a empty raw contact with a given fingerprint */ - private static void insertContact(ArrayList ops, Context context, String fingerprint) { + private static void insertContact(ArrayList ops, Context context, long masterKeyId) { ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE) - .withValue(ContactsContract.RawContacts.SOURCE_ID, fingerprint) + .withValue(ContactsContract.RawContacts.SOURCE_ID, Long.toString(masterKeyId)) .build()); } @@ -441,7 +452,7 @@ public class ContactHelper { *

* This creates the link to OK in contact details */ - private static void writeContactKey(ArrayList ops, Context context, int rawContactId, + private static void writeContactKey(ArrayList ops, Context context, long rawContactId, long masterKeyId, String keyIdShort) { ops.add(referenceRawContact(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI), rawContactId) .withValue(ContactsContract.Data.MIMETYPE, Constants.CUSTOM_CONTACT_DATA_MIME_TYPE) @@ -454,11 +465,15 @@ public class ContactHelper { * Write all known email addresses of a key (derived from user ids) to a given raw contact */ private static void writeContactEmail(ArrayList ops, ContentResolver resolver, - int rawContactId, long masterKeyId) { + long rawContactId, long masterKeyId) { ops.add(selectByRawContactAndItemType(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI), rawContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).build()); Cursor ids = resolver.query(UserPackets.buildUserIdsUri(masterKeyId), - USER_IDS_PROJECTION, NON_REVOKED_SELECTION, null, null); + new String[]{ + UserPackets.USER_ID + }, + UserPackets.IS_REVOKED + "=0", + null, null); if (ids != null) { while (ids.moveToNext()) { String[] userId = KeyRing.splitUserId(ids.getString(0)); @@ -475,7 +490,7 @@ public class ContactHelper { } } - private static void writeContactDisplayName(ArrayList ops, int rawContactId, + private static void writeContactDisplayName(ArrayList ops, long rawContactId, String displayName) { if (displayName != null) { ops.add(insertOrUpdateForRawContact(ContactsContract.Data.CONTENT_URI, rawContactId, @@ -486,13 +501,13 @@ public class ContactHelper { } private static ContentProviderOperation.Builder referenceRawContact(ContentProviderOperation.Builder builder, - int rawContactId) { + long rawContactId) { return rawContactId == -1 ? builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) : builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); } - private static ContentProviderOperation.Builder insertOrUpdateForRawContact(Uri uri, int rawContactId, + private static ContentProviderOperation.Builder insertOrUpdateForRawContact(Uri uri, long rawContactId, String itemType) { if (rawContactId == -1) { return referenceRawContact(ContentProviderOperation.newInsert(uri), rawContactId).withValue( @@ -503,8 +518,11 @@ public class ContactHelper { } private static ContentProviderOperation.Builder selectByRawContactAndItemType( - ContentProviderOperation.Builder builder, int rawContactId, String itemType) { - return builder.withSelection(RAW_CONTACT_AND_MIMETYPE_SELECTION, - new String[]{Integer.toString(rawContactId), itemType}); + ContentProviderOperation.Builder builder, long rawContactId, String itemType) { + return builder.withSelection( + ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?", + new String[]{ + Long.toString(rawContactId), itemType + }); } } -- cgit v1.2.3 From 46944198e4a4433025c92eb767118ed5bd4a9e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 15:12:00 +0100 Subject: ContactHelper cleanup --- .../org/sufficientlysecure/keychain/Constants.java | 3 +- .../keychain/util/ContactHelper.java | 72 ++++++++++++---------- 2 files changed, 41 insertions(+), 34 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 67fa30a44..2d3ee6188 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -33,6 +33,7 @@ public final class Constants { public static final String ACCOUNT_NAME = "OpenKeychain"; public static final String ACCOUNT_TYPE = PACKAGE_NAME + ".account"; + public static final String CUSTOM_CONTACT_DATA_MIME_TYPE = "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key"; // as defined in http://tools.ietf.org/html/rfc3156, section 7 public static final String NFC_MIME = "application/pgp-keys"; @@ -49,8 +50,6 @@ public final class Constants { public static final String INTENT_PREFIX = PACKAGE_NAME + ".action."; public static final String EXTRA_PREFIX = PACKAGE_NAME + "."; - public static final String CUSTOM_CONTACT_DATA_MIME_TYPE = "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key"; - public static final int TEMPFILE_TTL = 24 * 60 * 60 * 1000; // 1 day public static final String SAFESLINGER_SERVER = "safeslinger-openpgp.appspot.com"; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 2658f3ba0..2f868912b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -49,17 +49,6 @@ import java.util.Set; public class ContactHelper { - public static final String[] KEYS_TO_CONTACT_PROJECTION = new String[]{ - KeychainContract.KeyRings.MASTER_KEY_ID, - KeychainContract.KeyRings.USER_ID, - KeychainContract.KeyRings.IS_EXPIRED, - KeychainContract.KeyRings.IS_REVOKED}; - - public static final int INDEX_MASTER_KEY_ID = 0; - public static final int INDEX_USER_ID = 1; - public static final int INDEX_IS_EXPIRED = 2; - public static final int INDEX_IS_REVOKED = 3; - private static final Map photoCache = new HashMap<>(); public static List getPossibleUserEmails(Context context) { @@ -261,12 +250,12 @@ public class ContactHelper { return null; } if (!photoCache.containsKey(masterKeyId)) { - photoCache.put(masterKeyId, loadPhotoFromFingerprint(contentResolver, masterKeyId)); + photoCache.put(masterKeyId, loadPhotoFromMasterKeyId(contentResolver, masterKeyId)); } return photoCache.get(masterKeyId); } - private static Bitmap loadPhotoFromFingerprint(ContentResolver contentResolver, long masterKeyId) { + private static Bitmap loadPhotoFromMasterKeyId(ContentResolver contentResolver, long masterKeyId) { if (masterKeyId == -1) { return null; } @@ -288,6 +277,17 @@ public class ContactHelper { } } + public static final String[] KEYS_TO_CONTACT_PROJECTION = new String[]{ + KeychainContract.KeyRings.MASTER_KEY_ID, + KeychainContract.KeyRings.USER_ID, + KeychainContract.KeyRings.IS_EXPIRED, + KeychainContract.KeyRings.IS_REVOKED}; + + public static final int INDEX_MASTER_KEY_ID = 0; + public static final int INDEX_USER_ID = 1; + public static final int INDEX_IS_EXPIRED = 2; + public static final int INDEX_IS_REVOKED = 3; + /** * Write/Update the current OpenKeychain keys to the contact db */ @@ -295,7 +295,7 @@ public class ContactHelper { ContentResolver resolver = context.getContentResolver(); Set deletedKeys = getRawContactMasterKeyIds(resolver); - debugDeleteRawContacts(resolver); +// debugDeleteRawContacts(resolver); // ContentProviderClient client = resolver.acquireContentProviderClient(ContactsContract.AUTHORITY_URI); // ContentValues values = new ContentValues(); @@ -315,7 +315,7 @@ public class ContactHelper { if (cursor != null) { while (cursor.moveToNext()) { long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); - String[] primaryUserId = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID)); + String[] userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID)); String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_MASTER_KEY_ID)); boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0; boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; @@ -326,21 +326,17 @@ public class ContactHelper { // get raw contact to this master key id long rawContactId = findRawContactId(resolver, masterKeyId); - ArrayList ops = new ArrayList<>(); + Log.d(Constants.TAG, "rawContactId: " + rawContactId); - Log.d(Constants.TAG, "raw contact id: " + rawContactId); + ArrayList ops = new ArrayList<>(); // Do not store expired or revoked keys in contact db - and remove them if they already exist if (isExpired || isRevoked) { Log.d(Constants.TAG, "Expired or revoked: Deleting " + rawContactId); if (rawContactId != -1) { - resolver.delete(ContactsContract.RawContacts.CONTENT_URI, - ContactsContract.RawContacts._ID + "=?", - new String[]{ - Long.toString(rawContactId) - }); + deleteRawContactById(resolver, rawContactId); } - } else if (primaryUserId[0] != null) { + } else if (userIdSplit[0] != null) { // Create a new rawcontact with corresponding key if it does not exist yet if (rawContactId == -1) { @@ -352,7 +348,7 @@ public class ContactHelper { // We always update the display name (which is derived from primary user id) // and email addresses from user id - writeContactDisplayName(ops, rawContactId, primaryUserId[0]); + writeContactDisplayName(ops, rawContactId, userIdSplit[0]); writeContactEmail(ops, resolver, rawContactId, masterKeyId); try { resolver.applyBatch(ContactsContract.AUTHORITY, ops); @@ -366,18 +362,14 @@ public class ContactHelper { // Delete master key ids that are no longer present in OK for (Long masterKeyId : deletedKeys) { - Log.d(Constants.TAG, "Delete raw contact with fingerprint " + masterKeyId); - resolver.delete(ContactsContract.RawContacts.CONTENT_URI, - ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?", - new String[]{ - Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) - }); + Log.d(Constants.TAG, "Delete raw contact with masterKeyId " + masterKeyId); + deleteRawContactByMasterKeyId(resolver, masterKeyId); } } /** * Delete all raw contacts associated to OpenKeychain. - * + *

* TODO: Does this work? */ private static int debugDeleteRawContacts(ContentResolver resolver) { @@ -389,6 +381,22 @@ public class ContactHelper { }); } + private static int deleteRawContactById(ContentResolver resolver, long rawContactId) { + return resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts._ID + "=?", + new String[]{ + Constants.ACCOUNT_TYPE, Long.toString(rawContactId) + }); + } + + private static int deleteRawContactByMasterKeyId(ContentResolver resolver, long masterKeyId) { + return resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?", + new String[]{ + Constants.ACCOUNT_TYPE, Long.toString(masterKeyId) + }); + } + /** * @return a set of all key master key ids currently present in the contact db */ @@ -437,7 +445,7 @@ public class ContactHelper { } /** - * Creates a empty raw contact with a given fingerprint + * Creates a empty raw contact with a given masterKeyId */ private static void insertContact(ArrayList ops, Context context, long masterKeyId) { ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) -- cgit v1.2.3 From 2389ce9aebf46ab8e12fc4d60aa892615fe10123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 15:23:33 +0100 Subject: Full height contact pic in key view --- .../java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 9b0f1b319..2aa9edd44 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -930,27 +930,21 @@ public class ViewKeyActivity extends BaseActivity implements } if (mPreviousColor == 0 || mPreviousColor == color) { - mToolbar.setBackgroundColor(color); mStatusBar.setBackgroundColor(color); mBigToolbar.setBackgroundColor(color); mPreviousColor = color; } else { ObjectAnimator colorFade1 = - ObjectAnimator.ofObject(mToolbar, "backgroundColor", - new ArgbEvaluator(), mPreviousColor, color); - ObjectAnimator colorFade2 = ObjectAnimator.ofObject(mStatusBar, "backgroundColor", new ArgbEvaluator(), mPreviousColor, color); - ObjectAnimator colorFade3 = + ObjectAnimator colorFade2 = ObjectAnimator.ofObject(mBigToolbar, "backgroundColor", new ArgbEvaluator(), mPreviousColor, color); colorFade1.setDuration(1200); colorFade2.setDuration(1200); - colorFade3.setDuration(1200); colorFade1.start(); colorFade2.start(); - colorFade3.start(); mPreviousColor = color; } -- cgit v1.2.3 From 502a0b5376993a87d4d249b163156433c7c12053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 15:26:09 +0100 Subject: Crop image view to center --- .../java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 2aa9edd44..94f2bf92b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -76,7 +76,6 @@ import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.QrCodeUtils; -import org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView; import org.sufficientlysecure.keychain.util.ContactHelper; import org.sufficientlysecure.keychain.util.ExportHelper; import org.sufficientlysecure.keychain.util.Log; @@ -104,7 +103,7 @@ public class ViewKeyActivity extends BaseActivity implements private ImageButton mActionEncryptText; private ImageButton mActionNfc; private FloatingActionButton mFab; - private AspectRatioImageView mPhoto; + private ImageView mPhoto; private ImageView mQrCode; private CardView mQrCodeLayout; @@ -146,7 +145,7 @@ public class ViewKeyActivity extends BaseActivity implements mActionEncryptText = (ImageButton) findViewById(R.id.view_key_action_encrypt_text); mActionNfc = (ImageButton) findViewById(R.id.view_key_action_nfc); mFab = (FloatingActionButton) findViewById(R.id.fab); - mPhoto = (AspectRatioImageView) findViewById(R.id.view_key_photo); + mPhoto = (ImageView) findViewById(R.id.view_key_photo); mQrCode = (ImageView) findViewById(R.id.view_key_qr_code); mQrCodeLayout = (CardView) findViewById(R.id.view_key_qr_code_layout); -- cgit v1.2.3 From b662ff6c49e26d922e982edcaffb14b2c28b07ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 15:39:41 +0100 Subject: Get high res version of contact photo --- .../java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 2 +- .../keychain/ui/widget/EncryptKeyCompletionView.java | 2 +- .../java/org/sufficientlysecure/keychain/util/ContactHelper.java | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 94f2bf92b..f90326a7d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -821,7 +821,7 @@ public class ViewKeyActivity extends BaseActivity implements AsyncTask photoTask = new AsyncTask() { protected Bitmap doInBackground(Long... mMasterKeyId) { - return ContactHelper.photoFromMasterKeyId(getContentResolver(), mMasterKeyId[0]); + return ContactHelper.loadPhotoByMasterKeyId(getContentResolver(), mMasterKeyId[0], true); } protected void onPostExecute(Bitmap photo) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index 48648f2cf..d20e2bc99 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -90,7 +90,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { } private void setImageByKey(ImageView view, EncryptionKey key) { - Bitmap photo = ContactHelper.photoFromMasterKeyId(getContext().getContentResolver(), key.getKeyId()); + Bitmap photo = ContactHelper.getCachedPhotoByMasterKeyId(getContext().getContentResolver(), key.getKeyId()); if (photo != null) { view.setImageBitmap(photo); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 2f868912b..215cde1b7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -245,17 +245,18 @@ public class ContactHelper { return null; } - public static Bitmap photoFromMasterKeyId(ContentResolver contentResolver, long masterKeyId) { + public static Bitmap getCachedPhotoByMasterKeyId(ContentResolver contentResolver, long masterKeyId) { if (masterKeyId == -1) { return null; } if (!photoCache.containsKey(masterKeyId)) { - photoCache.put(masterKeyId, loadPhotoFromMasterKeyId(contentResolver, masterKeyId)); + photoCache.put(masterKeyId, loadPhotoByMasterKeyId(contentResolver, masterKeyId, false)); } return photoCache.get(masterKeyId); } - private static Bitmap loadPhotoFromMasterKeyId(ContentResolver contentResolver, long masterKeyId) { + public static Bitmap loadPhotoByMasterKeyId(ContentResolver contentResolver, long masterKeyId, + boolean highRes) { if (masterKeyId == -1) { return null; } @@ -267,7 +268,7 @@ public class ContactHelper { Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); Uri contactUri = ContactsContract.RawContacts.getContactLookupUri(contentResolver, rawContactUri); InputStream photoInputStream = - ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, contactUri); + ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, contactUri, highRes); if (photoInputStream == null) { return null; } -- cgit v1.2.3 From 17a627919c967fa0a46a913c5229e3ff56ffb5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 18:34:42 +0100 Subject: Simplified language: Confirm keys --- .../sufficientlysecure/keychain/ui/HelpActivity.java | 19 ++++--------------- .../keychain/util/ContactHelper.java | 6 ++++-- 2 files changed, 8 insertions(+), 17 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java index 2eb35351e..cd6cdf4d6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java @@ -32,10 +32,9 @@ public class HelpActivity extends BaseActivity { public static final int TAB_START = 0; public static final int TAB_FAQ = 1; - public static final int TAB_WOT = 2; - public static final int TAB_NFC = 3; - public static final int TAB_CHANGELOG = 4; - public static final int TAB_ABOUT = 5; + public static final int TAB_TRUST = 2; + public static final int TAB_CHANGELOG = 3; + public static final int TAB_ABOUT = 4; ViewPager mViewPager; private PagerTabStripAdapter mTabsAdapter; @@ -69,21 +68,11 @@ public class HelpActivity extends BaseActivity { mTabsAdapter.addTab(HelpHtmlFragment.class, startBundle, getString(R.string.help_tab_start)); - Bundle faqBundle = new Bundle(); - faqBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_faq); - mTabsAdapter.addTab(HelpHtmlFragment.class, faqBundle, - getString(R.string.help_tab_faq)); - Bundle wotBundle = new Bundle(); - wotBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_wot); + wotBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_certification); mTabsAdapter.addTab(HelpHtmlFragment.class, wotBundle, getString(R.string.help_tab_wot)); - Bundle nfcBundle = new Bundle(); - nfcBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_nfc_beam); - mTabsAdapter.addTab(HelpHtmlFragment.class, nfcBundle, - getString(R.string.help_tab_nfc_beam)); - Bundle changelogBundle = new Bundle(); changelogBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_changelog); mTabsAdapter.addTab(HelpHtmlFragment.class, changelogBundle, diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 215cde1b7..44bcc52a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -475,7 +475,8 @@ public class ContactHelper { */ private static void writeContactEmail(ArrayList ops, ContentResolver resolver, long rawContactId, long masterKeyId) { - ops.add(selectByRawContactAndItemType(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI), + ops.add(selectByRawContactAndItemType( + ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI), rawContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).build()); Cursor ids = resolver.query(UserPackets.buildUserIdsUri(masterKeyId), new String[]{ @@ -487,7 +488,8 @@ public class ContactHelper { while (ids.moveToNext()) { String[] userId = KeyRing.splitUserId(ids.getString(0)); if (userId[1] != null) { - ops.add(referenceRawContact(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI), + ops.add(referenceRawContact( + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI), rawContactId) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) -- cgit v1.2.3 From 2bfe355d446bdb86f720e37f7351f672fd2aebe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 20:03:20 +0100 Subject: More icon naming fixes and design --- .../keychain/ui/adapter/SubkeysAdapter.java | 4 ++-- .../keychain/ui/util/KeyFormattingUtils.java | 28 +++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java index ff5fbb49a..096dea51f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java @@ -272,12 +272,12 @@ public class SubkeysAdapter extends CursorAdapter { PorterDuff.Mode.SRC_IN); if (isRevoked) { - vStatus.setImageResource(R.drawable.status_signature_revoked_cutout_24px); + vStatus.setImageResource(R.drawable.status_signature_revoked_cutout_24dp); vStatus.setColorFilter( mContext.getResources().getColor(R.color.bg_gray), PorterDuff.Mode.SRC_IN); } else if (isExpired) { - vStatus.setImageResource(R.drawable.status_signature_expired_cutout_24px); + vStatus.setImageResource(R.drawable.status_signature_expired_cutout_24dp); vStatus.setColorFilter( mContext.getResources().getColor(R.color.bg_gray), PorterDuff.Mode.SRC_IN); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java index 38ed88b9c..3a2177e8d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java @@ -413,10 +413,10 @@ public class KeyFormattingUtils { case STATE_VERIFIED: { if (big) { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_96px)); + context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_96dp)); } else { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_24dp)); } if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_green_light; @@ -430,7 +430,7 @@ public class KeyFormattingUtils { } case STATE_ENCRYPTED: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_lock_closed_24px)); + context.getResources().getDrawable(R.drawable.status_lock_closed_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_green_light; } @@ -445,10 +445,10 @@ public class KeyFormattingUtils { case STATE_UNVERIFIED: { if (big) { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_96px)); + context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_96dp)); } else { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_24dp)); } if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_orange_light; @@ -462,7 +462,7 @@ public class KeyFormattingUtils { } case STATE_UNKNOWN_KEY: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_orange_light; } @@ -477,10 +477,10 @@ public class KeyFormattingUtils { case STATE_REVOKED: { if (big) { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_96px)); + context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_96dp)); } else { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_24dp)); } if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_red_light; @@ -495,10 +495,10 @@ public class KeyFormattingUtils { case STATE_EXPIRED: { if (big) { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_96px)); + context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_96dp)); } else { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_24dp)); } if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_red_light; @@ -512,7 +512,7 @@ public class KeyFormattingUtils { } case STATE_NOT_ENCRYPTED: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_lock_open_24px)); + context.getResources().getDrawable(R.drawable.status_lock_open_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_red_light; } @@ -525,7 +525,7 @@ public class KeyFormattingUtils { } case STATE_NOT_SIGNED: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_red_light; } @@ -538,7 +538,7 @@ public class KeyFormattingUtils { } case STATE_INVALID: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.android_red_light; } @@ -552,7 +552,7 @@ public class KeyFormattingUtils { /** special **/ case STATE_UNAVAILABLE: { statusIcon.setImageDrawable( - context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px)); + context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24dp)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { color = R.color.bg_gray; } -- cgit v1.2.3 From e312b0e675fcd81b19b95453f04b55aee927b1f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 20:47:37 +0100 Subject: Set key signature algo from SHA512 to SHA256 --- .../keychain/pgp/PgpKeyOperation.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java index 1a251eb79..da0394573 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java @@ -100,8 +100,8 @@ public class PgpKeyOperation { private static final int[] PREFERRED_HASH_ALGORITHMS = new int[]{ HashAlgorithmTags.SHA512, HashAlgorithmTags.SHA384, - HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256, + HashAlgorithmTags.SHA224, HashAlgorithmTags.RIPEMD160 }; private static final int[] PREFERRED_COMPRESSION_ALGORITHMS = new int[]{ @@ -131,6 +131,7 @@ public class PgpKeyOperation { private static final int SECRET_KEY_ENCRYPTOR_S2K_COUNT = 0x90; private static final int SECRET_KEY_ENCRYPTOR_HASH_ALGO = HashAlgorithmTags.SHA256; private static final int SECRET_KEY_ENCRYPTOR_SYMMETRIC_ALGO = SymmetricKeyAlgorithmTags.AES_256; + private static final int SECRET_KEY_SIGNATURE_HASH_ALGO = HashAlgorithmTags.SHA256; public PgpKeyOperation(Progressable progress) { super(); @@ -1025,7 +1026,7 @@ public class PgpKeyOperation { // add packet with EMPTY notation data (updates old one, but will be stripped later) PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512) + masterPrivateKey.getPublicKeyPacket().getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); { // set subpackets @@ -1051,7 +1052,7 @@ public class PgpKeyOperation { // add packet with "pin" notation data PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512) + masterPrivateKey.getPublicKeyPacket().getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); { // set subpackets @@ -1236,7 +1237,7 @@ public class PgpKeyOperation { int flags, long expiry) throws IOException, PGPException, SignatureException { PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512) + masterPrivateKey.getPublicKeyPacket().getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); @@ -1279,7 +1280,7 @@ public class PgpKeyOperation { PGPUserAttributeSubpacketVector vector) throws IOException, PGPException, SignatureException { PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512) + masterPrivateKey.getPublicKeyPacket().getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); @@ -1298,7 +1299,7 @@ public class PgpKeyOperation { PGPPrivateKey masterPrivateKey, PGPPublicKey pKey, String userId) throws IOException, PGPException, SignatureException { PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512) + masterPrivateKey.getPublicKeyPacket().getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); PGPSignatureSubpacketGenerator subHashedPacketsGen = new PGPSignatureSubpacketGenerator(); @@ -1312,7 +1313,7 @@ public class PgpKeyOperation { PGPPublicKey masterPublicKey, PGPPrivateKey masterPrivateKey, PGPPublicKey pKey) throws IOException, PGPException, SignatureException { PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA512) + masterPublicKey.getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); PGPSignatureSubpacketGenerator subHashedPacketsGen = new PGPSignatureSubpacketGenerator(); @@ -1356,7 +1357,7 @@ public class PgpKeyOperation { PGPSignatureSubpacketGenerator subHashedPacketsGen = new PGPSignatureSubpacketGenerator(); subHashedPacketsGen.setSignatureCreationTime(false, creationTime); PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - pKey.getAlgorithm(), HashAlgorithmTags.SHA512) + pKey.getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); sGen.init(PGPSignature.PRIMARYKEY_BINDING, subPrivateKey); @@ -1377,7 +1378,7 @@ public class PgpKeyOperation { } PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( - masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA512) + masterPublicKey.getAlgorithm(), SECRET_KEY_SIGNATURE_HASH_ALGO) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder); sGen.init(PGPSignature.SUBKEY_BINDING, masterPrivateKey); -- cgit v1.2.3 From fe8b08ac84b0360463612ac517444dbd7d2f96d7 Mon Sep 17 00:00:00 2001 From: Daniel Nelz Date: Wed, 4 Mar 2015 21:07:32 +0100 Subject: #1042 replaced some int constants with enums Created enum FragAction in CreateKeyActivity.java and enum State in KeyFormattingUtils.java and replaced int constants with them --- .../keychain/ui/CreateKeyActivity.java | 18 ++++---- .../keychain/ui/CreateKeyFinalFragment.java | 3 +- .../keychain/ui/CreateKeyInputFragment.java | 3 +- .../keychain/ui/DecryptFragment.java | 21 ++++----- .../keychain/ui/KeyListFragment.java | 9 ++-- .../keychain/ui/SelectPublicKeyFragment.java | 7 +-- .../keychain/ui/ViewKeyActivity.java | 9 ++-- .../keychain/ui/adapter/ImportKeysAdapter.java | 5 ++- .../ui/adapter/SelectKeyCursorAdapter.java | 5 ++- .../keychain/ui/adapter/UserIdsAdapter.java | 9 ++-- .../keychain/ui/util/KeyFormattingUtils.java | 52 +++++++++++----------- .../keychain/ui/widget/CertifyKeySpinner.java | 7 +-- .../keychain/ui/widget/SignKeySpinner.java | 7 +-- 13 files changed, 85 insertions(+), 70 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java index 62c38d136..60cc404b6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java @@ -28,9 +28,11 @@ public class CreateKeyActivity extends BaseActivity { public static final String EXTRA_NAME = "name"; public static final String EXTRA_EMAIL = "email"; - public static final int FRAG_ACTION_START = 0; - public static final int FRAG_ACTION_TO_RIGHT = 1; - public static final int FRAG_ACTION_TO_LEFT = 2; + public static enum FragAction { + START, + TO_RIGHT, + TO_LEFT + } @Override public void onCreate(Bundle savedInstanceState) { @@ -42,7 +44,7 @@ public class CreateKeyActivity extends BaseActivity { getIntent().getStringExtra(EXTRA_NAME), getIntent().getStringExtra(EXTRA_EMAIL) ); - loadFragment(null, frag, FRAG_ACTION_START); + loadFragment(null, frag, FragAction.START); } @Override @@ -50,7 +52,7 @@ public class CreateKeyActivity extends BaseActivity { setContentView(R.layout.create_key_activity); } - public void loadFragment(Bundle savedInstanceState, Fragment fragment, int action) { + public void loadFragment(Bundle savedInstanceState, Fragment fragment, FragAction action) { // However, if we're being restored from a previous state, // then we don't need to do anything and should return or else // we could end up with overlapping fragments. @@ -63,15 +65,15 @@ public class CreateKeyActivity extends BaseActivity { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); switch (action) { - case FRAG_ACTION_START: + case START: transaction.setCustomAnimations(0, 0); transaction.replace(R.id.create_key_fragment_container, fragment) .commitAllowingStateLoss(); break; - case FRAG_ACTION_TO_LEFT: + case TO_LEFT: getSupportFragmentManager().popBackStackImmediate(); break; - case FRAG_ACTION_TO_RIGHT: + case TO_RIGHT: transaction.setCustomAnimations(R.anim.frag_slide_in_from_right, R.anim.frag_slide_out_to_left, R.anim.frag_slide_in_from_left, R.anim.frag_slide_out_to_right); transaction.addToBackStack(null); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java index 6e0115342..920488e3e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -43,6 +43,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel; +import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; @@ -117,7 +118,7 @@ public class CreateKeyFinalFragment extends Fragment { mBackButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mCreateKeyActivity.loadFragment(null, null, CreateKeyActivity.FRAG_ACTION_TO_LEFT); + mCreateKeyActivity.loadFragment(null, null, FragAction.TO_LEFT); } }); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java index 8aa9fa6db..ac74e87ed 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java @@ -32,6 +32,7 @@ import android.widget.AutoCompleteTextView; import android.widget.EditText; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.util.ContactHelper; import java.util.regex.Matcher; @@ -161,7 +162,7 @@ public class CreateKeyInputFragment extends Fragment { ); hideKeyboard(); - mCreateKeyActivity.loadFragment(null, frag, CreateKeyActivity.FRAG_ACTION_TO_RIGHT); + mCreateKeyActivity.loadFragment(null, frag, FragAction.TO_RIGHT); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index 8723c7255..3814aa287 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -31,6 +31,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; public abstract class DecryptFragment extends Fragment { private static final int RESULT_CODE_LOOKUP_KEY = 0x00007006; @@ -141,16 +142,16 @@ public abstract class DecryptFragment extends Fragment { if (signatureResult.isSignatureOnly()) { mEncryptionText.setText(R.string.decrypt_result_not_encrypted); - KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, KeyFormattingUtils.STATE_NOT_ENCRYPTED); + KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, State.NOT_ENCRYPTED); } else { mEncryptionText.setText(R.string.decrypt_result_encrypted); - KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, KeyFormattingUtils.STATE_ENCRYPTED); + KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, State.ENCRYPTED); } switch (signatureResult.getStatus()) { case OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED: { mSignatureText.setText(R.string.decrypt_result_signature_certified); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_VERIFIED); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.VERIFIED); setSignatureLayoutVisibility(View.VISIBLE); setShowAction(mSignatureKeyId); @@ -161,7 +162,7 @@ public abstract class DecryptFragment extends Fragment { case OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED: { mSignatureText.setText(R.string.decrypt_result_signature_uncertified); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_UNVERIFIED); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.UNVERIFIED); setSignatureLayoutVisibility(View.VISIBLE); setShowAction(mSignatureKeyId); @@ -172,7 +173,7 @@ public abstract class DecryptFragment extends Fragment { case OpenPgpSignatureResult.SIGNATURE_KEY_MISSING: { mSignatureText.setText(R.string.decrypt_result_signature_missing_key); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_UNKNOWN_KEY); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.UNKNOWN_KEY); setSignatureLayoutVisibility(View.VISIBLE); mSignatureAction.setText(R.string.decrypt_result_action_Lookup); @@ -190,7 +191,7 @@ public abstract class DecryptFragment extends Fragment { case OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED: { mSignatureText.setText(R.string.decrypt_result_signature_expired_key); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_EXPIRED); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.EXPIRED); setSignatureLayoutVisibility(View.VISIBLE); setShowAction(mSignatureKeyId); @@ -201,7 +202,7 @@ public abstract class DecryptFragment extends Fragment { case OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED: { mSignatureText.setText(R.string.decrypt_result_signature_revoked_key); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_REVOKED); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.REVOKED); setSignatureLayoutVisibility(View.VISIBLE); setShowAction(mSignatureKeyId); @@ -212,7 +213,7 @@ public abstract class DecryptFragment extends Fragment { case OpenPgpSignatureResult.SIGNATURE_ERROR: { mSignatureText.setText(R.string.decrypt_result_invalid_signature); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_INVALID); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.INVALID); setSignatureLayoutVisibility(View.GONE); @@ -224,9 +225,9 @@ public abstract class DecryptFragment extends Fragment { setSignatureLayoutVisibility(View.GONE); mSignatureText.setText(R.string.decrypt_result_no_signature); - KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, KeyFormattingUtils.STATE_NOT_SIGNED); + KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.NOT_SIGNED); mEncryptionText.setText(R.string.decrypt_result_encrypted); - KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, KeyFormattingUtils.STATE_ENCRYPTED); + KeyFormattingUtils.setStatusImage(getActivity(), mEncryptionIcon, mEncryptionText, State.ENCRYPTED); valid = true; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index b56da463a..08963eb1d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -70,6 +70,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment; import org.sufficientlysecure.keychain.ui.util.Highlighter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.ExportHelper; import org.sufficientlysecure.keychain.util.FabContainer; @@ -716,13 +717,13 @@ public class KeyListFragment extends LoaderFragment // Note: order is important! if (isRevoked) { - KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, State.REVOKED, R.color.bg_gray); h.mStatus.setVisibility(View.VISIBLE); h.mSlinger.setVisibility(View.GONE); h.mMainUserId.setTextColor(context.getResources().getColor(R.color.bg_gray)); h.mMainUserIdRest.setTextColor(context.getResources().getColor(R.color.bg_gray)); } else if (isExpired) { - KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, State.EXPIRED, R.color.bg_gray); h.mStatus.setVisibility(View.VISIBLE); h.mSlinger.setVisibility(View.GONE); h.mMainUserId.setTextColor(context.getResources().getColor(R.color.bg_gray)); @@ -735,10 +736,10 @@ public class KeyListFragment extends LoaderFragment } else { // this is a public key - show if it's verified if (isVerified) { - KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, KeyFormattingUtils.STATE_VERIFIED); + KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, State.VERIFIED); h.mStatus.setVisibility(View.VISIBLE); } else { - KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, KeyFormattingUtils.STATE_UNVERIFIED); + KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, State.UNVERIFIED); h.mStatus.setVisibility(View.VISIBLE); } h.mSlinger.setVisibility(View.GONE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java index afec3bf06..835dd272c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java @@ -46,6 +46,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; import org.sufficientlysecure.keychain.ui.adapter.SelectKeyCursorAdapter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import java.util.Vector; @@ -376,15 +377,15 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T // Check if key is viable for our purposes if (cursor.getInt(mIndexHasEncrypt) == 0) { h.statusIcon.setVisibility(View.VISIBLE); - KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, KeyFormattingUtils.STATE_UNAVAILABLE); + KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, State.UNAVAILABLE); enabled = false; } else if (cursor.getInt(mIndexIsVerified) != 0) { h.statusIcon.setVisibility(View.VISIBLE); - KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, KeyFormattingUtils.STATE_VERIFIED); + KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, State.VERIFIED); enabled = true; } else { h.statusIcon.setVisibility(View.VISIBLE); - KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, KeyFormattingUtils.STATE_UNVERIFIED); + KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, State.UNVERIFIED); enabled = true; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 0be6c26f6..10545a867 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -74,6 +74,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.QrCodeUtils; import org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView; @@ -839,7 +840,7 @@ public class ViewKeyActivity extends BaseActivity implements mStatusText.setText(R.string.view_key_revoked); mStatusImage.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, - KeyFormattingUtils.STATE_REVOKED, R.color.icons, true); + State.REVOKED, R.color.icons, true); color = getResources().getColor(R.color.android_red_light); mActionEncryptFile.setVisibility(View.GONE); @@ -855,7 +856,7 @@ public class ViewKeyActivity extends BaseActivity implements } mStatusImage.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, - KeyFormattingUtils.STATE_EXPIRED, R.color.icons, true); + State.EXPIRED, R.color.icons, true); color = getResources().getColor(R.color.android_red_light); mActionEncryptFile.setVisibility(View.GONE); @@ -915,7 +916,7 @@ public class ViewKeyActivity extends BaseActivity implements mStatusText.setText(R.string.view_key_verified); mStatusImage.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, - KeyFormattingUtils.STATE_VERIFIED, R.color.icons, true); + State.VERIFIED, R.color.icons, true); color = getResources().getColor(R.color.primary); photoTask.execute(mFingerprint); @@ -924,7 +925,7 @@ public class ViewKeyActivity extends BaseActivity implements mStatusText.setText(R.string.view_key_unverified); mStatusImage.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, - KeyFormattingUtils.STATE_UNVERIFIED, R.color.icons, true); + State.UNVERIFIED, R.color.icons, true); color = getResources().getColor(R.color.android_orange_light); mFab.setVisibility(View.VISIBLE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java index 6ba9e26ad..429feb075 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java @@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Highlighter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import java.util.ArrayList; import java.util.HashMap; @@ -175,9 +176,9 @@ public class ImportKeysAdapter extends ArrayAdapter { } if (entry.isRevoked()) { - KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.REVOKED, R.color.bg_gray); } else if (entry.isExpired()) { - KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.EXPIRED, R.color.bg_gray); } if (entry.isRevoked() || entry.isExpired()) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java index a836b35df..226fda20b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java @@ -33,6 +33,7 @@ import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.ui.util.Highlighter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; /** @@ -133,11 +134,11 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter { boolean enabled; if (cursor.getInt(mIndexIsRevoked) != 0) { h.statusIcon.setVisibility(View.VISIBLE); - KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.REVOKED, R.color.bg_gray); enabled = false; } else if (cursor.getInt(mIndexIsExpiry) != 0) { h.statusIcon.setVisibility(View.VISIBLE); - KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.EXPIRED, R.color.bg_gray); enabled = false; } else { h.statusIcon.setVisibility(View.GONE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java index 6a4f61f4b..3486f1516 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java @@ -36,6 +36,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; public class UserIdsAdapter extends UserAttributesAdapter { protected LayoutInflater mInflater; @@ -127,7 +128,7 @@ public class UserIdsAdapter extends UserAttributesAdapter { if (isRevoked) { // set revocation icon (can this even be primary?) - KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.REVOKED, R.color.bg_gray); // disable revoked user ids vName.setEnabled(false); @@ -149,13 +150,13 @@ public class UserIdsAdapter extends UserAttributesAdapter { int isVerified = cursor.getInt(INDEX_VERIFIED); switch (isVerified) { case Certs.VERIFIED_SECRET: - KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_VERIFIED, KeyFormattingUtils.DEFAULT_COLOR); + KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.VERIFIED, KeyFormattingUtils.DEFAULT_COLOR); break; case Certs.VERIFIED_SELF: - KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_UNVERIFIED, KeyFormattingUtils.DEFAULT_COLOR); + KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.UNVERIFIED, KeyFormattingUtils.DEFAULT_COLOR); break; default: - KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_INVALID, KeyFormattingUtils.DEFAULT_COLOR); + KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.INVALID, KeyFormattingUtils.DEFAULT_COLOR); break; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java index 38ed88b9c..28deb1d5d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java @@ -379,27 +379,29 @@ public class KeyFormattingUtils { public static final int DEFAULT_COLOR = -1; - public static final int STATE_REVOKED = 1; - public static final int STATE_EXPIRED = 2; - public static final int STATE_VERIFIED = 3; - public static final int STATE_UNAVAILABLE = 4; - public static final int STATE_ENCRYPTED = 5; - public static final int STATE_NOT_ENCRYPTED = 6; - public static final int STATE_UNVERIFIED = 7; - public static final int STATE_UNKNOWN_KEY = 8; - public static final int STATE_INVALID = 9; - public static final int STATE_NOT_SIGNED = 10; - - public static void setStatusImage(Context context, ImageView statusIcon, int state) { + public static enum State { + REVOKED, + EXPIRED, + VERIFIED, + UNAVAILABLE, + ENCRYPTED, + NOT_ENCRYPTED, + UNVERIFIED, + UNKNOWN_KEY, + INVALID, + NOT_SIGNED + } + + public static void setStatusImage(Context context, ImageView statusIcon, State state) { setStatusImage(context, statusIcon, null, state); } - public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText, int state) { + public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText, State state) { setStatusImage(context, statusIcon, statusText, state, KeyFormattingUtils.DEFAULT_COLOR, false); } public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText, - int state, int color) { + State state, int color) { setStatusImage(context, statusIcon, statusText, state, color, false); } @@ -407,10 +409,10 @@ public class KeyFormattingUtils { * Sets status image based on constant */ public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText, - int state, int color, boolean big) { + State state, int color, boolean big) { switch (state) { /** GREEN: everything is good **/ - case STATE_VERIFIED: { + case VERIFIED: { if (big) { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_96px)); @@ -428,7 +430,7 @@ public class KeyFormattingUtils { } break; } - case STATE_ENCRYPTED: { + case ENCRYPTED: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_lock_closed_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { @@ -442,7 +444,7 @@ public class KeyFormattingUtils { break; } /** ORANGE: mostly bad... **/ - case STATE_UNVERIFIED: { + case UNVERIFIED: { if (big) { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_96px)); @@ -460,7 +462,7 @@ public class KeyFormattingUtils { } break; } - case STATE_UNKNOWN_KEY: { + case UNKNOWN_KEY: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { @@ -474,7 +476,7 @@ public class KeyFormattingUtils { break; } /** RED: really bad... **/ - case STATE_REVOKED: { + case REVOKED: { if (big) { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_96px)); @@ -492,7 +494,7 @@ public class KeyFormattingUtils { } break; } - case STATE_EXPIRED: { + case EXPIRED: { if (big) { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_96px)); @@ -510,7 +512,7 @@ public class KeyFormattingUtils { } break; } - case STATE_NOT_ENCRYPTED: { + case NOT_ENCRYPTED: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_lock_open_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { @@ -523,7 +525,7 @@ public class KeyFormattingUtils { } break; } - case STATE_NOT_SIGNED: { + case NOT_SIGNED: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { @@ -536,7 +538,7 @@ public class KeyFormattingUtils { } break; } - case STATE_INVALID: { + case INVALID: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { @@ -550,7 +552,7 @@ public class KeyFormattingUtils { break; } /** special **/ - case STATE_UNAVAILABLE: { + case UNAVAILABLE: { statusIcon.setImageDrawable( context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px)); if (color == KeyFormattingUtils.DEFAULT_COLOR) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java index 6d0e6556f..fc912fccb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java @@ -31,6 +31,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainDatabase; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; public class CertifyKeySpinner extends KeySpinner { private long mHiddenMasterKeyId = Constants.key.none; @@ -103,16 +104,16 @@ public class CertifyKeySpinner extends KeySpinner { @Override boolean setStatus(Context context, Cursor cursor, ImageView statusView) { if (cursor.getInt(mIndexIsRevoked) != 0) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.REVOKED, R.color.bg_gray); return false; } if (cursor.getInt(mIndexIsExpired) != 0) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.EXPIRED, R.color.bg_gray); return false; } // don't invalidate the "None" entry, which is also null! if (cursor.getPosition() != 0 && cursor.isNull(mIndexHasCertify)) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.UNAVAILABLE, R.color.bg_gray); return false; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java index fe91e306e..10327a6a4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java @@ -29,6 +29,7 @@ import android.widget.ImageView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; public class SignKeySpinner extends KeySpinner { public SignKeySpinner(Context context) { @@ -84,15 +85,15 @@ public class SignKeySpinner extends KeySpinner { @Override boolean setStatus(Context context, Cursor cursor, ImageView statusView) { if (cursor.getInt(mIndexIsRevoked) != 0) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.REVOKED, R.color.bg_gray); return false; } if (cursor.getInt(mIndexIsExpired) != 0) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.EXPIRED, R.color.bg_gray); return false; } if (cursor.getInt(mIndexHasSign) == 0) { - KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, R.color.bg_gray); + KeyFormattingUtils.setStatusImage(getContext(), statusView, null, State.UNAVAILABLE, R.color.bg_gray); return false; } -- cgit v1.2.3 From f3af54c814961f48b1d41095a684b7f87c351974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Mar 2015 21:12:52 +0100 Subject: Show fingerprint menu item only if not revoked or expired --- .../keychain/ui/ViewKeyActivity.java | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'OpenKeychain/src/main/java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index f90326a7d..3eb5f1057 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -119,6 +119,9 @@ public class ViewKeyActivity extends BaseActivity implements private boolean mIsSecret = false; private boolean mHasEncrypt = false; private boolean mIsVerified = false; + private boolean mIsRevoked = false; + private boolean mIsExpired = false; + private MenuItem mRefreshItem; private boolean mIsRefreshing; private Animation mRotate, mRotateSpin; @@ -171,7 +174,7 @@ public class ViewKeyActivity extends BaseActivity implements } }); - mRotate = AnimationUtils.loadAnimation(this, R.anim.rotate); + mRotate = AnimationUtils.loadAnimation(this, R.anim.rotate); mRotate.setRepeatCount(Animation.INFINITE); mRotate.setAnimationListener(new Animation.AnimationListener() { @Override @@ -345,7 +348,7 @@ public class ViewKeyActivity extends BaseActivity implements MenuItem editKey = menu.findItem(R.id.menu_key_view_edit); editKey.setVisible(mIsSecret); MenuItem certifyFingerprint = menu.findItem(R.id.menu_key_view_certify_fingerprint); - certifyFingerprint.setVisible(!mIsSecret && !mIsVerified); + certifyFingerprint.setVisible(!mIsSecret && !mIsVerified && !mIsExpired && !mIsRevoked); return true; } @@ -396,12 +399,12 @@ public class ViewKeyActivity extends BaseActivity implements private void certifyImmediate() { Intent intent = new Intent(this, CertifyKeyActivity.class); - intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{ mMasterKeyId }); + intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{mMasterKeyId}); startCertifyIntent(intent); } - private void startCertifyIntent (Intent intent) { + private void startCertifyIntent(Intent intent) { // Message is received after signing is done in KeychainIntentService KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(this) { public void handleMessage(Message message) { @@ -807,8 +810,8 @@ public class ViewKeyActivity extends BaseActivity implements mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0; mHasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0; - boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0; - boolean isExpired = data.getInt(INDEX_IS_EXPIRED) != 0; + mIsRevoked = data.getInt(INDEX_IS_REVOKED) > 0; + mIsExpired = data.getInt(INDEX_IS_EXPIRED) != 0; mIsVerified = data.getInt(INDEX_VERIFIED) > 0; // if the refresh animation isn't playing @@ -832,7 +835,7 @@ public class ViewKeyActivity extends BaseActivity implements // Note: order is important int color; - if (isRevoked) { + if (mIsRevoked) { mStatusText.setText(R.string.view_key_revoked); mStatusImage.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, @@ -844,7 +847,7 @@ public class ViewKeyActivity extends BaseActivity implements mActionNfc.setVisibility(View.GONE); mFab.setVisibility(View.GONE); mQrCodeLayout.setVisibility(View.GONE); - } else if (isExpired) { + } else if (mIsExpired) { if (mIsSecret) { mStatusText.setText(R.string.view_key_expired_secret); } else { @@ -865,7 +868,7 @@ public class ViewKeyActivity extends BaseActivity implements mStatusImage.setVisibility(View.GONE); color = getResources().getColor(R.color.primary); // reload qr code only if the fingerprint changed - if ( !mFingerprint.equals(oldFingerprint)) { + if (!mFingerprint.equals(oldFingerprint)) { loadQrCode(mFingerprint); } photoTask.execute(mMasterKeyId); -- cgit v1.2.3