Merge branch 'master' into performance

This commit is contained in:
Vincent Breitmoser
2016-02-10 17:36:02 +01:00
103 changed files with 573 additions and 438 deletions

View File

@@ -33,7 +33,7 @@ import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.bouncycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;

View File

@@ -34,7 +34,7 @@ import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;
import org.spongycastle.util.encoders.Hex;
import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;

View File

@@ -20,11 +20,15 @@ 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 android.view.View;
import com.astuetz.PagerSlidingTabStrip;
import org.sufficientlysecure.donations.DonationsFragment;
import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
@@ -36,10 +40,15 @@ public class HelpActivity extends BaseActivity {
public static final int TAB_START = 0;
public static final int TAB_CONFIRM = 1;
public static final int TAB_FAQ = 2;
public static final int TAB_CHANGELOG = 3;
public static final int TAB_ABOUT = 4;
public static final int TAB_DONATE = 3;
public static final int TAB_CHANGELOG = 4;
public static final int TAB_ABOUT = 5;
// Google Play
private static final String[] GOOGLE_PLAY_CATALOG = new String[]{"keychain.donation.1",
"keychain.donation.2", "keychain.donation.3", "keychain.donation.5", "keychain.donation.10",
"keychain.donation.50", "keychain.donation.100"};
ViewPager mViewPager;
private PagerTabStripAdapter mTabsAdapter;
@Override
@@ -53,12 +62,12 @@ public class HelpActivity extends BaseActivity {
}
});
mViewPager = (ViewPager) findViewById(R.id.pager);
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
PagerSlidingTabStrip slidingTabLayout =
(PagerSlidingTabStrip) findViewById(R.id.sliding_tab_layout);
mTabsAdapter = new PagerTabStripAdapter(this);
mViewPager.setAdapter(mTabsAdapter);
viewPager.setAdapter(mTabsAdapter);
int selectedTab = TAB_START;
Intent intent = getIntent();
@@ -81,6 +90,26 @@ public class HelpActivity extends BaseActivity {
mTabsAdapter.addTab(HelpMarkdownFragment.class, faqBundle,
getString(R.string.help_tab_faq));
Bundle donationsBundle = new Bundle();
donationsBundle.putBoolean(DonationsFragment.ARG_DEBUG, Constants.DEBUG);
if (BuildConfig.DONATIONS_GOOGLE) {
donationsBundle.putBoolean(DonationsFragment.ARG_GOOGLE_ENABLED, true);
donationsBundle.putString(DonationsFragment.ARG_GOOGLE_PUBKEY, BuildConfig.GOOGLE_PLAY_PUBKEY);
donationsBundle.putStringArray(DonationsFragment.ARG_GOOGLE_CATALOG, GOOGLE_PLAY_CATALOG);
donationsBundle.putStringArray(DonationsFragment.ARG_GOOGLE_CATALOG_VALUES,
getResources().getStringArray(R.array.help_donation_google_catalog_values));
} else {
donationsBundle.putBoolean(DonationsFragment.ARG_PAYPAL_ENABLED, true);
donationsBundle.putString(DonationsFragment.ARG_PAYPAL_CURRENCY_CODE, BuildConfig.PAYPAL_CURRENCY_CODE);
donationsBundle.putString(DonationsFragment.ARG_PAYPAL_USER, BuildConfig.PAYPAL_USER);
donationsBundle.putString(DonationsFragment.ARG_PAYPAL_ITEM_NAME,
getString(R.string.help_donation_paypal_item));
donationsBundle.putBoolean(DonationsFragment.ARG_BITCOIN_ENABLED, true);
donationsBundle.putString(DonationsFragment.ARG_BITCOIN_ADDRESS, BuildConfig.BITCOIN_ADDRESS);
}
mTabsAdapter.addTab(DonationsFragment.class, donationsBundle,
getString(R.string.help_tab_donations));
Bundle changelogBundle = new Bundle();
changelogBundle.putInt(HelpMarkdownFragment.ARG_MARKDOWN_RES, R.raw.help_changelog);
mTabsAdapter.addTab(HelpMarkdownFragment.class, changelogBundle,
@@ -90,10 +119,10 @@ public class HelpActivity extends BaseActivity {
getString(R.string.help_tab_about));
// NOTE: must be after adding the tabs!
slidingTabLayout.setViewPager(mViewPager);
slidingTabLayout.setViewPager(viewPager);
// switch to tab selected by extra
mViewPager.setCurrentItem(selectedTab);
viewPager.setCurrentItem(selectedTab);
}
@Override
@@ -107,4 +136,18 @@ public class HelpActivity extends BaseActivity {
context.startActivity(intent);
}
/**
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Fragment fragment = mTabsAdapter.getRegisteredFragment(TAB_DONATE);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}

View File

@@ -51,6 +51,8 @@ import android.widget.LinearLayout;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.AppCompatPreferenceActivity;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.ThemeChanger;
import org.sufficientlysecure.keychain.util.Log;
@@ -79,6 +81,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onResume() {
super.onResume();
BaseActivity.onResumeChecks(this);
if (mThemeChanger.changeTheme()) {
Intent intent = getIntent();
@@ -463,6 +466,8 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
} else {
// disable syncs
ContentResolver.setSyncAutomatically(account, authority, false);
// immediately delete any linked contacts
ContactSyncAdapterService.deleteIfSyncDisabled(getActivity());
// cancel any ongoing/pending syncs
ContentResolver.cancelSync(account, authority);
setSummary(syncCheckBox, authority, false);

View File

@@ -34,7 +34,7 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import org.spongycastle.util.encoders.Hex;
import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;

View File

@@ -22,12 +22,15 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import android.view.ViewGroup;
import java.util.ArrayList;
public class PagerTabStripAdapter extends FragmentPagerAdapter {
protected final Activity mActivity;
protected final ArrayList<TabInfo> mTabs = new ArrayList<>();
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
static final class TabInfo {
public final Class<?> clss;
@@ -72,4 +75,21 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter {
public CharSequence getPageTitle(int position) {
return mTabs.get(position).title;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}

View File

@@ -29,7 +29,7 @@ import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.bouncycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;

View File

@@ -18,6 +18,7 @@
package org.sufficientlysecure.keychain.ui.base;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
@@ -30,6 +31,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.service.KeyserverSyncAdapterService;
import org.sufficientlysecure.keychain.ui.util.ThemeChanger;
@@ -52,7 +54,7 @@ public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
KeyserverSyncAdapterService.cancelUpdates(this);
onResumeChecks(this);
if (mThemeChanger.changeTheme()) {
Intent intent = getIntent();
@@ -63,6 +65,12 @@ public abstract class BaseActivity extends AppCompatActivity {
}
}
public static void onResumeChecks(Context context) {
KeyserverSyncAdapterService.cancelUpdates(context);
// in case user has disabled sync from Android account settings
ContactSyncAdapterService.deleteIfSyncDisabled(context);
}
protected void initLayout() {
}

View File

@@ -43,9 +43,9 @@ import nordpol.android.AndroidCard;
import nordpol.android.OnDiscoveredTagListener;
import nordpol.IsoCard;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.util.Arrays;
import org.spongycastle.util.encoders.Hex;
import org.bouncycastle.bcpg.HashAlgorithmTags;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey;

View File

@@ -41,7 +41,7 @@ import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.bouncycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
@@ -358,7 +358,7 @@ public class AddSubkeyDialogFragment extends DialogFragment {
* <h3>DSA</h3>
* <p>For DSA algorithm key length must be between 2048 and 3072. Also, it must me dividable by 64.</p>
*
* @return correct key length, according to SpongyCastle specification. Returns <code>-1</code>, if key length is
* @return correct key length, according to BouncyCastle specification. Returns <code>-1</code>, if key length is
* inappropriate.
*/
private int getProperKeyLength(Algorithm algorithm, int currentKeyLength) {

View File

@@ -64,7 +64,7 @@ import android.widget.ViewAnimator;
import javax.net.ssl.HttpsURLConnection;
import org.json.JSONException;
import org.json.JSONObject;
import org.spongycastle.util.encoders.Hex;
import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;

View File

@@ -32,11 +32,11 @@ import android.widget.ViewAnimator;
import org.openintents.openpgp.OpenPgpDecryptionResult;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.spongycastle.asn1.ASN1ObjectIdentifier;
import org.spongycastle.asn1.nist.NISTNamedCurves;
import org.spongycastle.asn1.teletrust.TeleTrusTNamedCurves;
import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
import org.spongycastle.util.encoders.Hex;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.nist.NISTNamedCurves;
import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;