From 09e992081bbe9b4522b940177bd9bd08d692b94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 15 Jan 2015 14:48:13 +0100 Subject: [PATCH] Style tabs, add missing drawables --- OpenKeychain/build.gradle | 1 + .../keychain/ui/BaseActivity.java | 10 +- .../keychain/ui/HelpActivity.java | 20 +- .../keychain/ui/ViewKeyActivity.java | 33 +- .../keychain/ui/widget/SlidingTabLayout.java | 318 ------------------ .../keychain/ui/widget/SlidingTabStrip.java | 211 ------------ .../drawable-hdpi/key_flag_authenticate.png | Bin 0 -> 1302 bytes .../res/drawable-hdpi/key_flag_certify.png | Bin 0 -> 2289 bytes .../res/drawable-hdpi/key_flag_encrypt.png | Bin 0 -> 1530 bytes .../main/res/drawable-hdpi/key_flag_sign.png | Bin 0 -> 1751 bytes .../drawable-xhdpi/key_flag_authenticate.png | Bin 0 -> 2161 bytes .../res/drawable-xhdpi/key_flag_certify.png | Bin 0 -> 3713 bytes .../res/drawable-xhdpi/key_flag_encrypt.png | Bin 0 -> 2310 bytes .../main/res/drawable-xhdpi/key_flag_sign.png | Bin 0 -> 2705 bytes .../drawable-xxhdpi/key_flag_authenticate.png | Bin 0 -> 3073 bytes .../res/drawable-xxhdpi/key_flag_certify.png | Bin 0 -> 5303 bytes .../res/drawable-xxhdpi/key_flag_encrypt.png | Bin 0 -> 3158 bytes .../res/drawable-xxhdpi/key_flag_sign.png | Bin 0 -> 3765 bytes .../src/main/res/layout/help_activity.xml | 9 +- .../src/main/res/layout/view_key_activity.xml | 8 +- OpenKeychain/src/main/res/raw/help_start.html | 2 +- README.md | 4 + 22 files changed, 43 insertions(+), 573 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign.png diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 21482340a..9d8469144 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -25,6 +25,7 @@ dependencies { compile 'com.journeyapps:zxing-android-embedded:2.0.1@aar' compile 'com.journeyapps:zxing-android-integration:2.0.1@aar' compile 'com.google.zxing:core:3.0.1' + compile 'com.jpardogo.materialtabstrip:library:1.0.8' } android { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java index ee73bb8f2..c38d126d7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java @@ -27,7 +27,7 @@ import org.sufficientlysecure.keychain.R; * Sets action bar */ public abstract class BaseActivity extends ActionBarActivity { - private Toolbar toolbar; + protected Toolbar mToolbar; @Override protected void onCreate(Bundle savedInstanceState) { @@ -39,14 +39,14 @@ public abstract class BaseActivity extends ActionBarActivity { protected abstract void initLayout(); protected void initToolbar() { - toolbar = (Toolbar) findViewById(R.id.toolbar); - if (toolbar != null) { - setSupportActionBar(toolbar); + mToolbar = (Toolbar) findViewById(R.id.toolbar); + if (mToolbar != null) { + setSupportActionBar(mToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } protected void setActionBarIcon(int iconRes) { - toolbar.setNavigationIcon(iconRes); + mToolbar.setNavigationIcon(iconRes); } } 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 8d4d3c915..2eb35351e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java @@ -20,12 +20,12 @@ package org.sufficientlysecure.keychain.ui; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBar; -import android.support.v7.app.ActionBarActivity; +import android.view.View; + +import com.astuetz.PagerSlidingTabStrip; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter; -import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout; public class HelpActivity extends BaseActivity { public static final String EXTRA_SELECTED_TAB = "selected_tab"; @@ -44,14 +44,16 @@ public class HelpActivity extends BaseActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final ActionBar actionBar = getSupportActionBar(); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(false); - actionBar.setHomeButtonEnabled(false); + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); mViewPager = (ViewPager) findViewById(R.id.pager); - SlidingTabLayout slidingTabLayout = - (SlidingTabLayout) findViewById(R.id.sliding_tab_layout); + PagerSlidingTabStrip slidingTabLayout = + (PagerSlidingTabStrip) findViewById(R.id.sliding_tab_layout); mTabsAdapter = new PagerTabStripAdapter(this); mViewPager.setAdapter(mTabsAdapter); 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 ae80679d0..3bb0695a0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -21,7 +21,6 @@ package org.sufficientlysecure.keychain.ui; import android.annotation.TargetApi; import android.content.Intent; import android.database.Cursor; -import android.graphics.PorterDuff; import android.net.Uri; import android.nfc.NdefMessage; import android.nfc.NdefRecord; @@ -38,7 +37,6 @@ import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; -import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -47,22 +45,21 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import com.astuetz.PagerSlidingTabStrip; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.util.ContactHelper; -import org.sufficientlysecure.keychain.util.ExportHelper; -import org.sufficientlysecure.keychain.util.Preferences; +import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; -import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter; -import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout; -import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout.TabColorizer; -import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.util.ContactHelper; +import org.sufficientlysecure.keychain.util.ExportHelper; +import org.sufficientlysecure.keychain.util.Log; import java.util.Date; import java.util.HashMap; @@ -81,7 +78,7 @@ public class ViewKeyActivity extends BaseActivity implements // view private ViewPager mViewPager; - private SlidingTabLayout mSlidingTabLayout; + private PagerSlidingTabStrip mSlidingTabLayout; private PagerTabStripAdapter mTabsAdapter; private LinearLayout mStatusLayout; @@ -117,19 +114,7 @@ public class ViewKeyActivity extends BaseActivity implements mStatusDivider = findViewById(R.id.view_key_status_divider); mViewPager = (ViewPager) findViewById(R.id.view_key_pager); - mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout); - - mSlidingTabLayout.setCustomTabColorizer(new TabColorizer() { - @Override - public int getIndicatorColor(int position) { - return 0xFF4caf50; - } - - @Override - public int getDividerColor(int position) { - return 0; - } - }); + mSlidingTabLayout = (PagerSlidingTabStrip) findViewById(R.id.view_key_sliding_tab_layout); int switchToTab = TAB_MAIN; Intent intent = getIntent(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java deleted file mode 100644 index 17471c86c..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import android.graphics.Typeface; -import android.os.Build; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.HorizontalScrollView; -import android.widget.TextView; - -/** - * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html - */ - -/** - * To be used with ViewPager to provide a tab indicator component which give constant feedback as to - * the user's scroll progress. - *

- * To use the component, simply add it to your view hierarchy. Then in your - * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call - * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for. - *

- * The colors can be customized in two ways. The first and simplest is to provide an array of colors - * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The - * alternative is via the {@link TabColorizer} interface which provides you complete control over - * which color is used for any individual position. - *

- * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)}, - * providing the layout ID of your custom layout. - */ -public class SlidingTabLayout extends HorizontalScrollView { - - /** - * Allows complete control over the colors drawn in the tab layout. Set with - * {@link #setCustomTabColorizer(TabColorizer)}. - */ - public interface TabColorizer { - - /** - * @return return the color of the indicator used when {@code position} is selected. - */ - int getIndicatorColor(int position); - - /** - * @return return the color of the divider drawn to the right of {@code position}. - */ - int getDividerColor(int position); - - } - - private static final int TITLE_OFFSET_DIPS = 24; - private static final int TAB_VIEW_PADDING_DIPS = 16; - private static final int TAB_VIEW_TEXT_SIZE_SP = 12; - - private int mTitleOffset; - - private int mTabViewLayoutId; - private int mTabViewTextViewId; - - private ViewPager mViewPager; - private ViewPager.OnPageChangeListener mViewPagerPageChangeListener; - - private final SlidingTabStrip mTabStrip; - - public SlidingTabLayout(Context context) { - this(context, null); - } - - public SlidingTabLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - // Disable the Scroll Bar - setHorizontalScrollBarEnabled(false); - // Make sure that the Tab Strips fills this View - setFillViewport(true); - - mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density); - - mTabStrip = new SlidingTabStrip(context); - addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - } - - /** - * Set the custom {@link TabColorizer} to be used. - *

- * If you only require simple custmisation then you can use - * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve - * similar effects. - */ - public void setCustomTabColorizer(TabColorizer tabColorizer) { - mTabStrip.setCustomTabColorizer(tabColorizer); - } - - /** - * Sets the colors to be used for indicating the selected tab. These colors are treated as a - * circular array. Providing one color will mean that all tabs are indicated with the same color. - */ - public void setSelectedIndicatorColors(int... colors) { - mTabStrip.setSelectedIndicatorColors(colors); - } - - /** - * Sets the colors to be used for tab dividers. These colors are treated as a circular array. - * Providing one color will mean that all tabs are indicated with the same color. - */ - public void setDividerColors(int... colors) { - mTabStrip.setDividerColors(colors); - } - - /** - * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are - * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so - * that the layout can update it's scroll position correctly. - * - * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener) - */ - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - mViewPagerPageChangeListener = listener; - } - - /** - * Set the custom layout to be inflated for the tab views. - * - * @param layoutResId Layout id to be inflated - * @param textViewId id of the {@link TextView} in the inflated view - */ - public void setCustomTabView(int layoutResId, int textViewId) { - mTabViewLayoutId = layoutResId; - mTabViewTextViewId = textViewId; - } - - /** - * Sets the associated view pager. Note that the assumption here is that the pager content - * (number of tabs and tab titles) does not change after this call has been made. - */ - public void setViewPager(ViewPager viewPager) { - mTabStrip.removeAllViews(); - - mViewPager = viewPager; - if (viewPager != null) { - viewPager.setOnPageChangeListener(new InternalViewPagerListener()); - populateTabStrip(); - } - } - - /** - * Create a default view to be used for tabs. This is called if a custom tab view is not set via - * {@link #setCustomTabView(int, int)}. - */ - protected TextView createDefaultTabView(Context context) { - TextView textView = new TextView(context); - textView.setGravity(Gravity.CENTER); - textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP); - textView.setTypeface(Typeface.DEFAULT_BOLD); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - // If we're running on Honeycomb or newer, then we can use the Theme's - // selectableItemBackground to ensure that the View has a pressed state - TypedValue outValue = new TypedValue(); - getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, - outValue, true); - textView.setBackgroundResource(outValue.resourceId); - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style - textView.setAllCaps(true); - } - - int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density); - textView.setPadding(padding, padding, padding, padding); - - return textView; - } - - private void populateTabStrip() { - final PagerAdapter adapter = mViewPager.getAdapter(); - final View.OnClickListener tabClickListener = new TabClickListener(); - - for (int i = 0; i < adapter.getCount(); i++) { - View tabView = null; - TextView tabTitleView = null; - - if (mTabViewLayoutId != 0) { - // If there is a custom tab view layout id set, try and inflate it - tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip, - false); - tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId); - } - - if (tabView == null) { - tabView = createDefaultTabView(getContext()); - } - - if (tabTitleView == null && TextView.class.isInstance(tabView)) { - tabTitleView = (TextView) tabView; - } - - tabTitleView.setText(adapter.getPageTitle(i)); - tabView.setOnClickListener(tabClickListener); - - mTabStrip.addView(tabView); - } - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - - if (mViewPager != null) { - scrollToTab(mViewPager.getCurrentItem(), 0); - } - } - - private void scrollToTab(int tabIndex, int positionOffset) { - final int tabStripChildCount = mTabStrip.getChildCount(); - if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { - return; - } - - View selectedChild = mTabStrip.getChildAt(tabIndex); - if (selectedChild != null) { - int targetScrollX = selectedChild.getLeft() + positionOffset; - - if (tabIndex > 0 || positionOffset > 0) { - // If we're not at the first child and are mid-scroll, make sure we obey the offset - targetScrollX -= mTitleOffset; - } - - scrollTo(targetScrollX, 0); - } - } - - private class InternalViewPagerListener implements ViewPager.OnPageChangeListener { - private int mScrollState; - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - int tabStripChildCount = mTabStrip.getChildCount(); - if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { - return; - } - - mTabStrip.onViewPagerPageChanged(position, positionOffset); - - View selectedTitle = mTabStrip.getChildAt(position); - int extraOffset = (selectedTitle != null) - ? (int) (positionOffset * selectedTitle.getWidth()) - : 0; - scrollToTab(position, extraOffset); - - if (mViewPagerPageChangeListener != null) { - mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, - positionOffsetPixels); - } - } - - @Override - public void onPageScrollStateChanged(int state) { - mScrollState = state; - - if (mViewPagerPageChangeListener != null) { - mViewPagerPageChangeListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageSelected(int position) { - if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { - mTabStrip.onViewPagerPageChanged(position, 0f); - scrollToTab(position, 0); - } - - if (mViewPagerPageChangeListener != null) { - mViewPagerPageChangeListener.onPageSelected(position); - } - } - - } - - private class TabClickListener implements View.OnClickListener { - @Override - public void onClick(View v) { - for (int i = 0; i < mTabStrip.getChildCount(); i++) { - if (v == mTabStrip.getChildAt(i)) { - mViewPager.setCurrentItem(i); - return; - } - } - } - } - -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java deleted file mode 100644 index 4c41e12c5..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.R; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.View; -import android.widget.LinearLayout; - -/** - * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html - */ -class SlidingTabStrip extends LinearLayout { - - private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2; - private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26; - private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8; - private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFFAA66CC; - - private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1; - private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20; - private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f; - - private final int mBottomBorderThickness; - private final Paint mBottomBorderPaint; - - private final int mSelectedIndicatorThickness; - private final Paint mSelectedIndicatorPaint; - - private final int mDefaultBottomBorderColor; - - private final Paint mDividerPaint; - private final float mDividerHeight; - - private int mSelectedPosition; - private float mSelectionOffset; - - private SlidingTabLayout.TabColorizer mCustomTabColorizer; - private final SimpleTabColorizer mDefaultTabColorizer; - - SlidingTabStrip(Context context) { - this(context, null); - } - - SlidingTabStrip(Context context, AttributeSet attrs) { - super(context, attrs); - setWillNotDraw(false); - - final float density = getResources().getDisplayMetrics().density; - - TypedValue outValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true); - final int themeForegroundColor = outValue.data; - - mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor, - DEFAULT_BOTTOM_BORDER_COLOR_ALPHA); - - mDefaultTabColorizer = new SimpleTabColorizer(); - mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR); - mDefaultTabColorizer.setDividerColors(setColorAlpha(themeForegroundColor, - DEFAULT_DIVIDER_COLOR_ALPHA)); - - mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density); - mBottomBorderPaint = new Paint(); - mBottomBorderPaint.setColor(mDefaultBottomBorderColor); - - mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density); - mSelectedIndicatorPaint = new Paint(); - - mDividerHeight = DEFAULT_DIVIDER_HEIGHT; - mDividerPaint = new Paint(); - mDividerPaint.setStrokeWidth((int) (DEFAULT_DIVIDER_THICKNESS_DIPS * density)); - } - - void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) { - mCustomTabColorizer = customTabColorizer; - invalidate(); - } - - void setSelectedIndicatorColors(int... colors) { - // Make sure that the custom colorizer is removed - mCustomTabColorizer = null; - mDefaultTabColorizer.setIndicatorColors(colors); - invalidate(); - } - - void setDividerColors(int... colors) { - // Make sure that the custom colorizer is removed - mCustomTabColorizer = null; - mDefaultTabColorizer.setDividerColors(colors); - invalidate(); - } - - void onViewPagerPageChanged(int position, float positionOffset) { - mSelectedPosition = position; - mSelectionOffset = positionOffset; - invalidate(); - } - - @Override - protected void onDraw(Canvas canvas) { - final int height = getHeight(); - final int childCount = getChildCount(); - final int dividerHeightPx = (int) (Math.min(Math.max(0f, mDividerHeight), 1f) * height); - final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null - ? mCustomTabColorizer - : mDefaultTabColorizer; - - // Thick colored underline below the current selection - if (childCount > 0) { - View selectedTitle = getChildAt(mSelectedPosition); - int left = selectedTitle.getLeft(); - int right = selectedTitle.getRight(); - int color = tabColorizer.getIndicatorColor(mSelectedPosition); - - if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) { - int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1); - if (color != nextColor) { - color = blendColors(nextColor, color, mSelectionOffset); - } - - // Draw the selection partway between the tabs - View nextTitle = getChildAt(mSelectedPosition + 1); - left = (int) (mSelectionOffset * nextTitle.getLeft() + - (1.0f - mSelectionOffset) * left); - right = (int) (mSelectionOffset * nextTitle.getRight() + - (1.0f - mSelectionOffset) * right); - } - - mSelectedIndicatorPaint.setColor(color); - - canvas.drawRect(left, height - mSelectedIndicatorThickness, right, - height, mSelectedIndicatorPaint); - } - - // Thin underline along the entire bottom edge - canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint); - - // Vertical separators between the titles - int separatorTop = (height - dividerHeightPx) / 2; - for (int i = 0; i < childCount - 1; i++) { - View child = getChildAt(i); - mDividerPaint.setColor(tabColorizer.getDividerColor(i)); - canvas.drawLine(child.getRight(), separatorTop, child.getRight(), - separatorTop + dividerHeightPx, mDividerPaint); - } - } - - /** - * Set the alpha value of the {@code color} to be the given {@code alpha} value. - */ - private static int setColorAlpha(int color, byte alpha) { - return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color)); - } - - /** - * Blend {@code color1} and {@code color2} using the given ratio. - * - * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend, - * 0.0 will return {@code color2}. - */ - private static int blendColors(int color1, int color2, float ratio) { - final float inverseRation = 1f - ratio; - float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation); - float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation); - float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation); - return Color.rgb((int) r, (int) g, (int) b); - } - - private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer { - private int[] mIndicatorColors; - private int[] mDividerColors; - - @Override - public final int getIndicatorColor(int position) { - return mIndicatorColors[position % mIndicatorColors.length]; - } - - @Override - public final int getDividerColor(int position) { - return mDividerColors[position % mDividerColors.length]; - } - - void setIndicatorColors(int... colors) { - mIndicatorColors = colors; - } - - void setDividerColors(int... colors) { - mDividerColors = colors; - } - } -} \ No newline at end of file diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4ed6e843f07b87016f9450f48bbd476c1a0803 GIT binary patch literal 1302 zcmV+x1?l>UP)H9Nh&YW!ln3dCs4Fm$uOfIFgT|4=`Yr>3S5LLh{oR;wX|06+*qqtU?WbW*R^ zIeq#xx~{jCU`Ga;LDfc`#FM|N*L?VNg;ds{XP2|(@9phvJvS3HzgH9mDJ80^q9_WM zW!dVY13=SRC}#Qct55Jp2UtoyVIy6~J*Fc>fy-CE=G2MLFin$0B0;@g?`X&E;tPdB zcs!o2AUYWM@#c3Zy=5}lBo197UV~meM4vCjPj@f#!SPQKLJ$gtS^(@+-_z5BloCzT zI#}ph0?V>+2nW?_17ib(*bH7SFR;9v!s`lCt5tD06qc8lF-_C<)BqzRBWRjt3vR~} zytDrVH*S85-~A>HYoiq?q>k4;f}(6{Ash~4nr7GDS5?*4*JPt>3Htj&T>N5=M~~tZ zN^3|d5eSBd$9QA(t=0w(hXWx**MVavzULC5loF4-kMZdH&pg44PQx8F5Rb$qGlVzC&SrlBYbKA#WEvIvDj#9}erZZ{`Sp2V^&d_EtVrXhqtRaN|cKk0OuqeqVt z37#2!Y4rVRUq~dC-;+#M6Mjxw*MtjvP4>ZZsNgY;>D&+gY;{n4M{w#WG0h&a_iQui-1!I zA({*b!1r|NY?h|$UEu|-0a!p4C;$a1r4-MD{=c-Bel33m;1z&>0EsDosb|B@8UO$Q M07*qoM6N<$f^eHp0ssI2 literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png new file mode 100644 index 0000000000000000000000000000000000000000..e76393659bcfb4c98d04b1f5a8d683f684e0aab3 GIT binary patch literal 2289 zcmY*aXH*l&8VxN5kPV1fC=#+LPZ1J&ks=VJF0k|_7?J>ikc1>uk)nct^cAx#OI#HT zAShx`nn9%|vfGob%0hX6DX!?|09fGZ`*UHc}Gu5&!@|%FY(y z%Fhr%fPnm&93Q{NPoiW?J9iL&B!JNA{IxjI)`!eb#)1%9MHkrfH&0Tmy(w;lU`h;< zgaO3F#Assi;bat&h|wgFLW-A7~uqY%2OTa@=7!m~= zELdR*Q`&U+a9IJ|B8n19AOZMg$??b-ED|4%Jp9&y%0EU6ju99#ii9N!DgZ3-5G;yc zDVRivfVdwJxR3~87!*Yl;)cbeFpy{ri7eoPYZ_`A!T*gpxJ!oc_&(p zp)i0@3WZ2EhQSC#3?7BU5|Jc|z!Vr7LqTG3Fdcokz5(pO5RD%U(fGj-ji5M<$zWh;bxrNGJvHFWC?QE1wi~AUGO>B1A+G@Z;&e`=0MId7L?LL<(F zRg8E(!dvI~W`ooFzbo-xi8$Qa-u|aMc%bYilI!v`@Y;t}0}nkfQ3&+q>Aa+gB-Sqq zX1cY);n1U@bj!!*+zgvts?$Te{F|JlMIC7u+EKk`NngR_Zya*@^L6Gu?|IIO#3qwd ztY5_v!_u~R&J$8=CNFtr?uFxpWs*T{gH^MixL)9;tDNpd>$&9e9{+QU0f(L7d`Hc~ zJ+_o`lNpbhV;&$q7wU+E&b+W@M%qfmjwh~7300i~^G@HQUwllx)GM)es0X}U_qpa_ z18rY2QgIfr`&oPUwvFwkT{;R5q^EtN6t)fP+^jqk2Gxe5m3+iTWTy(`-e{awr{2ko zDRdC&X<>k8w#|MHAJj3_cj|X8cyX*3q54ck#!uVgVkG74wK@|!nF4vYwO#HF%?bo! z;&`*hHPhmW1lFcXVK{{E@b)b|7PW$;YbJ1p?|0Z$ z9cZkhSN?GQ*jrpDQ^Czd6`INt?n@?&)h*PAFNQcp?sOpiA%Owc!=-XE>ZO4OwXvUO z6mAUeF8eq@aVj-Y2_8L47np6ndBuSR z{OcW>UhHMbBi%-&+8K^sk)sj*DWaKaD%WVmk@tz!bwr_N_VqPz=>SGH&3jYw~D#MQb8w%Vlo|Zz| z6{#Sppuh7T{F5Fq%LqLCJ1Ar14L#?LTE7fXaUmf-xkc-&$M>q5^Fkjads5OjGrTr9gxu#o zA{P%MbabBTJnsKN7@aA_rvi|B*r7NJBnN$&mc>2Z#-JC&ij3b4 zy~g#9o9*Is5)ThmmS>9z0q}C2)UBN+!3%jw=v631bnwJoBeR}lf>rASME-MSVRKnR z^pVObQ_9R*kLM0Y_HIe@XuM3d15IqyV^IT@7#AGudBYJXsXLl>Hyc~g547amVN_n3 z|MRAB==<4{Un*llqZt2}-#XvS0s@D;zat7LP=NmCQ{zC38Uk@z$-N>Mfc;sVG< zB7ZiI$=+O?>ss4O|B_tOq#G}6;x@oU*KohYH)P*)44U6udNOb)jim~-cN8=FGv&xa zkT?UL%>KTECDm6mWR}fPafjyP%>7sGqirr7gGpTuEkf@i6WH=d%J;eI40zb&RrJbl7oLLvSBh-!16$?0 z03IIM>?FUYt(>v>Oz;Y0gB9qPCI3v%I~-ek-hBJp#(LxWd)dLVu-NKG$pHH=qrd)r zj=D`qh2blS zb8QOd8)99_P&hhTLuPetiPHk_Q2G$d}OI?&jj#a~{Y5R?o4bhI6l1J(R`#Hs{ z1c*N4xs&p^(Y5G7Er_Tui<+bocplt1qvn=Mr6nbll+zZ9Ts$VdCSOb^f=@-&PxZ9! t>FC$Sh4MDp%0fk{-68bpiPv(oX!g8lB@qbEyowXC9%JRzf{{e$cDjWa+ literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2f8c09c57b5d612f3a5b9445b1a8eee6be02a7 GIT binary patch literal 1530 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 literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png new file mode 100644 index 0000000000000000000000000000000000000000..8d36d72026d3028666ca21b663c7686f82164ff7 GIT binary patch literal 2161 zcmV-%2#)uOP)L4bmu-Asx--IWKJj*qbo7~-tNCyjdM^H){>Uw!peb+?6-lCQEkmRrD5?JdA^+gpI; zwzmMwZR%`Cb8~Zr)9L)Bq9|)$=Riw6ZxV?_r^DgczkU1mr_=pnddJPp%}tq^nMWHM z8r(TKIZMt?D$(?VBfzeS^0I|dGAML<`%yZvGe(!{}$7Az0f-Ex$!xl z{QMnyyN)75ce&m17yj_UdcL^cF{5)SCE;+`{vL@$2m}IiVj__U!C-KX-?FR)eW`3w zfaqk1Pj~&8jT`Ft=Gs-%R_0S%T}oA19-r?13DNLOAv<^OBpeRY-rmmr`}f(ue?J2Q z16;Xsh0B*OBc0DCk`u$$EA?waq`8DnORU2g+qr9p(qOH&YdGOGn3=TkMr4QpKF(}k_wL!=C@pL}U| z-rwI(O-&7czn_a2FS2>_W}?w3!^6XNe^N?nYint3ZDs4$tqczj)7#t2wr$(EaNz>w z<>m9%!Ak>3De+bN={lnmicB#c3}adb6X8h|XBH8C6kqikd%()dN-8QU09dnTO-d1# zWzpE!NJB#d0IOE5qOq|Nfa>aMJ8nq;(;KB1mJ=8caeqJ|KPM9-VWPUS35wEiN#`!j*iYd%c+Ezrb%I8;hgxzcAz-` z)5$B!>nJZ>&C{m?loYQfo`@o)Wyd;%15Hcg!Tk|d*L@48(`_$-%F4%Yw}KKS#DK{QQ6Rnzl!gL0i={T z94a4ucoZomhMAaAm;z8$=e%q7O`Qub1u(q>#i8O5%A8K$#DVoPbucf0VHoz#l1L;_ zRTa}TQ51zlB7tRDxLhu#rlwF;6~i#>7|VKAD~4g9D9?5%(=^dEjYJ}WrfI}tF}uB{ zX-rK`;cz(YzLIT|V+tWsNu7H)nxwvU>lR&IUEI8Rlf8TQa_7z+&YU^J@bEAvPMl!h zzJ2Jr&f&v{85>({T-+}uoecQ@zHpXb1V1B{G}(AwHcBog7s zkt0MR5l)^w$;ikE2M->kv$GQ^CD*Q9qot*Vo}M1s+S=@c@r3{Y`ynD#I_LY$m-5*= zQL6Y<4>AjFozrd68c0u1r?j*buh&a{emlp!jg3)LQ-fg`tY5#L(a}+AYio%{qiou=iBKrS;NT!`x0?+cHc(bpMt67j zivvs-o|Tn_%jLqdEG8x<08kW#v9U2GCMN8n%FfPaa&nSrG)f|oU}9o|+S*zkK72?# z9>+9IR;*Y-AP_*;b-Z3L!C(+g(+CEGgu`LHUN5Su5{t!9RTW*=Z7s>{FA8wu#*O&K zjThb literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png new file mode 100644 index 0000000000000000000000000000000000000000..01a74bcc0f353a64f4498f7a365b2103b50ae2f6 GIT binary patch literal 3713 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 I&hO&C0T0#Qm;e9( literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png new file mode 100644 index 0000000000000000000000000000000000000000..d786dc72f3262a12c858c5409d736d8b84ce7ad5 GIT binary patch literal 3073 zcmV+c4F24TrYMq#U@Z}+%=%s1d5Hj1{9k>v2oXcViPDfzVrqdvi+D!h6!IW;t1*?8m9)0Dn%;Wrt=dp1 z^h4mqrTsUFeEs#;jhd$IzVE*K)>V9p;7Z#DaMje@-p~5{X2O z5W--y+14O)If@}T+cuF%P*zrkrfJog95W4&42Hr^esq48;r~6w_{bUD6}2?9-ABbe zt-n{Hw-PH!5|SiIISnWjy~hr6bl>+7Lf~*ZkYh5DaEP5>|69KC_b+3yJBu!OrM^t8 z+JKMV+sFGq`DfZUHqhMQLsM0v@i3r)Ui#=iKBkAHn&84)1_Z@lpai9~{T-+h;3$Bq#Q1UP#1D2EOmA`}Yo&O7h0 zfB$||RYeHF`|rQc#*G_!_0?B7efl&50|Oj9c#u#i#L&Pd-UsUmtt-?xnW2mi_zp^TG=+@WBTkaQyi3 ztb((damxnyzxa$2n;A8kAfd#GMq?zD1gfT@X#yo4!)CECd1+wT!H*m{g4Jrp?RN9Y zC!a7gGlR?J!sqj`VZ#QZ(I`HjkGi@#B9Ta1#Gylnc=OFSdFrXBP!xraKmM48h6c*Y z%6Q;`2k7YN$SOFW@Dx^61MJQ+6h$Q#S4hUf$niL;suGSwiODiZW|FFk)n2;njBMGm zg|4nH3vIY&WCrA1 z0-4jPVe4)ZIz1PL{e)FaiHdld@BngYfLhAWtEyXae0m-Do)u}6N@U;^P&7i6v1W3|C zTZjWqgC`#OA?2QC-uun>al2fcAG*lo)k{=W)~9niolX*o#4=*}$fpDwjmCmvGxM(6 zfYiWnB!mzeLP*H6N-` z%|d1YfYoZHrluyZ;6i6X-WuR^cql8YV&?iB9(NTIW|B!kA|XiL)Id!FNH`r8%mjh} zl$YO=&X-!-nS?Vdc4ptw-}%;it}8?~6m%8%*5CYq|9oW+4o3+as@ss|c@oJuaC2h4 z-iX!WK#mCp1}^f)fAk2I6?N%6Hk*yQy1HdofqZ8xv+Cy?Q%IhI4FGuftAEX0@ESjT z^G8%vRAaFiF&WJ_iohb0YLdX!>jbV}r>4rs_x|y~GBRef8I#GBQ$#*_x_Z7YJA ziMDRu&6f5D*Ol1qh|N_8@;(gRDI(S*HXHKJfICgZt;A+S-Xa){Mj0F&q@$yQv9U3x zr>8NS&9t|-^ZDnWQ(s??q9|Osas_~njt+*0hp|{JxLhvIojaF)X)!f5#oXK+t*x!} z_4T2uDpgfgIGs)|T)2P`f~KY>qR}Y9U@#rm*w{!U5+N82($dmGe}6xkrcqg0NmW%9 z0B6peN$0cM?Fl&%BwMy@!C)|O`SN8hUc5+4OA8-<_#vvQvSY^%nwpw8 zdGaIxZnvB1>FIP_Pfrh}rKMcEc8!sd5n5VWICbh2s;aVm`}Xwvfm5eWkxVApxpOBq zH8u3~^xT>O*{%dD^{-T9Rui+*n5D}&$pDm;aP z?gUfVwrv~r_4VlolFrUfDl04Tcsw{94ulZsbUN<8|9*@{BX+x;C!Tl$olb`kg68Jt z^pt(C* zJJB=^x7$rL8eKmFmKsr7TFS)41j%F)olZwE7^I}61X-4upP$F$@zC4bOGQNmrKP3x z_xI!Vdhz@H$g)f*6r!!IEnTpjPAB8zFH@28XCBE z?HaLIjM~~-`uh4X7z~V$kF#ytHYO$}(kEeJVgjSlNGujZk|eBFE2E>M=yW=2YHAoA z9VHM50AMs4DJv^0$bg$Zka*>lSA061?((zGK8vC#$g-SuHsspgj@Z@0>-C~23U9yt zc4W_^&CKGnMoyo~bgb)*w zB$Y~%WJ>iL7R4I@>)6e$sFwQPEOdlPeW zbH4>_0FopLAw)tFLLf2Wx=H zBQUQ4|KD+^ujk)8?ix^R0>#E%1By+c*tlyzu?Z9#cMT{ufnwuJZ@~Wn<_Xo{FJ)*J P00000NkvXXu0mjfeoD*r literal 0 HcmV?d00001 diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb97f992901afac54f8923ba2bbffa1847a0f23 GIT binary patch literal 5303 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 @@ -9,15 +10,17 @@ - + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + android:textColor="#FFFFFF" + app:pstsIndicatorColor="#FFFFFF" /> @@ -46,10 +47,13 @@ android:visibility="gone" android:id="@+id/view_key_status_divider" /> - + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + android:textColor="#FFFFFF" + app:pstsIndicatorColor="#FFFFFF" />

Getting started

First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.

-

On Android lower 4.4, it is recommended that you install OI File Manager for enhanced file selection. To share via QR Codes install Barcode Scanner. Clicking on the links will open Google Play Store or F-Droid for installation.

+

On Android lower 4.4, it is recommended that you install OI File Manager for enhanced file selection.

I found a bug in OpenKeychain!

Please report the bug using the issue tracker of OpenKeychain.

diff --git a/README.md b/README.md index 10d07747c..991757169 100644 --- a/README.md +++ b/README.md @@ -220,6 +220,10 @@ Some parts and some libraries are Apache License v2, MIT X11 License (see below) * StickyListHeaders https://github.com/emilsjolander/StickyListHeaders Apache License v2 + +* https://github.com/jpardogo/PagerSlidingTabStrip + +* https://github.com/journeyapps/zxing-android-embedded ### Images * icon.svg