diff --git a/.gitmodules b/.gitmodules index fdc6dddb3..4ab812ef0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,18 +2,6 @@ path = extern/openpgp-api-lib url = https://github.com/open-keychain/openpgp-api.git ignore = dirty -[submodule "extern/KeybaseLib"] - path = extern/KeybaseLib - url = https://github.com/open-keychain/KeybaseLib.git - ignore = dirty -[submodule "extern/minidns"] - path = extern/minidns - url = https://github.com/open-keychain/minidns.git - ignore = dirty -[submodule "extern/safeslinger-exchange"] - path = extern/safeslinger-exchange - url = https://github.com/open-keychain/exchange-android - ignore = dirty [submodule "OpenKeychain/src/test/resources/openpgp-interop"] path = OpenKeychain/src/test/resources/openpgp-interop url = https://github.com/google/openpgp-interop diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 8b4c4251d..3ea7e058d 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.android.application' -apply plugin: 'jacoco' apply plugin: 'com.squareup.sqldelight' // apply plugin: 'com.github.kt3k.coveralls' @@ -8,113 +7,94 @@ dependencies { // NOTE: libraries are pinned to a specific build, see below // from local Android SDK - compile 'com.android.support:support-v4:27.1.1' - compile 'com.android.support:appcompat-v7:27.1.1' - compile 'com.android.support:design:27.1.1' - compile 'com.android.support:recyclerview-v7:27.1.1' - compile 'com.android.support:cardview-v7:27.1.1' - compile 'com.android.support:support-annotations:27.1.1' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.annotation:annotation:1.1.0' // JCenter etc. - compile 'com.journeyapps:zxing-android-embedded:3.4.0' - compile 'com.google.zxing:core:3.3.0' - compile 'org.commonjava.googlecode.markdown4j:markdown4j:2.2-cj-1.1' - compile 'org.sufficientlysecure:donations:2.5' - compile 'com.squareup.okhttp3:okhttp:3.9.1' - compile 'com.squareup.okhttp3:okhttp-urlconnection:3.9.1' - compile 'org.apache.james:apache-mime4j-core:0.8.0' - compile 'org.apache.james:apache-mime4j-dom:0.8.0' + implementation 'com.journeyapps:zxing-android-embedded:3.4.0' + implementation 'com.google.zxing:core:3.3.0' + implementation 'org.commonjava.googlecode.markdown4j:markdown4j:2.2-cj-1.1' + implementation 'org.sufficientlysecure:donations:2.5' + implementation 'com.squareup.okhttp3:okhttp:3.13.1' + implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.9.1' + implementation 'org.apache.james:apache-mime4j-core:0.8.1' + implementation 'org.apache.james:apache-mime4j-dom:0.8.1' // UI - compile 'org.sufficientlysecure:html-textview:3.1' - compile 'com.jpardogo.materialtabstrip:library:1.1.1' - compile 'com.getbase:floatingactionbutton:1.10.1' - compile 'com.nispok:snackbar:2.11.0' - compile 'com.cocosw:bottomsheet:1.3.1@aar' + implementation 'org.sufficientlysecure:html-textview:3.1' + implementation 'com.jpardogo.materialtabstrip:library:1.1.1' + implementation 'com.getbase:floatingactionbutton:1.10.1' + implementation 'com.nispok:snackbar:2.11.0' + implementation 'com.cocosw:bottomsheet:1.5.0@aar' // RecyclerView - compile 'eu.davidea:flexible-adapter:5.0.5' - compile 'eu.davidea:flexible-adapter-ui:1.0.0-b5' - compile 'eu.davidea:flexible-adapter-livedata:1.0.0-b2' + implementation 'eu.davidea:flexible-adapter:5.1.0' + implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b5' + implementation 'eu.davidea:flexible-adapter-livedata:1.0.0-b2' // Material Drawer - compile 'com.mikepenz:materialdrawer:5.6.0@aar' - compile 'com.mikepenz:fastadapter:1.8.2' - compile 'com.mikepenz:materialize:1.0.0' - compile 'com.mikepenz:iconics-core:2.8.1@aar' - compile 'com.mikepenz:google-material-typeface:2.2.0.3.original@aar' - compile 'com.mikepenz:fontawesome-typeface:4.6.0.3@aar' - compile 'com.mikepenz:community-material-typeface:1.5.54.2@aar' + implementation 'com.mikepenz:materialdrawer:6.1.2@aar' + implementation 'com.mikepenz:fastadapter:3.3.0' + implementation 'com.mikepenz:fastadapter-extensions-expandable:3.3.0' + implementation 'com.mikepenz:materialize:1.2.0' + implementation 'com.mikepenz:iconics-core:3.1.0@aar' + implementation 'com.mikepenz:google-material-typeface:2.2.0.3.original@aar' + implementation 'com.mikepenz:fontawesome-typeface:5.3.1.1@aar' + implementation 'com.mikepenz:community-material-typeface:1.5.54.2@aar' // Nordpol - compile 'com.fidesmo:nordpol-android:0.1.22' + implementation 'com.fidesmo:nordpol-android:0.1.22' // piwik implementation 'org.piwik.sdk:piwik-sdk:3.0.3' // libs as submodules - implementation project(':libkeychain') implementation project(':openpgp-api-lib') implementation project(':nfcsweetspot') implementation project(':sshauthentication-api') - implementation project(':extern:bouncycastle:core') - implementation project(':extern:bouncycastle:pg') - implementation project(':extern:bouncycastle:prov') - implementation project(':extern:minidns') - implementation project(':KeybaseLib') - implementation project(':safeslinger-exchange') implementation project(':extern:MaterialChipsInput') - implementation "android.arch.work:work-runtime:1.0.0-alpha02" + // implementation project(':openkeychain:extern:bouncycastle:core') + implementation 'org.bouncycastle:bcprov-jdk15on:1.65.01' + implementation project(':extern:bouncycastle:pg') + // implementation project(':openkeychain:extern:bouncycastle:prov') + + implementation 'androidx.work:work-runtime:2.3.4' // Unit tests in the local JVM with Robolectric // https://developer.android.com/training/testing/unit-testing/local-unit-tests.html // http://robolectric.org/getting-started/ // http://www.vogella.com/tutorials/Robolectric/article.html - testCompile 'junit:junit:4.12' - testCompile ('org.robolectric:robolectric:3.6.1') { + testImplementation 'junit:junit:4.12' + testImplementation ('org.robolectric:robolectric:3.8') { exclude group: 'org.bouncycastle', module: 'bcprov-jdk16' } - testCompile 'org.mockito:mockito-core:1.10.19' + testImplementation 'org.mockito:mockito-core:2.18.0' - // UI testing with Espresso - // Force usage of support libs in the test app, since they are internally used by the runner module. - // https://github.com/googlesamples/android-testing/blob/master/ui/espresso/BasicSample/app/build.gradle#L28 - androidTestCompile 'com.android.support:support-annotations:27.1.1' - androidTestCompile 'com.android.support:appcompat-v7:27.1.1' - androidTestCompile 'com.android.support:design:27.1.1' - androidTestCompile 'com.android.support.test:runner:0.5' - androidTestCompile 'com.android.support.test:rules:0.5' - androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' - androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2' - androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.2') { - exclude group: 'com.android.support', module: 'appcompat' - exclude group: 'com.android.support', module: 'support-v4' - exclude module: 'recyclerview-v7' - } + implementation 'com.jakewharton.timber:timber:4.7.1' - compile "com.jakewharton.timber:timber:4.5.1" + implementation 'org.glassfish:javax.annotation:10.0-b28' + api "com.google.auto.value:auto-value-annotations:1.6.5" + annotationProcessor "com.google.auto.value:auto-value:1.6.2" + implementation 'com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.6' + annotationProcessor "com.ryanharter.auto.value:auto-value-parcel:0.2.6" - compile 'org.glassfish:javax.annotation:10.0-b28' - provided "com.google.auto.value:auto-value:1.5" - annotationProcessor "com.google.auto.value:auto-value:1.5" - annotationProcessor "com.ryanharter.auto.value:auto-value-parcel:0.2.5" - compile 'com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.5' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0' - compile "android.arch.lifecycle:extensions:1.0.0" - annotationProcessor "android.arch.lifecycle:compiler:1.0.0" - - compile "android.arch.persistence:db-framework:1.0.0" - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.sqlite:sqlite-framework:2.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' // for debugging the db. don't enable by default, this will expose the database no the network! // debugImplementation 'com.amitshekhar.android:debug-db:1.0.3' } - android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { minSdkVersion 15 @@ -124,7 +104,7 @@ android { applicationId "org.sufficientlysecure.keychain" // the androidjunitrunner is broken regarding coverage, see here: // https://code.google.com/p/android/issues/detail?id=170607 - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // this workaround runner fixes the coverage problem, BUT doesn't work // with android studio single test execution. use it to generate coverage // data, but keep the other one otherwis @@ -225,7 +205,7 @@ android { } variantFilter { variant -> - if(variant.buildType.name.equals('debug') && variant.getFlavors().get(0).name.equals('google')) { + if(variant.buildType.name == 'debug' && variant.getFlavors().get(0).name == 'google') { variant.setIgnore(true) } } @@ -292,34 +272,6 @@ android { } } -task jacocoTestReport(type:JacocoReport, dependsOn: "testFdroidDebugWithTestCoverageUnitTest") { - group = "Reporting" - description = "Generate Jacoco coverage reports" - - classDirectories = fileTree( - dir: "${buildDir}/intermediates/classes/fdroid/debugWithTestCoverage", - excludes: ['**/R.class', - '**/R$*.class', - '**/*$ViewInjector*.*', - '**/BuildConfig.*', - '**/Manifest*.*', - '**/*Activity*.*', - '**/*Fragment*.*'] - ) - - sourceDirectories = files("${buildDir.parent}/src/main/java") - additionalSourceDirs = files([ - "${buildDir}/generated/source/buildConfig/fdroid/debugWithTestCoverage", - "${buildDir}/generated/source/r/fdroid/debugWithTestCoverage" - ]) - executionData = fileTree(dir: "${buildDir}/jacoco", include: "**/*.exec") - - reports { - xml.enabled true - html.enabled true - } -} - // Fix for: No report file available: [/home/travis/build/open-keychain/open-keychain/OpenKeychain/build/reports/cobertura/coverage.xml, /home/travis/build/open-keychain/open-keychain/OpenKeychain/build/reports/jacoco/test/jacocoTestReport.xml] // coveralls { // jacocoReportPath 'build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml' diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/AndroidTestHelpers.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/AndroidTestHelpers.java deleted file mode 100644 index c376f7040..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/AndroidTestHelpers.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Random; - -import android.content.Context; -import android.support.annotation.StringRes; -import android.support.test.espresso.UiController; -import android.support.test.espresso.ViewAction; -import android.support.test.espresso.matcher.ViewMatchers; -import android.view.View; - -import com.nispok.snackbar.Snackbar; -import org.hamcrest.Matcher; -import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; -import org.sufficientlysecure.keychain.pgp.UncachedKeyRing.IteratorWithIOThrow; -import org.sufficientlysecure.keychain.daos.KeyWritableRepository; -import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; - -import static android.support.test.InstrumentationRegistry.getInstrumentation; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.withClassName; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.endsWith; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSnackbarLineColor; - - -public class AndroidTestHelpers { - - public static void dismissSnackbar() { - onView(withClassName(endsWith("Snackbar"))) - .perform(new ViewAction() { - @Override - public Matcher getConstraints() { - return ViewMatchers.isAssignableFrom(Snackbar.class); - } - - @Override - public String getDescription() { - return "dismiss snackbar"; - } - - @Override - public void perform(UiController uiController, View view) { - ((Snackbar) view).dismiss(); - } - }); - } - - public static void checkSnackbar(Style style, @StringRes Integer text) { - - onView(withClassName(endsWith("Snackbar"))) - .check(matches(withSnackbarLineColor(style.mLineColor))); - - if (text != null) { - onView(withClassName(endsWith("Snackbar"))) - .check(matches(hasDescendant(withText(text)))); - } - - } - - public static void checkAndDismissSnackbar(Style style, @StringRes Integer text) { - checkSnackbar(style, text); - dismissSnackbar(); - } - - public static void importKeysFromResource(Context context, String name) throws Exception { - IteratorWithIOThrow stream = UncachedKeyRing.fromStream( - getInstrumentation().getContext().getAssets().open(name)); - - KeyWritableRepository helper = KeyWritableRepository.create(context); - while(stream.hasNext()) { - UncachedKeyRing ring = stream.next(); - if (ring.isSecret()) { - helper.saveSecretKeyRing(ring); - } else { - helper.savePublicKeyRing(ring); - } - } - - } - - public static void copyFiles() throws IOException { - File cacheDir = getInstrumentation().getTargetContext().getFilesDir(); - byte[] buf = new byte[256]; - for (String filename : FILES) { - File outFile = new File(cacheDir, filename); - if (outFile.exists()) { - continue; - } - InputStream in = new BufferedInputStream(getInstrumentation().getContext().getAssets().open(filename)); - OutputStream out = new BufferedOutputStream(new FileOutputStream(outFile)); - int len; - while( (len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - } - } - - public static final String[] FILES = new String[] { "pa.png", "re.png", "ci.png" }; - public static File[] getImageNames() { - File cacheDir = getInstrumentation().getTargetContext().getFilesDir(); - File[] ret = new File[FILES.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = new File(cacheDir, FILES[i]); - } - return ret; - } - - public static T pickRandom(T[] haystack) { - return haystack[new Random().nextInt(haystack.length)]; - } - - public static String randomString(int min, int max) { - String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()-_="; - Random r = new Random(); - StringBuilder passbuilder = new StringBuilder(); - // 5% chance for an empty string - for(int i = 0, j = r.nextInt(max)+min; i < j; i++) { - passbuilder.append(chars.charAt(r.nextInt(chars.length()))); - } - return passbuilder.toString(); - } - - public static void cleanupForTests(Context context) throws Exception { - - // KeychainDatabase.getInstance(context).clearDatabase(); - - // import these two, make sure they're there - importKeysFromResource(context, "x.sec.asc"); - - // make sure no passphrases are cached - PassphraseCacheService.clearCachedPassphrases(context); - - } -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/JacocoWorkaroundJUnitRunner.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/JacocoWorkaroundJUnitRunner.java deleted file mode 100644 index b310ed5b8..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/JacocoWorkaroundJUnitRunner.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.sufficientlysecure.keychain; - - -import java.lang.reflect.Method; - -import android.os.Bundle; -import android.support.test.runner.AndroidJUnitRunner; - - -public class JacocoWorkaroundJUnitRunner extends AndroidJUnitRunner { - static { - System.setProperty("jacoco-agent.destfile", "/data/data/" - + BuildConfig.APPLICATION_ID + "/coverage.ec"); - } - - @Override - public void finish(int resultCode, Bundle results) { - try { - Class rt = Class.forName("org.jacoco.agent.rt.RT"); - Method getAgent = rt.getMethod("getAgent"); - Method dump = getAgent.getReturnType().getMethod("dump", boolean.class); - Object agent = getAgent.invoke(null); - dump.invoke(agent, false); - } catch (Exception e) { - e.printStackTrace(); - } - super.finish(resultCode, results); - } -} \ No newline at end of file diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/CustomActions.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/CustomActions.java deleted file mode 100644 index 65d39edb8..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/CustomActions.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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.actions; - - -import android.support.test.espresso.UiController; -import android.support.test.espresso.ViewAction; -import android.support.test.espresso.matcher.ViewMatchers; -import android.view.View; - -import com.tokenautocomplete.TokenCompleteTextView; -import org.hamcrest.Matcher; -import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; -import org.sufficientlysecure.keychain.daos.KeyWritableRepository; - -import static android.support.test.InstrumentationRegistry.getTargetContext; - - -public abstract class CustomActions { - - public static ViewAction tokenEncryptViewAddToken(long keyId) throws Exception { - CanonicalizedPublicKeyRing ring = - KeyWritableRepository.create(getTargetContext()).getCanonicalizedPublicKeyRing(keyId); - final Object item = new KeyAdapter.KeyItem(ring); - - return new ViewAction() { - @Override - public Matcher getConstraints() { - return ViewMatchers.isAssignableFrom(TokenCompleteTextView.class); - } - - @Override - public String getDescription() { - return "add completion token"; - } - - @Override - public void perform(UiController uiController, View view) { - ((TokenCompleteTextView) view).addObject(item); - } - }; - } - - public static ViewAction tokenViewAddToken(final Object item) { - return new ViewAction() { - @Override - public Matcher getConstraints() { - return ViewMatchers.isAssignableFrom(TokenCompleteTextView.class); - } - - @Override - public String getDescription() { - return "add completion token"; - } - - @Override - public void perform(UiController uiController, View view) { - ((TokenCompleteTextView) view).addObject(item); - } - }; - } - -} \ No newline at end of file diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/OrientationChangeAction.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/OrientationChangeAction.java deleted file mode 100644 index cdded7d7f..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/actions/OrientationChangeAction.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.sufficientlysecure.keychain.actions; - - -import java.util.Collection; - -import android.app.Activity; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.pm.ActivityInfo; -import android.support.test.espresso.UiController; -import android.support.test.espresso.ViewAction; -import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry; -import android.support.test.runner.lifecycle.Stage; -import android.view.View; - -import org.hamcrest.Matcher; - -import static android.support.test.espresso.matcher.ViewMatchers.isRoot; - -public class OrientationChangeAction implements ViewAction { - private final int orientation; - - private OrientationChangeAction(int orientation) { - this.orientation = orientation; - } - - @Override - public Matcher getConstraints() { - return isRoot(); - } - - @Override - public String getDescription() { - return "change orientation to " + orientation; - } - - @Override - public void perform(UiController uiController, View view) { - uiController.loopMainThreadUntilIdle(); - - final Activity activity = findActivity(view.getContext()); - if (activity == null){ - throw new IllegalStateException("Could not find the current activity"); - } - - activity.setRequestedOrientation(orientation); - - Collection resumedActivities = ActivityLifecycleMonitorRegistry - .getInstance().getActivitiesInStage(Stage.RESUMED); - - if (resumedActivities.isEmpty()) { - throw new RuntimeException("Could not change orientation"); - } - } - - private static Activity findActivity(Context context) { - if (context == null) - return null; - else if (context instanceof Activity) - return (Activity) context; - else if (context instanceof ContextWrapper) - return findActivity(((ContextWrapper) context).getBaseContext()); - - return null; - } - - public static ViewAction orientationLandscape() { - return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } - - public static ViewAction orientationPortrait() { - return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } -} \ No newline at end of file diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/BitmapMatcher.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/BitmapMatcher.java deleted file mode 100644 index c08847065..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/BitmapMatcher.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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 . - * - * From the droidcon anroid espresso repository. - * https://github.com/xrigau/droidcon-android-espresso/ - * - */ - -package org.sufficientlysecure.keychain.matcher; - - -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.ImageView; - -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; - - -public class BitmapMatcher extends TypeSafeMatcher { - - private final Bitmap mBitmap; - - public BitmapMatcher(Bitmap bitmap) { - super(View.class); - mBitmap = bitmap; - } - - @Override - public boolean matchesSafely(View view) { - if ( !(view instanceof ImageView) ) { - return false; - } - Drawable drawable = ((ImageView) view).getDrawable(); - return drawable != null && (drawable instanceof BitmapDrawable) - && ((BitmapDrawable) drawable).getBitmap().sameAs(mBitmap); - } - - @Override - public void describeTo(Description description) { - description.appendText("with equivalent specified bitmap"); - } - - public static BitmapMatcher withBitmap(Bitmap bitmap) { - return new BitmapMatcher(bitmap); - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/CustomMatchers.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/CustomMatchers.java deleted file mode 100644 index fd44c4ad1..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/CustomMatchers.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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.matcher; - - -import android.support.annotation.ColorRes; -import android.support.annotation.IdRes; -import android.support.test.espresso.matcher.BoundedMatcher; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.widget.ViewAnimator; - -import com.nispok.snackbar.Snackbar; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.sufficientlysecure.keychain.R; - -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withParent; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.not; -import static org.sufficientlysecure.keychain.matcher.DrawableMatcher.withDrawable; - - -public abstract class CustomMatchers { - - public static Matcher withDisplayedChild(final int child) { - return new BoundedMatcher(ViewAnimator.class) { - public void describeTo(Description description) { - description.appendText("with displayed child: " + child); - } - - @Override - public boolean matchesSafely(ViewAnimator viewAnimator) { - return viewAnimator.getDisplayedChild() == child; - } - }; - } - - public static Matcher withSnackbarLineColor(@ColorRes final int colorRes) { - return new BoundedMatcher(Snackbar.class) { - public void describeTo(Description description) { - description.appendText("with color resource id: " + colorRes); - } - - @Override - public boolean matchesSafely(Snackbar snackbar) { - return snackbar.getResources().getColor(colorRes) == snackbar.getLineColor(); - } - }; - } - - public static Matcher withKeyItemId(final long keyId) { - return new BoundedMatcher(KeyItem.class) { - @Override - public boolean matchesSafely(KeyItem item) { - return item.mKeyId == keyId; - } - - @Override - public void describeTo(Description description) { - description.appendText("with key id: " + keyId); - } - }; - } - - public static Matcher withKeyHolderId(final long keyId) { - return new BoundedMatcher(RecyclerView.ViewHolder.class) { - @Override - public void describeTo(Description description) { - description.appendText("with ViewHolder id: " + keyId); - } - - @Override - protected boolean matchesSafely(View item) { - return item.getItemId() == keyId; - } - }; - } - - public static Matcher withKeyToken(@ColorRes final long keyId) { - return new BoundedMatcher(EncryptKeyCompletionView.class) { - public void describeTo(Description description) { - description.appendText("with key id token: " + keyId); - } - - @Override - public boolean matchesSafely(EncryptKeyCompletionView tokenView) { - for (Object object : tokenView.getObjects()) { - if (object instanceof KeyItem && ((KeyItem) object).mKeyId == keyId) { - return true; - } - } - return false; - } - }; - } - - public static Matcher withRecyclerView(@IdRes int viewId) { - return allOf(isAssignableFrom(RecyclerView.class), withId(viewId)); - } - - public static Matcher isRecyclerItemView(@IdRes int recyclerId, Matcher specificChildMatcher) { - return allOf(withParent(withRecyclerView(recyclerId)), specificChildMatcher); - } - - public static Matcher withEncryptionStatus(boolean encrypted) { - - if (encrypted) { - return allOf( - hasDescendant(allOf( - withId(R.id.result_encryption_text), withText(R.string.decrypt_result_encrypted))), - hasDescendant(allOf( - withId(R.id.result_encryption_icon), withDrawable(R.drawable.status_lock_closed_24dp, true))) - ); - } else { - return allOf( - hasDescendant(allOf( - withId(R.id.result_encryption_text), withText(R.string.decrypt_result_not_encrypted))), - hasDescendant(allOf( - withId(R.id.result_encryption_icon), withDrawable(R.drawable.status_lock_open_24dp, true))) - ); - } - } - - public static Matcher withSignatureNone() { - - return allOf( - hasDescendant(allOf( - withId(R.id.result_signature_text), withText(R.string.decrypt_result_no_signature))), - hasDescendant(allOf( - withId(R.id.result_signature_icon), withDrawable(R.drawable.status_signature_invalid_cutout_24dp, true))), - hasDescendant(allOf( - withId(R.id.result_signature_layout), not(isDisplayed()))) - ); - - } - - public static Matcher withSignatureMyKey() { - - return allOf( - hasDescendant(allOf( - withId(R.id.result_signature_text), withText(R.string.decrypt_result_signature_certified))), - hasDescendant(allOf( - withId(R.id.result_signature_icon), withDrawable(R.drawable.status_signature_verified_cutout_24dp, true))), - hasDescendant(allOf( - withId(R.id.result_signature_layout), isDisplayed())) - ); - - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/DrawableMatcher.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/DrawableMatcher.java deleted file mode 100644 index da2ff87d9..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/DrawableMatcher.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2015 Xavi Rigau - * Copyright (C) 2015 Vincent Breitmoser - * - * 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 . - * - * From the droidcon anroid espresso repository. - * https://github.com/xrigau/droidcon-android-espresso/ - * - */ - -package org.sufficientlysecure.keychain.matcher; - - -import android.content.res.Resources; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; - - -public class DrawableMatcher extends TypeSafeMatcher { - - private final int mResourceId; - private final boolean mIgnoreFilters; - - public DrawableMatcher(int resourceId, boolean ignoreFilters) { - super(View.class); - mResourceId = resourceId; - mIgnoreFilters = ignoreFilters; - } - - private String resourceName = null; - private Drawable expectedDrawable = null; - - @Override - public boolean matchesSafely(View target) { - if (expectedDrawable == null) { - loadDrawableFromResources(target.getResources()); - } - if (invalidExpectedDrawable()) { - return false; - } - - if (target instanceof ImageView) { - return hasImage((ImageView) target) || hasBackground(target); - } - if (target instanceof TextView) { - return hasCompoundDrawable((TextView) target) || hasBackground(target); - } - return hasBackground(target); - } - - private void loadDrawableFromResources(Resources resources) { - try { - expectedDrawable = resources.getDrawable(mResourceId); - resourceName = resources.getResourceEntryName(mResourceId); - } catch (Resources.NotFoundException ignored) { - // view could be from a context unaware of the resource id. - } - } - - private boolean invalidExpectedDrawable() { - return expectedDrawable == null; - } - - private boolean hasImage(ImageView target) { - return isSameDrawable(target.getDrawable()); - } - - private boolean hasCompoundDrawable(TextView target) { - for (Drawable drawable : target.getCompoundDrawables()) { - if (isSameDrawable(drawable)) { - return true; - } - } - return false; - } - - private boolean hasBackground(View target) { - return isSameDrawable(target.getBackground()); - } - - private boolean isSameDrawable(Drawable drawable) { - if (drawable == null) { - return false; - } - // if those are both bitmap drawables, compare their bitmaps (ignores color filters, which is what we want!) - if (mIgnoreFilters && drawable instanceof BitmapDrawable && expectedDrawable instanceof BitmapDrawable) { - return ((BitmapDrawable) drawable).getBitmap().sameAs((((BitmapDrawable) expectedDrawable).getBitmap())); - } - return expectedDrawable.getConstantState().equals(drawable.getConstantState()); - } - - @Override - public void describeTo(Description description) { - description.appendText("with drawable from resource id: "); - description.appendValue(mResourceId); - if (resourceName != null) { - description.appendText("["); - description.appendText(resourceName); - description.appendText("]"); - } - } - - public static DrawableMatcher withDrawable(int resourceId, boolean ignoreFilters) { - return new DrawableMatcher(resourceId, ignoreFilters); - } - public static DrawableMatcher withDrawable(int resourceId) { - return new DrawableMatcher(resourceId, true); - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java deleted file mode 100644 index a1df7912f..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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.matcher; - -import android.content.Context; -import android.text.method.TransformationMethod; -import android.view.View; -import android.widget.EditText; - -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; - -public class EditTextMatchers { - - public static TypeSafeMatcher withError(final int errorResId) { - return new TypeSafeMatcher() { - - @Override - public boolean matchesSafely(View view) { - Context context = view.getContext(); - - if (view instanceof EditText) { - CharSequence error = ((EditText) view).getError(); - return error != null && error.equals(context.getString(errorResId)); - } - - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("EditText with error"); - } - - }; - } - - public static TypeSafeMatcher withTransformationMethod(final Class transformationClass) { - return new TypeSafeMatcher() { - - @Override - public boolean matchesSafely(View view) { - if (view instanceof EditText) { - TransformationMethod transformation = ((EditText) view).getTransformationMethod(); - return transformation != null && transformationClass.isInstance(transformation); - } - - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("EditText with transformation method"); - } - - }; - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceTest.java deleted file mode 100644 index ccd83a777..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceTest.java +++ /dev/null @@ -1,167 +0,0 @@ -package org.sufficientlysecure.keychain.remote; - - -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ServiceTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.LargeTest; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.openintents.openpgp.IOpenPgpService2; -import org.openintents.openpgp.util.OpenPgpApi; -import org.sufficientlysecure.keychain.R; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; - -import static android.support.test.espresso.Espresso.closeSoftKeyboard; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.cleanupForTests; - - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class OpenPgpServiceTest { - - public static final int ACTIVITY_WAIT_TIME = 2 * 1000; - - @Rule - public final ServiceTestRule mServiceRule = new ServiceTestRule(); - - private OpenPgpApi mApi; - - @Before - public void setUp() throws Exception { - Context context = InstrumentationRegistry.getTargetContext(); - - cleanupForTests(context); - - Intent serviceIntent = new Intent(context, OpenPgpService2.class); - IBinder binder = mServiceRule.bindService(serviceIntent); - - mApi = new OpenPgpApi(context, IOpenPgpService2.Stub.asInterface(binder)); - } - - @Test - public void testStuff() throws Exception { - // TODO why does this not ask for general usage permissions?! - - { - Intent intent = new Intent(); - intent.setAction(OpenPgpApi.ACTION_ENCRYPT); - intent.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); - intent.putExtra(OpenPgpApi.EXTRA_KEY_IDS, new long[]{0x9D604D2F310716A3L}); - - ByteArrayInputStream is = new ByteArrayInputStream("swag".getBytes()); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - Intent result = mApi.executeApi(intent, is, os); - - assertThat("result is pending accept", - result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR), - is(OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED)); - - PendingIntent pi = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); - pi.send(); - - Thread.sleep(ACTIVITY_WAIT_TIME); // Wait for activity to start - onView(withText(R.string.button_allow)).perform(click()); - } - - byte[] ciphertext; - { - Intent intent = new Intent(); - intent.setAction(OpenPgpApi.ACTION_ENCRYPT); - intent.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); - intent.putExtra(OpenPgpApi.EXTRA_KEY_IDS, new long[]{0x9D604D2F310716A3L}); - - ByteArrayInputStream is = new ByteArrayInputStream("swag".getBytes()); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - Intent result = mApi.executeApi(intent, is, os); - - assertThat("result is encrypt ok", - result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR), - is(OpenPgpApi.RESULT_CODE_SUCCESS)); - - ciphertext = os.toByteArray(); - } - - { // decrypt - Intent intent = new Intent(); - intent.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY); - - ByteArrayInputStream is = new ByteArrayInputStream(ciphertext); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - Intent result = mApi.executeApi(intent, is, os); - - assertThat("result is pending input", - result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR), - is(OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED)); - - PendingIntent pi = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); - pi.send(); - - Thread.sleep(ACTIVITY_WAIT_TIME); // Wait for activity to start - onView(withText(R.string.button_allow)).perform(click()); - } - - { // decrypt again, this time pending passphrase - Intent intent = new Intent(); - intent.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY); - - ByteArrayInputStream is = new ByteArrayInputStream(ciphertext); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - Intent result = mApi.executeApi(intent, is, os); - - assertThat("result is pending passphrase", - result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR), - is(OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED)); - - PendingIntent pi = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); - pi.send(); - - Thread.sleep(ACTIVITY_WAIT_TIME); // Wait for activity to start - onView(withId(R.id.passphrase_passphrase)).perform(typeText("x")); - - // Needed to correctly execute test on Travis - closeSoftKeyboard(); - Thread.sleep(1 * 1000); - - onView(withText(R.string.btn_unlock)).perform(click()); - } - - { // decrypt again, NOW it should work with passphrase cached =) - Intent intent = new Intent(); - intent.setAction(OpenPgpApi.ACTION_DECRYPT_VERIFY); - - ByteArrayInputStream is = new ByteArrayInputStream(ciphertext); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - Intent result = mApi.executeApi(intent, is, os); - - assertThat("result is decrypt ok", - result.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR), - is(OpenPgpApi.RESULT_CODE_SUCCESS)); - - byte[] plaintext = os.toByteArray(); - assertThat("decrypted plaintext matches plaintext", new String(plaintext), is("swag")); - } - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java deleted file mode 100644 index 0930ef7c4..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricFileOperationTests.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.Instrumentation.ActivityResult; -import android.content.Intent; -import android.net.Uri; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.support.test.espresso.intent.Intents; -import android.support.test.espresso.intent.rule.IntentsTestRule; -import android.widget.AdapterView; - -import org.junit.Before; -import org.junit.Rule; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.AndroidTestHelpers; -import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; - -import java.io.File; - -import static android.support.test.InstrumentationRegistry.getInstrumentation; -import static android.support.test.espresso.Espresso.onData; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; -import static android.support.test.espresso.Espresso.pressBack; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasAction; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasCategories; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasExtra; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasExtraWithKey; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasType; -import static android.support.test.espresso.matcher.ViewMatchers.assertThat; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.CoreMatchers.is; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.checkSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.getImageNames; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.importKeysFromResource; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.pickRandom; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.randomString; -import static org.sufficientlysecure.keychain.actions.CustomActions.tokenEncryptViewAddToken; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.isRecyclerItemView; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withDisplayedChild; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withEncryptionStatus; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyItemId; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSignatureMyKey; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSignatureNone; - -//TODO This test is disabled because it needs to be fixed to work with updated code -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class AsymmetricFileOperationTests { - - @Rule - public final IntentsTestRule mActivity - = new IntentsTestRule(MainActivity.class) { - @Override - protected Intent getActivityIntent() { - Intent intent = super.getActivityIntent(); - intent.putExtra(MainActivity.EXTRA_SKIP_FIRST_TIME, true); - intent.putExtra(MainActivity.EXTRA_INIT_FRAG, MainActivity.ID_ENCRYPT_DECRYPT); - return intent; - } - }; - - @Before - public void setUp() throws Exception { - Activity activity = mActivity.getActivity(); - - AndroidTestHelpers.copyFiles(); - - // import these two, make sure they're there - importKeysFromResource(activity, "x.sec.asc"); - - // make sure no passphrases are cached - PassphraseCacheService.clearCachedPassphrases(activity); - } - - //@Test - public void testFileSaveEncryptDecrypt() throws Exception { - - // navigate to 'encrypt text' - onView(withId(R.id.encrypt_files)).perform(click()); - - File file = pickRandom(getImageNames()); - File outputFile = new File(getInstrumentation().getTargetContext().getFilesDir(), "output-token.gpg"); - - { // encrypt - - // the EncryptKeyCompletionView is tested individually - onView(withId(R.id.recipient_list)).perform(tokenEncryptViewAddToken(0x9D604D2F310716A3L)); - - handleAddFileIntent(file); - onView(withId(R.id.file_list_entry_add)).perform(click()); - - handleSaveEncryptedFileIntent(outputFile); - onView(withId(R.id.encrypt_save)).perform(click()); - - assertThat("output file has been written", true, is(outputFile.exists())); - - } - - // go to decrypt from clipboard view - pressBack(); - - handleOpenFileIntentKitKat(outputFile); - onView(withId(R.id.decrypt_files)).perform(click()); - - { // decrypt - onView(withId(R.id.passphrase_passphrase)).perform(typeText("x")); - onView(withText(R.string.btn_unlock)).perform(click()); - - onView(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(file.getName())))) - .check(matches(allOf(withEncryptionStatus(true), withSignatureNone()))); - } - - { // delete original file - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(file.getName())))), - withId(R.id.context_menu))).perform(click()); - - // delete file - onView(withText(R.string.btn_delete_original)).perform(click()); - - checkSnackbar(Style.OK, R.string.file_delete_ok); - assertThat("output file has been deleted", false, is(outputFile.exists())); - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(file.getName())))), - withId(R.id.context_menu))).perform(click()); - - // delete file - onView(withText(R.string.btn_delete_original)).perform(click()); - - checkSnackbar(Style.WARN, R.string.file_delete_none); - - } - - { // save file (*after* deletion~) - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(file.getName())))), - withId(R.id.context_menu))).perform(click()); - - File savedFile = - new File(getInstrumentation().getTargetContext().getFilesDir(), "vo.png"); - handleSaveDecryptedFileIntent(savedFile, file.getName()); - - // save decrypted content - onView(withText(R.string.btn_save_file)).perform(click()); - - checkSnackbar(Style.OK, R.string.file_saved); - assertThat("decrypted file has been saved", true, is(savedFile.exists())); - - // cleanup - // noinspection ResultOfMethodCallIgnored - file.delete(); - - } - - } - - private void handleAddFileIntent(File file) { - if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { - handleAddFileIntentKitKat(file); - } else { - handleAddFileIntentOlder(file); - } - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleAddFileIntentKitKat(File file) { - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_OPEN_DOCUMENT), - hasType("*/*"), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)), - hasExtraWithKey(Intent.EXTRA_ALLOW_MULTIPLE) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - private void handleAddFileIntentOlder(File file) { - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_GET_CONTENT), - hasType("*/*"), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleSaveDecryptedFileIntent(File file, String expectedTitle) { - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_CREATE_DOCUMENT), - hasExtra("android.content.extra.SHOW_ADVANCED", true), - hasExtra(Intent.EXTRA_TITLE, expectedTitle), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleSaveEncryptedFileIntent(File file) { - - try { - //noinspection ResultOfMethodCallIgnored - file.delete(); - } catch (Exception e) { - // nvm - } - - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_CREATE_DOCUMENT), - hasType("*/*"), - hasExtra("android.content.extra.SHOW_ADVANCED", true), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleOpenFileIntentKitKat(File file) { - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_OPEN_DOCUMENT), - hasType("*/*"), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - // hasExtraWithKey(Intent.EXTRA_ALLOW_MULTIPLE) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - //@Test - public void testSignVerify() throws Exception { - - String cleartext = randomString(10, 30); - - // navigate to 'encrypt text' - onView(withId(R.id.encrypt_text)).perform(click()); - - { // sign - - onView(withId(R.id.encrypt_copy)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_empty_text); - - onView(withId(R.id.result_signature_icon)).check(matches(withDisplayedChild(0))); - onView(withId(R.id.sign)).perform(click()); - onData(withKeyItemId(0x9D604D2F310716A3L)) - .inAdapterView(isAssignableFrom(AdapterView.class)) - .perform(click()); - onView(withId(R.id.result_signature_icon)).check(matches(withDisplayedChild(1))); - - onView(withId(R.id.encrypt_text_text)).perform(typeText(cleartext)); - - onView(withId(R.id.encrypt_copy)).perform(click()); - - onView(withId(R.id.passphrase_passphrase)).perform(typeText("x")); - onView(withText(R.string.btn_unlock)).perform(click()); - - checkSnackbar(Style.OK, R.string.msg_se_success); - - } - - // go to decrypt from clipboard view - pressBack(); - - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - - { // decrypt - - onView(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown)))) - .check(matches(allOf(withEncryptionStatus(false), withSignatureMyKey()))); - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown)))), - withId(R.id.context_menu))).perform(click()); - - // check if log looks ok - onView(withText(R.string.snackbar_details)).perform(click()); - onView(withText(R.string.msg_dc_clear_signature_ok)).check(matches(isDisplayed())); - pressBack(); - - } - - } - - //@Test - public void testGeneralErrorHandling() throws Exception { - - // navigate to encrypt files fragment - onView(withId(R.id.encrypt_files)).perform(click()); - - File[] files = getImageNames(); - - { // encrypt screen - - onView(withId(R.id.encrypt_share)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_no_file_selected); - - handleAddFileIntent(files[0]); - onView(withId(R.id.file_list_entry_add)).perform(click()); - - handleAddFileIntent(files[1]); - onView(withId(R.id.file_list_entry_add)).perform(click()); - - onView(withId(R.id.encrypt_share)).perform(click()); - checkSnackbar(Style.ERROR, R.string.select_encryption_key); - - onView(withId(R.id.sign)).perform(click()); - onData(withKeyItemId(0x9D604D2F310716A3L)) - .inAdapterView(isAssignableFrom(AdapterView.class)) - .perform(click()); - - onView(withId(R.id.encrypt_share)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_detached_signature); - - // the EncryptKeyCompletionView is tested individually - onView(withId(R.id.recipient_list)).perform(tokenEncryptViewAddToken(0x9D604D2F310716A3L)); - - onView(withId(R.id.encrypt_save)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_multi_files); - - openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); - onView(withText(R.string.btn_copy_encrypted_signed)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_multi_clipboard); - - } - - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java deleted file mode 100644 index b34ea6c81..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/AsymmetricTextOperationTests.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import android.app.Activity; -import android.content.Intent; -import android.support.test.rule.ActivityTestRule; -import android.widget.AdapterView; - -import org.junit.Before; -import org.junit.Rule; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; -import org.sufficientlysecure.keychain.util.FileHelper; - -import static android.support.test.espresso.Espresso.onData; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.pressBack; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.checkSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.importKeysFromResource; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.randomString; -import static org.sufficientlysecure.keychain.actions.CustomActions.tokenEncryptViewAddToken; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.isRecyclerItemView; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withDisplayedChild; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withEncryptionStatus; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyItemId; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSignatureMyKey; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSignatureNone; - -//TODO This test is disabled because it needs to be fixed to work with updated code -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class AsymmetricTextOperationTests { - - @Rule - public final ActivityTestRule mActivity - = new ActivityTestRule(MainActivity.class) { - @Override - protected Intent getActivityIntent() { - Intent intent = super.getActivityIntent(); - intent.putExtra(MainActivity.EXTRA_SKIP_FIRST_TIME, true); - intent.putExtra(MainActivity.EXTRA_INIT_FRAG, MainActivity.ID_ENCRYPT_DECRYPT); - return intent; - } - }; - - @Before - public void setUp() throws Exception { - Activity activity = mActivity.getActivity(); - - // import these two, make sure they're there - importKeysFromResource(activity, "x.sec.asc"); - - // make sure no passphrases are cached - PassphraseCacheService.clearCachedPassphrases(activity); - } - - //@Test - public void testTextEncryptDecryptFromToken() throws Exception { - - // navigate to 'encrypt text' - onView(withId(R.id.encrypt_text)).perform(click()); - - String cleartext = randomString(10, 30); - - { // encrypt - - // the EncryptKeyCompletionView is tested individually - onView(withId(R.id.result_encryption_icon)).check(matches(withDisplayedChild(0))); - onView(withId(R.id.recipient_list)).perform(tokenEncryptViewAddToken(0x9D604D2F310716A3L)); - onView(withId(R.id.result_encryption_icon)).check(matches(withDisplayedChild(1))); - - onView(withId(R.id.encrypt_text_text)).perform(typeText(cleartext)); - - onView(withId(R.id.encrypt_copy)).perform(click()); - } - - // go to decrypt from clipboard view - pressBack(); - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - - { // decrypt - onView(withId(R.id.passphrase_passphrase)).perform(typeText("x")); - onView(withText(R.string.btn_unlock)).perform(click()); - - onView(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown_text)))) - .check(matches(allOf( - hasDescendant(withText(FileHelper.readableFileSize(cleartext.length()))), - withEncryptionStatus(true), - withSignatureNone() - ))); - - } - - } - - //@Test - public void testSignVerify() throws Exception { - - String cleartext = randomString(10, 30); - - // navigate to 'encrypt text' - onView(withId(R.id.encrypt_text)).perform(click()); - - { // sign - - onView(withId(R.id.encrypt_copy)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_empty_text); - - onView(withId(R.id.result_signature_icon)).check(matches(withDisplayedChild(0))); - onView(withId(R.id.sign)).perform(click()); - onData(withKeyItemId(0x9D604D2F310716A3L)) - .inAdapterView(isAssignableFrom(AdapterView.class)) - .perform(click()); - onView(withId(R.id.result_signature_icon)).check(matches(withDisplayedChild(1))); - - onView(withId(R.id.encrypt_text_text)).perform(typeText(cleartext)); - - onView(withId(R.id.encrypt_copy)).perform(click()); - - onView(withId(R.id.passphrase_passphrase)).perform(typeText("x")); - onView(withText(R.string.btn_unlock)).perform(click()); - - checkSnackbar(Style.OK, R.string.msg_se_success); - - } - - // go to decrypt from clipboard view - pressBack(); - - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - - { // decrypt - - onView(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown)))) - .check(matches(allOf(withEncryptionStatus(false), withSignatureMyKey()))); - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown)))), - withId(R.id.context_menu))).perform(click()); - - // check if log looks ok - onView(withText(R.string.snackbar_details)).perform(click()); - onView(withText(R.string.msg_dc_clear_signature_ok)).check(matches(isDisplayed())); - pressBack(); - - } - - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java deleted file mode 100644 index a02078d8e..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (C) 2015 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; - - -import android.support.test.espresso.matcher.ViewMatchers; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.LargeTest; -import android.text.method.HideReturnsTransformationMethod; -import android.text.method.PasswordTransformationMethod; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.sufficientlysecure.keychain.R; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.swipeLeft; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.RootMatchers.isDialog; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.hasSibling; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.allOf; -import static org.sufficientlysecure.keychain.matcher.EditTextMatchers.withError; -import static org.sufficientlysecure.keychain.matcher.EditTextMatchers.withTransformationMethod; - -//TODO This test is disabled because it needs to be fixed to work with updated code -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class CreateKeyActivityTest { - - public static final String SAMPLE_NAME = "Sample Name"; - public static final String SAMPLE_EMAIL = "sample_email@gmail.com"; - public static final String SAMPLE_ADDITIONAL_EMAIL = "sample_additional_email@gmail.com"; - public static final String SAMPLE_PASSWORD = "sample_password"; - - @Rule - public final ActivityTestRule mActivity - = new ActivityTestRule<>(CreateKeyActivity.class); - - //@Test - public void testCreateMyKey() { - /* - - mActivity.getActivity(); - - // Clicks create my key - onView(ViewMatchers.withId(R.id.create_key_create_key_button)) - .perform(click()); - - // Clicks next with empty name - onView(withId(R.id.create_key_next_button)) - .perform(click()); - onView(withId(R.id.create_key_name)) - .check(matches(withError(R.string.create_key_empty))); - - // Types name and clicks next - onView(withId(R.id.create_key_name)) - .perform(typeText(SAMPLE_NAME)); - onView(withId(R.id.create_key_next_button)) - .perform(click()); - - // Clicks next with empty email - onView(withId(R.id.create_key_next_button)) - .perform(click()); - onView(withId(R.id.create_key_email)) - .check(matches(withError(R.string.create_key_empty))); - - // Types email - onView(withId(R.id.create_key_email)) - .perform(typeText(SAMPLE_EMAIL)); - - // Adds same email as additional email and dismisses the snackbar - onView(withId(R.id.create_key_add_email)) - .perform(click()); - onView(withId(R.id.add_email_address)) - .perform(typeText(SAMPLE_EMAIL)); - onView(withText(android.R.string.ok)) - .inRoot(isDialog()) - .perform(click()); - onView(allOf(withId(R.id.sb__text), withText(R.string.create_key_email_already_exists_text))) - .check(matches(isDisplayed())); - onView(allOf(withId(R.id.sb__text), withText(R.string.create_key_email_already_exists_text))) - .perform(swipeLeft()); - - // Adds additional email - onView(withId(R.id.create_key_add_email)) - .perform(click()); - onView(withId(R.id.add_email_address)) - .perform(typeText(SAMPLE_ADDITIONAL_EMAIL)); - onView(withText(android.R.string.ok)) - .inRoot(isDialog()) - .perform(click()); - onView(withId(R.id.create_key_emails)) - .check(matches(hasDescendant(allOf(withId(R.id.create_key_email_item_email), withText(SAMPLE_ADDITIONAL_EMAIL))))); - - // Removes additional email and clicks next - onView(allOf(withId(R.id.create_key_email_item_delete_button), hasSibling(allOf(withId(R.id.create_key_email_item_email), withText(SAMPLE_ADDITIONAL_EMAIL))))) - .perform(click()) - .check(doesNotExist()); - onView(withId(R.id.create_key_next_button)) - .perform(click(click())); - - // Clicks next with empty password - onView(withId(R.id.create_key_next_button)) - .perform(click()); - onView(withId(R.id.create_key_passphrase)) - .check(matches(withError(R.string.create_key_empty))); - - // Types password - onView(withId(R.id.create_key_passphrase)) - .perform(typeText(SAMPLE_PASSWORD)); - - // Clicks next with empty confirm password - onView(withId(R.id.create_key_next_button)) - .perform(click()); - onView(withId(R.id.create_key_passphrase_again)) - .check(matches(withError(R.string.create_key_passphrases_not_equal))); - - // Types confirm password - onView(withId(R.id.create_key_passphrase_again)) - .perform(typeText(SAMPLE_PASSWORD)); - - // Clicks show password twice and clicks next - onView(withId(R.id.create_key_show_passphrase)) - .perform(click()); - onView(withId(R.id.create_key_passphrase)) - .check(matches(withTransformationMethod(HideReturnsTransformationMethod.class))); - onView(withId(R.id.create_key_passphrase_again)) - .check(matches(withTransformationMethod(HideReturnsTransformationMethod.class))); - onView(withId(R.id.create_key_show_passphrase)) - .perform(click()); - onView(withId(R.id.create_key_passphrase)) - .check(matches(withTransformationMethod(PasswordTransformationMethod.class))); - onView(withId(R.id.create_key_passphrase_again)) - .check(matches(withTransformationMethod(PasswordTransformationMethod.class))); - onView(withId(R.id.create_key_next_button)) - .perform(click()); - - // Verifies name and email - onView(withId(R.id.name)) - .check(matches(withText(SAMPLE_NAME))); - onView(withId(R.id.email)) - .check(matches(withText(SAMPLE_EMAIL))); - - // Verifies backstack - onView(withId(R.id.create_key_back_button)) - .perform(click()); - onView(withId(R.id.create_key_back_button)) - .perform(click()); - onView(withId(R.id.create_key_back_button)) - .perform(click()); - - onView(withId(R.id.create_key_name)) - .check(matches(withText(SAMPLE_NAME))); - onView(withId(R.id.create_key_next_button)) - .perform(click()); - - onView(withId(R.id.create_key_email)) - .check(matches(withText(SAMPLE_EMAIL))); - onView(withId(R.id.create_key_next_button)) - .perform(click()); - - // TODO: Uncomment when fixed in main -// onView(withId(R.id.create_key_passphrase)) -// .check(matches(withText(SAMPLE_PASSWORD))); -// onView(withId(R.id.create_key_passphrase_again)) -// .check(matches(withText(SAMPLE_PASSWORD))); - onView(withId(R.id.create_key_next_button)) - .perform(click()); - - onView(withId(R.id.name)) - .check(matches(withText(SAMPLE_NAME))); - onView(withId(R.id.email)) - .check(matches(withText(SAMPLE_EMAIL))); - - // Clicks create key - onView(withId(R.id.create_key_next_button)) - .perform(click()); - */ - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/EditKeyTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/EditKeyTest.java deleted file mode 100644 index 75429dd89..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/EditKeyTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import android.app.Activity; -import android.content.Intent; -import android.support.test.rule.ActivityTestRule; -import android.support.v7.widget.RecyclerView; - -import org.junit.FixMethodOrder; -import org.junit.Rule; -import org.junit.runners.MethodSorters; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.KeychainDatabase; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnHolderItem; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.checkSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.importKeysFromResource; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyHolderId; - - -//TODO This test is disabled because it needs to be fixed to work with updated code -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class EditKeyTest { - - @Rule - public final ActivityTestRule mActivity - = new ActivityTestRule(MainActivity.class) { - @Override - protected Intent getActivityIntent() { - Intent intent = super.getActivityIntent(); - intent.putExtra(MainActivity.EXTRA_SKIP_FIRST_TIME, true); - return intent; - } - }; - - //@Test - public void test01Edit() throws Exception { - Activity activity = mActivity.getActivity(); - - // KeychainDatabase.getInstance(activity).clearDatabase(); - - // import key for testing, get a stable initial state - importKeysFromResource(activity, "x.sec.asc"); - - // navigate to edit key dialog - onView(allOf( - isAssignableFrom(RecyclerView.class), - withId(android.R.id.list))) - .perform(actionOnHolderItem( - withKeyHolderId(0x9D604D2F310716A3L), click())); - - onView(withId(R.id.view_key_card_user_ids_edit)).perform(click()); - - // no-op should yield snackbar - onView(withText(R.string.btn_save)).perform(click()); - checkSnackbar(Style.ERROR, R.string.msg_mf_error_noop); - - } - - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java deleted file mode 100644 index 74b79f020..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/MiscCryptOperationTests.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.Instrumentation.ActivityResult; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build.VERSION_CODES; -import android.support.test.espresso.intent.Intents; -import android.support.test.espresso.intent.rule.IntentsTestRule; -import android.support.v7.widget.RecyclerView; - -import org.junit.Before; -import org.junit.Rule; -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.AndroidTestHelpers; -import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; -import org.sufficientlysecure.keychain.util.Preferences; - -import java.io.File; - -import static android.support.test.InstrumentationRegistry.getInstrumentation; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; -import static android.support.test.espresso.Espresso.pressBack; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnHolderItem; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasAction; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasCategories; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasType; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.hasSibling; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.isChecked; -import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static android.support.test.espresso.matcher.ViewMatchers.isNotChecked; -import static android.support.test.espresso.matcher.ViewMatchers.withChild; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.checkSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.dismissSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.getImageNames; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.importKeysFromResource; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.pickRandom; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.randomString; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.isRecyclerItemView; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withDisplayedChild; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyHolderId; -import static org.sufficientlysecure.keychain.matcher.DrawableMatcher.withDrawable; - -//TODO This test is disabled because it needs to be fixed to work with updated code -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class MiscCryptOperationTests { - - @Rule - public final IntentsTestRule mActivityRule - = new IntentsTestRule(MainActivity.class) { - @Override - protected Intent getActivityIntent() { - Intent intent = super.getActivityIntent(); - intent.putExtra(MainActivity.EXTRA_SKIP_FIRST_TIME, true); - intent.putExtra(MainActivity.EXTRA_INIT_FRAG, MainActivity.ID_ENCRYPT_DECRYPT); - return intent; - } - }; - private Activity mActivity; - - @Before - public void setUp() throws Exception { - // clear dis shit - Preferences.getPreferences(getInstrumentation().getTargetContext()).clear(); - - mActivity = mActivityRule.getActivity(); - - AndroidTestHelpers.copyFiles(); - - // import these two, make sure they're there - importKeysFromResource(mActivity, "x.sec.asc"); - - // make sure no passphrases are cached - PassphraseCacheService.clearCachedPassphrases(mActivity); - } - - //@Test - public void testDecryptNonPgpFile() throws Exception { - - // decrypt any non-pgp file - File file = pickRandom(getImageNames()); - handleOpenFileIntentKitKat(file); - onView(withId(R.id.decrypt_files)).perform(click()); - - { // decrypt - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(allOf( - hasDescendant(withDrawable(R.drawable.status_signature_invalid_cutout_24dp, true)), - hasDescendant(withText(R.string.msg_dc_error_invalid_data)))))), - withId(R.id.result_error_log))).perform(click()); - - } - - } - - //@Test - public void testDecryptEmptySelection() throws Exception { - - // decrypt any non-pgp file - handleOpenFileEmptyKitKat(); - onView(withId(R.id.decrypt_files)).perform(click()); - - checkSnackbar(Style.ERROR, R.string.no_file_selected); - - } - - //@Test - public void testDecryptEmptyClipboard() throws Exception { - - // decrypt any non-pgp file - ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setPrimaryClip(ClipData.newPlainText("", "")); - - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - checkSnackbar(Style.ERROR, R.string.error_clipboard_empty); - - } - - //@Test - public void testDecryptNonPgpClipboard() throws Exception { - - // decrypt any non-pgp file - ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText(Constants.CLIPBOARD_LABEL, randomString(0, 50)); - clipboard.setPrimaryClip(clip); - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - - { // decrypt - - // open context menu - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(allOf( - hasDescendant(withDrawable(R.drawable.status_signature_invalid_cutout_24dp, true)), - hasDescendant(withText(R.string.msg_dc_error_invalid_data)))))), - withId(R.id.result_error_log))).perform(click()); - - } - - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleOpenFileEmptyKitKat() { - Intent data = new Intent(); - data.setData(null); - - Intents.intending(allOf( - hasAction(Intent.ACTION_OPEN_DOCUMENT), - hasType("*/*"), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - // hasExtraWithKey(Intent.EXTRA_ALLOW_MULTIPLE) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - @TargetApi(VERSION_CODES.KITKAT) - private void handleOpenFileIntentKitKat(File file) { - Intent data = new Intent(); - data.setData(Uri.fromFile(file)); - - Intents.intending(allOf( - hasAction(Intent.ACTION_OPEN_DOCUMENT), - hasType("*/*"), - hasCategories(hasItem(Intent.CATEGORY_OPENABLE)) - // hasExtraWithKey(Intent.EXTRA_ALLOW_MULTIPLE) - )).respondWith( - new ActivityResult(Activity.RESULT_OK, data) - ); - } - - //@Test - public void testEncryptTokenFromKeyView() throws Exception { - onView(allOf( - isAssignableFrom(RecyclerView.class), - withId(android.R.id.list))) - .perform(actionOnHolderItem( - withKeyHolderId(0x9D604D2F310716A3L), click())); - - onView(withId(R.id.view_key_action_encrypt_text)).perform(click()); - - // make sure the encrypt is correctly set - onView(withId(R.id.result_encryption_icon)).check(matches(withDisplayedChild(1))); - // TODO check token id - - } - - //@Test - public void testMenuSaveDefault() throws Exception { - - onView(withId(R.id.encrypt_files)).perform(click()); - - { // save checked options - - openActionBarOverflowOrOptionsMenu(mActivity); - - // check initial button states - onView(allOf(withId(R.id.checkbox), - hasSibling(withChild(withText(R.string.label_delete_after_encryption))))) - .check(matches(isNotChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_enable_compression))))) - .check(matches(isChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_encrypt_filenames))))) - .check(matches(isChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_file_ascii_armor))))) - .check(matches(isNotChecked())); - - // press some buttons - - onView(withText(R.string.label_enable_compression)).perform(click()); - checkSnackbar(Style.OK, R.string.snack_compression_off); - onView(withText(R.string.btn_save_default)).perform(click()); - checkSnackbar(Style.OK, R.string.btn_saved); - dismissSnackbar(); - - openActionBarOverflowOrOptionsMenu(mActivity); - onView(withText(R.string.label_encrypt_filenames)).perform(click()); - checkSnackbar(Style.OK, R.string.snack_encrypt_filenames_off); - onView(withText(R.string.btn_save_default)).perform(click()); - checkSnackbar(Style.OK, R.string.btn_saved); - dismissSnackbar(); - - openActionBarOverflowOrOptionsMenu(mActivity); - onView(withText(R.string.label_file_ascii_armor)).perform(click()); - checkSnackbar(Style.OK, R.string.snack_armor_on); - onView(withText(R.string.btn_save_default)).perform(click()); - checkSnackbar(Style.OK, R.string.btn_saved); - dismissSnackbar(); - - } - - pressBack(); - onView(withId(R.id.encrypt_files)).perform(click()); - - { // save checked options - - openActionBarOverflowOrOptionsMenu(mActivity); - - // check initial button states (as saved from before!) - onView(allOf(withId(R.id.checkbox), - hasSibling(withChild(withText(R.string.label_delete_after_encryption))))) - .check(matches(isNotChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_enable_compression))))) - .check(matches(isNotChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_encrypt_filenames))))) - .check(matches(isNotChecked())); - onView(allOf(withId(R.id.checkbox), hasSibling(withChild(withText(R.string.label_file_ascii_armor))))) - .check(matches(isChecked())); - - } - - } - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/SymmetricTextOperationTests.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/SymmetricTextOperationTests.java deleted file mode 100644 index b51be1e09..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/SymmetricTextOperationTests.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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; - - -import android.app.Activity; -import android.app.Instrumentation.ActivityResult; -import android.content.Intent; -import android.support.test.espresso.intent.rule.IntentsTestRule; - -import org.junit.FixMethodOrder; -import org.junit.Rule; -import org.junit.runners.MethodSorters; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.provider.TemporaryFileProvider; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; - -import static android.support.test.InstrumentationRegistry.getInstrumentation; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; -import static android.support.test.espresso.Espresso.pressBack; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.intent.Intents.intending; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasAction; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasData; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasExtra; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasExtraWithKey; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasFlags; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasType; -import static android.support.test.espresso.intent.matcher.UriMatchers.hasHost; -import static android.support.test.espresso.intent.matcher.UriMatchers.hasScheme; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.Matchers.equalTo; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.checkSnackbar; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.randomString; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.isRecyclerItemView; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withEncryptionStatus; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withSignatureNone; - -//TODO This test is disabled because it needs to be fixed to work with updated code -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class SymmetricTextOperationTests { - - public static final String PASSPHRASE = randomString(5, 20); - - @Rule - public final IntentsTestRule mActivity - = new IntentsTestRule(MainActivity.class) { - @Override - protected Intent getActivityIntent() { - Intent intent = super.getActivityIntent(); - intent.putExtra(MainActivity.EXTRA_SKIP_FIRST_TIME, true); - intent.putExtra(MainActivity.EXTRA_INIT_FRAG, MainActivity.ID_ENCRYPT_DECRYPT); - return intent; - } - }; - - //@Test - public void testSymmetricCryptClipboard() throws Exception { - - mActivity.getActivity(); - - String text = randomString(10, 30); - - // navigate to encrypt/decrypt - onView(withId(R.id.encrypt_text)).perform(click()); - - { - onView(withId(R.id.encrypt_text_text)).perform(typeText(text)); - - openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); - onView(withText(R.string.label_symmetric)).perform(click()); - - onView(withId(R.id.passphrase)).perform(typeText(PASSPHRASE)); - - onView(withId(R.id.encrypt_copy)).perform(click()); - - checkSnackbar(Style.ERROR, R.string.passphrases_do_not_match); - - onView(withId(R.id.passphraseAgain)).perform(typeText(PASSPHRASE)); - - onView(withId(R.id.encrypt_text_text)).check(matches(withText(text))); - - onView(withId(R.id.encrypt_copy)).perform(click()); - - checkSnackbar(Style.OK, R.string.msg_se_success); - } - - // go to decrypt from clipboard view - pressBack(); - onView(withId(R.id.decrypt_from_clipboard)).perform(click()); - - { - onView(withId(R.id.passphrase_passphrase)).perform(typeText(PASSPHRASE)); - onView(withText(R.string.btn_unlock)).perform(click()); - - onView(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown_text)))) - .check(matches(allOf(withEncryptionStatus(true), withSignatureNone()))); - - intending(allOf( - hasAction("android.intent.action.CHOOSER"), - hasExtra(equalTo(Intent.EXTRA_INTENT), allOf( - hasAction(Intent.ACTION_VIEW), - hasFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION), - hasData(allOf(hasScheme("content"), hasHost(TemporaryFileProvider.AUTHORITY))), - hasType("text/plain") - )) - )).respondWith(new ActivityResult(Activity.RESULT_OK, null)); - - onView(allOf(isDescendantOfA(isRecyclerItemView(R.id.decrypted_files_list, - hasDescendant(withText(R.string.filename_unknown_text)))), - withId(R.id.file))).perform(click()); - - } - - } - - //@Test - public void testSymmetricCryptShare() throws Exception { - - mActivity.getActivity(); - - String text = randomString(10, 30); - - // navigate to encrypt/decrypt - onView(withId(R.id.encrypt_text)).perform(click()); - - { - onView(withId(R.id.encrypt_text_text)).perform(typeText(text)); - - openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); - onView(withText(R.string.label_symmetric)).perform(click()); - - onView(withId(R.id.passphrase)).perform(typeText(PASSPHRASE)); - - onView(withId(R.id.passphraseAgain)).perform(typeText(PASSPHRASE)); - - onView(withId(R.id.encrypt_text_text)).check(matches(withText(text))); - - intending(allOf( - hasAction("android.intent.action.CHOOSER"), - hasExtra(equalTo(Intent.EXTRA_INTENT), allOf( - hasAction(Intent.ACTION_SEND), - hasFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION), - hasExtraWithKey(Intent.EXTRA_TEXT), - hasType("text/plain") - )) - )).respondWith(new ActivityResult(Activity.RESULT_OK, null)); - - onView(withId(R.id.encrypt_share)).perform(click()); - - } - - } - - -} diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionViewTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionViewTest.java deleted file mode 100644 index 554df0a51..000000000 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionViewTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2015 Vincent Breitmoser - * - * 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.widget; - - -import android.app.Activity; -import android.content.Intent; -import android.support.test.espresso.action.ViewActions; -import android.support.test.espresso.matcher.RootMatchers; -import android.support.test.espresso.matcher.ViewMatchers; -import android.support.test.rule.ActivityTestRule; -import android.view.KeyEvent; -import android.widget.AdapterView; - -import org.junit.Rule; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.EncryptTextActivity; - -import static android.support.test.espresso.Espresso.onData; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static org.hamcrest.CoreMatchers.allOf; -import static org.sufficientlysecure.keychain.AndroidTestHelpers.importKeysFromResource; -import static org.sufficientlysecure.keychain.actions.CustomActions.tokenEncryptViewAddToken; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyItemId; -import static org.sufficientlysecure.keychain.matcher.CustomMatchers.withKeyToken; - - -//TODO This test is disabled because it needs to be fixed to work with updated code -//@RunWith(AndroidJUnit4.class) -//@LargeTest -public class EncryptKeyCompletionViewTest { - - @Rule - public final ActivityTestRule mActivity - = new ActivityTestRule<>(EncryptTextActivity.class); - - //@Test - public void testTextEncryptDecryptFromToken() throws Exception { - - Intent intent = new Intent(); - intent.putExtra(EncryptTextActivity.EXTRA_ENCRYPTION_KEY_IDS, new long[]{0x9D604D2F310716A3L}); - Activity activity = mActivity.launchActivity(intent); - - // import these two, make sure they're there - importKeysFromResource(activity, "x.sec.asc"); - - // check if the element passed in from intent - onView(ViewMatchers.withId(R.id.recipient_list)).check(matches(withKeyToken(0x9D604D2F310716A3L))); - onView(withId(R.id.recipient_list)).perform(ViewActions.pressKey(KeyEvent.KEYCODE_DEL)); - - // type X, select from list, check if it's there - onView(withId(R.id.recipient_list)).perform(typeText("x")); - onData(withKeyItemId(0x9D604D2F310716A3L)).inRoot(RootMatchers.isPlatformPopup()) - .inAdapterView(allOf(isAssignableFrom(AdapterView.class), - hasDescendant(withId(R.id.key_list_item_name)))).perform(click()); - onView(withId(R.id.recipient_list)).check(matches(withKeyToken(0x9D604D2F310716A3L))); - onView(withId(R.id.recipient_list)).perform(ViewActions.pressKey(KeyEvent.KEYCODE_DEL)); - onView(withId(R.id.recipient_list)).perform(ViewActions.pressKey(KeyEvent.KEYCODE_DEL)); - - // add directly, check if it's there - onView(withId(R.id.recipient_list)).perform(tokenEncryptViewAddToken(0x9D604D2F310716A3L)); - onView(withId(R.id.recipient_list)).check(matches(withKeyToken(0x9D604D2F310716A3L))); - onView(withId(R.id.recipient_list)).perform(ViewActions.pressKey(KeyEvent.KEYCODE_DEL)); - - } - -} diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index 2d3ec5fc8..eb99d3ff6 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -166,16 +166,6 @@ - - - 0) { - throw new IllegalStateException("ScrollView can host only one direct child"); - } else { - super.addView(child); - } - } - - public void addView(View child, int index) { - if(this.getChildCount() > 0) { - throw new IllegalStateException("ScrollView can host only one direct child"); - } else { - super.addView(child, index); - } - } - - public void addView(View child, LayoutParams params) { - if(this.getChildCount() > 0) { - throw new IllegalStateException("ScrollView can host only one direct child"); - } else { - super.addView(child, params); - } - } - - public void addView(View child, int index, LayoutParams params) { - if(this.getChildCount() > 0) { - throw new IllegalStateException("ScrollView can host only one direct child"); - } else { - super.addView(child, index, params); - } - } - - private boolean canScroll() { - View child = this.getChildAt(0); - if(child != null) { - int childHeight = child.getHeight(); - return this.getHeight() < childHeight + this.getPaddingTop() + this.getPaddingBottom(); - } else { - return false; - } - } - - public boolean isFillViewport() { - return this.mFillViewport; - } - - public void setFillViewport(boolean fillViewport) { - if(fillViewport != this.mFillViewport) { - this.mFillViewport = fillViewport; - this.requestLayout(); - } - - } - - public boolean isSmoothScrollingEnabled() { - return this.mSmoothScrollingEnabled; - } - - public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) { - this.mSmoothScrollingEnabled = smoothScrollingEnabled; - } - - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if(this.mFillViewport) { - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - if(heightMode != 0) { - if(this.getChildCount() > 0) { - View child = this.getChildAt(0); - int height = this.getMeasuredHeight(); - if(child.getMeasuredHeight() < height) { - android.widget.FrameLayout.LayoutParams lp = (android.widget.FrameLayout.LayoutParams)child.getLayoutParams(); - int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, this.getPaddingLeft() + this.getPaddingRight(), lp.width); - height -= this.getPaddingTop(); - height -= this.getPaddingBottom(); - //noinspection ResourceType - int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, 1073741824); - child.measure(childWidthMeasureSpec, childHeightMeasureSpec); - } - } - - } - } - } - - public boolean dispatchKeyEvent(KeyEvent event) { - return super.dispatchKeyEvent(event) || this.executeKeyEvent(event); - } - - public boolean executeKeyEvent(KeyEvent event) { - this.mTempRect.setEmpty(); - if(this.canScroll()) { - boolean handled1 = false; - if(event.getAction() == 0) { - switch(event.getKeyCode()) { - case 19: - if(!event.isAltPressed()) { - handled1 = this.arrowScroll(33); - } else { - handled1 = this.fullScroll(33); - } - break; - case 20: - if(!event.isAltPressed()) { - handled1 = this.arrowScroll(130); - } else { - handled1 = this.fullScroll(130); - } - break; - case 62: - this.pageScroll(event.isShiftPressed()?33:130); - } - } - - return handled1; - } else if(this.isFocused() && event.getKeyCode() != 4) { - View handled = this.findFocus(); - if(handled == this) { - handled = null; - } - - View nextFocused = FocusFinder.getInstance().findNextFocus(this, handled, 130); - return nextFocused != null && nextFocused != this && nextFocused.requestFocus(130); - } else { - return false; - } - } - - private boolean inChild(int x, int y) { - if(this.getChildCount() <= 0) { - return false; - } else { - int scrollY = this.getScrollY(); - View child = this.getChildAt(0); - return y >= child.getTop() - scrollY && y < child.getBottom() - scrollY && x >= child.getLeft() && x < child.getRight(); - } - } - - private void initOrResetVelocityTracker() { - if(this.mVelocityTracker == null) { - this.mVelocityTracker = VelocityTracker.obtain(); - } else { - this.mVelocityTracker.clear(); - } - - } - - private void initVelocityTrackerIfNotExists() { - if(this.mVelocityTracker == null) { - this.mVelocityTracker = VelocityTracker.obtain(); - } - - } - - private void recycleVelocityTracker() { - if(this.mVelocityTracker != null) { - this.mVelocityTracker.recycle(); - this.mVelocityTracker = null; - } - - } - - public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { - if(disallowIntercept) { - this.recycleVelocityTracker(); - } - - super.requestDisallowInterceptTouchEvent(disallowIntercept); - } - - public boolean onInterceptTouchEvent(MotionEvent ev) { - int action = ev.getAction(); - if(action == 2 && this.mIsBeingDragged) { - return true; - } else if(this.getScrollY() == 0 && !ViewCompat.canScrollVertically(this, 1)) { - return false; - } else { - int y; - switch(action & 255) { - case 0: - y = (int)ev.getY(); - if(!this.inChild((int)ev.getX(), y)) { - this.mIsBeingDragged = false; - this.recycleVelocityTracker(); - } else { - this.mLastMotionY = y; - this.mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - this.initOrResetVelocityTracker(); - this.mVelocityTracker.addMovement(ev); - this.mIsBeingDragged = !this.mScroller.isFinished(); - this.startNestedScroll(2); - } - break; - case 1: - case 3: - this.mIsBeingDragged = false; - this.mActivePointerId = -1; - this.recycleVelocityTracker(); - this.stopNestedScroll(); - break; - case 2: - y = this.mActivePointerId; - if(y != -1) { - int pointerIndex = MotionEventCompat.findPointerIndex(ev, y); - if(pointerIndex == -1) { - Timber.e("Invalid pointerId=" + y + " in onInterceptTouchEvent"); - } else { - int y1 = (int)MotionEventCompat.getY(ev, pointerIndex); - int yDiff = Math.abs(y1 - this.mLastMotionY); - if(yDiff > this.mTouchSlop && (this.getNestedScrollAxes() & 2) == 0) { - this.mIsBeingDragged = true; - this.mLastMotionY = y1; - this.initVelocityTrackerIfNotExists(); - this.mVelocityTracker.addMovement(ev); - this.mNestedYOffset = 0; - ViewParent parent = this.getParent(); - if(parent != null) { - parent.requestDisallowInterceptTouchEvent(true); - } - } - } - } - case 4: - case 5: - default: - break; - case 6: - this.onSecondaryPointerUp(ev); - } - - return this.mIsBeingDragged; - } - } - - public boolean onTouchEvent(MotionEvent ev) { - this.initVelocityTrackerIfNotExists(); - MotionEvent vtev = MotionEvent.obtain(ev); - int actionMasked = MotionEventCompat.getActionMasked(ev); - if(actionMasked == 0) { - this.mNestedYOffset = 0; - } - - vtev.offsetLocation(0.0F, (float)this.mNestedYOffset); - int index; - int initialVelocity; - switch(actionMasked) { - case 0: - if(this.getChildCount() == 0) { - return false; - } - - if(this.mIsBeingDragged = !this.mScroller.isFinished()) { - ViewParent activePointerIndex1 = this.getParent(); - if(activePointerIndex1 != null) { - activePointerIndex1.requestDisallowInterceptTouchEvent(true); - } - } - - if(!this.mScroller.isFinished()) { - this.mScroller.abortAnimation(); - } - - this.mLastMotionY = (int)ev.getY(); - this.mActivePointerId = MotionEventCompat.getPointerId(ev, 0); - this.startNestedScroll(2); - break; - case 1: - if(this.mIsBeingDragged) { - VelocityTracker index2 = this.mVelocityTracker; - index2.computeCurrentVelocity(1000, (float)this.mMaximumVelocity); - initialVelocity = (int) VelocityTrackerCompat.getYVelocity(index2, this.mActivePointerId); - if(Math.abs(initialVelocity) > this.mMinimumVelocity) { - this.flingWithNestedDispatch(-initialVelocity); - } - - this.mActivePointerId = -1; - this.endDrag(); - } - break; - case 2: - int activePointerIndex = MotionEventCompat.findPointerIndex(ev, this.mActivePointerId); - if(activePointerIndex == -1) { - Timber.e("Invalid pointerId=" + this.mActivePointerId + " in onTouchEvent"); - } else { - int y = (int)MotionEventCompat.getY(ev, activePointerIndex); - int deltaY = this.mLastMotionY - y; - if(this.dispatchNestedPreScroll(0, deltaY, this.mScrollConsumed, this.mScrollOffset)) { - deltaY -= this.mScrollConsumed[1]; - vtev.offsetLocation(0.0F, (float)this.mScrollOffset[1]); - this.mNestedYOffset += this.mScrollOffset[1]; - } - - if(!this.mIsBeingDragged && Math.abs(deltaY) > this.mTouchSlop) { - ViewParent index1 = this.getParent(); - if(index1 != null) { - index1.requestDisallowInterceptTouchEvent(true); - } - - this.mIsBeingDragged = true; - if(deltaY > 0) { - deltaY -= this.mTouchSlop; - } else { - deltaY += this.mTouchSlop; - } - } - - if(this.mIsBeingDragged) { - this.mLastMotionY = y - this.mScrollOffset[1]; - index = this.getScrollY(); - initialVelocity = this.getScrollRange(); - int overscrollMode = ViewCompat.getOverScrollMode(this); - boolean canOverscroll = overscrollMode == 0 || overscrollMode == 1 && initialVelocity > 0; - if(this.overScrollByCompat(0, deltaY, 0, this.getScrollY(), 0, initialVelocity, 0, 0, true) && !this.hasNestedScrollingParent()) { - this.mVelocityTracker.clear(); - } - - int scrolledDeltaY = this.getScrollY() - index; - int unconsumedY = deltaY - scrolledDeltaY; - if(this.dispatchNestedScroll(0, scrolledDeltaY, 0, unconsumedY, this.mScrollOffset)) { - this.mLastMotionY -= this.mScrollOffset[1]; - vtev.offsetLocation(0.0F, (float)this.mScrollOffset[1]); - this.mNestedYOffset += this.mScrollOffset[1]; - } else if(canOverscroll) { - this.ensureGlows(); - int pulledToY = index + deltaY; - if(pulledToY < 0) { - this.mEdgeGlowTop.onPull((float)deltaY / (float)this.getHeight(), MotionEventCompat.getX(ev, activePointerIndex) / (float)this.getWidth()); - if(!this.mEdgeGlowBottom.isFinished()) { - this.mEdgeGlowBottom.onRelease(); - } - } else if(pulledToY > initialVelocity) { - this.mEdgeGlowBottom.onPull((float)deltaY / (float)this.getHeight(), 1.0F - MotionEventCompat.getX(ev, activePointerIndex) / (float)this.getWidth()); - if(!this.mEdgeGlowTop.isFinished()) { - this.mEdgeGlowTop.onRelease(); - } - } - - if(this.mEdgeGlowTop != null && (!this.mEdgeGlowTop.isFinished() || !this.mEdgeGlowBottom.isFinished())) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - } - } - break; - case 3: - if(this.mIsBeingDragged && this.getChildCount() > 0) { - this.mActivePointerId = -1; - this.endDrag(); - } - case 4: - default: - break; - case 5: - index = MotionEventCompat.getActionIndex(ev); - this.mLastMotionY = (int)MotionEventCompat.getY(ev, index); - this.mActivePointerId = MotionEventCompat.getPointerId(ev, index); - break; - case 6: - this.onSecondaryPointerUp(ev); - this.mLastMotionY = (int)MotionEventCompat.getY(ev, MotionEventCompat.findPointerIndex(ev, this.mActivePointerId)); - } - - if(this.mVelocityTracker != null) { - this.mVelocityTracker.addMovement(vtev); - } - - vtev.recycle(); - return true; - } - - private void onSecondaryPointerUp(MotionEvent ev) { - int pointerIndex = (ev.getAction() & '\uff00') >> 8; - int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); - if(pointerId == this.mActivePointerId) { - int newPointerIndex = pointerIndex == 0?1:0; - this.mLastMotionY = (int)MotionEventCompat.getY(ev, newPointerIndex); - this.mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); - if(this.mVelocityTracker != null) { - this.mVelocityTracker.clear(); - } - } - - } - - public boolean onGenericMotionEvent(MotionEvent event) { - if((MotionEventCompat.getSource(event) & 2) != 0) { - switch(event.getAction()) { - case 8: - if(!this.mIsBeingDragged) { - float vscroll = MotionEventCompat.getAxisValue(event, 9); - if(vscroll != 0.0F) { - int delta = (int)(vscroll * this.getVerticalScrollFactorCompat()); - int range = this.getScrollRange(); - int oldScrollY = this.getScrollY(); - int newScrollY = oldScrollY - delta; - if(newScrollY < 0) { - newScrollY = 0; - } else if(newScrollY > range) { - newScrollY = range; - } - - if(newScrollY != oldScrollY) { - super.scrollTo(this.getScrollX(), newScrollY); - return true; - } - } - } - } - } - - return false; - } - - private float getVerticalScrollFactorCompat() { - if(this.mVerticalScrollFactor == 0.0F) { - TypedValue outValue = new TypedValue(); - Context context = this.getContext(); - if(!context.getTheme().resolveAttribute(16842829, outValue, true)) { - throw new IllegalStateException("Expected theme to define listPreferredItemHeight."); - } - - this.mVerticalScrollFactor = outValue.getDimension(context.getResources().getDisplayMetrics()); - } - - return this.mVerticalScrollFactor; - } - - protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { - super.scrollTo(scrollX, scrollY); - } - - boolean overScrollByCompat(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { - int overScrollMode = ViewCompat.getOverScrollMode(this); - boolean canScrollHorizontal = this.computeHorizontalScrollRange() > this.computeHorizontalScrollExtent(); - boolean canScrollVertical = this.computeVerticalScrollRange() > this.computeVerticalScrollExtent(); - boolean overScrollHorizontal = overScrollMode == 0 || overScrollMode == 1 && canScrollHorizontal; - boolean overScrollVertical = overScrollMode == 0 || overScrollMode == 1 && canScrollVertical; - int newScrollX = scrollX + deltaX; - if(!overScrollHorizontal) { - maxOverScrollX = 0; - } - - int newScrollY = scrollY + deltaY; - if(!overScrollVertical) { - maxOverScrollY = 0; - } - - int left = -maxOverScrollX; - int right = maxOverScrollX + scrollRangeX; - int top = -maxOverScrollY; - int bottom = maxOverScrollY + scrollRangeY; - boolean clampedX = false; - if(newScrollX > right) { - newScrollX = right; - clampedX = true; - } else if(newScrollX < left) { - newScrollX = left; - clampedX = true; - } - - boolean clampedY = false; - if(newScrollY > bottom) { - newScrollY = bottom; - clampedY = true; - } else if(newScrollY < top) { - newScrollY = top; - clampedY = true; - } - - this.onOverScrolled(newScrollX, newScrollY, clampedX, clampedY); - return clampedX || clampedY; - } - - private int getScrollRange() { - int scrollRange = 0; - if(this.getChildCount() > 0) { - View child = this.getChildAt(0); - scrollRange = Math.max(0, child.getHeight() - (this.getHeight() - this.getPaddingBottom() - this.getPaddingTop())); - } - - return scrollRange; - } - - private View findFocusableViewInBounds(boolean topFocus, int top, int bottom) { - //noinspection ResourceType - ArrayList focusables = this.getFocusables(2); - View focusCandidate = null; - boolean foundFullyContainedFocusable = false; - int count = focusables.size(); - - for(int i = 0; i < count; ++i) { - View view = (View)focusables.get(i); - int viewTop = view.getTop(); - int viewBottom = view.getBottom(); - if(top < viewBottom && viewTop < bottom) { - boolean viewIsFullyContained = top < viewTop && viewBottom < bottom; - if(focusCandidate == null) { - focusCandidate = view; - foundFullyContainedFocusable = viewIsFullyContained; - } else { - boolean viewIsCloserToBoundary = topFocus && viewTop < focusCandidate.getTop() || !topFocus && viewBottom > focusCandidate.getBottom(); - if(foundFullyContainedFocusable) { - if(viewIsFullyContained && viewIsCloserToBoundary) { - focusCandidate = view; - } - } else if(viewIsFullyContained) { - focusCandidate = view; - foundFullyContainedFocusable = true; - } else if(viewIsCloserToBoundary) { - focusCandidate = view; - } - } - } - } - - return focusCandidate; - } - - public boolean pageScroll(int direction) { - boolean down = direction == 130; - int height = this.getHeight(); - if(down) { - this.mTempRect.top = this.getScrollY() + height; - int count = this.getChildCount(); - if(count > 0) { - View view = this.getChildAt(count - 1); - if(this.mTempRect.top + height > view.getBottom()) { - this.mTempRect.top = view.getBottom() - height; - } - } - } else { - this.mTempRect.top = this.getScrollY() - height; - if(this.mTempRect.top < 0) { - this.mTempRect.top = 0; - } - } - - this.mTempRect.bottom = this.mTempRect.top + height; - return this.scrollAndFocus(direction, this.mTempRect.top, this.mTempRect.bottom); - } - - public boolean fullScroll(int direction) { - boolean down = direction == 130; - int height = this.getHeight(); - this.mTempRect.top = 0; - this.mTempRect.bottom = height; - if(down) { - int count = this.getChildCount(); - if(count > 0) { - View view = this.getChildAt(count - 1); - this.mTempRect.bottom = view.getBottom() + this.getPaddingBottom(); - this.mTempRect.top = this.mTempRect.bottom - height; - } - } - - return this.scrollAndFocus(direction, this.mTempRect.top, this.mTempRect.bottom); - } - - private boolean scrollAndFocus(int direction, int top, int bottom) { - boolean handled = true; - int height = this.getHeight(); - int containerTop = this.getScrollY(); - int containerBottom = containerTop + height; - boolean up = direction == 33; - Object newFocused = this.findFocusableViewInBounds(up, top, bottom); - if(newFocused == null) { - newFocused = this; - } - - if(top >= containerTop && bottom <= containerBottom) { - handled = false; - } else { - int delta = up?top - containerTop:bottom - containerBottom; - this.doScrollY(delta); - } - - if(newFocused != this.findFocus()) { - ((View)newFocused).requestFocus(direction); - } - - return handled; - } - - public boolean arrowScroll(int direction) { - View currentFocused = this.findFocus(); - if(currentFocused == this) { - currentFocused = null; - } - - View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction); - int maxJump = this.getMaxScrollAmount(); - int descendantFocusability; - if(nextFocused != null && this.isWithinDeltaOfScreen(nextFocused, maxJump, this.getHeight())) { - nextFocused.getDrawingRect(this.mTempRect); - this.offsetDescendantRectToMyCoords(nextFocused, this.mTempRect); - descendantFocusability = this.computeScrollDeltaToGetChildRectOnScreen(this.mTempRect); - this.doScrollY(descendantFocusability); - nextFocused.requestFocus(direction); - } else { - descendantFocusability = maxJump; - if(direction == 33 && this.getScrollY() < maxJump) { - descendantFocusability = this.getScrollY(); - } else if(direction == 130 && this.getChildCount() > 0) { - int daBottom = this.getChildAt(0).getBottom(); - int screenBottom = this.getScrollY() + this.getHeight() - this.getPaddingBottom(); - if(daBottom - screenBottom < maxJump) { - descendantFocusability = daBottom - screenBottom; - } - } - - if(descendantFocusability == 0) { - return false; - } - - this.doScrollY(direction == 130?descendantFocusability:-descendantFocusability); - } - - if(currentFocused != null && currentFocused.isFocused() && this.isOffScreen(currentFocused)) { - descendantFocusability = this.getDescendantFocusability(); - //noinspection ResourceType - this.setDescendantFocusability(131072); - this.requestFocus(); - this.setDescendantFocusability(descendantFocusability); - } - - return true; - } - - private boolean isOffScreen(View descendant) { - return !this.isWithinDeltaOfScreen(descendant, 0, this.getHeight()); - } - - private boolean isWithinDeltaOfScreen(View descendant, int delta, int height) { - descendant.getDrawingRect(this.mTempRect); - this.offsetDescendantRectToMyCoords(descendant, this.mTempRect); - return this.mTempRect.bottom + delta >= this.getScrollY() && this.mTempRect.top - delta <= this.getScrollY() + height; - } - - private void doScrollY(int delta) { - if(delta != 0) { - if(this.mSmoothScrollingEnabled) { - this.smoothScrollBy(0, delta); - } else { - this.scrollBy(0, delta); - } - } - - } - - public final void smoothScrollBy(int dx, int dy) { - if(this.getChildCount() != 0) { - long duration = AnimationUtils.currentAnimationTimeMillis() - this.mLastScroll; - if(duration > 250L) { - int height = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop(); - int bottom = this.getChildAt(0).getHeight(); - int maxY = Math.max(0, bottom - height); - int scrollY = this.getScrollY(); - dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY; - this.mScroller.startScroll(this.getScrollX(), scrollY, 0, dy); - ViewCompat.postInvalidateOnAnimation(this); - } else { - if(!this.mScroller.isFinished()) { - this.mScroller.abortAnimation(); - } - - this.scrollBy(dx, dy); - } - - this.mLastScroll = AnimationUtils.currentAnimationTimeMillis(); - } - } - - public final void smoothScrollTo(int x, int y) { - this.smoothScrollBy(x - this.getScrollX(), y - this.getScrollY()); - } - - protected int computeVerticalScrollRange() { - int count = this.getChildCount(); - int contentHeight = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop(); - if(count == 0) { - return contentHeight; - } else { - int scrollRange = this.getChildAt(0).getBottom(); - int scrollY = this.getScrollY(); - int overscrollBottom = Math.max(0, scrollRange - contentHeight); - if(scrollY < 0) { - scrollRange -= scrollY; - } else if(scrollY > overscrollBottom) { - scrollRange += scrollY - overscrollBottom; - } - - return scrollRange; - } - } - - protected int computeVerticalScrollOffset() { - return Math.max(0, super.computeVerticalScrollOffset()); - } - - protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) { - LayoutParams lp = (LayoutParams) child.getLayoutParams(); - int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, this.getPaddingLeft() + this.getPaddingRight(), lp.width); - //noinspection ResourceType - int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, 0); - child.measure(childWidthMeasureSpec, childHeightMeasureSpec); - } - - protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { - MarginLayoutParams lp = (MarginLayoutParams)child.getLayoutParams(); - int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, this.getPaddingLeft() + this.getPaddingRight() + lp.leftMargin + lp.rightMargin + widthUsed, lp.width); - //noinspection ResourceType - int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.topMargin + lp.bottomMargin, 0); - child.measure(childWidthMeasureSpec, childHeightMeasureSpec); - } - - public void computeScroll() { - if(this.mScroller.computeScrollOffset()) { - int oldX = this.getScrollX(); - int oldY = this.getScrollY(); - int x = this.mScroller.getCurrX(); - int y = this.mScroller.getCurrY(); - if(oldX != x || oldY != y) { - int range = this.getScrollRange(); - int overscrollMode = ViewCompat.getOverScrollMode(this); - boolean canOverscroll = overscrollMode == 0 || overscrollMode == 1 && range > 0; - this.overScrollByCompat(x - oldX, y - oldY, oldX, oldY, 0, range, 0, 0, false); - if(canOverscroll) { - this.ensureGlows(); - if(y <= 0 && oldY > 0) { - this.mEdgeGlowTop.onAbsorb((int)this.mScroller.getCurrVelocity()); - } else if(y >= range && oldY < range) { - this.mEdgeGlowBottom.onAbsorb((int)this.mScroller.getCurrVelocity()); - } - } - } - } - - } - - private void scrollToChild(View child) { - child.getDrawingRect(this.mTempRect); - this.offsetDescendantRectToMyCoords(child, this.mTempRect); - int scrollDelta = this.computeScrollDeltaToGetChildRectOnScreen(this.mTempRect); - if(scrollDelta != 0) { - this.scrollBy(0, scrollDelta); - } - - } - - private boolean scrollToChildRect(Rect rect, boolean immediate) { - int delta = this.computeScrollDeltaToGetChildRectOnScreen(rect); - boolean scroll = delta != 0; - if(scroll) { - if(immediate) { - this.scrollBy(0, delta); - } else { - this.smoothScrollBy(0, delta); - } - } - - return scroll; - } - - protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) { - if(this.getChildCount() == 0) { - return 0; - } else { - int height = this.getHeight(); - int screenTop = this.getScrollY(); - int screenBottom = screenTop + height; - int fadingEdge = this.getVerticalFadingEdgeLength(); - if(rect.top > 0) { - screenTop += fadingEdge; - } - - if(rect.bottom < this.getChildAt(0).getHeight()) { - screenBottom -= fadingEdge; - } - - int scrollYDelta = 0; - if(rect.bottom > screenBottom && rect.top > screenTop) { - if(rect.height() > height) { - scrollYDelta += rect.top - screenTop; - } else { - scrollYDelta += rect.bottom - screenBottom; - } - - int bottom = this.getChildAt(0).getBottom(); - int distanceToBottom = bottom - screenBottom; - scrollYDelta = Math.min(scrollYDelta, distanceToBottom); - } else if(rect.top < screenTop && rect.bottom < screenBottom) { - if(rect.height() > height) { - scrollYDelta -= screenBottom - rect.bottom; - } else { - scrollYDelta -= screenTop - rect.top; - } - - scrollYDelta = Math.max(scrollYDelta, -this.getScrollY()); - } - - return scrollYDelta; - } - } - - public void requestChildFocus(View child, View focused) { - if(!this.mIsLayoutDirty) { - this.scrollToChild(focused); - } else { - this.mChildToScrollTo = focused; - } - - super.requestChildFocus(child, focused); - } - - protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - if(direction == 2) { - direction = 130; - } else if(direction == 1) { - direction = 33; - } - - View nextFocus = previouslyFocusedRect == null?FocusFinder.getInstance().findNextFocus(this, null, direction):FocusFinder.getInstance().findNextFocusFromRect(this, previouslyFocusedRect, direction); - return nextFocus != null && (!this.isOffScreen(nextFocus) && - nextFocus.requestFocus(direction, previouslyFocusedRect)); - } - - public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { - rectangle.offset(child.getLeft() - child.getScrollX(), child.getTop() - child.getScrollY()); - return this.scrollToChildRect(rectangle, immediate); - } - - public void requestLayout() { - this.mIsLayoutDirty = true; - super.requestLayout(); - } - - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - this.mIsLayoutDirty = false; - if(this.mChildToScrollTo != null && isViewDescendantOf(this.mChildToScrollTo, this)) { - this.scrollToChild(this.mChildToScrollTo); - } - - this.mChildToScrollTo = null; - if(!this.mIsLaidOut) { - if(this.mSavedState != null) { - this.scrollTo(this.getScrollX(), this.mSavedState.scrollPosition); - this.mSavedState = null; - } - - int childHeight = this.getChildCount() > 0?this.getChildAt(0).getMeasuredHeight():0; - int scrollRange = Math.max(0, childHeight - (b - t - this.getPaddingBottom() - this.getPaddingTop())); - if(this.getScrollY() > scrollRange) { - this.scrollTo(this.getScrollX(), scrollRange); - } else if(this.getScrollY() < 0) { - this.scrollTo(this.getScrollX(), 0); - } - } - - this.scrollTo(this.getScrollX(), this.getScrollY()); - this.mIsLaidOut = true; - } - - @SuppressLint("MissingSuperCall") - public void onAttachedToWindow() { - this.mIsLaidOut = false; - } - - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - View currentFocused = this.findFocus(); - if(null != currentFocused && this != currentFocused) { - if(this.isWithinDeltaOfScreen(currentFocused, 0, oldh)) { - currentFocused.getDrawingRect(this.mTempRect); - this.offsetDescendantRectToMyCoords(currentFocused, this.mTempRect); - int scrollDelta = this.computeScrollDeltaToGetChildRectOnScreen(this.mTempRect); - this.doScrollY(scrollDelta); - } - - } - } - - private static boolean isViewDescendantOf(View child, View parent) { - if(child == parent) { - return true; - } else { - ViewParent theParent = child.getParent(); - return theParent instanceof ViewGroup && isViewDescendantOf((View)theParent, parent); - } - } - - /** - * Adjusted from AppCompat v23.0.0 so that the function returns true if the nested fling will - * end at the top of the scroll view. Which means that it should be dispatched to the - * CoordinatorLayout/AppBarLayout - * @param velocityY - * @return - */ - public boolean fling(int velocityY) { - if(this.getChildCount() > 0) { - int height = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop(); - int bottom = this.getChildAt(0).getHeight(); - this.mScroller.fling(this.getScrollX(), this.getScrollY(), 0, velocityY, 0, 0, 0, Math.max(0, bottom - height), 0, height / 2); - ViewCompat.postInvalidateOnAnimation(this); - return mScroller.getFinalY() == 0; - } - return false; - } - - private void flingWithNestedDispatch(int velocityY) { - int scrollY = this.getScrollY(); - boolean canFling = (scrollY > 0 || velocityY > 0) && (scrollY < this.getScrollRange() || velocityY < 0); - if(!this.dispatchNestedPreFling(0.0F, (float)velocityY)) { - boolean dispatchFling = true; - if (canFling) - dispatchFling = fling(velocityY); - this.dispatchNestedFling(0.0F, (float)velocityY, !dispatchFling); - } - - } - - private void endDrag() { - this.mIsBeingDragged = false; - this.recycleVelocityTracker(); - this.stopNestedScroll(); - if(this.mEdgeGlowTop != null) { - this.mEdgeGlowTop.onRelease(); - this.mEdgeGlowBottom.onRelease(); - } - - } - - public void scrollTo(int x, int y) { - if(this.getChildCount() > 0) { - View child = this.getChildAt(0); - x = clamp(x, this.getWidth() - this.getPaddingRight() - this.getPaddingLeft(), child.getWidth()); - y = clamp(y, this.getHeight() - this.getPaddingBottom() - this.getPaddingTop(), child.getHeight()); - if(x != this.getScrollX() || y != this.getScrollY()) { - super.scrollTo(x, y); - } - } - - } - - private void ensureGlows() { - if(ViewCompat.getOverScrollMode(this) != 2) { - if(this.mEdgeGlowTop == null) { - Context context = this.getContext(); - this.mEdgeGlowTop = new EdgeEffectCompat(context); - this.mEdgeGlowBottom = new EdgeEffectCompat(context); - } - } else { - this.mEdgeGlowTop = null; - this.mEdgeGlowBottom = null; - } - - } - - public void draw(Canvas canvas) { - super.draw(canvas); - if(this.mEdgeGlowTop != null) { - int scrollY = this.getScrollY(); - int restoreCount; - int width; - if(!this.mEdgeGlowTop.isFinished()) { - restoreCount = canvas.save(); - width = this.getWidth() - this.getPaddingLeft() - this.getPaddingRight(); - canvas.translate((float)this.getPaddingLeft(), (float)Math.min(0, scrollY)); - this.mEdgeGlowTop.setSize(width, this.getHeight()); - if(this.mEdgeGlowTop.draw(canvas)) { - ViewCompat.postInvalidateOnAnimation(this); - } - - canvas.restoreToCount(restoreCount); - } - - if(!this.mEdgeGlowBottom.isFinished()) { - restoreCount = canvas.save(); - width = this.getWidth() - this.getPaddingLeft() - this.getPaddingRight(); - int height = this.getHeight(); - canvas.translate((float)(-width + this.getPaddingLeft()), (float)(Math.max(this.getScrollRange(), scrollY) + height)); - canvas.rotate(180.0F, (float)width, 0.0F); - this.mEdgeGlowBottom.setSize(width, height); - if(this.mEdgeGlowBottom.draw(canvas)) { - ViewCompat.postInvalidateOnAnimation(this); - } - - canvas.restoreToCount(restoreCount); - } - } - - } - - private static int clamp(int n, int my, int child) { - return my < child && n >= 0?(my + n > child?child - my:n):0; - } - - protected void onRestoreInstanceState(Parcelable state) { - FlingNestedScrollView.SavedState ss = (FlingNestedScrollView.SavedState)state; - super.onRestoreInstanceState(ss.getSuperState()); - this.mSavedState = ss; - this.requestLayout(); - } - - protected Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - FlingNestedScrollView.SavedState ss = new FlingNestedScrollView.SavedState(superState); - ss.scrollPosition = this.getScrollY(); - return ss; - } - - static class AccessibilityDelegate extends AccessibilityDelegateCompat { - AccessibilityDelegate() { - } - - public boolean performAccessibilityAction(View host, int action, Bundle arguments) { - if(super.performAccessibilityAction(host, action, arguments)) { - return true; - } else { - FlingNestedScrollView nsvHost = (FlingNestedScrollView)host; - if(!nsvHost.isEnabled()) { - return false; - } else { - int viewportHeight; - int targetScrollY; - switch(action) { - case 4096: - viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom() - nsvHost.getPaddingTop(); - targetScrollY = Math.min(nsvHost.getScrollY() + viewportHeight, nsvHost.getScrollRange()); - if(targetScrollY != nsvHost.getScrollY()) { - nsvHost.smoothScrollTo(0, targetScrollY); - return true; - } - - return false; - case 8192: - viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom() - nsvHost.getPaddingTop(); - targetScrollY = Math.max(nsvHost.getScrollY() - viewportHeight, 0); - if(targetScrollY != nsvHost.getScrollY()) { - nsvHost.smoothScrollTo(0, targetScrollY); - return true; - } - - return false; - default: - return false; - } - } - } - } - - public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(host, info); - FlingNestedScrollView nsvHost = (FlingNestedScrollView)host; - info.setClassName(ScrollView.class.getName()); - if(nsvHost.isEnabled()) { - int scrollRange = nsvHost.getScrollRange(); - if(scrollRange > 0) { - info.setScrollable(true); - if(nsvHost.getScrollY() > 0) { - info.addAction(8192); - } - - if(nsvHost.getScrollY() < scrollRange) { - info.addAction(4096); - } - } - } - - } - - public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(host, event); - FlingNestedScrollView nsvHost = (FlingNestedScrollView)host; - event.setClassName(ScrollView.class.getName()); - AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); - boolean scrollable = nsvHost.getScrollRange() > 0; - record.setScrollable(scrollable); - record.setScrollX(nsvHost.getScrollX()); - record.setScrollY(nsvHost.getScrollY()); - record.setMaxScrollX(nsvHost.getScrollX()); - record.setMaxScrollY(nsvHost.getScrollRange()); - } - } - - static class SavedState extends BaseSavedState { - public int scrollPosition; - public static final Creator CREATOR = new Creator() { - public FlingNestedScrollView.SavedState createFromParcel(Parcel in) { - return new FlingNestedScrollView.SavedState(in); - } - - public FlingNestedScrollView.SavedState[] newArray(int size) { - return new FlingNestedScrollView.SavedState[size]; - } - }; - - SavedState(Parcelable superState) { - super(superState); - } - - public SavedState(Parcel source) { - super(source); - this.scrollPosition = source.readInt(); - } - - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(this.scrollPosition); - } - - public String toString() { - return "HorizontalScrollView.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " scrollPosition=" + this.scrollPosition + "}"; - } - } -} diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/AuthenticationSignatureGenerator.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/AuthenticationSignatureGenerator.java similarity index 100% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/AuthenticationSignatureGenerator.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/AuthenticationSignatureGenerator.java diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/jcajce/JcaSkipMarkerPGPObjectFactory.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/jcajce/JcaSkipMarkerPGPObjectFactory.java similarity index 100% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/jcajce/JcaSkipMarkerPGPObjectFactory.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/jcajce/JcaSkipMarkerPGPObjectFactory.java diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/CachingDataDecryptorFactory.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/CachingDataDecryptorFactory.java similarity index 100% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/CachingDataDecryptorFactory.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/CachingDataDecryptorFactory.java diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java similarity index 78% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java index 91289b478..7edabffa0 100644 --- a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java +++ b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/EdDsaAuthenticationContentSignerBuilder.java @@ -1,17 +1,19 @@ package org.bouncycastle.openpgp.operator.jcajce; -import org.bouncycastle.jcajce.provider.asymmetric.eddsa.EdDSAEngine; -import org.bouncycastle.jcajce.provider.asymmetric.eddsa.spec.EdDSANamedCurveTable; -import org.bouncycastle.jcajce.provider.asymmetric.eddsa.spec.EdDSAParameterSpec; +import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPrivateKey; import org.bouncycastle.openpgp.PGPRuntimeOperationException; import org.bouncycastle.openpgp.operator.PGPContentSigner; import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder; +import org.bouncycastle.openpgp.operator.PGPDigestCalculator; -import java.io.ByteArrayOutputStream; import java.io.OutputStream; -import java.security.*; +import java.security.InvalidKeyException; +import java.security.PrivateKey; +import java.security.Provider; +import java.security.Signature; +import java.security.SignatureException; public class EdDsaAuthenticationContentSignerBuilder implements PGPContentSignerBuilder { private JcaPGPKeyConverter keyConverter = new JcaPGPKeyConverter(); @@ -33,9 +35,8 @@ public class EdDsaAuthenticationContentSignerBuilder implements PGPContentSigner return this; } - private Signature createSignature() throws NoSuchAlgorithmException { - EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("Ed25519"); - return new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); + private Signature createSignature() throws PGPException { + return new OperatorHelper(new DefaultJcaJceHelper()).createSignature(keyAlgorithm, hashAlgorithm); } public PGPContentSigner build(final int signatureType, final long keyID, final PrivateKey privateKey) @@ -43,12 +44,12 @@ public class EdDsaAuthenticationContentSignerBuilder implements PGPContentSigner Signature signatureEdDsa; try { signatureEdDsa = createSignature(); - } catch (NoSuchAlgorithmException e) { + } catch (PGPException e) { throw new PGPException("unable to create Signature.", e); } final Signature signature = signatureEdDsa; - final ByteArrayOutputStream dataOutputStream = new ByteArrayOutputStream(); + final PGPDigestCalculator digestCalculator = new JcaPGPDigestCalculatorProviderBuilder().build().get(hashAlgorithm); try { signature.initSign(privateKey); @@ -74,11 +75,12 @@ public class EdDsaAuthenticationContentSignerBuilder implements PGPContentSigner } public OutputStream getOutputStream() { - return new SignatureOutputStream(signature); + return digestCalculator.getOutputStream(); } public byte[] getSignature() { try { + signature.update(digestCalculator.getDigest()); return signature.sign(); } catch (SignatureException e) { throw new PGPRuntimeOperationException("Unable to create signature: " + e.getMessage(), e); @@ -86,7 +88,7 @@ public class EdDsaAuthenticationContentSignerBuilder implements PGPContentSigner } public byte[] getDigest() { - return null; + return digestCalculator.getDigest(); } }; } diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java similarity index 98% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java index 584d86891..e38e70c21 100644 --- a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java +++ b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/NfcSyncPGPContentSignerBuilder.java @@ -16,8 +16,6 @@ import org.bouncycastle.openpgp.operator.PGPDigestCalculator; import java.io.OutputStream; import java.nio.ByteBuffer; import java.security.Provider; -import java.util.Date; -import java.util.HashMap; import java.util.Map; diff --git a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java similarity index 95% rename from libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java rename to OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java index 6f1b6f5ef..bf44de997 100644 --- a/libkeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java +++ b/OpenKeychain/src/main/java/org/bouncycastle/openpgp/operator/jcajce/SessionKeySecretKeyDecryptorBuilder.java @@ -7,6 +7,15 @@ package org.bouncycastle.openpgp.operator.jcajce; +import org.bouncycastle.bcpg.S2K; +import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; +import org.bouncycastle.jcajce.util.NamedJcaJceHelper; +import org.bouncycastle.jcajce.util.ProviderJcaJceHelper; +import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.PGPUtil; +import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; +import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider; + import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Provider; @@ -15,13 +24,6 @@ import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.spec.IvParameterSpec; -import org.bouncycastle.bcpg.S2K; -import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; -import org.bouncycastle.jcajce.util.NamedJcaJceHelper; -import org.bouncycastle.jcajce.util.ProviderJcaJceHelper; -import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; -import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider; /** This is a builder for a special PBESecretKeyDecryptor which is parametrized by a @@ -90,7 +92,7 @@ public class SessionKeySecretKeyDecryptorBuilder { Cipher c = helper.createCipher(PGPUtil.getSymmetricCipherName(encAlgorithm) + "/CFB/NoPadding"); - c.init(Cipher.DECRYPT_MODE, PGPUtil.makeSymmetricKey(encAlgorithm, key), new IvParameterSpec(iv)); + c.init(Cipher.DECRYPT_MODE, JcaJcePGPUtil.makeSymmetricKey(encAlgorithm, key), new IvParameterSpec(iv)); return c.doFinal(keyData, keyOff, keyLen); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index b1fef45ea..c1e83c150 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -132,7 +132,6 @@ public final class Constants { public static final String FIRST_TIME_APP = "firstTimeApp"; public static final String CACHED_CONSOLIDATE = "cachedConsolidate"; public static final String SEARCH_KEYSERVER = "search_keyserver_pref"; - public static final String SEARCH_KEYBASE = "search_keybase_pref"; public static final String SEARCH_WEB_KEY_DIRECTORY = "search_wkd_pref"; public static final String USE_NUMKEYPAD_FOR_SECURITY_TOKEN_PIN = "useNumKeypadForYubikeyPin"; public static final String ENCRYPT_FILENAMES = "encryptFilenames"; @@ -154,7 +153,6 @@ public final class Constants { public static final String ENABLE_WIFI_SYNC_ONLY = "enableWifiSyncOnly"; public static final String SYNC_WORK_UUID = "syncWorkUuid"; // other settings - public static final String EXPERIMENTAL_ENABLE_KEYBASE = "experimentalEnableKeybase"; public static final String EXPERIMENTAL_USB_ALLOW_UNTESTED = "experimentalUsbAllowUntested"; public static final String EXPERIMENTAL_SMARTPGP_VERIFY_AUTHORITY = "smartpgp_authorities_pref"; public static final String EXPERIMENTAL_SMARTPGP_AUTHORITIES = "smartpgp_authorities"; @@ -178,9 +176,9 @@ public final class Constants { // we generally only track booleans. never snoop around in the user's string settings!! public static final List ANALYTICS_PREFS = Arrays.asList(USE_NORMAL_PROXY, USE_TOR_PROXY, - SYNC_CONTACTS, SYNC_KEYSERVER, ENABLE_WIFI_SYNC_ONLY, EXPERIMENTAL_ENABLE_KEYBASE, + SYNC_CONTACTS, SYNC_KEYSERVER, ENABLE_WIFI_SYNC_ONLY, EXPERIMENTAL_USB_ALLOW_UNTESTED, - PASSPHRASE_CACHE_SUBS, SEARCH_KEYSERVER, SEARCH_KEYBASE, SEARCH_WEB_KEY_DIRECTORY, + PASSPHRASE_CACHE_SUBS, SEARCH_KEYSERVER, SEARCH_WEB_KEY_DIRECTORY, TEXT_USE_COMPRESSION, TEXT_SELF_ENCRYPT, FILE_USE_COMPRESSION, FILE_SELF_ENCRYPT, USE_ARMOR, USE_NUMKEYPAD_FOR_SECURITY_TOKEN_PIN, ENCRYPT_FILENAMES); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 7d1d631d2..845d0c055 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -18,23 +18,27 @@ package org.sufficientlysecure.keychain; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.security.Security; import java.util.HashMap; import android.accounts.Account; import android.accounts.AccountManager; +import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; import android.graphics.Bitmap; -import android.support.annotation.Nullable; +import android.os.Build; import android.widget.Toast; +import androidx.annotation.Nullable; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.sufficientlysecure.keychain.analytics.AnalyticsManager; +import org.sufficientlysecure.keychain.keysync.KeyserverSyncManager; import org.sufficientlysecure.keychain.network.TlsCertificatePinning; import org.sufficientlysecure.keychain.provider.TemporaryFileProvider; import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; -import org.sufficientlysecure.keychain.keysync.KeyserverSyncManager; import org.sufficientlysecure.keychain.util.PRNGFixes; import org.sufficientlysecure.keychain.util.Preferences; import timber.log.Timber; @@ -102,12 +106,16 @@ public class KeychainApplication extends Application { TlsCertificatePinning.addPinnedCertificate("keys.openpgp.org", getAssets(), "LetsEncryptCA.cer"); TlsCertificatePinning.addPinnedCertificate("hkps.pool.sks-keyservers.net", getAssets(), "hkps.pool.sks-keyservers.net.CA.cer"); TlsCertificatePinning.addPinnedCertificate("pgp.mit.edu", getAssets(), "pgp.mit.edu.cer"); - TlsCertificatePinning.addPinnedCertificate("api.keybase.io", getAssets(), "api.keybase.io.CA.cer"); TlsCertificatePinning.addPinnedCertificate("keyserver.ubuntu.com", getAssets(), "LetsEncryptCA.cer"); + // only set up the rest on our main process + if (!BuildConfig.APPLICATION_ID.equals(getProcessName())) { + return; + } + KeyserverSyncManager.updateKeyserverSyncScheduleAsync(this, false); - TemporaryFileProvider.scheduleCleanupImmediately(); + TemporaryFileProvider.scheduleCleanupImmediately(getApplicationContext()); analyticsManager = AnalyticsManager.getInstance(getApplicationContext()); analyticsManager.initialize(this); @@ -162,4 +170,32 @@ public class KeychainApplication extends Application { public AnalyticsManager getAnalyticsManager() { return analyticsManager; } + + public static String getProcessName() { + if (Build.VERSION.SDK_INT >= 28) + return Application.getProcessName(); + + // Using the same technique as Application.getProcessName() for older devices + // Using reflection since ActivityThread is an internal API + + try { + @SuppressLint("PrivateApi") + Class activityThread = Class.forName("android.app.ActivityThread"); + + // Before API 18, the method was incorrectly named "currentPackageName", but it still returned the process name + // See https://github.com/aosp-mirror/platform_frameworks_base/commit/b57a50bd16ce25db441da5c1b63d48721bb90687 + String methodName = Build.VERSION.SDK_INT >= 18 ? "currentProcessName" : "currentPackageName"; + + Method getProcessName = activityThread.getDeclaredMethod(methodName); + return (String) getProcessName.invoke(null); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainDatabase.java index ae9fb9f0d..160005f79 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainDatabase.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainDatabase.java @@ -23,11 +23,11 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import android.arch.persistence.db.SupportSQLiteDatabase; -import android.arch.persistence.db.SupportSQLiteOpenHelper; -import android.arch.persistence.db.SupportSQLiteOpenHelper.Callback; -import android.arch.persistence.db.SupportSQLiteOpenHelper.Configuration; -import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteOpenHelper; +import androidx.sqlite.db.SupportSQLiteOpenHelper.Callback; +import androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration; +import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory; import android.content.Context; import android.database.Cursor; import android.database.SQLException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/NotificationChannelManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/NotificationChannelManager.java index 63806e577..310be32ac 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/NotificationChannelManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/NotificationChannelManager.java @@ -6,8 +6,8 @@ import android.app.NotificationManager; import android.content.Context; import android.os.Build; import android.os.Build.VERSION_CODES; -import android.support.annotation.RequiresApi; -import android.support.annotation.StringRes; +import androidx.annotation.RequiresApi; +import androidx.annotation.StringRes; public class NotificationChannelManager { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java index 0ff1778f8..15fe9a304 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/analytics/AnalyticsConsentRequester.java @@ -13,7 +13,6 @@ import android.text.method.LinkMovementMethod; import android.widget.TextView; import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.KeychainApplication; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.SettingsActivity; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java index b77fce985..cae84150f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/AppCompatPreferenceActivity.java @@ -19,11 +19,11 @@ package org.sufficientlysecure.keychain.compatibility; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceActivity; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.widget.Toolbar; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/ClipboardReflection.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/ClipboardReflection.java index eb550e3ef..d4144d285 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/ClipboardReflection.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/compatibility/ClipboardReflection.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.compatibility; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import timber.log.Timber; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AbstractDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AbstractDao.java index 4500e4a75..f123c9160 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AbstractDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AbstractDao.java @@ -4,8 +4,8 @@ package org.sufficientlysecure.keychain.daos; import java.util.ArrayList; import java.util.List; -import android.arch.persistence.db.SupportSQLiteDatabase; -import android.arch.persistence.db.SupportSQLiteQuery; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteQuery; import android.database.Cursor; import com.squareup.sqldelight.RowMapper; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AutocryptPeerDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AutocryptPeerDao.java index 773ba27fd..2d4a05e67 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AutocryptPeerDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/AutocryptPeerDao.java @@ -24,7 +24,7 @@ import java.util.List; import android.content.Context; import android.database.Cursor; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.squareup.sqldelight.SqlDelightQuery; import org.sufficientlysecure.keychain.AutocryptPeersModel.DeleteByIdentifier; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/DatabaseBatchInteractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/DatabaseBatchInteractor.java index 67913ab53..788f77d14 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/DatabaseBatchInteractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/DatabaseBatchInteractor.java @@ -3,7 +3,7 @@ package org.sufficientlysecure.keychain.daos; import java.util.List; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import org.sufficientlysecure.keychain.CertsModel.InsertCert; import org.sufficientlysecure.keychain.KeyRingsPublicModel.InsertKeyRingPublic; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyRepository.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyRepository.java index 59d457b5c..4cb0b33ea 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyRepository.java @@ -24,7 +24,7 @@ import java.util.List; import android.content.Context; import android.database.Cursor; -import android.support.annotation.WorkerThread; +import androidx.annotation.WorkerThread; import com.squareup.sqldelight.SqlDelightQuery; import org.bouncycastle.bcpg.ArmoredOutputStream; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyWritableRepository.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyWritableRepository.java index 8e4c17024..cf7d3a610 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyWritableRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/daos/KeyWritableRepository.java @@ -25,10 +25,10 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.util.LongSparseArray; +import androidx.annotation.NonNull; +import androidx.collection.LongSparseArray; import org.openintents.openpgp.util.OpenPgpUtils; import org.sufficientlysecure.keychain.KeyRingsPublicModel.DeleteByMasterKeyId; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java index 51c840d89..d8f01711e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.keyimport; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.util.ParcelableProxy; import org.sufficientlysecure.keychain.util.Preferences; @@ -45,9 +45,6 @@ public class CloudSearch { if (cloudPrefs.isKeyserverEnabled()) { servers.add(HkpKeyserverClient.fromHkpKeyserverAddress(cloudPrefs.getKeyserver())); } - if (cloudPrefs.isKeybaseEnabled()) { - servers.add(KeybaseKeyserverClient.getInstance()); - } if (cloudPrefs.isFacebookEnabled()) { servers.add(FacebookKeyserverClient.getInstance()); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/FacebookKeyserverClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/FacebookKeyserverClient.java index 1ed579685..0553eb626 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/FacebookKeyserverClient.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/FacebookKeyserverClient.java @@ -26,8 +26,8 @@ import java.util.List; import java.util.regex.Matcher; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import okhttp3.OkHttpClient; import okhttp3.Request; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverAddress.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverAddress.java index 14a088b88..75e5912f1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverAddress.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverAddress.java @@ -22,8 +22,8 @@ import java.net.URI; import java.net.URISyntaxException; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverClient.java index c94854a68..f838aa757 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverClient.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserverClient.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.keyimport; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import okhttp3.MediaType; import okhttp3.ResponseBody; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java index b698f6b02..e5abf0946 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java @@ -77,14 +77,8 @@ public class ImportKeysList extends ArrayList { if (incoming.getKeyserver() != null) { existing.setKeyserver(incoming.getKeyserver()); - // Mail addresses returned by HKP servers are preferred over keybase.io IDs existing.setPrimaryUserId(incoming.getPrimaryUserId()); - modified = true; - } else if (incoming.getKeybaseName() != null) { - // to work properly, Keybase-sourced/Facebook-sourced entries need to pass along the - // identifying name/id - existing.setKeybaseName(incoming.getKeybaseName()); modified = true; } else if (incoming.getFbUsername() != null) { existing.setFbUsername(incoming.getFbUsername()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java index 61716e36c..cb672958d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java @@ -17,6 +17,18 @@ package org.sufficientlysecure.keychain.keyimport; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + import android.content.Context; import android.os.Parcel; import android.os.Parcelable; @@ -27,18 +39,6 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.UncachedPublicKey; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - public class ImportKeysListEntry implements Serializable, Parcelable { private static final long serialVersionUID = -7797972103284992662L; @@ -64,7 +64,6 @@ public class ImportKeysListEntry implements Serializable, Parcelable { private UserId mPrimaryUserId; private HkpKeyserverAddress mKeyserver; - private String mKeybaseName; private String mFbUsername; private String mQuery; @@ -197,14 +196,6 @@ public class ImportKeysListEntry implements Serializable, Parcelable { mKeyserver = keyserver; } - public String getKeybaseName() { - return mKeybaseName; - } - - public void setKeybaseName(String keybaseName) { - mKeybaseName = keybaseName; - } - public String getFbUsername() { return mFbUsername; } @@ -257,20 +248,11 @@ public class ImportKeysListEntry implements Serializable, Parcelable { return modified; } - public ArrayList getKeybaseUserIds() { - ArrayList keybaseUserIds = new ArrayList<>(); - for (String s : mUserIds) { - if (s.contains(":")) - keybaseUserIds.add(s); - } - return keybaseUserIds; - } - /** * Constructor for later querying from keyserver */ public ImportKeysListEntry() { - // keys from keyserver are always public keys; from keybase too + // keys from keyserver are always public keys mSecretKey = false; mUserIds = new ArrayList<>(); @@ -339,20 +321,8 @@ public class ImportKeysListEntry implements Serializable, Parcelable { private void sortMergedUserIds() { mSortedUserIds = new ArrayList<>(mMergedUserIds.entrySet()); - Collections.sort(mSortedUserIds, new Comparator>>() { - @Override - public int compare(Map.Entry> entry1, - Map.Entry> entry2) { - - // sort keybase UserIds after non-Keybase - boolean e1IsKeybase = entry1.getKey().contains(":"); - boolean e2IsKeybase = entry2.getKey().contains(":"); - if (e1IsKeybase != e2IsKeybase) { - return (e1IsKeybase) ? 1 : -1; - } - return entry1.getKey().compareTo(entry2.getKey()); - } - }); + Collections.sort(mSortedUserIds, + (entry1, entry2) -> entry1.getKey().compareTo(entry2.getKey())); } @Override @@ -377,7 +347,6 @@ public class ImportKeysListEntry implements Serializable, Parcelable { dest.writeString(mAlgorithm); dest.writeByte((byte) (mSecretKey ? 1 : 0)); dest.writeParcelable(mKeyserver, flags); - dest.writeString(mKeybaseName); dest.writeString(mFbUsername); } @@ -400,7 +369,6 @@ public class ImportKeysListEntry implements Serializable, Parcelable { vr.mAlgorithm = source.readString(); vr.mSecretKey = source.readByte() == 1; vr.mKeyserver = source.readParcelable(HkpKeyserverAddress.class.getClassLoader()); - vr.mKeybaseName = source.readString(); vr.mFbUsername = source.readString(); return vr; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserverClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserverClient.java deleted file mode 100644 index e0b20b55e..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserverClient.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.keyimport; - -import com.textuality.keybase.lib.KeybaseException; -import com.textuality.keybase.lib.KeybaseQuery; -import com.textuality.keybase.lib.Match; -import com.textuality.keybase.lib.User; - -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.network.OkHttpKeybaseClient; -import org.sufficientlysecure.keychain.util.ParcelableProxy; -import timber.log.Timber; - -import java.util.ArrayList; -import java.util.List; - -public class KeybaseKeyserverClient implements KeyserverClient { - - public static KeybaseKeyserverClient getInstance() { - return new KeybaseKeyserverClient(); - } - - private KeybaseKeyserverClient() { } - - @Override - public ArrayList search(String query, ParcelableProxy proxy) throws QueryFailedException, - QueryNeedsRepairException { - ArrayList results = new ArrayList<>(); - - if (query.startsWith("0x")) { - // cut off "0x" if a user is searching for a key id - query = query.substring(2); - } - if (query.isEmpty()) { - throw new QueryTooShortException(); - } - - try { - KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); - keybaseQuery.setProxy(proxy.getProxy()); - Iterable matches = keybaseQuery.search(query); - for (Match match : matches) { - results.add(makeEntry(match, query)); - } - } catch (KeybaseException e) { - Timber.e(e, "keybase result parsing error"); - throw new QueryFailedException("Unexpected structure in keybase search result: " + e.getMessage()); - } - - return results; - } - - private ImportKeysListEntry makeEntry(Match match, String query) throws KeybaseException { - final ImportKeysListEntry entry = new ImportKeysListEntry(); - entry.setQuery(query); - - entry.setRevoked(false); // keybase doesn’t say anything about revoked keys - - String username = match.getUsername(); - String fullName = match.getFullName(); - String fingerprint = match.getFingerprint(); - entry.setFingerprint(KeyFormattingUtils.convertFingerprintHexFingerprint(fingerprint)); - - entry.setKeyIdHex("0x" + match.getKeyID()); - // so we can query for the keybase id directly, and to identify the location from which the - // key is to be retrieved - entry.setKeybaseName(username); - - final int bitStrength = match.getBitStrength(); - entry.setBitStrength(bitStrength); - final int algorithmId = match.getAlgorithmId(); - entry.setAlgorithm(KeyFormattingUtils.getAlgorithmInfo(algorithmId, bitStrength, null)); - - ArrayList userIds = new ArrayList<>(); - String name = ""; - if (fullName != null) { - name = fullName + " " + name; - } - userIds.add(name); - - List proofLabels = match.getProofLabels(); - for (String proofLabel : proofLabels) { - userIds.add(proofLabel); - } - entry.setUserIds(userIds); - entry.setPrimaryUserId(name); - return entry; - } - - @Override - public String get(String id, ParcelableProxy proxy) throws QueryFailedException { - try { - KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); - keybaseQuery.setProxy(proxy.getProxy()); - return User.keyForUsername(keybaseQuery, id); - } catch (KeybaseException e) { - throw new QueryFailedException(e.getMessage()); - } - } - - @Override - public void add(String armoredKey, ParcelableProxy proxy) throws AddKeyException { - throw new AddKeyException(); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java index 37dd6cb98..b69e167d5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java @@ -19,14 +19,14 @@ package org.sufficientlysecure.keychain.keyimport; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; /** * This class is a parcelable representation of either a keyring as raw data, - * or a (unique) reference to one as a fingerprint, keyid, or keybase name. + * or a (unique) reference to one as a fingerprint, or keyid. */ @AutoValue public abstract class ParcelableKeyRing implements Parcelable { @@ -41,16 +41,14 @@ public abstract class ParcelableKeyRing implements Parcelable { @Nullable public abstract String getKeyIdHex(); @Nullable - public abstract String getKeybaseName(); - @Nullable public abstract String getFbUsername(); public static ParcelableKeyRing createFromEncodedBytes(byte[] bytes) { - return new AutoValue_ParcelableKeyRing(bytes, null, null, null, null); + return new AutoValue_ParcelableKeyRing(bytes, null, null, null); } public static ParcelableKeyRing createFromReference( - byte[] expectedFingerprint, String keyIdHex, String keybaseName, String fbUsername) { - return new AutoValue_ParcelableKeyRing(null, expectedFingerprint, keyIdHex, keybaseName, fbUsername); + byte[] expectedFingerprint, String keyIdHex, String fbUsername) { + return new AutoValue_ParcelableKeyRing(null, expectedFingerprint, keyIdHex, fbUsername); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/WebKeyDirectoryClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/WebKeyDirectoryClient.java index c37522c59..3983789a6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/WebKeyDirectoryClient.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/WebKeyDirectoryClient.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.keyimport; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java index 6833343ac..05358de4b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java @@ -18,8 +18,8 @@ package org.sufficientlysecure.keychain.keyimport.processing; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v4.content.AsyncTaskLoader; +import androidx.annotation.Nullable; +import androidx.loader.content.AsyncTaskLoader; import org.sufficientlysecure.keychain.keyimport.CloudSearch; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.keyimport.KeyserverClient; @@ -51,8 +51,7 @@ public class ImportKeysListCloudLoader * * @param loaderState state containing the string to search on servers for (if it is a * fingerprint, will enforce fingerprint check) and the keyserver to - * search on (whether to search on the keyserver, and whether to search - * keybase.io) + * search on (whether to search on the keyserver) * @param parcelableProxy explicit proxy to use. If null, will retrieve from preferences */ public ImportKeysListCloudLoader(Context context, CloudLoaderState loaderState, @@ -84,7 +83,7 @@ public class ImportKeysListCloudLoader for (ImportKeysListEntry e : mEntryList) { if (e.getParcelableKeyRing() == null) { e.setParcelableKeyRing(ParcelableKeyRing.createFromReference(e.getFingerprint(), e.getKeyIdHex(), - e.getKeybaseName(), e.getFbUsername())); + e.getFbUsername())); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java index a53e82118..ef79ce671 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.keyimport.processing; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.content.AsyncTaskLoader; +import androidx.annotation.NonNull; +import androidx.loader.content.AsyncTaskLoader; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.operations.results.GetKeyResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java index fc452e133..6cd1fdc11 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java @@ -19,22 +19,22 @@ package org.sufficientlysecure.keychain.keysync; import java.util.UUID; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import android.content.Context; import android.os.AsyncTask; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; -import android.support.annotation.WorkerThread; +import androidx.annotation.WorkerThread; import androidx.work.Constraints.Builder; import androidx.work.NetworkType; import androidx.work.OneTimeWorkRequest; import androidx.work.PeriodicWorkRequest; -import androidx.work.State; -import androidx.work.SynchronousWorkManager; +import androidx.work.WorkInfo; +import androidx.work.WorkInfo.State; import androidx.work.WorkManager; -import androidx.work.WorkStatus; import org.sufficientlysecure.keychain.util.Preferences; import timber.log.Timber; @@ -58,30 +58,26 @@ public class KeyserverSyncManager { @WorkerThread private static void updateKeyserverSyncSchedule(Context context, boolean forceReschedule) { Preferences prefs = Preferences.getPreferences(context); - WorkManager workManager = WorkManager.getInstance(); - if (workManager == null) { - Timber.e("WorkManager unavailable!"); - return; - } - SynchronousWorkManager synchronousWorkManager = workManager.synchronous(); - if (synchronousWorkManager == null) { - Timber.e("WorkManager unavailable!"); - return; - } + WorkManager workManager = WorkManager.getInstance(context); UUID workUuid = prefs.getKeyserverSyncWorkUuid(); - WorkStatus status = workUuid != null ? synchronousWorkManager.getStatusByIdSync(workUuid) : null; - boolean workIsScheduled = status != null && status.getState() != State.CANCELLED; - if (workIsScheduled == prefs.isKeyserverSyncEnabled()) { - if (!forceReschedule) { - Timber.d("Key sync already scheduled, no changes necessary"); - return; + try { + WorkInfo info = workUuid != null ? workManager.getWorkInfoById(workUuid).get() : null; + + boolean workIsScheduled = info != null && info.getState() != State.CANCELLED; + if (workIsScheduled == prefs.isKeyserverSyncEnabled()) { + if (!forceReschedule) { + Timber.d("Key sync already scheduled, no changes necessary"); + return; + } + Timber.d("Key sync already scheduled, but forcing reschedule"); } - Timber.d("Key sync already scheduled, but forcing reschedule"); + } catch (ExecutionException | InterruptedException e) { + Timber.e(e, "Error getting info for scheduled key sync work?"); } Timber.d("Cancelling sync tasks…"); - synchronousWorkManager.cancelAllWorkByTagSync(PERIODIC_WORK_TAG); + workManager.cancelAllWorkByTag(PERIODIC_WORK_TAG); if (!prefs.isKeyserverSyncEnabled()) { Timber.d("Key sync disabled"); @@ -102,14 +98,17 @@ public class KeyserverSyncManager { .setConstraints(constraints.build()) .addTag(PERIODIC_WORK_TAG) .build(); - synchronousWorkManager.enqueueSync(workRequest); - - Timber.d("Work id: %s", workRequest.getId()); - prefs.setKeyserverSyncScheduled(workRequest.getId()); + try { + workManager.enqueue(workRequest).getResult().get(); + Timber.d("Work id: %s", workRequest.getId()); + prefs.setKeyserverSyncScheduled(workRequest.getId()); + } catch (InterruptedException | ExecutionException e) { + Timber.e(e, "Error enqueueing job!"); + } } - public static void debugRunSyncNow() { - WorkManager workManager = WorkManager.getInstance(); + public static void debugRunSyncNow(Context context) { + WorkManager workManager = WorkManager.getInstance(context); OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(KeyserverSyncWorker.class).build(); workManager.enqueue(workRequest); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncWorker.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncWorker.java index 2d9b2fdb8..8e562769b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncWorker.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncWorker.java @@ -5,11 +5,12 @@ import java.util.concurrent.atomic.AtomicBoolean; import android.app.NotificationManager; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationCompat.Builder; +import androidx.annotation.NonNull; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationCompat.Builder; import androidx.work.Worker; +import androidx.work.WorkerParameters; import org.sufficientlysecure.keychain.Constants.NotificationIds; import org.sufficientlysecure.keychain.NotificationChannelManager; import org.sufficientlysecure.keychain.R; @@ -28,9 +29,13 @@ import timber.log.Timber; public class KeyserverSyncWorker extends Worker { private AtomicBoolean cancellationSignal = new AtomicBoolean(false); + public KeyserverSyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + @NonNull @Override - public WorkerResult doWork() { + public Result doWork() { KeyWritableRepository keyWritableRepository = KeyWritableRepository.create(getApplicationContext()); Timber.d("Starting key sync…"); @@ -47,7 +52,7 @@ public class KeyserverSyncWorker extends Worker { * @param result * result of keyserver sync */ - private WorkerResult handleUpdateResult(ImportKeyResult result) { + private Result handleUpdateResult(ImportKeyResult result) { if (result.isPending()) { Timber.d("Orbot required for sync but not running, attempting to start"); // result is pending due to Orbot not being started @@ -62,13 +67,13 @@ public class KeyserverSyncWorker extends Worker { OrbotRequiredDialogActivity.showOrbotRequiredNotification(getApplicationContext()); } }.startOrbotAndListen(getApplicationContext(), false); - return WorkerResult.RETRY; + return Result.retry(); } else if (isStopped()) { Timber.d("Keyserver sync cancelled"); - return WorkerResult.FAILURE; + return Result.failure(); } else { Timber.d("Keyserver sync completed: Updated: %d, Failed: %d", result.mUpdatedKeys, result.mBadKeys); - return WorkerResult.SUCCESS; + return Result.success(); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/Certification.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/Certification.java index 391af0cc7..2a06d837f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/Certification.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/Certification.java @@ -3,7 +3,7 @@ package org.sufficientlysecure.keychain.model; import java.util.Date; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.CertsModel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/CustomColumnAdapters.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/CustomColumnAdapters.java index bfaa83caa..9ebcceab1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/CustomColumnAdapters.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/CustomColumnAdapters.java @@ -3,7 +3,7 @@ package org.sufficientlysecure.keychain.model; import java.util.Date; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.squareup.sqldelight.ColumnAdapter; import org.sufficientlysecure.keychain.model.AutocryptPeer.GossipOrigin; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeyRingPublic.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeyRingPublic.java index 4f42685cb..bb1604a8c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeyRingPublic.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeyRingPublic.java @@ -1,11 +1,10 @@ package org.sufficientlysecure.keychain.model; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.KeyRingsPublicModel; -import org.sufficientlysecure.keychain.KeysModel.InsertKey; @AutoValue diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeySignature.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeySignature.java index a79621e21..fe101cfb8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeySignature.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/KeySignature.java @@ -1,7 +1,7 @@ package org.sufficientlysecure.keychain.model; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.KeySignaturesModel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java index 71eed7579..c963aa330 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java @@ -6,7 +6,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import com.google.auto.value.AutoValue; import com.squareup.sqldelight.RowMapper; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/UserPacket.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/UserPacket.java index 6bd833a81..79af3633b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/UserPacket.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/UserPacket.java @@ -1,8 +1,8 @@ package org.sufficientlysecure.keychain.model; -import android.arch.persistence.db.SupportSQLiteDatabase; -import android.support.annotation.NonNull; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.annotation.NonNull; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.UserPacketsModel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java index 1fb9e387d..0ba4c9d96 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java @@ -41,8 +41,8 @@ import java.util.Set; import android.os.Build.VERSION_CODES; import android.os.Handler; import android.os.Looper; -import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLHandshakeException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/OkHttpKeybaseClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/OkHttpKeybaseClient.java deleted file mode 100644 index 91056813d..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/OkHttpKeybaseClient.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.network; - - -import java.io.IOException; -import java.net.Proxy; -import java.net.URL; - -import com.textuality.keybase.lib.KeybaseUrlConnectionClient; -import okhttp3.OkHttpClient; -import okhttp3.Request; - -/** - * Wrapper for Keybase Lib - */ -public class OkHttpKeybaseClient implements KeybaseUrlConnectionClient { - - @Override - public Response getUrlResponse(URL url, Proxy proxy, boolean isKeybase) throws IOException { - OkHttpClient client; - - if (proxy != null) { - client = OkHttpClientFactory.getClientPinnedIfAvailable(url, proxy); - } else { - client = OkHttpClientFactory.getSimpleClient(); - } - - Request request = new Request.Builder() - .url(url).build(); - okhttp3.Response okResponse = client.newCall(request).execute(); - return new Response(okResponse.body().byteStream(), okResponse.code(), okResponse.message(), okResponse.headers().toMultimap()); - } - - @Override - public String getKeybaseBaseUrl() { - return "https://api.keybase.io/"; - } - -} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/SktUri.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/SktUri.java index 887c762aa..7186c8237 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/SktUri.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/SktUri.java @@ -21,8 +21,8 @@ import java.net.URISyntaxException; import java.nio.charset.Charset; import android.annotation.SuppressLint; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.bouncycastle.util.encoders.DecoderException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/TlsPskCompat.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/TlsPskCompat.java index 7a83eac34..24886557a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/TlsPskCompat.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/TlsPskCompat.java @@ -6,7 +6,7 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import android.os.Build.VERSION_CODES; -import android.support.annotation.RequiresApi; +import androidx.annotation.RequiresApi; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/orbot/OrbotHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/orbot/OrbotHelper.java index 5bb3b0e44..78bafe195 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/orbot/OrbotHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/orbot/OrbotHelper.java @@ -61,8 +61,8 @@ import android.net.Uri; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.text.TextUtils; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java index f3c85fc0a..f870c5386 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java @@ -32,8 +32,8 @@ import java.util.regex.Pattern; import android.content.Context; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java index a5cc4602d..b645dd629 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java @@ -22,8 +22,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.annotation.StringRes; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import org.sufficientlysecure.keychain.Constants.key; import org.sufficientlysecure.keychain.daos.KeyRepository; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BenchmarkOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BenchmarkOperation.java index 353ecc5d1..144dd215b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BenchmarkOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BenchmarkOperation.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.operations; import java.util.Random; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.bouncycastle.bcpg.HashAlgorithmTags; import org.bouncycastle.bcpg.S2K; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java index 87eaccd8f..cea093a48 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ChangeUnlockOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ChangeUnlockOperation.java index bb14199c1..0111e55a3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ChangeUnlockOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ChangeUnlockOperation.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.operations; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.EditKeyResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java index 31564146d..ab5951173 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.operations; import java.util.Collections; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.operations.results.DeleteResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java index 053ca87b0..573fba8f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java index 452990673..833b40ec8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java @@ -32,8 +32,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; @@ -41,7 +41,6 @@ import org.sufficientlysecure.keychain.daos.KeyWritableRepository; import org.sufficientlysecure.keychain.keyimport.FacebookKeyserverClient; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverClient; -import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserverClient; import org.sufficientlysecure.keychain.keyimport.KeyserverClient; import org.sufficientlysecure.keychain.keyimport.KeyserverClient.QueryNotFoundException; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; @@ -76,8 +75,7 @@ import timber.log.Timber; * all steps for this import. * For the import operation, the only valid source is an Iterator of * ParcelableKeyRing, each of which must contain either a single - * keyring encoded as bytes, or a unique reference to a keyring - * on keyservers and/or keybase.io. + * keyring encoded as bytes, or a unique reference to a keyring on keyservers. * It is important to note that public keys should generally be imported before * secret keys, because some implementations (notably Symantec PGP Desktop) do * not include self certificates for user ids in the secret keyring. The import @@ -93,7 +91,6 @@ public class ImportOperation extends BaseReadWriteOperation private final KeyMetadataDao keyMetadataDao; private FacebookKeyserverClient facebookServer; - private KeybaseKeyserverClient keybaseServer; public ImportOperation(Context context, KeyWritableRepository databaseInteractor, Progressable progressable) { super(context, databaseInteractor, progressable); @@ -355,14 +352,6 @@ public class ImportOperation extends BaseReadWriteOperation } } - boolean hasKeybaseName = entry.getKeybaseName() != null; - if (hasKeybaseName) { - UncachedKeyRing keybaseKey = fetchKeyFromKeybase(proxy, log, entry); - if (keybaseKey != null) { - key = mergeKeysOrUseEither(log, 3, key, keybaseKey); - } - } - boolean hasFacebookName = entry.getFbUsername() != null; if (hasFacebookName) { UncachedKeyRing facebookKey = fetchKeyFromFacebook(proxy, log, entry); @@ -414,32 +403,6 @@ public class ImportOperation extends BaseReadWriteOperation } } - private UncachedKeyRing fetchKeyFromKeybase(@NonNull ParcelableProxy proxy, OperationLog log, ParcelableKeyRing entry) - throws PgpGeneralException, IOException { - if (keybaseServer == null) { - keybaseServer = KeybaseKeyserverClient.getInstance(); - } - - try { - log.add(LogType.MSG_IMPORT_FETCH_KEYBASE, 2, entry.getKeybaseName()); - byte[] data = keybaseServer.get(entry.getKeybaseName(), proxy).getBytes(); - UncachedKeyRing keybaseKey = UncachedKeyRing.decodeFromData(data); - - if (keybaseKey != null) { - log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_OK, 3); - } else { - log.add(LogType.MSG_IMPORT_FETCH_ERROR_DECODE, 3); - } - - return keybaseKey; - } catch (KeyserverClient.QueryFailedException e) { - // download failed, too bad. just proceed - Timber.e(e, "query failed"); - log.add(LogType.MSG_IMPORT_FETCH_ERROR_KEYSERVER, 3, e.getMessage()); - return null; - } - } - private UncachedKeyRing fetchKeyFromFacebook(@NonNull ParcelableProxy proxy, OperationLog log, ParcelableKeyRing entry) throws PgpGeneralException, IOException { if (facebookServer == null) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java index 222e75d7a..8936d05b5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java @@ -28,7 +28,7 @@ import java.util.ArrayList; import android.content.ClipDescription; import android.content.Context; import android.net.Uri; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.webkit.MimeTypeMap; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java index e97a31bf4..e2e589380 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java @@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; @@ -72,7 +72,7 @@ public class KeySyncOperation extends BaseReadWriteOperation { ArrayList result = new ArrayList<>(staleKeyFingerprints.size()); for (byte[] fingerprint : staleKeyFingerprints) { Timber.d("Keyserver sync: Updating %s", KeyFormattingUtils.beautifyKeyId(fingerprint)); - result.add(ParcelableKeyRing.createFromReference(fingerprint, null, null, null)); + result.add(ParcelableKeyRing.createFromReference(fingerprint, null, null)); } return result; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java deleted file mode 100644 index 90c569f71..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.operations; - - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.net.Proxy; -import java.util.ArrayList; -import java.util.List; - -import android.content.Context; -import android.support.annotation.NonNull; - -import com.textuality.keybase.lib.KeybaseQuery; -import com.textuality.keybase.lib.Proof; -import com.textuality.keybase.lib.prover.Prover; -import de.measite.minidns.Client; -import de.measite.minidns.DNSMessage; -import de.measite.minidns.Question; -import de.measite.minidns.Record; -import de.measite.minidns.record.Data; -import de.measite.minidns.record.TXT; -import org.bouncycastle.openpgp.PGPUtil; -import org.json.JSONObject; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.network.OkHttpKeybaseClient; -import org.sufficientlysecure.keychain.network.orbot.OrbotHelper; -import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; -import org.sufficientlysecure.keychain.operations.results.KeybaseVerificationResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyOperation; -import org.sufficientlysecure.keychain.pgp.Progressable; -import org.sufficientlysecure.keychain.daos.KeyWritableRepository; -import org.sufficientlysecure.keychain.service.KeybaseVerificationParcel; -import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.util.Preferences; - -public class KeybaseVerificationOperation extends BaseOperation { - - public KeybaseVerificationOperation(Context context, KeyWritableRepository databaseInteractor, - Progressable progressable) { - super(context, databaseInteractor, progressable); - } - - @NonNull - @Override - public KeybaseVerificationResult execute(KeybaseVerificationParcel keybaseInput, - CryptoInputParcel cryptoInput) { - Proxy proxy; - if (cryptoInput.getParcelableProxy() == null) { - // explicit proxy not set - if (!OrbotHelper.isOrbotInRequiredState(mContext)) { - return new KeybaseVerificationResult(null, - RequiredInputParcel.createOrbotRequiredOperation(), cryptoInput); - } - proxy = Preferences.getPreferences(mContext).getParcelableProxy().getProxy(); - } else { - proxy = cryptoInput.getParcelableProxy().getProxy(); - } - - String requiredFingerprint = keybaseInput.mRequiredFingerprint; - - OperationResult.OperationLog log = new OperationResult.OperationLog(); - log.add(OperationResult.LogType.MSG_KEYBASE_VERIFICATION, 0, requiredFingerprint); - - try { - KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); - keybaseQuery.setProxy(proxy); - - String keybaseProof = keybaseInput.mKeybaseProof; - Proof proof = new Proof(new JSONObject(keybaseProof)); - mProgressable.setProgress(R.string.keybase_message_fetching_data, 0, 100); - - Prover prover = Prover.findProverFor(proof); - - if (prover == null) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_NO_PROVER, 1, - proof.getPrettyName()); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - if (!prover.fetchProofData(keybaseQuery)) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_FETCH_PROOF, 1); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - if (!prover.checkFingerprint(requiredFingerprint)) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_FINGERPRINT_MISMATCH, 1); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - String domain = prover.dnsTxtCheckRequired(); - if (domain != null) { - DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); - if (dnsQuery == null) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_DNS_FAIL, 1); - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 2, - getFlattenedProverLog(prover)); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - Record[] records = dnsQuery.getAnswers(); - List> extents = new ArrayList<>(); - for (Record r : records) { - Data d = r.getPayload(); - if (d instanceof TXT) { - extents.add(((TXT) d).getExtents()); - } - } - if (!prover.checkDnsTxt(extents)) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1, - getFlattenedProverLog(prover)); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - } - - byte[] messageBytes = prover.getPgpMessage().getBytes(); - if (prover.rawMessageCheckRequired()) { - InputStream messageByteStream = PGPUtil.getDecoderStream(new - ByteArrayInputStream - (messageBytes)); - if (!prover.checkRawMessageBytes(messageByteStream)) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1, - getFlattenedProverLog(prover)); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - } - - PgpDecryptVerifyOperation op = new PgpDecryptVerifyOperation(mContext, mKeyRepository, mProgressable); - - PgpDecryptVerifyInputParcel input = PgpDecryptVerifyInputParcel.builder() - .setInputBytes(messageBytes) - .build(); - - DecryptVerifyResult decryptVerifyResult = op.execute(input, CryptoInputParcel.createCryptoInputParcel()); - - if (!decryptVerifyResult.success()) { - log.add(decryptVerifyResult, 1); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - long verifyingKeyId = decryptVerifyResult.getSignatureResult().getKeyId(); - byte[] verifyingFingerprint = mKeyRepository.getFingerprintByKeyId(verifyingKeyId); - if (!requiredFingerprint.equals(KeyFormattingUtils.convertFingerprintToHex(verifyingFingerprint))) { - log.add(LogType.MSG_KEYBASE_ERROR_FINGERPRINT_MISMATCH, 1); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_PAYLOAD_MISMATCH, 1); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - - return new KeybaseVerificationResult(OperationResult.RESULT_OK, log, prover); - } catch (Exception e) { - // just adds the passed parameter, in this case e.getMessage() - log.add(OperationResult.LogType.MSG_KEYBASE_ERROR_SPECIFIC, 1, e.getMessage()); - return new KeybaseVerificationResult(OperationResult.RESULT_ERROR, log); - } - } - - private String getFlattenedProverLog(Prover prover) { - String log = ""; - for (String line : prover.getLog()) { - log += line + "\n"; - } - return log; - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java index b1126cf2f..a895f5509 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/RevokeOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/RevokeOperation.java index 3df9fc4c5..36101cfa0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/RevokeOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/RevokeOperation.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.operations; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.operations.results.EditKeyResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java index 20bcd19e8..5f5949c9b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java @@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.net.Uri; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.daos.KeyRepository; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java index f7c70e671..d5b54cc8c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java @@ -24,8 +24,8 @@ import java.net.Proxy; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java index d6475e002..4819977b6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.operations.results; import android.app.Activity; import android.content.Intent; import android.os.Parcel; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputDataResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputDataResult.java index 98d2e9818..7fafe0e07 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputDataResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputDataResult.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import android.net.Uri; import android.os.Parcel; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.openintents.openpgp.OpenPgpMetadata; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputPendingResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputPendingResult.java index 5f456bae8..3a3b7c8e5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputPendingResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/InputPendingResult.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.operations.results; import android.os.Parcel; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java deleted file mode 100644 index 54b3c675a..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/KeybaseVerificationResult.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.operations.results; - -import android.os.Parcel; -import android.os.Parcelable; -import com.textuality.keybase.lib.KeybaseException; -import com.textuality.keybase.lib.prover.Prover; - -import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; - -public class KeybaseVerificationResult extends InputPendingResult { - public final String mProofUrl; - public final String mPresenceUrl; - public final String mPresenceLabel; - - public KeybaseVerificationResult(int result, OperationLog log) { - super(result, log); - mProofUrl = null; - mPresenceLabel = null; - mPresenceUrl = null; - } - - public KeybaseVerificationResult(int result, OperationLog log, Prover prover) - throws KeybaseException { - super(result, log); - mProofUrl = prover.getProofUrl(); - mPresenceUrl = prover.getPresenceUrl(); - mPresenceLabel = prover.getPresenceLabel(); - } - - public KeybaseVerificationResult(OperationLog log, RequiredInputParcel requiredInputParcel, - CryptoInputParcel cryptoInputParcel) { - super(log, requiredInputParcel, cryptoInputParcel); - mProofUrl = null; - mPresenceUrl = null; - mPresenceLabel = null; - } - - protected KeybaseVerificationResult(Parcel in) { - super(in); - mProofUrl = in.readString(); - mPresenceUrl = in.readString(); - mPresenceLabel = in.readString(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeString(mProofUrl); - dest.writeString(mPresenceUrl); - dest.writeString(mPresenceLabel); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public KeybaseVerificationResult createFromParcel(Parcel in) { - return new KeybaseVerificationResult(in); - } - - @Override - public KeybaseVerificationResult[] newArray(int size) { - return new KeybaseVerificationResult[size]; - } - }; -} \ No newline at end of file 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 cf912cbd3..98c990ca8 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 @@ -22,7 +22,7 @@ import android.content.Intent; import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.LogDisplayActivity; import org.sufficientlysecure.keychain.ui.LogDisplayFragment; @@ -756,7 +756,6 @@ public abstract class OperationResult implements Parcelable { MSG_IMPORT_FETCH_ERROR_NOT_FOUND (LogLevel.ERROR, R.string.msg_import_fetch_error_not_found), MSG_IMPORT_FETCH_ERROR_KEYSERVER(LogLevel.ERROR, R.string.msg_import_fetch_error_keyserver), MSG_IMPORT_FETCH_ERROR_KEYSERVER_SECRET (LogLevel.ERROR, R.string.msg_import_fetch_error_keyserver_secret), - MSG_IMPORT_FETCH_KEYBASE (LogLevel.INFO, R.string.msg_import_fetch_keybase), MSG_IMPORT_FETCH_FACEBOOK (LogLevel.INFO, R.string.msg_import_fetch_facebook), MSG_IMPORT_FETCH_KEYSERVER (LogLevel.INFO, R.string.msg_import_fetch_keyserver), MSG_IMPORT_FETCH_KEYSERVER_OK (LogLevel.DEBUG, R.string.msg_import_fetch_keyserver_ok), @@ -820,18 +819,6 @@ public abstract class OperationResult implements Parcelable { MSG_REVOKE_ERROR_KEY_FAIL (LogLevel.ERROR, R.string.msg_revoke_key_fail), MSG_REVOKE_OK (LogLevel.OK, R.string.msg_revoke_ok), - // keybase verification - MSG_KEYBASE_VERIFICATION(LogLevel.START, R.string.msg_keybase_verification), - - MSG_KEYBASE_ERROR_NO_PROVER(LogLevel.ERROR, R.string.msg_keybase_error_no_prover), - MSG_KEYBASE_ERROR_FETCH_PROOF(LogLevel.ERROR, R.string.msg_keybase_error_fetching_evidence), - MSG_KEYBASE_ERROR_FINGERPRINT_MISMATCH(LogLevel.ERROR, - R.string.msg_keybase_error_key_mismatch), - MSG_KEYBASE_ERROR_DNS_FAIL(LogLevel.ERROR, R.string.msg_keybase_error_dns_fail), - MSG_KEYBASE_ERROR_SPECIFIC(LogLevel.ERROR, R.string.msg_keybase_error_specific), - MSG_KEYBASE_ERROR_PAYLOAD_MISMATCH(LogLevel.ERROR, - R.string.msg_keybase_error_msg_payload_mismatch), - // InputData Operation MSG_DATA (LogLevel.START, R.string.msg_data), MSG_DATA_OPENPGP (LogLevel.DEBUG, R.string.msg_data_openpgp), diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/RevokeResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/RevokeResult.java index 4dc86c2c0..19fb0341a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/RevokeResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/RevokeResult.java @@ -21,7 +21,7 @@ import android.app.Activity; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/UploadResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/UploadResult.java index ea6436e24..5d5fd9de0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/UploadResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/UploadResult.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.operations.results; import android.os.Parcel; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java index a9b24b4ac..aa5a7b1f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java @@ -24,7 +24,7 @@ import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.bouncycastle.openpgp.PGPObjectFactory; import org.bouncycastle.openpgp.PGPPublicKey; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyInputParcel.java index d21f7b1c4..efa150c5a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyInputParcel.java @@ -23,7 +23,7 @@ import java.util.List; import android.net.Uri; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java index 9fdc6362d..d5f4ba42f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java @@ -33,7 +33,7 @@ import java.util.Map; import java.util.Map.Entry; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.webkit.MimeTypeMap; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java index 666d73599..1310c654d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java @@ -21,10 +21,10 @@ package org.sufficientlysecure.keychain.pgp; import java.util.regex.Matcher; import java.util.regex.Pattern; -import android.support.annotation.CheckResult; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.CheckResult; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import android.text.TextUtils; import timber.log.Timber; 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 ede83699a..813404c43 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.security.InvalidAlgorithmParameterException; +import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; @@ -35,7 +36,7 @@ import java.util.List; import java.util.Stack; import java.util.concurrent.atomic.AtomicBoolean; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.nist.NISTNamedCurves; @@ -46,7 +47,11 @@ import org.bouncycastle.bcpg.S2K; import org.bouncycastle.bcpg.sig.Features; import org.bouncycastle.bcpg.sig.KeyFlags; import org.bouncycastle.bcpg.sig.RevocationReasonTags; -import org.bouncycastle.jcajce.provider.asymmetric.eddsa.spec.EdDSAGenParameterSpec; +import org.bouncycastle.crypto.AsymmetricCipherKeyPair; +import org.bouncycastle.crypto.generators.Ed25519KeyPairGenerator; +import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters; +import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters; +import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; import org.bouncycastle.jce.spec.ElGamalParameterSpec; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPKeyFlags; @@ -250,10 +255,8 @@ public class PgpKeyOperation { return null; } progress(R.string.progress_generating_eddsa, 30); - EdDSAGenParameterSpec edParamSpec = - new EdDSAGenParameterSpec("ed25519"); - keyGen = KeyPairGenerator.getInstance("EdDSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME); - keyGen.initialize(edParamSpec, new SecureRandom()); + keyGen = KeyPairGenerator.getInstance("ED25519", Constants.BOUNCY_CASTLE_PROVIDER_NAME); + keyGen.initialize(256, new SecureRandom()); algorithm = PGPPublicKey.EDDSA; break; @@ -281,7 +284,8 @@ public class PgpKeyOperation { } // build new key pair - return new JcaPGPKeyPair(algorithm, keyGen.generateKeyPair(), creationTime); + KeyPair keyPair = keyGen.generateKeyPair(); + return new JcaPGPKeyPair(algorithm, keyPair, creationTime); } catch(NoSuchProviderException | InvalidAlgorithmParameterException e) { throw new RuntimeException(e); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java index 6c0f40c77..68372eb5f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSecurityConstants.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.pgp; import java.util.Arrays; import java.util.HashSet; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.bouncycastle.asn1.nist.NISTNamedCurves; import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java index 294992655..e10a161a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java @@ -24,7 +24,7 @@ import java.util.Collections; import java.util.List; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java index bfe21c976..d7b54117e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.pgp; import android.net.Uri; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java index 32bb301dc..80c2d2d64 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java @@ -37,7 +37,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.net.Uri; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.BCPGOutputStream; @@ -48,10 +48,10 @@ import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPLiteralData; import org.bouncycastle.openpgp.PGPLiteralDataGenerator; import org.bouncycastle.openpgp.PGPSignatureGenerator; +import org.bouncycastle.openpgp.PGPUtil; import org.bouncycastle.openpgp.operator.jcajce.JcePBEKeyEncryptionMethodGenerator; import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder; import org.bouncycastle.openpgp.operator.jcajce.NfcSyncPGPContentSignerBuilder; -import org.bouncycastle.openpgp.operator.jcajce.PGPUtil; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.daos.KeyRepository; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java index 2bd344855..d78c794c8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.pgp; import android.net.Uri; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SshPublicKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SshPublicKey.java index e711f3ca8..f6b5224d5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SshPublicKey.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SshPublicKey.java @@ -19,13 +19,11 @@ package org.sufficientlysecure.keychain.pgp; import org.bouncycastle.bcpg.DSAPublicBCPGKey; import org.bouncycastle.bcpg.ECPublicBCPGKey; -import org.bouncycastle.bcpg.EdDSAPublicBCPGKey; import org.bouncycastle.bcpg.RSAPublicBCPGKey; import org.bouncycastle.openpgp.PGPPublicKey; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.ssh.key.SshDSAPublicKey; import org.sufficientlysecure.keychain.ssh.key.SshECDSAPublicKey; -import org.sufficientlysecure.keychain.ssh.key.SshEd25519PublicKey; import org.sufficientlysecure.keychain.ssh.key.SshRSAPublicKey; import org.sufficientlysecure.keychain.ssh.utils.SshUtils; @@ -48,8 +46,9 @@ public class SshPublicKey { return encodeRSAKey(key); case PGPPublicKey.ECDSA: return encodeECKey(key); - case PGPPublicKey.EDDSA: - return encodeEdDSAKey(key); + // TODO +// case PGPPublicKey.EDDSA: +// return encodeEdDSAKey(key); case PGPPublicKey.DSA: return encodeDSAKey(key); default: @@ -76,13 +75,13 @@ public class SshPublicKey { - private String encodeEdDSAKey(PGPPublicKey publicKey) { - EdDSAPublicBCPGKey publicBCPGKey = (EdDSAPublicBCPGKey) publicKey.getPublicKeyPacket().getKey(); - - SshEd25519PublicKey pubkey = new SshEd25519PublicKey(publicBCPGKey.getEdDSAEncodedPoint()); - - return pubkey.getPublicKeyBlob(); - } +// private String encodeEdDSAKey(PGPPublicKey publicKey) { +// EdDSAPublicBCPGKey publicBCPGKey = (EdDSAPublicBCPGKey) publicKey.getPublicKeyPacket().getKey(); +// +// SshEd25519PublicKey pubkey = new SshEd25519PublicKey(publicBCPGKey.getEdDSAEncodedPoint()); +// +// return pubkey.getPublicKeyBlob(); +// } private String encodeDSAKey(PGPPublicKey publicKey) { DSAPublicBCPGKey publicBCPGKey = (DSAPublicBCPGKey) publicKey.getPublicKeyPacket().getKey(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java index aea544be8..32f0b6ece 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java @@ -36,7 +36,7 @@ import java.util.Set; import java.util.TimeZone; import java.util.TreeSet; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.VisibleForTesting; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.PublicKeyAlgorithmTags; @@ -672,7 +672,7 @@ public class UncachedKeyRing { } // If NO user ids remain, error out! - if (modified == null || !modified.getUserIDs().hasNext()) { + if (modified == null || !modified.getRawUserIDs().hasNext()) { log.add(LogType.MSG_KC_ERROR_NO_UID, indent); return null; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index dde5ef6ab..4372190f9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -5,8 +5,8 @@ import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; public class KeychainProvider extends ContentProvider { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java index 18ca44a0d..37901984b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryFileProvider.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import android.app.Application; import android.content.ClipDescription; import android.content.ContentProvider; import android.content.ContentResolver; @@ -38,12 +39,15 @@ import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; import androidx.work.Worker; +import androidx.work.WorkerParameters; +import org.sufficientlysecure.keychain.BuildConfig; import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.KeychainApplication; import org.sufficientlysecure.keychain.util.DatabaseUtil; import timber.log.Timber; @@ -95,7 +99,7 @@ public class TemporaryFileProvider extends ContentProvider { contentValues.put(TemporaryFileColumns.COLUMN_TIME, System.currentTimeMillis()); Uri resultUri = contentResolver.insert(CONTENT_URI, contentValues); - scheduleCleanupAfterTtl(); + scheduleCleanupAfterTtl(context); return resultUri; } @@ -308,24 +312,34 @@ public class TemporaryFileProvider extends ContentProvider { return openFileHelper(uri, mode); } - public static void scheduleCleanupAfterTtl() { + public static void scheduleCleanupAfterTtl(Context context) { OneTimeWorkRequest cleanupWork = new OneTimeWorkRequest.Builder(CleanupWorker.class) .setInitialDelay(Constants.TEMPFILE_TTL, TimeUnit.MILLISECONDS).build(); - WorkManager.getInstance().enqueue(cleanupWork); + workManagerEnqueue(context, cleanupWork); } - public static void scheduleCleanupImmediately() { + public static void scheduleCleanupImmediately(Context context) { OneTimeWorkRequest cleanupWork = new OneTimeWorkRequest.Builder(CleanupWorker.class).build(); - WorkManager workManager = WorkManager.getInstance(); - if (workManager != null) { // it's possible this is null, if this is called in onCreate of secondary processes - workManager.enqueue(cleanupWork); + workManagerEnqueue(context, cleanupWork); + } + + private static void workManagerEnqueue(Context context, OneTimeWorkRequest cleanupWork) { + // work manager is only available on the main thread + if (!BuildConfig.APPLICATION_ID.equals(KeychainApplication.getProcessName())) { + return; } + WorkManager.getInstance(context).enqueue(cleanupWork); } public static class CleanupWorker extends Worker { + public CleanupWorker(@NonNull Context context, + @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + @NonNull @Override - public WorkerResult doWork() { + public Result doWork() { Timber.d("Cleaning up temporary files…"); ContentResolver contentResolver = getApplicationContext().getContentResolver(); @@ -335,7 +349,7 @@ public class TemporaryFileProvider extends ContentProvider { new String[]{Long.toString(System.currentTimeMillis() - Constants.TEMPFILE_TTL)} ); - return WorkerResult.SUCCESS; + return Result.success(); } } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AutocryptInteractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AutocryptInteractor.java index db6aaa94c..4907f47c7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AutocryptInteractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AutocryptInteractor.java @@ -2,15 +2,13 @@ package org.sufficientlysecure.keychain.remote; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Map; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.text.format.DateUtils; import org.openintents.openpgp.AutocryptPeerUpdate; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java index f3a6fca2e..831a01e31 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java @@ -31,7 +31,7 @@ import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.widget.Toast; import org.sufficientlysecure.keychain.BuildConfig; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 72075e29a..7e4514fa4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -38,8 +38,8 @@ import android.os.Messenger; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SystemClock; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.text.TextUtils; import org.bouncycastle.bcpg.ArmoredOutputStream; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractor.java index 106073ce9..463c1dac0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractor.java @@ -27,8 +27,8 @@ import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import org.openintents.openpgp.util.OpenPgpApi; import org.sufficientlysecure.keychain.provider.KeychainExternalContract; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java index 7dd4d1c13..a82f0e5f7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/SshAuthenticationService.java @@ -40,6 +40,8 @@ import org.openintents.ssh.authentication.response.PublicKeyResponse; import org.openintents.ssh.authentication.response.SigningResponse; import org.openintents.ssh.authentication.response.SshPublicKeyResponse; import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.KeychainApplication; +import org.sufficientlysecure.keychain.analytics.AnalyticsManager; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel; import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey; @@ -65,6 +67,8 @@ public class SshAuthenticationService extends Service { private ApiAppDao mApiAppDao; private ApiPendingIntentFactory mApiPendingIntentFactory; + private AnalyticsManager analyticsManager; + private static final List SUPPORTED_VERSIONS = Collections.unmodifiableList(Collections.singletonList(1)); private static final int INVALID_API_VERSION = -1; @@ -78,6 +82,8 @@ public class SshAuthenticationService extends Service { mApiAppDao = ApiAppDao.getInstance(this); mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext()); + + analyticsManager = ((KeychainApplication) getApplication()).getAnalyticsManager(); } private final ISshAuthenticationService.Stub mSSHAgent = new ISshAuthenticationService.Stub() { @@ -103,6 +109,8 @@ public class SshAuthenticationService extends Service { } private Intent executeInternal(Intent intent) { + analyticsManager.trackApiServiceCall(intent.getAction(), mApiPermissionHelper.getCurrentCallingPackage()); + switch (intent.getAction()) { case SshAuthenticationApi.ACTION_SIGN: return authenticate(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java index 1d43a0b70..fd2ba5fa5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java @@ -27,7 +27,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.v4.app.FragmentManager; +import androidx.fragment.app.FragmentManager; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java index e85806428..0e8beddcd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java @@ -21,10 +21,10 @@ package org.sufficientlysecure.keychain.remote.ui; import java.util.List; import java.util.Set; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java index 13406266e..dae36fbf6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java @@ -20,19 +20,19 @@ package org.sufficientlysecure.keychain.remote.ui; import java.util.List; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteBackupActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteBackupActivity.java index 524e8819c..f16b50b30 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteBackupActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteBackupActivity.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.remote.ui; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.remote.CryptoInputParcelCacheService; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteDisplayTransferCodeActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteDisplayTransferCodeActivity.java index c15c776df..d256b2fa7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteDisplayTransferCodeActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteDisplayTransferCodeActivity.java @@ -25,9 +25,9 @@ import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteRegisterActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteRegisterActivity.java index a68cccc05..d0b020a99 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteRegisterActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteRegisterActivity.java @@ -25,9 +25,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java index 153d52cee..5c49fb2d0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java @@ -27,10 +27,10 @@ import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.StringRes; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionActivity.java index 934ea70aa..ac22132c7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionActivity.java @@ -25,9 +25,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; @@ -36,9 +36,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import org.openintents.openpgp.util.OpenPgpUtils.UserId; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.remote.ui.RequestKeyPermissionPresenter.RequestKeyPermissionMvpView; import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionPresenter.java index 8f45d5fb3..29a3c3e53 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RequestKeyPermissionPresenter.java @@ -23,7 +23,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java index f696f78e3..1a8ae735c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java @@ -24,11 +24,11 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.widget.LinearLayoutManager; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java index 5ef3ec72e..365935bce 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java @@ -21,11 +21,11 @@ package org.sufficientlysecure.keychain.remote.ui; import java.util.List; import android.app.Activity; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java index 7e3b0864f..fcbfc57cb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java @@ -5,9 +5,9 @@ import java.util.List; import android.content.Context; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicateActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicateActivity.java index 057d981a8..ad03f6360 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicateActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicateActivity.java @@ -23,19 +23,19 @@ import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java index 6464b4add..9b41914b2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java @@ -20,9 +20,9 @@ package org.sufficientlysecure.keychain.remote.ui.dialog; import java.util.List; -import android.arch.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleOwner; import android.content.Context; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.recyclerview.widget.RecyclerView.Adapter; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java index e320d5e1c..f91b13ff7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java @@ -23,9 +23,9 @@ import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -33,13 +33,13 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable.ConstantState; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.content.res.ResourcesCompat; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.core.content.res.ResourcesCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyPresenter.java index 24f93520a..e45a8ffef 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyPresenter.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.remote.ui.dialog; import java.util.List; -import android.arch.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleOwner; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java index 3370ebfb6..17ead0307 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java @@ -23,9 +23,9 @@ import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -34,17 +34,17 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable.ConstantState; import android.os.Bundle; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.transition.Fade; -import android.support.transition.Transition; -import android.support.transition.TransitionListenerAdapter; -import android.support.transition.TransitionManager; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.content.res.ResourcesCompat; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.transition.Fade; +import androidx.transition.Transition; +import androidx.transition.TransitionListenerAdapter; +import androidx.transition.TransitionManager; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.core.content.res.ResourcesCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdentityKeyPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdentityKeyPresenter.java index ccf865fb2..f5007522e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdentityKeyPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdentityKeyPresenter.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import android.arch.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleOwner; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/NfcTransport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/NfcTransport.java index 0aedc45dd..41fd2f6ef 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/NfcTransport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/NfcTransport.java @@ -18,14 +18,11 @@ package org.sufficientlysecure.keychain.securitytoken; import android.nfc.Tag; -import android.support.annotation.Nullable; -import android.util.Log; +import androidx.annotation.Nullable; -import org.bouncycastle.util.encoders.Hex; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TokenType; import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TransportType; -import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenActivity; import java.io.IOException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java index 18f22e9b7..74067dfba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCapabilities.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.securitytoken; import java.io.IOException; import java.nio.ByteBuffer; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCommandApduFactory.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCommandApduFactory.java index b31748de1..729a9d85e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCommandApduFactory.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/OpenPgpCommandApduFactory.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.securitytoken; import java.util.ArrayList; import java.util.List; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Hex; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SCP11bSecureMessaging.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SCP11bSecureMessaging.java index ce882a272..249b2af8e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SCP11bSecureMessaging.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SCP11bSecureMessaging.java @@ -55,8 +55,8 @@ import java.security.spec.InvalidParameterSpecException; import java.util.ArrayList; import android.content.Context; -import android.support.annotation.CheckResult; -import android.support.annotation.NonNull; +import androidx.annotation.CheckResult; +import androidx.annotation.NonNull; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java index 0237c12fd..4215af30c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenConnection.java @@ -24,9 +24,9 @@ import java.util.List; import android.content.Context; import android.os.SystemClock; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TokenType; import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TransportType; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenInfo.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenInfo.java index 9e107371e..4320db59b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenInfo.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenInfo.java @@ -28,8 +28,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.bouncycastle.util.encoders.Hex; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/Transport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/Transport.java index 826494fb5..5cee7126f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/Transport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/Transport.java @@ -22,7 +22,7 @@ import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.Transport import java.io.IOException; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; /** diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/PsoDecryptTokenOp.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/PsoDecryptTokenOp.java index ceb54cfcb..83c8349de 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/PsoDecryptTokenOp.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/PsoDecryptTokenOp.java @@ -18,21 +18,12 @@ package org.sufficientlysecure.keychain.securitytoken.operations; -import java.io.IOException; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; -import android.support.annotation.NonNull; -import android.support.annotation.VisibleForTesting; - -import javax.crypto.Cipher; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.asn1.cryptlib.CryptlibObjectIdentifiers; import org.bouncycastle.asn1.x9.ECNamedCurveTable; import org.bouncycastle.asn1.x9.X9ECParameters; -import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.jcajce.util.MessageDigestUtils; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.openpgp.PGPException; @@ -48,6 +39,16 @@ import org.sufficientlysecure.keychain.securitytoken.KeyFormat; import org.sufficientlysecure.keychain.securitytoken.ResponseApdu; import org.sufficientlysecure.keychain.securitytoken.SecurityTokenConnection; +import java.io.IOException; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + /** This class implements the PSO:DECIPHER operation, as specified in OpenPGP card spec / 7.2.11 (p52 in v3.0.1). * @@ -196,7 +197,8 @@ public class PsoDecryptTokenOp { } private byte[] getEcDecipherPayload(ECKeyFormat eckf, byte[] encryptedPoint) throws CardException { - if (CustomNamedCurves.CV25519.equals(eckf.getCurveOID())) { + // TODO is this the right curve? + if (CryptlibObjectIdentifiers.curvey25519.equals(eckf.getCurveOID())) { return Arrays.copyOfRange(encryptedPoint, 1, 33); } else { X9ECParameters x9Params = ECNamedCurveTable.getByOID(eckf.getCurveOID()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/SecurityTokenChangeKeyTokenOp.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/SecurityTokenChangeKeyTokenOp.java index 3618731ab..6c784326d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/SecurityTokenChangeKeyTokenOp.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/operations/SecurityTokenChangeKeyTokenOp.java @@ -26,7 +26,7 @@ import java.security.interfaces.ECPublicKey; import java.security.interfaces.RSAPrivateCrtKey; import java.util.Arrays; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.VisibleForTesting; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidDescription.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidDescription.java index b0654faa2..c63c6f855 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidDescription.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidDescription.java @@ -21,8 +21,8 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; -import android.support.annotation.NonNull; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.securitytoken.usb.tpdu.T0ShortApduProtocol; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransceiver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransceiver.java index 75ff2b358..518532514 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransceiver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransceiver.java @@ -24,9 +24,9 @@ import java.nio.ByteOrder; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbEndpoint; import android.os.SystemClock; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.WorkerThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import com.google.auto.value.AutoValue; import org.bouncycastle.util.Arrays; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransportProtocol.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransportProtocol.java index fd3966232..34d1c1ae3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransportProtocol.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/CcidTransportProtocol.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; public interface CcidTransportProtocol { void connect(@NonNull CcidTransceiver transceiver) throws UsbTransportException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java index 9c8fd28de..18766bce5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java @@ -27,8 +27,8 @@ import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbEndpoint; import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbManager; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.Pair; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/RBlock.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/RBlock.java index 1536b08a0..f31e8d56f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/RBlock.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/RBlock.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb.tpdu; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.securitytoken.usb.UsbTransportException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T0ShortApduProtocol.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T0ShortApduProtocol.java index 63a15b20a..5ec055398 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T0ShortApduProtocol.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T0ShortApduProtocol.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb.tpdu; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.securitytoken.usb.CcidTransceiver; import org.sufficientlysecure.keychain.securitytoken.usb.CcidTransceiver.CcidDataBlock; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1ShortApduProtocol.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1ShortApduProtocol.java index 073b472f4..41f659f26 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1ShortApduProtocol.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1ShortApduProtocol.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb.tpdu; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.securitytoken.usb.CcidTransceiver; import org.sufficientlysecure.keychain.securitytoken.usb.CcidTransceiver.CcidDataBlock; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1TpduProtocol.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1TpduProtocol.java index 5cfe38e36..7fc3a73b5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1TpduProtocol.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/tpdu/T1TpduProtocol.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb.tpdu; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.bouncycastle.util.Arrays; import org.sufficientlysecure.keychain.securitytoken.usb.CcidTransceiver; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/BackupKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/BackupKeyringParcel.java index f88580fe2..2e15ab22c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/BackupKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/BackupKeyringParcel.java @@ -22,7 +22,7 @@ import java.util.List; import android.net.Uri; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java index bf60493fe..745f773d3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java @@ -23,8 +23,8 @@ import java.util.Collection; import java.util.List; import android.os.Parcelable; -import android.support.annotation.CheckResult; -import android.support.annotation.Nullable; +import androidx.annotation.CheckResult; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ChangeUnlockParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ChangeUnlockParcel.java index fde6b5fed..9f0196e19 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ChangeUnlockParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ChangeUnlockParcel.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.service; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.util.Passphrase; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java index b87cc8591..ea5a43221 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java @@ -18,7 +18,6 @@ package org.sufficientlysecure.keychain.service; -import android.Manifest; import android.accounts.Account; import android.app.PendingIntent; import android.app.Service; @@ -28,14 +27,13 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SyncResult; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceActivity; import android.provider.ContactsContract; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationManagerCompat; -import android.support.v4.content.ContextCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.KeychainApplication; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java index bf8d20033..d4dac61e5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/InputDataParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/InputDataParcel.java index 97c29dbf7..7ea26741c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/InputDataParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/InputDataParcel.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.service; import android.net.Uri; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java deleted file mode 100644 index 12bb296f1..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeybaseVerificationParcel.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.service; - -import android.os.Parcel; -import android.os.Parcelable; - -public class KeybaseVerificationParcel implements Parcelable { - - public String mKeybaseProof; - public String mRequiredFingerprint; - - public KeybaseVerificationParcel(String keybaseProof, String requiredFingerprint) { - mKeybaseProof = keybaseProof; - mRequiredFingerprint = requiredFingerprint; - } - - protected KeybaseVerificationParcel(Parcel in) { - mKeybaseProof = in.readString(); - mRequiredFingerprint = in.readString(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mKeybaseProof); - dest.writeString(mRequiredFingerprint); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public KeybaseVerificationParcel createFromParcel(Parcel in) { - return new KeybaseVerificationParcel(in); - } - - @Override - public KeybaseVerificationParcel[] newArray(int size) { - return new KeybaseVerificationParcel[size]; - } - }; -} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java index cd1eba398..9dc0a9c37 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainServiceTask.java @@ -25,7 +25,7 @@ import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Parcelable; -import android.support.v4.os.CancellationSignal; +import androidx.core.os.CancellationSignal; import org.sufficientlysecure.keychain.KeychainApplication; import org.sufficientlysecure.keychain.analytics.AnalyticsManager; @@ -41,7 +41,6 @@ import org.sufficientlysecure.keychain.operations.ImportOperation; import org.sufficientlysecure.keychain.operations.InputDataOperation; import org.sufficientlysecure.keychain.operations.KeySyncOperation; import org.sufficientlysecure.keychain.operations.KeySyncParcel; -import org.sufficientlysecure.keychain.operations.KeybaseVerificationOperation; import org.sufficientlysecure.keychain.operations.PromoteKeyOperation; import org.sufficientlysecure.keychain.operations.RevokeOperation; import org.sufficientlysecure.keychain.operations.SignEncryptOperation; @@ -114,8 +113,6 @@ public class KeychainServiceTask { } else if (inputParcel instanceof UploadKeyringParcel) { op = new UploadOperation(context, keyRepository, asyncProgressable, operationCancelledBoolean); - } else if (inputParcel instanceof KeybaseVerificationParcel) { - op = new KeybaseVerificationOperation(context, keyRepository, asyncProgressable); } else if (inputParcel instanceof InputDataParcel) { op = new InputDataOperation(context, keyRepository, asyncProgressable); } else if (inputParcel instanceof BenchmarkInputParcel) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index c0e20f568..19e89d326 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -36,10 +36,10 @@ import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationCompat.Builder; -import android.support.v4.app.NotificationCompat.InboxStyle; -import android.support.v4.util.LongSparseArray; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationCompat.Builder; +import androidx.core.app.NotificationCompat.InboxStyle; +import androidx.collection.LongSparseArray; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants.NotificationIds; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressDialogManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressDialogManager.java index d5086a4ba..1fb4d52e7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressDialogManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressDialogManager.java @@ -20,9 +20,9 @@ package org.sufficientlysecure.keychain.service; import android.app.ProgressDialog; import android.os.Handler; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.os.CancellationSignal; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.core.os.CancellationSignal; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java index c116d242f..a02a2c887 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PromoteKeyringParcel.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.service; import java.util.List; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/RevokeKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/RevokeKeyringParcel.java index c2484f947..22b7ac295 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/RevokeKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/RevokeKeyringParcel.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.service; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java index bb13973cf..703c8137c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java @@ -24,7 +24,7 @@ import java.util.Collections; import java.util.List; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.bouncycastle.bcpg.sig.KeyFlags; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/UploadKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/UploadKeyringParcel.java index 87f2b71ea..1819c333b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/UploadKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/UploadKeyringParcel.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.service; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java index e9e9a31ec..7d4882a6d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java @@ -25,8 +25,8 @@ import java.util.HashMap; import java.util.Map; import android.os.Parcelable; -import android.support.annotation.CheckResult; -import android.support.annotation.Nullable; +import androidx.annotation.CheckResult; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import com.ryanharter.auto.value.parcel.ParcelAdapter; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationData.java index 644a266ee..431a16737 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationData.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationData.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ssh; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationOperation.java index 243bfba9b..3aad253f3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ssh/AuthenticationOperation.java @@ -21,7 +21,7 @@ package org.sufficientlysecure.keychain.ssh; import java.util.Collection; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.bouncycastle.openpgp.AuthenticationSignatureGenerator; import org.bouncycastle.openpgp.PGPException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupActivity.java index f20120b65..9806a50bd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupActivity.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import android.view.MenuItem; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java index 3911a0f67..b0cd5b5ef 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java @@ -28,15 +28,13 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupRestoreFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupRestoreFragment.java index 92cde2cb9..246d7681b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupRestoreFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupRestoreFragment.java @@ -32,9 +32,9 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java index 6c958bf5b..a75d3f68f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java @@ -17,11 +17,8 @@ package org.sufficientlysecure.keychain.ui; -import android.arch.lifecycle.ViewModelProviders; -import android.content.Intent; -import android.net.Uri; +import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import android.view.View; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.base.BaseActivity; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java index 9abb2ad39..02989a7c5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java @@ -18,12 +18,12 @@ package org.sufficientlysecure.keychain.ui; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 29ff936fb..d882ede52 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -23,12 +23,12 @@ import java.util.Date; import java.util.List; import android.app.Activity; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.graphics.PorterDuff; import android.os.Bundle; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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 90432a79c..b45a2b100 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java @@ -24,11 +24,11 @@ import java.util.ArrayList; import android.content.Intent; import android.nfc.NfcAdapter; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.app.TaskStackBuilder; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.core.app.TaskStackBuilder; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.securitytoken.KeyFormat; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java index 74652e621..938a3ea62 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java @@ -23,11 +23,11 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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 5eabe1e44..007421d2d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -26,8 +26,8 @@ import java.util.regex.Pattern; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java index d507e9c1a..f33506f18 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyNameFragment.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java index 5915e051e..e24dce606 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java @@ -24,8 +24,8 @@ import android.content.Intent; import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenAlgorithmFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenAlgorithmFragment.java index 834120530..af1201bff 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenAlgorithmFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenAlgorithmFragment.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui; import android.app.Activity; import android.content.Context; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import android.text.Html; import android.view.LayoutInflater; import android.view.View; @@ -32,7 +32,6 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.securitytoken.KeyFormat; -import org.sufficientlysecure.keychain.securitytoken.SecurityTokenConnection; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.util.Choice; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java index 883ad4dfa..8685f2bc3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.ui; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,7 +30,6 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.securitytoken.SecurityTokenConnection; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.util.Passphrase; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java index 4b300babd..98a551536 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java @@ -21,9 +21,9 @@ package org.sufficientlysecure.keychain.ui; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java index b38856f5e..15cc64bf1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java @@ -32,8 +32,8 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java index 3fefd4455..c20577a13 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java @@ -29,9 +29,9 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import android.widget.Toast; import org.sufficientlysecure.keychain.Constants; 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 81494d2df..5982a145e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -21,11 +21,11 @@ package org.sufficientlysecure.keychain.ui; import java.util.ArrayList; import android.app.Activity; -import android.arch.lifecycle.LiveData; +import androidx.lifecycle.LiveData; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.View; import android.widget.Button; import android.widget.ImageView; @@ -138,7 +138,7 @@ public abstract class DecryptFragment extends Fragment { { ParcelableKeyRing keyEntry = ParcelableKeyRing.createFromReference(null, - KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null, null); + KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index 69a3b25a1..f944b542f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -44,11 +44,11 @@ import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MenuItem; @@ -769,7 +769,7 @@ public class DecryptListFragment { ParcelableKeyRing keyEntry = ParcelableKeyRing.createFromReference(null, - KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null, null); + KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java index c4fee2953..2b0d4fedf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java @@ -25,10 +25,10 @@ import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextActivity.java index 18f2ab0f7..4e36626f3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextActivity.java @@ -23,7 +23,7 @@ import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.widget.Toast; import org.openintents.openpgp.OpenPgpMetadata; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextFragment.java index eb1c2e0ea..c1f3c0bb9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DisplayTextFragment.java @@ -23,8 +23,8 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.Menu; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index f0c0ba3d3..24c037969 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -24,8 +24,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java index 91a646142..cb471882d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.ui; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import android.view.Menu; import android.view.MenuItem; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptFragment.java index eb362d0f3..eb6de2883 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptFragment.java @@ -28,8 +28,8 @@ import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java index 4e0214426..2fcdf0156 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java @@ -21,7 +21,7 @@ import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.v4.app.FragmentTransaction; +import androidx.fragment.app.FragmentTransaction; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 60976b9c0..1e1d419e9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -41,12 +41,12 @@ import android.net.Uri; import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.FragmentActivity; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeAsymmetricFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeAsymmetricFragment.java index 99caf6076..ee1a690f1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeAsymmetricFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeAsymmetricFragment.java @@ -22,13 +22,13 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -42,12 +42,8 @@ import org.sufficientlysecure.keychain.livedata.GenericLiveData; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput; import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput.EncryptRecipientChip; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.ui.widget.KeySpinner; import org.sufficientlysecure.keychain.util.Passphrase; -import timber.log.Timber; public class EncryptModeAsymmetricFragment extends EncryptModeFragment { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeFragment.java index 93214e46f..09d458c26 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptModeFragment.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import org.sufficientlysecure.keychain.util.Passphrase; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java index 6ff7bfbc3..a65b5271a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java @@ -22,10 +22,8 @@ import java.io.IOException; import android.app.Activity; import android.content.Intent; -import android.net.Uri; import android.os.Bundle; -import android.support.v4.app.FragmentTransaction; -import android.util.Log; +import androidx.fragment.app.FragmentTransaction; import android.widget.Toast; import org.apache.james.mime4j.util.MimeUtil; @@ -34,7 +32,6 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FileHelper; -import timber.log.Timber; public class EncryptTextActivity extends EncryptActivity { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java index 5a53d9d87..d0bdce7bd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java @@ -21,7 +21,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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 6bf653fbf..7c4eb4355 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import android.view.View; import com.astuetz.PagerSlidingTabStrip; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java index 6adb9b906..3177157d7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index a5d85a93d..4db8a525a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -27,9 +27,9 @@ import android.content.Intent; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import android.text.TextUtils; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java index 853d82e6a..1b8a783be 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java @@ -25,8 +25,8 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java index fbe2e5080..33ecdd8a9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -20,16 +20,16 @@ package org.sufficientlysecure.keychain.ui; import android.app.Activity; import android.content.Context; -import android.databinding.DataBindingUtil; +import androidx.databinding.DataBindingUtil; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.Loader; -import android.support.v7.widget.LinearLayoutManager; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.LinearLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java index a5eb1aa01..f69a465af 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -25,7 +25,7 @@ import android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.FragmentActivity; import android.widget.Toast; import com.google.zxing.integration.android.IntentIntegrator; @@ -223,7 +223,7 @@ public class ImportKeysProxyActivity extends FragmentActivity } public void importKeysFromFingerprint(byte[] fingerprint) { - ParcelableKeyRing keyEntry = ParcelableKeyRing.createFromReference(fingerprint, null, null, null); + ParcelableKeyRing keyEntry = ParcelableKeyRing.createFromReference(fingerprint, null, null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java index 1b60ab634..078a54eca 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysSearchFragment.java @@ -24,12 +24,12 @@ import android.database.MatrixCursor; import android.os.Bundle; import android.preference.PreferenceActivity; import android.provider.BaseColumns; -import android.support.v4.app.Fragment; -import android.support.v4.view.MenuItemCompat; -import android.support.v4.view.MenuItemCompat.OnActionExpandListener; -import android.support.v4.widget.CursorAdapter; -import android.support.v4.widget.SimpleCursorAdapter; -import android.support.v7.widget.SearchView; +import androidx.fragment.app.Fragment; +import androidx.core.view.MenuItemCompat; +import androidx.core.view.MenuItemCompat.OnActionExpandListener; +import androidx.cursoradapter.widget.CursorAdapter; +import androidx.cursoradapter.widget.SimpleCursorAdapter; +import androidx.appcompat.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -48,8 +48,8 @@ import org.sufficientlysecure.keychain.util.Preferences.CloudSearchPrefs; import java.util.ArrayList; import java.util.List; -import static android.support.v7.widget.SearchView.OnQueryTextListener; -import static android.support.v7.widget.SearchView.OnSuggestionListener; +import static androidx.appcompat.widget.SearchView.OnQueryTextListener; +import static androidx.appcompat.widget.SearchView.OnSuggestionListener; /** * Consists of the search bar, search button, and search settings button 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 32ce010d3..4c1c30336 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -23,17 +23,9 @@ import java.util.List; import android.animation.ObjectAnimator; import android.app.Activity; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.support.annotation.WorkerThread; -import android.support.v4.app.FragmentActivity; -import android.support.v4.view.MenuItemCompat; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SearchView; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; @@ -44,6 +36,14 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.ViewAnimator; +import androidx.annotation.WorkerThread; +import androidx.appcompat.widget.SearchView; +import androidx.core.view.MenuItemCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.getbase.floatingactionbutton.FloatingActionButton; import com.getbase.floatingactionbutton.FloatingActionsMenu; import eu.davidea.fastscroller.FastScroller; @@ -188,12 +188,6 @@ public class KeyListFragment extends RecyclerFragment. - */ - -package org.sufficientlysecure.keychain.ui; - - -import java.io.IOException; -import java.util.ArrayList; - -import android.annotation.TargetApi; -import android.content.Intent; -import android.graphics.PorterDuff; -import android.os.Build; -import android.os.Bundle; -import android.view.View; -import android.widget.ImageView; -import android.widget.NumberPicker; - -import edu.cmu.cylab.starslinger.exchange.ExchangeActivity; -import edu.cmu.cylab.starslinger.exchange.ExchangeConfig; -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.ImportOperation; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.daos.KeyRepository; -import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException; -import org.sufficientlysecure.keychain.service.ImportKeyringParcel; -import org.sufficientlysecure.keychain.ui.base.BaseActivity; -import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; -import org.sufficientlysecure.keychain.ui.util.FormattingUtils; -import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.util.ParcelableFileCache; -import timber.log.Timber; - - -@TargetApi(Build.VERSION_CODES.HONEYCOMB) -public class SafeSlingerActivity extends BaseActivity - implements CryptoOperationHelper.Callback { - - private static final int REQUEST_CODE_SAFE_SLINGER = 211; - - public static final String EXTRA_MASTER_KEY_ID = "master_key_id"; - - private long mMasterKeyId; - private int mSelectedNumber = 2; - - // for CryptoOperationHelper - private ArrayList mKeyList; - private HkpKeyserverAddress mKeyserver; - private CryptoOperationHelper mOperationHelper; - private KeyRepository keyRepository; - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - keyRepository = KeyRepository.create(this); - mMasterKeyId = getIntent().getLongExtra(EXTRA_MASTER_KEY_ID, 0); - - NumberPicker picker = findViewById(R.id.safe_slinger_picker); - picker.setMinValue(2); - picker.setMaxValue(10); - picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mSelectedNumber = newVal; - } - }); - - ImageView buttonIcon = findViewById(R.id.safe_slinger_button_image); - buttonIcon.setColorFilter(FormattingUtils.getColorFromAttr(this, R.attr.colorTertiaryText), - PorterDuff.Mode.SRC_IN); - - View button = findViewById(R.id.safe_slinger_button); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startExchange(mMasterKeyId, mSelectedNumber); - } - }); - } - - @Override - protected void initLayout() { - setContentView(R.layout.safe_slinger_activity); - } - - private void startExchange(long masterKeyId, int number) { - try { - byte[] keyBlob = keyRepository.loadPublicKeyRingData(masterKeyId); - - Intent slingerIntent = new Intent(this, ExchangeActivity.class); - - slingerIntent.putExtra(ExchangeConfig.extra.NUM_USERS, number); - slingerIntent.putExtra(ExchangeConfig.extra.USER_DATA, keyBlob); - slingerIntent.putExtra(ExchangeConfig.extra.HOST_NAME, Constants.SAFESLINGER_SERVER); - startActivityForResult(slingerIntent, REQUEST_CODE_SAFE_SLINGER); - } catch (NotFoundException e) { - Timber.e(e, "key for transfer not found"); - } - } - - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (mOperationHelper != null) { - mOperationHelper.handleActivityResult(requestCode, resultCode, data); - } - - if (requestCode == REQUEST_CODE_SAFE_SLINGER) { - if (resultCode == ExchangeActivity.RESULT_EXCHANGE_CANCELED) { - return; - } - - Timber.d("importKeys started"); - - // instead of giving the entries by Intent extra, cache them into a - // file to prevent Java Binder problems on heavy imports - // read FileImportCache for more info. - try { - // import exchanged keys - ArrayList it = getSlingedKeys(data.getExtras()); - - // We parcel this iteratively into a file - anything we can - // display here, we should be able to import. - ParcelableFileCache cache = - new ParcelableFileCache<>(this, ImportOperation.CACHE_FILE_NAME); - cache.writeCache(it.size(), it.iterator()); - - mOperationHelper = - new CryptoOperationHelper(1, this, this, R.string.progress_importing); - - mKeyList = null; - mKeyserver = null; - mOperationHelper.cryptoOperation(); - } catch (IOException e) { - Timber.e(e, "Problem writing cache file"); - Notify.create(this, "Problem writing cache file!", Notify.Style.ERROR).show(); - } - } else { - // give everything else down to KeyListActivity! - setResult(resultCode, data); - finish(); - } - } - - private static ArrayList getSlingedKeys(Bundle extras) { - ArrayList list = new ArrayList<>(); - - if (extras != null) { - byte[] d; - int i = 0; - do { - d = extras.getByteArray(ExchangeConfig.extra.MEMBER_DATA + i); - if (d != null) { - list.add(ParcelableKeyRing.createFromEncodedBytes(d)); - i++; - } - } while (d != null); - } - - return list; - } - - // CryptoOperationHelper.Callback functions - - @Override - public ImportKeyringParcel createOperationInput() { - return ImportKeyringParcel.createImportKeyringParcel(mKeyList, mKeyserver); - } - - @Override - public void onCryptoOperationSuccess(ImportKeyResult result) { - Intent certifyIntent = new Intent(this, CertifyKeyActivity.class); - certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result); - certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds()); - certifyIntent.putExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, mMasterKeyId); - startActivityForResult(certifyIntent, 0); - } - - @Override - public void onCryptoOperationCancelled() { - - } - - @Override - public void onCryptoOperationError(ImportKeyResult result) { - Bundle returnData = new Bundle(); - returnData.putParcelable(OperationResult.EXTRA_RESULT, result); - Intent data = new Intent(); - data.putExtras(returnData); - setResult(RESULT_OK, data); - finish(); - } - - @Override - public boolean onCryptoSetProgress(String msg, int progress, int max) { - return false; - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java index 236a07fb8..7c09d8d82 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityKeyShopFragment.java @@ -19,9 +19,9 @@ package org.sufficientlysecure.keychain.ui; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index 1bc83869e..2e8a14fae 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -41,9 +41,9 @@ import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.preference.SwitchPreference; import android.provider.ContactsContract; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.appcompat.widget.Toolbar; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java index 1e1f1a86d..6ce8e8d45 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java @@ -26,11 +26,11 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.v4.app.Fragment; -import android.support.v4.view.MotionEventCompat; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.fragment.app.Fragment; +import androidx.core.view.MotionEventCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthoritiesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthoritiesActivity.java index 84c894c04..6810e6fff 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthoritiesActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthoritiesActivity.java @@ -27,13 +27,9 @@ import org.sufficientlysecure.keychain.ui.base.BaseActivity; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.IOException; import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; + public class SettingsSmartPGPAuthoritiesActivity extends BaseActivity { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthorityFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthorityFragment.java index 2ea931dd1..9d33aff98 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthorityFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsSmartPGPAuthorityFragment.java @@ -22,10 +22,10 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SubKeyItem.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SubKeyItem.java index 4f737c377..178abf307 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SubKeyItem.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SubKeyItem.java @@ -9,7 +9,7 @@ import java.util.TimeZone; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.Typeface; -import android.support.annotation.StringRes; +import androidx.annotation.StringRes; import android.text.format.DateFormat; import android.view.View; import android.view.View.OnClickListener; 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 457d02354..65295caf7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java @@ -22,17 +22,17 @@ import java.util.List; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.Transformations; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.StringRes; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.OnPageChangeListener; +import androidx.annotation.StringRes; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; +import androidx.viewpager.widget.ViewPager.OnPageChangeListener; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; 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 6f080c468..bba11d1de 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java @@ -20,35 +20,33 @@ package org.sufficientlysecure.keychain.ui; import android.app.Activity; import android.app.ActivityOptions; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.Transformations; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; +import androidx.lifecycle.ViewModelProviders; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; -import android.graphics.PorterDuff; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.app.Fragment; -import android.support.v7.widget.CardView; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.fragment.app.Fragment; +import androidx.cardview.widget.CardView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.livedata.GenericLiveData; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.ui.ViewKeyAdvActivity.ViewKeyAdvViewModel; -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.Notify.Style; @@ -99,12 +97,9 @@ public class ViewKeyAdvShareFragment extends Fragment { View vFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard); View vKeyShareButton = view.findViewById(R.id.view_key_action_key_share); View vKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard); - ImageButton vKeySafeSlingerButton = view.findViewById(R.id.view_key_action_key_safeslinger); View vKeySshShareButton = view.findViewById(R.id.view_key_action_key_ssh_share); View vKeySshClipboardButton = view.findViewById(R.id.view_key_action_key_ssh_clipboard); View vKeyUploadButton = view.findViewById(R.id.view_key_action_upload); - vKeySafeSlingerButton.setColorFilter(FormattingUtils.getColorFromAttr(requireContext(), R.attr.colorTertiaryText), - PorterDuff.Mode.SRC_IN); vFingerprintShareButton.setOnClickListener(v -> shareFingerprint(false)); vFingerprintClipboardButton.setOnClickListener(v -> shareFingerprint(true)); @@ -113,7 +108,6 @@ public class ViewKeyAdvShareFragment extends Fragment { vKeyClipboardButton.setOnClickListener(v -> ShareKeyHelper.shareKeyToClipboard(getActivity(), unifiedKeyInfo.master_key_id())); - vKeySafeSlingerButton.setOnClickListener(v -> startSafeSlinger()); vKeySshShareButton.setOnClickListener(v -> ShareKeyHelper.shareSshKey(getActivity(), unifiedKeyInfo.master_key_id())); vKeySshClipboardButton.setOnClickListener(v -> ShareKeyHelper.shareSshKeyToClipboard(getActivity(), unifiedKeyInfo.master_key_id())); @@ -122,12 +116,6 @@ public class ViewKeyAdvShareFragment extends Fragment { return view; } - private void startSafeSlinger() { - Intent safeSlingerIntent = new Intent(getActivity(), SafeSlingerActivity.class); - safeSlingerIntent.putExtra(SafeSlingerActivity.EXTRA_MASTER_KEY_ID, unifiedKeyInfo.master_key_id()); - startActivityForResult(safeSlingerIntent, 0); - } - private void shareFingerprint(boolean toClipboard) { Activity activity = getActivity(); if (activity == null || unifiedKeyInfo == null) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java index 70850ae2a..e93d2cbf1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java index 170343704..9a7928821 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java @@ -21,18 +21,18 @@ package org.sufficientlysecure.keychain.ui; import java.util.ArrayList; import java.util.List; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; 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 b76301e0d..0a9a67c4e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java @@ -20,15 +20,15 @@ package org.sufficientlysecure.keychain.ui; import java.util.List; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java deleted file mode 100644 index 70fb46e70..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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; - - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.List; - -import android.arch.lifecycle.ViewModelProviders; -import android.content.Intent; -import android.graphics.Typeface; -import android.os.AsyncTask; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.text.style.StyleSpan; -import android.text.style.URLSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TableLayout; -import android.widget.TableRow; -import android.widget.TextView; - -import com.textuality.keybase.lib.KeybaseException; -import com.textuality.keybase.lib.KeybaseQuery; -import com.textuality.keybase.lib.Proof; -import com.textuality.keybase.lib.User; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; -import org.sufficientlysecure.keychain.network.OkHttpKeybaseClient; -import org.sufficientlysecure.keychain.network.orbot.OrbotHelper; -import org.sufficientlysecure.keychain.operations.results.KeybaseVerificationResult; -import org.sufficientlysecure.keychain.service.KeybaseVerificationParcel; -import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; -import org.sufficientlysecure.keychain.ui.keyview.UnifiedKeyInfoViewModel; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.util.ParcelableProxy; -import org.sufficientlysecure.keychain.util.Preferences; - -public class ViewKeyKeybaseFragment extends Fragment implements - CryptoOperationHelper.Callback { - private TextView mReportHeader; - private TableLayout mProofListing; - private LayoutInflater mInflater; - private View mProofVerifyHeader; - private TextView mProofVerifyDetail; - - private Proof mProof; - - // for CryptoOperationHelper,Callback - private String mKeybaseProof; - private String mKeybaseFingerprint; - private CryptoOperationHelper mKeybaseOpHelper; - - /** - * Creates new instance of this fragment - */ - public static ViewKeyKeybaseFragment newInstance() { - return new ViewKeyKeybaseFragment(); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.view_key_adv_keybase_fragment, viewGroup, false); - mInflater = inflater; - - mReportHeader = view.findViewById(R.id.view_key_trust_cloud_narrative); - mProofListing = view.findViewById(R.id.view_key_proof_list); - mProofVerifyHeader = view.findViewById(R.id.view_key_proof_verify_header); - mProofVerifyDetail = view.findViewById(R.id.view_key_proof_verify_detail); - mReportHeader.setVisibility(View.GONE); - mProofListing.setVisibility(View.GONE); - mProofVerifyHeader.setVisibility(View.GONE); - mProofVerifyDetail.setVisibility(View.GONE); - - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - UnifiedKeyInfoViewModel viewKeyViewModel = ViewModelProviders.of(requireActivity()).get(UnifiedKeyInfoViewModel.class); - viewKeyViewModel.getUnifiedKeyInfoLiveData(requireContext()).observe(this, this::onLoadUnifiedKeyInfo); - } - - private void onLoadUnifiedKeyInfo(UnifiedKeyInfo unifiedKeyInfo) { - if (unifiedKeyInfo == null) { - return; - } - String fingerprint = KeyFormattingUtils.convertFingerprintToHex(unifiedKeyInfo.fingerprint()); - startSearch(fingerprint); - } - - private void startSearch(final String fingerprint) { - final ParcelableProxy parcelableProxy = - Preferences.getPreferences(getActivity()).getParcelableProxy(); - - OrbotHelper.DialogActions dialogActions = new OrbotHelper.DialogActions() { - @Override - public void onOrbotStarted() { - new DescribeKey(parcelableProxy).execute(fingerprint); - } - - @Override - public void onNeutralButton() { - new DescribeKey(ParcelableProxy.getForNoProxy()) - .execute(fingerprint); - } - - @Override - public void onCancel() { - - } - }; - - if (OrbotHelper.putOrbotInRequiredState(dialogActions, getActivity())) { - new DescribeKey(parcelableProxy).execute(fingerprint); - } - } - - class ResultPage { - String mHeader; - final List mProofs; - - ResultPage(String header, List proofs) { - mHeader = header; - mProofs = proofs; - } - } - - /** - * look for evidence from keybase in the background, make tabular version of result - */ - private class DescribeKey extends AsyncTask { - ParcelableProxy mParcelableProxy; - - DescribeKey(ParcelableProxy parcelableProxy) { - mParcelableProxy = parcelableProxy; - } - - @Override - protected ResultPage doInBackground(String... args) { - String fingerprint = args[0]; - - final ArrayList proofList = new ArrayList<>(); - final Hashtable> proofs = new Hashtable<>(); - try { - KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); - keybaseQuery.setProxy(mParcelableProxy.getProxy()); - User keybaseUser = User.findByFingerprint(keybaseQuery, fingerprint); - for (Proof proof : keybaseUser.getProofs()) { - Integer proofType = proof.getType(); - appendIfOK(proofs, proofType, proof); - } - - // a one-liner in a modern programming language - for (Integer proofType : proofs.keySet()) { - Proof[] x = {}; - Proof[] proofsFor = proofs.get(proofType).toArray(x); - if (proofsFor.length > 0) { - SpannableStringBuilder ssb = new SpannableStringBuilder(); - int i = 0; - while (i < proofsFor.length - 1) { - appendProofLinks(ssb, fingerprint, proofsFor[i]); - ssb.append(", "); - i++; - } - appendProofLinks(ssb, fingerprint, proofsFor[i]); - proofList.add(formatSpannableString(ssb, getProofNarrative(proofType))); - } - } - - } catch (KeybaseException ignored) { - } - - String prefix = ""; - if (isAdded()) { - prefix = getString(R.string.key_trust_results_prefix); - } - - return new ResultPage(prefix, proofList); - } - - private SpannableStringBuilder formatSpannableString(SpannableStringBuilder proofLinks, String proofType) { - //Formatting SpannableStringBuilder with String.format() causes the links to stop working. - //This method is to insert the links while reserving the links - - SpannableStringBuilder ssb = new SpannableStringBuilder(); - ssb.append(proofType); - if (proofType.contains("%s")) { - int i = proofType.indexOf("%s"); - ssb.replace(i, i + 2, proofLinks); - } else ssb.append(proofLinks); - - return ssb; - } - - private void appendProofLinks(SpannableStringBuilder ssb, final String fingerprint, final Proof proof) throws KeybaseException { - int startAt = ssb.length(); - String handle = proof.getHandle(); - ssb.append(handle); - ssb.setSpan(new URLSpan(proof.getServiceUrl()), startAt, startAt + handle.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - if (haveProofFor(proof.getType())) { - ssb.append("\u00a0["); - startAt = ssb.length(); - String verify = ""; - if (isAdded()) { - verify = getString(R.string.keybase_verify); - } - ssb.append(verify); - ClickableSpan clicker = new ClickableSpan() { - @Override - public void onClick(View view) { - verify(proof, fingerprint); - } - }; - ssb.setSpan(clicker, startAt, startAt + verify.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - ssb.append("]"); - } - } - - @Override - protected void onPostExecute(ResultPage result) { - super.onPostExecute(result); - // stop if fragment is no longer added to an activity - if(!isAdded()) { - return; - } - - if (result.mProofs.isEmpty()) { - result.mHeader = requireActivity().getString(R.string.key_trust_no_cloud_evidence); - } - - mReportHeader.setVisibility(View.VISIBLE); - mProofListing.setVisibility(View.VISIBLE); - mReportHeader.setText(result.mHeader); - - int rowNumber = 1; - for (CharSequence s : result.mProofs) { - TableRow row = (TableRow) mInflater.inflate(R.layout.view_key_adv_keybase_proof, null); - TextView number = row.findViewById(R.id.proof_number); - TextView text = row.findViewById(R.id.proof_text); - number.setText(Integer.toString(rowNumber++) + ". "); - text.setText(s); - text.setMovementMethod(LinkMovementMethod.getInstance()); - mProofListing.addView(row); - } - } - } - - private String getProofNarrative(int proofType) { - int stringIndex; - switch (proofType) { - case Proof.PROOF_TYPE_TWITTER: - stringIndex = R.string.keybase_narrative_twitter; - break; - case Proof.PROOF_TYPE_GITHUB: - stringIndex = R.string.keybase_narrative_github; - break; - case Proof.PROOF_TYPE_DNS: - stringIndex = R.string.keybase_narrative_dns; - break; - case Proof.PROOF_TYPE_WEB_SITE: - stringIndex = R.string.keybase_narrative_web_site; - break; - case Proof.PROOF_TYPE_HACKERNEWS: - stringIndex = R.string.keybase_narrative_hackernews; - break; - case Proof.PROOF_TYPE_COINBASE: - stringIndex = R.string.keybase_narrative_coinbase; - break; - case Proof.PROOF_TYPE_REDDIT: - stringIndex = R.string.keybase_narrative_reddit; - break; - default: - stringIndex = R.string.keybase_narrative_unknown; - } - - if (isAdded()) { - return getString(stringIndex); - } else { - return ""; - } - } - - private void appendIfOK(Hashtable> table, Integer proofType, Proof proof) { - ArrayList list = table.get(proofType); - if (list == null) { - list = new ArrayList<>(); - table.put(proofType, list); - } - list.add(proof); - } - - // which proofs do we have working verifiers for? - private boolean haveProofFor(int proofType) { - switch (proofType) { - case Proof.PROOF_TYPE_TWITTER: - return true; - case Proof.PROOF_TYPE_GITHUB: - return true; - case Proof.PROOF_TYPE_DNS: - return true; - case Proof.PROOF_TYPE_WEB_SITE: - return true; - case Proof.PROOF_TYPE_HACKERNEWS: - return true; - case Proof.PROOF_TYPE_COINBASE: - return true; - case Proof.PROOF_TYPE_REDDIT: - return true; - default: - return false; - } - } - - private void verify(final Proof proof, final String fingerprint) { - - mProof = proof; - mKeybaseProof = proof.toString(); - mKeybaseFingerprint = fingerprint; - - mProofVerifyDetail.setVisibility(View.GONE); - - mKeybaseOpHelper = new CryptoOperationHelper<>(1, this, this, - R.string.progress_verifying_signature); - mKeybaseOpHelper.cryptoOperation(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (mKeybaseOpHelper != null) { - mKeybaseOpHelper.handleActivityResult(requestCode, resultCode, data); - } - } - - // CryptoOperationHelper.Callback methods - @Override - public KeybaseVerificationParcel createOperationInput() { - return new KeybaseVerificationParcel(mKeybaseProof, mKeybaseFingerprint); - } - - @Override - public void onCryptoOperationSuccess(KeybaseVerificationResult result) { - - result.createNotify(getActivity()).show(); - - String proofUrl = result.mProofUrl; - String presenceUrl = result.mPresenceUrl; - String presenceLabel = result.mPresenceLabel; - - Proof proof = mProof; // TODO: should ideally be contained in result - - String proofLabel; - switch (proof.getType()) { - case Proof.PROOF_TYPE_TWITTER: - proofLabel = getString(R.string.keybase_twitter_proof); - break; - case Proof.PROOF_TYPE_DNS: - proofLabel = getString(R.string.keybase_dns_proof); - break; - case Proof.PROOF_TYPE_WEB_SITE: - proofLabel = getString(R.string.keybase_web_site_proof); - break; - case Proof.PROOF_TYPE_GITHUB: - proofLabel = getString(R.string.keybase_github_proof); - break; - case Proof.PROOF_TYPE_REDDIT: - proofLabel = getString(R.string.keybase_reddit_proof); - break; - default: - proofLabel = getString(R.string.keybase_a_post); - break; - } - - SpannableStringBuilder ssb = new SpannableStringBuilder(); - - ssb.append(getString(R.string.keybase_proof_succeeded)); - StyleSpan bold = new StyleSpan(Typeface.BOLD); - ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - ssb.append("\n\n"); - int length = ssb.length(); - ssb.append(proofLabel); - if (proofUrl != null) { - URLSpan postLink = new URLSpan(proofUrl); - ssb.setSpan(postLink, length, length + proofLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - if (Proof.PROOF_TYPE_DNS == proof.getType()) { - ssb.append(" ").append(getString(R.string.keybase_for_the_domain)).append(" "); - } else { - ssb.append(" ").append(getString(R.string.keybase_fetched_from)).append(" "); - } - length = ssb.length(); - URLSpan presenceLink = new URLSpan(presenceUrl); - ssb.append(presenceLabel); - ssb.setSpan(presenceLink, length, length + presenceLabel.length(), Spanned - .SPAN_EXCLUSIVE_EXCLUSIVE); - if (Proof.PROOF_TYPE_REDDIT == proof.getType()) { - ssb.append(", "). - append(getString(R.string.keybase_reddit_attribution)). - append(" “").append(proof.getHandle()).append("”, "); - } - ssb.append(" ").append(getString(R.string.keybase_contained_signature)); - - displaySpannableResult(ssb); - } - - @Override - public void onCryptoOperationCancelled() { - - } - - @Override - public void onCryptoOperationError(KeybaseVerificationResult result) { - result.createNotify(getActivity()).show(); - - SpannableStringBuilder ssb = new SpannableStringBuilder(); - - ssb.append(getString(R.string.keybase_proof_failure)); - String msg = getString(result.getLog().getLast().mType.mMsgId); - if (msg == null) { - msg = getString(R.string.keybase_unknown_proof_failure); - } - StyleSpan bold = new StyleSpan(Typeface.BOLD); - ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - ssb.append("\n\n").append(msg); - - displaySpannableResult(ssb); - } - - @Override - public boolean onCryptoSetProgress(String msg, int progress, int max) { - return false; - } - - private void displaySpannableResult(SpannableStringBuilder ssb) { - mProofVerifyHeader.setVisibility(View.VISIBLE); - mProofVerifyDetail.setVisibility(View.VISIBLE); - mProofVerifyDetail.setMovementMethod(LinkMovementMethod.getInstance()); - mProofVerifyDetail.setText(ssb); - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyHeader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyHeader.java index 2c2327e98..554fdb828 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyHeader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyHeader.java @@ -7,7 +7,6 @@ import android.view.View; import android.widget.TextView; import eu.davidea.flexibleadapter.FlexibleAdapter; -import eu.davidea.flexibleadapter.items.AbstractHeaderItem; import eu.davidea.flexibleadapter.items.IFlexible; import eu.davidea.flexibleadapter.items.IHeader; import eu.davidea.viewholders.FlexibleViewHolder; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItem.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItem.java index 3f4c0bd5f..1ef392902 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItem.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItem.java @@ -1,7 +1,7 @@ package org.sufficientlysecure.keychain.ui.adapter; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.ISectionable; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItemFactory.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItemFactory.java index 5c2283530..fa8b14835 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItemFactory.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/FlexibleKeyItemFactory.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; import android.content.res.Resources; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/IdentityAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/IdentityAdapter.java index 44b6ab5b5..5f2973486 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/IdentityAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/IdentityAdapter.java @@ -22,8 +22,8 @@ import java.util.List; import android.content.Context; import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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 bcb13376c..543454b04 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 @@ -24,15 +24,19 @@ import java.util.Date; import java.util.List; import android.content.Intent; -import android.databinding.DataBindingUtil; -import android.support.v4.app.FragmentActivity; -import android.support.v7.widget.RecyclerView; +import androidx.databinding.DataBindingUtil; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import androidx.databinding.DataBindingUtil; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.daos.KeyRepository; import org.sufficientlysecure.keychain.databinding.ImportKeysListItemBinding; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; @@ -45,7 +49,6 @@ import org.sufficientlysecure.keychain.operations.ImportOperation; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing; import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing.VerificationStatus; -import org.sufficientlysecure.keychain.daos.KeyRepository; import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.keyview.ViewKeyActivity; @@ -308,10 +311,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter realUserIdsPlusKeybase = keyRing.getUnorderedUserIds(); - realUserIdsPlusKeybase.addAll(entry.getKeybaseUserIds()); - entry.setUserIds(realUserIdsPlusKeybase); + entry.setUserIds(keyRing.getUnorderedUserIds()); } private class KeyState { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java index e90334274..7322dbaed 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java @@ -8,9 +8,9 @@ import java.util.Objects; import java.util.Set; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.CheckBox; import android.widget.RadioButton; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java index 156da2a88..c339f7d6a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java @@ -23,8 +23,8 @@ import java.util.ArrayList; import android.content.Context; import android.database.Cursor; import android.os.Parcel; -import android.support.v4.util.LongSparseArray; -import android.support.v4.widget.CursorAdapter; +import androidx.collection.LongSparseArray; +import androidx.cursoradapter.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/NestedLogAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/NestedLogAdapter.java index af50a1dbd..a18bea429 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/NestedLogAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/NestedLogAdapter.java @@ -23,8 +23,8 @@ import java.util.List; import android.content.Context; import android.graphics.Color; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import android.util.Pair; import android.util.TypedValue; import android.view.LayoutInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java index b746c9c1f..a71e0f899 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java @@ -19,9 +19,9 @@ package org.sufficientlysecure.keychain.ui.adapter; import android.app.Activity; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v7.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.appcompat.app.AppCompatActivity; import android.util.SparseArray; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SpacesItemDecoration.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SpacesItemDecoration.java index 0e4caddd4..a629243c1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SpacesItemDecoration.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SpacesItemDecoration.java @@ -18,8 +18,8 @@ package org.sufficientlysecure.keychain.ui.adapter; import android.graphics.Rect; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; /** diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeyAddedItem.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeyAddedItem.java index c56c56c34..1bf5f6761 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeyAddedItem.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeyAddedItem.java @@ -18,27 +18,20 @@ package org.sufficientlysecure.keychain.ui.adapter; -import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.TimeZone; -import android.content.Context; -import android.graphics.Typeface; -import android.text.format.DateFormat; import android.view.View; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.IFlexible; -import org.bouncycastle.bcpg.sig.KeyFlags; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyAdd; import org.sufficientlysecure.keychain.ui.SubKeyItem.SubkeyViewHolder; import org.sufficientlysecure.keychain.ui.ViewKeyAdvSubkeysFragment; import org.sufficientlysecure.keychain.ui.ViewKeyAdvSubkeysFragment.SubkeyEditViewModel; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; public class SubkeyAddedItem extends AbstractFlexibleItem { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java index c0d956f99..badc2930c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java @@ -26,7 +26,7 @@ import java.util.TimeZone; import android.app.Activity; import android.content.Context; import android.graphics.Typeface; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.FragmentActivity; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; 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 518a5ac8c..d19c61617 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 @@ -22,8 +22,8 @@ import java.util.List; import android.content.Context; import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java index ed0790243..e18209e08 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java @@ -21,9 +21,9 @@ package org.sufficientlysecure.keychain.ui.base; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java index 92aaeda39..28b871355 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java @@ -22,8 +22,8 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.View; import android.view.inputmethod.InputMethodManager; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java index 16737121a..d67260b0d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java @@ -26,10 +26,10 @@ import android.content.Intent; import android.os.Handler; import android.os.Parcelable; import android.os.SystemClock; -import android.support.annotation.UiThread; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.os.CancellationSignal; +import androidx.annotation.UiThread; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.core.os.CancellationSignal; import org.sufficientlysecure.keychain.operations.results.InputPendingResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/RecyclerFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/RecyclerFragment.java index 091d073be..741637d0d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/RecyclerFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/RecyclerFragment.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui.base; import android.content.Context; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.Fragment; -import android.support.v7.widget.RecyclerView; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindings.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindings.java index f42f1f67e..f0a08d256 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindings.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindings.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.ui.bindings; import android.content.Context; import android.content.res.Resources; -import android.databinding.BindingAdapter; +import androidx.databinding.BindingAdapter; import android.graphics.Color; import android.text.format.DateFormat; import android.widget.TextView; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysExtraBindings.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysExtraBindings.java index 8d9f767b4..9e994f0de 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysExtraBindings.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysExtraBindings.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.ui.bindings; import android.content.Context; import android.content.res.Resources; -import android.databinding.BindingAdapter; +import androidx.databinding.BindingAdapter; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.LinearLayout; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientChipAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientChipAdapter.java index 929200dad..d22c0da88 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientChipAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientChipAdapter.java @@ -2,8 +2,8 @@ package org.sufficientlysecure.keychain.ui.chips; import android.content.Context; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java index 3ca48d72b..c981f5beb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java @@ -4,8 +4,8 @@ package org.sufficientlysecure.keychain.ui.chips; import java.util.List; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java index 0061cbcf6..f58685a98 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java @@ -33,10 +33,10 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditSmartPGPAuthorityDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditSmartPGPAuthorityDialogFragment.java index 5d2624532..438af5d35 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditSmartPGPAuthorityDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditSmartPGPAuthorityDialogFragment.java @@ -28,10 +28,10 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java index 481870790..969e840bf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Activity; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -27,7 +27,7 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.DialogFragment; +import androidx.fragment.app.DialogFragment; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; 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 d923bcf1c..733381d8a 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 @@ -21,10 +21,10 @@ import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.text.Html; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java index 5fd542ed5..be3625f04 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Activity; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -27,7 +27,7 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.DialogFragment; +import androidx.fragment.app.DialogFragment; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java index f4914b1a1..07d3e123a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import org.sufficientlysecure.keychain.R; 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 96055ad0e..023df3514 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 @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.content.Context; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; /** * Uses support lib's dialog builder. We can apply a theme here later! 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 b96a0ed96..a37075954 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 @@ -23,8 +23,8 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.DocumentsContract; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.FragmentActivity; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; import android.widget.Toast; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyDialogFragment.java index 603fe0136..ad25e57b1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyDialogFragment.java @@ -23,7 +23,7 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.DialogFragment; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.R; import timber.log.Timber; 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 313ffc472..c7469abb7 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 @@ -24,8 +24,8 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java index 7123c90b7..7243e0c38 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java @@ -23,7 +23,7 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.DialogFragment; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.R; import timber.log.Timber; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoInstallDialog.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoInstallDialog.java index e602df7ae..9d871736c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoInstallDialog.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoInstallDialog.java @@ -22,8 +22,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoPgpInstallDialog.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoPgpInstallDialog.java index dcf2c3b5d..7941cbf4c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoPgpInstallDialog.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FidesmoPgpInstallDialog.java @@ -22,8 +22,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.R; import timber.log.Timber; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java index e2bff1db5..a88fe00a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java @@ -25,9 +25,9 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import android.view.ContextThemeWrapper; import android.view.View; import android.widget.Button; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 3132dce00..ddfeac639 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -25,9 +25,9 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener; import android.graphics.Color; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.os.CancellationSignal; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.core.os.CancellationSignal; import android.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.View; 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 6f5f5d816..aced3b19e 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 @@ -26,8 +26,8 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareLogDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareLogDialogFragment.java index fd764e8f1..d5f04b799 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareLogDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareLogDialogFragment.java @@ -22,8 +22,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import android.view.ContextThemeWrapper; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java index 33f889805..4f34c991d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Dialog; import android.os.Bundle; import android.os.Messenger; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.ui.util.InstallDialogFragmentHelper; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/UserIdInfoDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/UserIdInfoDialogFragment.java index 3d6122a68..9d79590fd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/UserIdInfoDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/UserIdInfoDialogFragment.java @@ -22,7 +22,7 @@ import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; -import android.support.v4.app.DialogFragment; +import androidx.fragment.app.DialogFragment; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/GenericViewModel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/GenericViewModel.java index 12a46720f..ef5cda777 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/GenericViewModel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/GenericViewModel.java @@ -1,8 +1,8 @@ package org.sufficientlysecure.keychain.ui.keyview; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; import android.content.Context; import org.sufficientlysecure.keychain.livedata.GenericLiveData; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java index 1f208349b..80f131b8d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/KeyFragmentViewModel.java @@ -3,9 +3,9 @@ package org.sufficientlysecure.keychain.ui.keyview; import java.util.List; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.Transformations; -import android.arch.lifecycle.ViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; +import androidx.lifecycle.ViewModel; import android.content.Context; import org.sufficientlysecure.keychain.daos.KeyMetadataDao; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/UnifiedKeyInfoViewModel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/UnifiedKeyInfoViewModel.java index f121434fd..b7d0ad065 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/UnifiedKeyInfoViewModel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/UnifiedKeyInfoViewModel.java @@ -1,8 +1,8 @@ package org.sufficientlysecure.keychain.ui.keyview; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; import android.content.Context; import android.net.Uri; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java index 6f013c34f..5bb3393d9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java @@ -28,7 +28,7 @@ import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityOptions; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -41,16 +41,16 @@ import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.provider.ContactsContract; -import android.support.annotation.IntDef; -import android.support.annotation.NonNull; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.design.widget.CoordinatorLayout; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.ActivityCompat; -import android.support.v4.app.FragmentManager; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.CardView; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.app.ActivityCompat; +import androidx.fragment.app.FragmentManager; +import androidx.core.content.ContextCompat; +import androidx.cardview.widget.CardView; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -91,9 +91,7 @@ import org.sufficientlysecure.keychain.ui.ImportKeysProxyActivity; import org.sufficientlysecure.keychain.ui.MainActivity; import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity; import org.sufficientlysecure.keychain.ui.QrCodeViewActivity; -import org.sufficientlysecure.keychain.ui.SafeSlingerActivity; import org.sufficientlysecure.keychain.ui.ViewKeyAdvActivity; -import org.sufficientlysecure.keychain.ui.ViewKeyKeybaseFragment; import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; @@ -267,11 +265,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { actionShareClipboard.setOnClickListener(v -> ShareKeyHelper.shareKeyToClipboard(this, masterKeyId)); floatingActionButton.setOnClickListener(v -> { - if (unifiedKeyInfo.has_any_secret()) { - startSafeSlinger(); - } else { - scanQrCode(); - } + scanQrCode(); }); qrCodeLayout.setOnClickListener(v -> showQrCodeDialog()); @@ -294,11 +288,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { ViewKeyFragment frag = ViewKeyFragment.newInstance(); manager.beginTransaction().replace(R.id.view_key_fragment, frag, "view_key_fragment").commit(); - - if (Preferences.getPreferences(this).getExperimentalEnableKeybase()) { - final ViewKeyKeybaseFragment keybaseFrag = ViewKeyKeybaseFragment.newInstance(); - manager.beginTransaction().replace(R.id.view_key_keybase_fragment, keybaseFrag).commit(); - } } @Override @@ -592,12 +581,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { startActivityForResult(intent, 0); } - private void startSafeSlinger() { - Intent safeSlingerIntent = new Intent(this, SafeSlingerActivity.class); - safeSlingerIntent.putExtra(SafeSlingerActivity.EXTRA_MASTER_KEY_ID, unifiedKeyInfo.master_key_id()); - startActivityForResult(safeSlingerIntent, 0); - } - /** * Load QR Code asynchronously and with a fade in animation */ @@ -778,8 +761,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { actionShare.setVisibility(View.VISIBLE); actionShareClipboard.setVisibility(View.VISIBLE); - showFab(); - floatingActionButton.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_repeat_white_24dp)); + hideFab(); } else { actionEncryptFile.setVisibility(View.VISIBLE); actionEncryptText.setVisibility(View.VISIBLE); @@ -902,7 +884,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity { HkpKeyserverAddress preferredKeyserver = Preferences.getPreferences(getApplicationContext()).getPreferredKeyserver(); ParcelableKeyRing keyEntry = - ParcelableKeyRing.createFromReference(unifiedKeyInfo.fingerprint(), null, null, null); + ParcelableKeyRing.createFromReference(unifiedKeyInfo.fingerprint(), null, null); return ImportKeyringParcel .createImportKeyringParcel(Collections.singletonList(keyEntry), preferredKeyserver); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java index 4636a827c..d6e39aeeb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyFragment.java @@ -20,20 +20,20 @@ package org.sufficientlysecure.keychain.ui.keyview; import java.util.List; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.ContactsContract; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.widget.PopupMenu; -import android.support.v7.widget.PopupMenu.OnMenuItemClickListener; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.widget.PopupMenu; +import androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/AsyncTaskLiveData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/AsyncTaskLiveData.java index 13631e7ff..0c65ae2a6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/AsyncTaskLiveData.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/AsyncTaskLiveData.java @@ -1,16 +1,16 @@ package org.sufficientlysecure.keychain.ui.keyview.loader; -import android.arch.lifecycle.LiveData; +import androidx.lifecycle.LiveData; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.os.CancellationSignal; -import android.support.v4.os.OperationCanceledException; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.os.CancellationSignal; +import androidx.core.os.OperationCanceledException; public abstract class AsyncTaskLiveData extends LiveData { @NonNull diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/IdentityDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/IdentityDao.java index 288d6d18f..b64a84f91 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/IdentityDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/IdentityDao.java @@ -22,14 +22,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import com.squareup.sqldelight.SqlDelightQuery; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SubkeyStatusDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SubkeyStatusDao.java index 2125527f7..c1ad2ed11 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SubkeyStatusDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SubkeyStatusDao.java @@ -25,7 +25,7 @@ import java.util.Date; import java.util.List; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.model.SubKey; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java index 499f36347..5b0f59055 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/loader/SystemContactDao.java @@ -28,7 +28,7 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.provider.ContactsContract; -import android.support.v4.content.ContextCompat; +import androidx.core.content.ContextCompat; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.util.ContactHelper; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/presenter/ViewKeyMvpView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/presenter/ViewKeyMvpView.java index 5898ae907..8ad9f509e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/presenter/ViewKeyMvpView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/presenter/ViewKeyMvpView.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.ui.keyview.presenter; import android.content.Intent; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/IdentitiesCardView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/IdentitiesCardView.java index aaedd2daa..4008d4b70 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/IdentitiesCardView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/IdentitiesCardView.java @@ -19,14 +19,13 @@ package org.sufficientlysecure.keychain.ui.keyview.view; import android.content.Context; -import android.support.v7.widget.CardView; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.AdapterDataObserver; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; -import android.widget.Button; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.adapter.IdentityAdapter; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyHealthView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyHealthView.java index 9b94195b3..66145bf64 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyHealthView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyHealthView.java @@ -21,10 +21,10 @@ package org.sufficientlysecure.keychain.ui.keyview.view; import java.util.Date; import android.content.Context; -import android.support.annotation.ColorRes; -import android.support.annotation.DrawableRes; -import android.support.annotation.StringRes; -import android.support.v4.content.ContextCompat; +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.LayoutInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyStatusList.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyStatusList.java index b4bb2669d..c5a89db89 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyStatusList.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyStatusList.java @@ -19,9 +19,9 @@ package org.sufficientlysecure.keychain.ui.keyview.view; import android.content.Context; -import android.support.annotation.ColorRes; -import android.support.annotation.StringRes; -import android.support.v4.content.ContextCompat; +import androidx.annotation.ColorRes; +import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyserverStatusView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyserverStatusView.java index 1b353e729..af053b41b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyserverStatusView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/KeyserverStatusView.java @@ -21,10 +21,10 @@ package org.sufficientlysecure.keychain.ui.keyview.view; import java.util.Date; import android.content.Context; -import android.support.annotation.ColorRes; -import android.support.annotation.DrawableRes; -import android.support.annotation.StringRes; -import android.support.v4.content.ContextCompat; +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.LayoutInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java index 2cfd01440..1d487a8a7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/view/SystemContactCardView.java @@ -20,7 +20,7 @@ package org.sufficientlysecure.keychain.ui.keyview.view; import android.content.Context; import android.graphics.Bitmap; -import android.support.v7.widget.CardView; +import androidx.cardview.widget.CardView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ChangePinDialogHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ChangePinDialogHelper.java index 08834f99a..4f139a4da 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ChangePinDialogHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ChangePinDialogHelper.java @@ -22,9 +22,9 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnShowListener; -import android.support.annotation.CheckResult; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AlertDialog.Builder; +import androidx.annotation.CheckResult; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AlertDialog.Builder; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenFragment.java index 4b34a13c2..179d99088 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenFragment.java @@ -24,18 +24,18 @@ import java.util.Objects; import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AlertDialog.Builder; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.fragment.app.Fragment; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AlertDialog.Builder; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenPresenter.java index db4400711..d431578ce 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenPresenter.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.token; -import android.arch.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleOwner; import android.content.Context; import android.net.Uri; import android.os.Handler; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenViewModel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenViewModel.java index 4509e9d85..89b2d2612 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenViewModel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/ManageSecurityTokenViewModel.java @@ -1,9 +1,9 @@ package org.sufficientlysecure.keychain.ui.token; -import android.arch.lifecycle.LifecycleOwner; -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; import android.content.Context; import android.net.Uri; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/PublicKeyRetriever.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/PublicKeyRetriever.java index 0a4c26740..ed4a3e532 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/PublicKeyRetriever.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/token/PublicKeyRetriever.java @@ -24,7 +24,7 @@ import java.util.List; import android.content.Context; import android.net.Uri; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.text.TextUtils; import com.google.auto.value.AutoValue; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java index a89a61067..ff76d29db 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java @@ -22,8 +22,8 @@ import java.io.IOException; import java.net.URISyntaxException; import java.util.List; -import android.arch.lifecycle.LifecycleOwner; -import android.arch.lifecycle.LiveData; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; import android.content.Context; import android.graphics.Bitmap; import android.net.ConnectivityManager; @@ -34,8 +34,8 @@ import android.net.wifi.WifiManager; import android.os.Build.VERSION_CODES; import android.os.Handler; import android.os.Parcelable; -import android.support.annotation.RequiresApi; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.annotation.RequiresApi; +import androidx.recyclerview.widget.RecyclerView.Adapter; import android.view.LayoutInflater; import org.openintents.openpgp.util.OpenPgpUtils; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/ReceivedSecretKeyList.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/ReceivedSecretKeyList.java index ffa86931d..b61c9e0c4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/ReceivedSecretKeyList.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/ReceivedSecretKeyList.java @@ -22,9 +22,9 @@ import java.util.ArrayList; import java.util.List; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.LayoutInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java index 6a8e0c979..fe55fc432 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java @@ -19,7 +19,7 @@ package org.sufficientlysecure.keychain.ui.transfer.view; import android.app.Activity; -import android.arch.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProviders; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -28,21 +28,20 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.net.NetworkInfo; -import android.net.Uri; import android.net.wifi.WifiManager; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentManager.OnBackStackChangedListener; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AlertDialog.Builder; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentManager.OnBackStackChangedListener; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AlertDialog.Builder; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferNotAvailableFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferNotAvailableFragment.java index 549b5f344..a45de3191 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferNotAvailableFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferNotAvailableFragment.java @@ -19,8 +19,8 @@ package org.sufficientlysecure.keychain.ui.transfer.view; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferSecretKeyList.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferSecretKeyList.java index 5cdcd8842..2f9e5b8f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferSecretKeyList.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferSecretKeyList.java @@ -22,10 +22,10 @@ import java.util.ArrayList; import java.util.List; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.LayoutInflater; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java index b284a2095..3549ad488 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java @@ -19,9 +19,6 @@ package org.sufficientlysecure.keychain.ui.util; import android.content.Context; import android.content.res.Resources.Theme; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.style.StrikethroughSpan; import android.util.TypedValue; public class FormattingUtils { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java index a31d6bedd..a0d3df680 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java @@ -25,7 +25,7 @@ import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.view.ContextThemeWrapper; import org.sufficientlysecure.keychain.R; 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 25c67634f..6573397a6 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 @@ -26,7 +26,7 @@ import java.util.Locale; import android.content.Context; import android.content.res.Resources; import android.graphics.PorterDuff; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -39,7 +39,7 @@ import org.bouncycastle.bcpg.PublicKeyAlgorithmTags; import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags; import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.operator.jcajce.PGPUtil; +import org.bouncycastle.openpgp.PGPUtil; import org.bouncycastle.util.encoders.Hex; import org.openintents.openpgp.OpenPgpDecryptionResult; import org.openintents.openpgp.OpenPgpSignatureResult; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java index 743a1a2c7..1aa2c9aae 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java @@ -2,8 +2,8 @@ package org.sufficientlysecure.keychain.ui.util; import android.content.Context; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import android.text.format.DateUtils; import android.view.View; import android.widget.ImageView; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java index 44bfc03a8..6e09160d3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java @@ -18,8 +18,8 @@ package org.sufficientlysecure.keychain.ui.util; import android.app.Activity; -import android.support.annotation.CheckResult; -import android.support.v4.app.Fragment; +import androidx.annotation.CheckResult; +import androidx.fragment.app.Fragment; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java index 7b7ad504c..c002d004f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/PermissionsUtil.java @@ -25,8 +25,8 @@ import android.content.Context; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; -import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; import android.widget.Toast; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java index 7473f78e3..4a2e0f268 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/DividerItemDecoration.java @@ -21,8 +21,8 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; public class DividerItemDecoration extends RecyclerView.ItemDecoration { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java index c691182bf..c57606c47 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperAdapter.java @@ -16,8 +16,8 @@ package org.sufficientlysecure.keychain.ui.util.recyclerview; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; /** * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}. diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java index 0fd24581d..8ba77443f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperDragCallback.java @@ -16,8 +16,8 @@ package org.sufficientlysecure.keychain.ui.util.recyclerview; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; /** * An implementation of {@link ItemTouchHelper.Callback} that enables basic drag & drop and diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java index 97e70d71e..d0c1de845 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/ItemTouchHelperViewHolder.java @@ -16,11 +16,11 @@ package org.sufficientlysecure.keychain.ui.util.recyclerview; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.recyclerview.widget.ItemTouchHelper; /** * Interface to notify an item ViewHolder of relevant callbacks from {@link - * android.support.v7.widget.helper.ItemTouchHelper.Callback}. + * androidx.recyclerview.widget.ItemTouchHelper.Callback}. */ public interface ItemTouchHelperViewHolder { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java index 6d9ca93e3..abacd00a4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/recyclerview/RecyclerItemClickListener.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.util.recyclerview; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CacheTTLSpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CacheTTLSpinner.java index 1530f4d54..bf25c528f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CacheTTLSpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CacheTTLSpinner.java @@ -21,8 +21,8 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; -import android.support.v4.widget.SimpleCursorAdapter; -import android.support.v7.widget.AppCompatSpinner; +import androidx.cursoradapter.widget.SimpleCursorAdapter; +import androidx.appcompat.widget.AppCompatSpinner; import android.util.AttributeSet; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ConnectionStatusView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ConnectionStatusView.java index f48f375d4..b9358fc07 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ConnectionStatusView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ConnectionStatusView.java @@ -23,7 +23,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java index bd942a64c..ad15ef62e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EmailEditText.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; -import android.support.v7.widget.AppCompatAutoCompleteTextView; +import androidx.appcompat.widget.AppCompatAutoCompleteTextView; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java index b41b7adc8..4cf64ffa3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java @@ -2,7 +2,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; -import android.support.annotation.StringRes; +import androidx.annotation.StringRes; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index 8ac45c6d8..794443542 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -23,9 +23,9 @@ import java.util.List; import android.content.Context; import android.os.Bundle; import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.support.annotation.StringRes; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.appcompat.widget.AppCompatSpinner; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java index 6d927d0c9..b9b266f36 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NameEditText.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; -import android.support.v7.widget.AppCompatAutoCompleteTextView; +import androidx.appcompat.widget.AppCompatAutoCompleteTextView; import android.util.AttributeSet; import android.view.inputmethod.EditorInfo; import android.widget.ArrayAdapter; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java index cf04d346f..e5615d23a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java @@ -20,8 +20,8 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.*; -import android.support.annotation.NonNull; -import android.support.v7.widget.AppCompatEditText; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatEditText; import android.text.Layout; import android.text.TextPaint; import android.util.AttributeSet; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ToolableViewAnimator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ToolableViewAnimator.java index 172009d24..b8eb7b942 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ToolableViewAnimator.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ToolableViewAnimator.java @@ -27,7 +27,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; import android.content.res.TypedArray; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java similarity index 98% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java index 821117487..98b7379d2 100644 --- a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CharsetVerifier.java @@ -26,8 +26,8 @@ import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; import android.content.ClipDescription; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** This class can be used to guess whether a stream of data is encoded in a given * charset or not. 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 e5f67ba15..ceca99564 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -43,7 +43,7 @@ import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Im; import android.provider.ContactsContract.Data; -import android.support.v4.content.ContextCompat; +import androidx.core.content.ContextCompat; import android.util.Patterns; import org.sufficientlysecure.keychain.Constants; diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java similarity index 97% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java index 8bfe26aeb..bd5272d41 100644 --- a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CountingOutputStream.java @@ -19,7 +19,7 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; public final class CountingOutputStream extends FilterOutputStream { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java index d9cffe702..6f1ac9946 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java @@ -18,7 +18,7 @@ package org.sufficientlysecure.keychain.util; -import android.arch.persistence.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteDatabase; import android.database.Cursor; import android.text.TextUtils; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java deleted file mode 100644 index 1a44d9dba..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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.util; - - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Set; - -import android.content.Context; - -import de.measite.minidns.Client; -import de.measite.minidns.Question; -import de.measite.minidns.Record; -import de.measite.minidns.record.SRV; -import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; -import org.sufficientlysecure.keychain.keyimport.HkpKeyserverClient; -import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; -import org.sufficientlysecure.keychain.keyimport.KeyserverClient; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.service.ImportKeyringParcel; -import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; - -public class EmailKeyHelper { - // TODO: Make this not require a proxy in it's constructor, redesign when it is to be used - // to import keys, simply use CryptoOperationHelper with this callback - public abstract class ImportContactKeysCallback - implements CryptoOperationHelper.Callback { - - private ArrayList mKeyList; - private HkpKeyserverAddress mKeyserver; - - public ImportContactKeysCallback(Context context, HkpKeyserverAddress keyserver, - ParcelableProxy proxy) { - this(context, new ContactHelper(context).getContactMails(), keyserver, proxy); - } - - public ImportContactKeysCallback(Context context, List mails, - HkpKeyserverAddress keyserver, ParcelableProxy proxy) { - Set entries = new HashSet<>(); - for (String mail : mails) { - entries.addAll(getEmailKeys(context, mail, proxy)); - } - - // Put them in a list and import - ArrayList keys = new ArrayList<>(entries.size()); - for (ImportKeysListEntry entry : entries) { - keys.add(ParcelableKeyRing.createFromReference(entry.getFingerprint(), entry.getKeyIdHex(), null, null)); - } - mKeyList = keys; - mKeyserver = keyserver; - } - - @Override - public ImportKeyringParcel createOperationInput() { - return ImportKeyringParcel.createImportKeyringParcel(mKeyList, mKeyserver); - } - } - - public static Set getEmailKeys(Context context, String mail, - ParcelableProxy proxy) { - Set keys = new HashSet<>(); - - // Try _hkp._tcp SRV record first - String[] mailparts = mail.split("@"); - if (mailparts.length == 2) { - HkpKeyserverAddress hkp = findKeyserverFromDns(mailparts[1]); - if (hkp != null) { - keys.addAll(getEmailKeys(mail, hkp, proxy)); - } - } - - if (keys.isEmpty()) { - // Most users don't have the SRV record, so ask a default server as well - HkpKeyserverAddress server = Preferences.getPreferences(context).getPreferredKeyserver(); - if (server != null) { - keys.addAll(getEmailKeys(mail, server, proxy)); - } - } - return keys; - } - - public static List getEmailKeys(String mail, HkpKeyserverAddress keyServer, - ParcelableProxy proxy) { - Set keys = new HashSet<>(); - try { - for (ImportKeysListEntry key : HkpKeyserverClient - .fromHkpKeyserverAddress(keyServer).search(mail, proxy)) { - if (key.isRevokedOrExpiredOrInsecure()) continue; - for (String userId : key.getUserIds()) { - if (userId.toLowerCase().contains(mail.toLowerCase(Locale.ENGLISH))) { - keys.add(key); - } - } - } - } catch (KeyserverClient.CloudSearchFailureException ignored) { - } - return new ArrayList<>(keys); - } - - public static HkpKeyserverAddress findKeyserverFromDns(String domain) { - try { - Record[] records = new Client().query(new Question("_hkp._tcp." + domain, Record.TYPE.SRV)).getAnswers(); - if (records.length > 0) { - Arrays.sort(records, new Comparator() { - @Override - public int compare(Record lhs, Record rhs) { - if (lhs.getPayload().getType() != Record.TYPE.SRV) return 1; - if (rhs.getPayload().getType() != Record.TYPE.SRV) return -1; - return ((SRV) lhs.getPayload()).getPriority() - ((SRV) rhs.getPayload()).getPriority(); - } - }); - Record record = records[0]; // This is our best choice - if (record.getPayload().getType() == Record.TYPE.SRV) { - SRV payload = (SRV) record.getPayload(); - return HkpKeyserverAddress.createFromUri(payload.getName() + ":" + payload.getPort()); - } - } - } catch (Exception ignored) { - } - return null; - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java index c816a17d8..2441d144c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java @@ -49,10 +49,9 @@ import android.os.Build.VERSION_CODES; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.OpenableColumns; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import android.widget.Toast; -import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import timber.log.Timber; diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java similarity index 100% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java index 68b402124..885cf3f7c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.util; import android.content.Intent; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; import com.google.zxing.integration.android.IntentIntegrator; diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/IterableIterator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IterableIterator.java similarity index 100% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/IterableIterator.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IterableIterator.java diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/IteratorWithSize.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IteratorWithSize.java similarity index 100% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/IteratorWithSize.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IteratorWithSize.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Numeric9x4PassphraseUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Numeric9x4PassphraseUtil.java index 89d9f004e..4d540d4aa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Numeric9x4PassphraseUtil.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Numeric9x4PassphraseUtil.java @@ -23,7 +23,7 @@ import java.security.SecureRandom; import java.util.Random; import java.util.regex.Pattern; -import android.support.annotation.VisibleForTesting; +import androidx.annotation.VisibleForTesting; // see https://autocrypt.org/level1.html#setup-code public class Numeric9x4PassphraseUtil { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PRNGFixes.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PRNGFixes.java index 143d222f0..57316e1cd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PRNGFixes.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PRNGFixes.java @@ -12,7 +12,6 @@ package org.sufficientlysecure.keychain.util; import android.os.Build; import android.os.Process; -import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableHashMap.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableHashMap.java index 1294c1221..c9d6f7382 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableHashMap.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableHashMap.java @@ -22,7 +22,7 @@ import java.util.HashMap; import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import org.sufficientlysecure.keychain.KeychainApplication; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java index 86429dff8..423d24dd6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java @@ -23,7 +23,7 @@ import java.net.Proxy; import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; /** * used to simply transport java.net.Proxy objects created using InetSockets between services/activities diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/PositionAwareInputStream.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PositionAwareInputStream.java similarity index 100% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/PositionAwareInputStream.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/PositionAwareInputStream.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index cba8ed888..de0c15306 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -29,7 +29,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Parcelable; import android.preference.PreferenceManager; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.Constants; @@ -330,7 +330,6 @@ public class Preferences { public CloudSearchPrefs getCloudSearchPrefs() { return CloudSearchPrefs.create(mSharedPreferences.getBoolean(Pref.SEARCH_KEYSERVER, true), - mSharedPreferences.getBoolean(Pref.SEARCH_KEYBASE, true), false, mSharedPreferences.getBoolean(Pref.SEARCH_WEB_KEY_DIRECTORY, true), getPreferredKeyserver()); @@ -387,7 +386,6 @@ public class Preferences { @AutoValue public static abstract class CloudSearchPrefs implements Parcelable { public abstract boolean isKeyserverEnabled(); - public abstract boolean isKeybaseEnabled(); public abstract boolean isFacebookEnabled(); public abstract boolean isWebKeyDirectoryEnabled(); @@ -396,31 +394,29 @@ public class Preferences { /** * @param searchKeyserver should passed keyserver be searched - * @param searchKeybase should keybase.io be searched * @param searchFacebook should Facebook be searched * @param searchWebKeyDirectory should WKD be searched * @param keyserver the keyserver url authority to search on */ - public static CloudSearchPrefs create(boolean searchKeyserver, boolean searchKeybase, + public static CloudSearchPrefs create(boolean searchKeyserver, boolean searchFacebook, boolean searchWebKeyDirectory, @Nullable HkpKeyserverAddress keyserver) { return new AutoValue_Preferences_CloudSearchPrefs(searchKeyserver, - searchKeybase, searchFacebook, searchWebKeyDirectory, keyserver); } public static CloudSearchPrefs createWebKeyDirectoryOnly() { - return create(false, false, false, true, null); + return create(false, false, true, null); } public static CloudSearchPrefs createKeyserverOnly(HkpKeyserverAddress keyserver) { - return create(true, false, false, false, keyserver); + return create(true, false, false, keyserver); } public static CloudSearchPrefs createSocialOnly() { - return create(false, true, true, false, null); + return create(false, true, false, null); } } @@ -432,10 +428,6 @@ public class Preferences { // experimental prefs - public boolean getExperimentalEnableKeybase() { - return mSharedPreferences.getBoolean(Pref.EXPERIMENTAL_ENABLE_KEYBASE, false); - } - public boolean getExperimentalUsbAllowUntested() { return mSharedPreferences.getBoolean(Pref.EXPERIMENTAL_USB_ALLOW_UNTESTED, false); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ResourceUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ResourceUtils.java index b5432ff4e..dd1cdaf03 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ResourceUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ResourceUtils.java @@ -6,9 +6,9 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.annotation.DrawableRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; public class ResourceUtils { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareKeyHelper.java index 20541a7f6..12d7b8351 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareKeyHelper.java @@ -31,7 +31,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.ParcelFileDescriptor; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; diff --git a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java similarity index 94% rename from libkeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java index 10a7c0a67..d6a80e96f 100644 --- a/libkeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Utf8Util.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.util; -import org.sufficientlysecure.keychain.LibConstants; +import org.sufficientlysecure.keychain.Constants; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; @@ -49,7 +49,7 @@ public class Utf8Util { try { return charsetDecoder.decode(ByteBuffer.wrap(input)).toString(); } catch (CharacterCodingException e) { - Log.e(LibConstants.TAG, "Decoding failed!", e); + Log.e(Constants.TAG, "Decoding failed!", e); return charsetDecoder.replacement(); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/WebKeyDirectoryUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/WebKeyDirectoryUtil.java index 5dc0bd735..622a93eaf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/WebKeyDirectoryUtil.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/WebKeyDirectoryUtil.java @@ -1,6 +1,6 @@ package org.sufficientlysecure.keychain.util; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; diff --git a/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml b/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml index feebad47f..63ee7dae2 100644 --- a/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml +++ b/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml @@ -9,7 +9,7 @@ android:paddingRight="24dp" android:paddingTop="16dp"> - - + - - + - - +