diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure')
5 files changed, 102 insertions, 52 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 866888bb2..f911318a0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -18,6 +18,9 @@ package org.sufficientlysecure.keychain; import android.app.Application; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.os.Environment; import org.spongycastle.jce.provider.BouncyCastleProvider; @@ -70,5 +73,22 @@ public class KeychainApplication extends Application { // that the directory doesn't exist at this point } } + + brandGlowEffect(getApplicationContext(), + getApplicationContext().getResources().getColor(R.color.emphasis)); + } + + static void brandGlowEffect(Context context, int brandColor) { + // terrible hack to brand the edge overscroll glow effect + // https://gist.github.com/menny/7878762#file-brandgloweffect_full-java + + //glow + int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android"); + Drawable androidGlow = context.getResources().getDrawable(glowDrawableId); + androidGlow.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); + //edge + int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android"); + Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId); + androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); } } 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 e81bc1563..cf7446a58 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java @@ -24,7 +24,9 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter; import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter; +import org.sufficientlysecure.keychain.util.SlidingTabLayout; public class HelpActivity extends ActionBarActivity { public static final String EXTRA_SELECTED_TAB = "selected_tab"; @@ -37,25 +39,27 @@ public class HelpActivity extends ActionBarActivity { public static final int TAB_ABOUT = 5; ViewPager mViewPager; - TabsAdapter mTabsAdapter; + private PagerTabStripAdapter mTabsAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.help_activity); - - mViewPager = (ViewPager) findViewById(R.id.pager); - final ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setHomeButtonEnabled(false); - actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); - mTabsAdapter = new TabsAdapter(this, mViewPager); + setContentView(R.layout.help_activity); + + mViewPager = (ViewPager) findViewById(R.id.pager); + SlidingTabLayout slidingTabLayout = + (SlidingTabLayout) findViewById(R.id.sliding_tab_layout); + + mTabsAdapter = new PagerTabStripAdapter(this); + mViewPager.setAdapter(mTabsAdapter); - int selectedTab = 0; + int selectedTab = TAB_START; Intent intent = getIntent(); if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) { selectedTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB); @@ -63,30 +67,36 @@ public class HelpActivity extends ActionBarActivity { Bundle startBundle = new Bundle(); startBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_start); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_start)), - HelpHtmlFragment.class, startBundle, (selectedTab == TAB_START)); + mTabsAdapter.addTab(HelpHtmlFragment.class, startBundle, + getString(R.string.help_tab_start)); Bundle faqBundle = new Bundle(); faqBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_faq); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_faq)), - HelpHtmlFragment.class, faqBundle, (selectedTab == TAB_FAQ)); + mTabsAdapter.addTab(HelpHtmlFragment.class, faqBundle, + getString(R.string.help_tab_faq)); Bundle wotBundle = new Bundle(); wotBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_wot); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_wot)), - HelpHtmlFragment.class, wotBundle, (selectedTab == TAB_WOT)); + mTabsAdapter.addTab(HelpHtmlFragment.class, wotBundle, + getString(R.string.help_tab_wot)); Bundle nfcBundle = new Bundle(); nfcBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_nfc_beam); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_nfc_beam)), - HelpHtmlFragment.class, nfcBundle, (selectedTab == TAB_NFC)); + mTabsAdapter.addTab(HelpHtmlFragment.class, nfcBundle, + getString(R.string.help_tab_nfc_beam)); Bundle changelogBundle = new Bundle(); changelogBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_changelog); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_changelog)), - HelpHtmlFragment.class, changelogBundle, (selectedTab == TAB_CHANGELOG)); + mTabsAdapter.addTab(HelpHtmlFragment.class, changelogBundle, + getString(R.string.help_tab_changelog)); + + mTabsAdapter.addTab(HelpAboutFragment.class, null, + getString(R.string.help_tab_about)); + + // NOTE: must be after adding the tabs! + slidingTabLayout.setViewPager(mViewPager); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_about)), - HelpAboutFragment.class, null, (selectedTab == TAB_ABOUT)); + // switch to tab selected by extra + mViewPager.setCurrentItem(selectedTab); } } 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 f196e3445..5464a9b96 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -381,6 +381,9 @@ public class KeyListFragment extends Fragment // Execute this when searching mSearchView.setOnQueryTextListener(this); + View searchPlate = mSearchView.findViewById(android.support.v7.appcompat.R.id.search_plate); + searchPlate.setBackgroundResource(R.drawable.keychaintheme_searchview_holo_light); + // Erase search result without focus MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 7c920294c..1955c122d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -40,6 +40,7 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.view.Window; import com.devspark.appmsg.AppMsg; @@ -55,6 +56,7 @@ import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.SlidingTabLayout; import java.io.IOException; +import java.util.Date; import java.util.HashMap; public class ViewKeyActivity extends ActionBarActivity implements @@ -75,6 +77,9 @@ public class ViewKeyActivity extends ActionBarActivity implements private ViewPager mViewPager; private SlidingTabLayout mSlidingTabLayout; private PagerTabStripAdapter mTabsAdapter; + private View mStatusDivider; + private View mStatusRevoked; + private View mStatusExpired; public static final int REQUEST_CODE_LOOKUP_KEY = 0x00007006; @@ -104,6 +109,10 @@ public class ViewKeyActivity extends ActionBarActivity implements setContentView(R.layout.view_key_activity); + mStatusDivider = findViewById(R.id.status_divider); + mStatusRevoked = findViewById(R.id.view_key_revoked); + mStatusExpired = findViewById(R.id.view_key_expired); + mViewPager = (ViewPager) findViewById(R.id.view_key_pager); mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout); @@ -363,10 +372,14 @@ public class ViewKeyActivity extends ActionBarActivity implements KeychainContract.KeyRings._ID, KeychainContract.KeyRings.MASTER_KEY_ID, KeychainContract.KeyRings.USER_ID, + KeychainContract.KeyRings.IS_REVOKED, + KeychainContract.KeyRings.EXPIRY, }; static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; static final int INDEX_UNIFIED_USER_ID = 2; + static final int INDEX_UNIFIED_IS_REVOKED = 3; + static final int INDEX_UNIFIED_EXPIRY = 4; @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { @@ -408,6 +421,24 @@ public class ViewKeyActivity extends ActionBarActivity implements String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId); getSupportActionBar().setSubtitle(keyIdStr); + // If this key is revoked, it cannot be used for anything! + if (data.getInt(INDEX_UNIFIED_IS_REVOKED) != 0) { + mStatusDivider.setVisibility(View.VISIBLE); + mStatusRevoked.setVisibility(View.VISIBLE); + mStatusExpired.setVisibility(View.GONE); + } else { + mStatusRevoked.setVisibility(View.GONE); + + Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000); + if (!data.isNull(INDEX_UNIFIED_EXPIRY) && expiryDate.before(new Date())) { + mStatusDivider.setVisibility(View.VISIBLE); + mStatusExpired.setVisibility(View.VISIBLE); + } else { + mStatusDivider.setVisibility(View.GONE); + mStatusExpired.setVisibility(View.GONE); + } + } + break; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java index ded457eca..b30c9aaec 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java @@ -32,6 +32,8 @@ import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.ListView; +import com.devspark.appmsg.AppMsg; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R;import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; @@ -49,8 +51,6 @@ public class ViewKeyMainFragment extends Fragment implements public static final String ARG_DATA_URI = "uri"; private LinearLayout mContainer; - private View mStatusRevoked; - private View mStatusExpired; private View mActionEdit; private View mActionEditDivider; private View mActionEncrypt; @@ -62,6 +62,9 @@ public class ViewKeyMainFragment extends Fragment implements private static final int LOADER_ID_UNIFIED = 0; private static final int LOADER_ID_USER_IDS = 1; + // conservative attitude + private boolean mHasEncrypt = true; + private ViewKeyUserIdsAdapter mUserIdsAdapter; private Uri mDataUri; @@ -72,8 +75,6 @@ public class ViewKeyMainFragment extends Fragment implements mContainer = (LinearLayout) view.findViewById(R.id.container); mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids); - mStatusRevoked = view.findViewById(R.id.view_key_revoked); - mStatusExpired = view.findViewById(R.id.view_key_expired); mActionEdit = view.findViewById(R.id.view_key_action_edit); mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider); mActionEncrypt = view.findViewById(R.id.view_key_action_encrypt); @@ -132,30 +133,14 @@ public class ViewKeyMainFragment extends Fragment implements } static final String[] UNIFIED_PROJECTION = new String[]{ - KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, - KeyRings.USER_ID, KeyRings.FINGERPRINT, - KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, - KeyRings.HAS_ENCRYPT - + KeyRings._ID, KeyRings.MASTER_KEY_ID, + KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, KeyRings.EXPIRY, KeyRings.HAS_ENCRYPT }; static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2; static final int INDEX_UNIFIED_IS_REVOKED = 3; - static final int INDEX_UNIFIED_USER_ID = 4; - static final int INDEX_UNIFIED_FINGERPRINT = 5; - static final int INDEX_UNIFIED_ALGORITHM = 6; - static final int INDEX_UNIFIED_KEY_SIZE = 7; - static final int INDEX_UNIFIED_CREATION = 8; - static final int INDEX_UNIFIED_EXPIRY = 9; - static final int INDEX_UNIFIED_HAS_ENCRYPT = 10; - - static final String[] KEYS_PROJECTION = new String[]{ - Keys._ID, - Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET, - Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED, - Keys.CREATION, Keys.EXPIRY, Keys.FINGERPRINT - }; - static final int KEYS_INDEX_CAN_ENCRYPT = 7; + static final int INDEX_UNIFIED_EXPIRY = 4; + static final int INDEX_UNIFIED_HAS_ENCRYPT = 5; public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { @@ -165,7 +150,8 @@ public class ViewKeyMainFragment extends Fragment implements } case LOADER_ID_USER_IDS: { Uri baseUri = UserIds.buildUserIdsUri(mDataUri); - return new CursorLoader(getActivity(), baseUri, ViewKeyUserIdsAdapter.USER_IDS_PROJECTION, null, null, null); + return new CursorLoader(getActivity(), baseUri, + ViewKeyUserIdsAdapter.USER_IDS_PROJECTION, null, null, null); } default: @@ -206,9 +192,6 @@ public class ViewKeyMainFragment extends Fragment implements // If this key is revoked, it cannot be used for anything! if (data.getInt(INDEX_UNIFIED_IS_REVOKED) != 0) { - mStatusRevoked.setVisibility(View.VISIBLE); - mStatusExpired.setVisibility(View.GONE); - mActionEdit.setEnabled(false); mActionCertify.setEnabled(false); mActionEncrypt.setEnabled(false); @@ -217,18 +200,16 @@ public class ViewKeyMainFragment extends Fragment implements Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000); if (!data.isNull(INDEX_UNIFIED_EXPIRY) && expiryDate.before(new Date())) { - mStatusRevoked.setVisibility(View.GONE); - mStatusExpired.setVisibility(View.VISIBLE); mActionCertify.setEnabled(false); mActionEncrypt.setEnabled(false); } else { - mStatusRevoked.setVisibility(View.GONE); - mStatusExpired.setVisibility(View.GONE); mActionCertify.setEnabled(true); mActionEncrypt.setEnabled(true); } } + mHasEncrypt = data.getInt(INDEX_UNIFIED_HAS_ENCRYPT) != 0; + break; } } @@ -255,6 +236,11 @@ public class ViewKeyMainFragment extends Fragment implements } private void encrypt(Uri dataUri) { + // If there is no encryption key, don't bother. + if (!mHasEncrypt) { + AppMsg.makeText(getActivity(), R.string.error_no_encrypt_subkey, AppMsg.STYLE_ALERT).show(); + return; + } try { long keyId = new ProviderHelper(getActivity()).extractOrGetMasterKeyId(dataUri); long[] encryptionKeyIds = new long[]{keyId}; |