Merge branch 'development' of github.com:open-keychain/open-keychain into development

This commit is contained in:
Vincent Breitmoser 2015-02-27 23:53:14 +01:00
commit c46fdef203
15 changed files with 76 additions and 211 deletions

View File

@ -28,7 +28,7 @@ dependencies {
compile 'com.google.zxing:core:3.0.1'
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
compile 'it.neokree:MaterialNavigationDrawer:1.3.1'
compile 'com.nispok:snackbar:2.7.4'
compile 'com.nispok:snackbar:2.9.1'
compile 'com.getbase:floatingactionbutton:1.8.0'
}

View File

@ -95,7 +95,7 @@
<activity
android:name=".ui.CreateKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:windowSoftInputMode="stateHidden"
android:windowSoftInputMode="stateHidden|adjustResize"
android:label="@string/title_create_key"
android:parentActivityName=".ui.MainActivity">
<meta-data

View File

@ -36,8 +36,6 @@ import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.NoScrollableSwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.view.ActionMode;
@ -45,7 +43,6 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@ -73,7 +70,6 @@ import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Highlighter;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout;
import org.sufficientlysecure.keychain.util.ExportHelper;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
@ -97,7 +93,6 @@ public class KeyListFragment extends LoaderFragment
private KeyListAdapter mAdapter;
private StickyListHeadersListView mStickyList;
private ListAwareSwipeRefreshLayout mSwipeRefreshLayout;
// saves the mode object for multiselect, needed for reset at some point
private ActionMode mActionMode = null;
@ -152,73 +147,10 @@ public class KeyListFragment extends LoaderFragment
}
});
mSwipeRefreshLayout = (ListAwareSwipeRefreshLayout) view.findViewById(R.id.key_list_swipe_container);
mSwipeRefreshLayout.setOnRefreshListener(new NoScrollableSwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
KeychainIntentServiceHandler finishedHandler = new KeychainIntentServiceHandler(getActivity()) {
public void handleMessage(Message message) {
if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
mSwipeRefreshLayout.setRefreshing(false);
}
}
};
// new KeyUpdateHelper().updateAllKeys(getActivity(), finishedHandler);
updateActionbarForSwipe(false);
}
});
mSwipeRefreshLayout.setColorScheme(
R.color.android_purple_dark,
R.color.android_purple_light,
R.color.android_purple_dark,
R.color.android_purple_light);
mSwipeRefreshLayout.setStickyListHeadersListView(mStickyList);
mSwipeRefreshLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
updateActionbarForSwipe(true);
} else {
updateActionbarForSwipe(false);
}
return false;
}
});
// Just disable for now
mSwipeRefreshLayout.setIsLocked(true);
return root;
}
private void updateActionbarForSwipe(boolean show) {
ActionBarActivity activity = (ActionBarActivity) getActivity();
ActionBar bar = activity.getSupportActionBar();
if (show) {
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
bar.setDisplayUseLogoEnabled(false);
bar.setCustomView(R.layout.custom_actionbar);
TextView title = (TextView) getActivity().findViewById(R.id.custom_actionbar_text);
title.setText(R.string.swipe_to_update);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// hideMenu = true;
// activity.invalidateOptionsMenu();
}
} else {
bar.setTitle(getActivity().getTitle());
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowTitleEnabled(true);
bar.setDisplayUseLogoEnabled(true);
bar.setDisplayShowHomeEnabled(true);
bar.setDisplayShowCustomEnabled(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// hideMenu = false;
// activity.invalidateOptionsMenu();
}
}
}
/**
* Define Adapter and Loader on create of Activity
*/

View File

@ -72,19 +72,19 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
public UserIdsAdapter(Context context, Cursor c, int flags, boolean showCheckBoxes,
SaveKeyringParcel saveKeyringParcel) {
this(context, c, flags, showCheckBoxes, false, saveKeyringParcel);
this(context, c, flags, showCheckBoxes, true, saveKeyringParcel);
}
public UserIdsAdapter(Context context, Cursor c, int flags, boolean showCheckBoxes) {
this(context, c, flags, showCheckBoxes, false, null);
this(context, c, flags, showCheckBoxes, true, null);
}
public UserIdsAdapter(Context context, Cursor c, int flags, SaveKeyringParcel saveKeyringParcel) {
this(context, c, flags, false, false, saveKeyringParcel);
this(context, c, flags, false, true, saveKeyringParcel);
}
public UserIdsAdapter(Context context, Cursor c, int flags) {
this(context, c, flags, false, false, null);
this(context, c, flags, false, true, null);
}
@Override

View File

@ -24,6 +24,7 @@ import android.graphics.Color;
import com.nispok.snackbar.Snackbar;
import com.nispok.snackbar.Snackbar.SnackbarDuration;
import com.nispok.snackbar.SnackbarManager;
import com.nispok.snackbar.enums.SnackbarType;
import com.nispok.snackbar.listeners.ActionClickListener;
import org.sufficientlysecure.keychain.R;
@ -48,6 +49,7 @@ public class Notify {
Snackbar bar = Snackbar.with(activity)
.text(text)
.type(SnackbarType.MULTI_LINE)
.duration(SnackbarDuration.LENGTH_LONG);
switch (style) {
@ -67,7 +69,8 @@ public class Notify {
public static Showable createNotify (Activity activity, int resId, int duration, Style style) {
final Snackbar bar = Snackbar.with(activity)
.text(resId);
.text(resId)
.type(SnackbarType.MULTI_LINE);
if (duration == LENGTH_INDEFINITE) {
bar.duration(SnackbarDuration.LENGTH_INDEFINITE);
} else {
@ -104,6 +107,7 @@ public class Notify {
final Snackbar bar = Snackbar.with(activity)
.text(msg)
.actionLabel(resIdAction)
.type(SnackbarType.MULTI_LINE)
.actionListener(new ActionClickListener() {
@Override
public void onActionClicked(Snackbar snackbar) {

View File

@ -1,99 +0,0 @@
/*
* Copyright (C) 2014 Daniel Albert
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.sufficientlysecure.keychain.ui.widget;
import android.content.Context;
import android.support.v4.widget.NoScrollableSwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
public class ListAwareSwipeRefreshLayout extends NoScrollableSwipeRefreshLayout {
private StickyListHeadersListView mStickyListHeadersListView = null;
private boolean mIsLocked = false;
/**
* Constructors
*/
public ListAwareSwipeRefreshLayout(Context context) {
super(context);
}
public ListAwareSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Getters / Setters
*/
public void setStickyListHeadersListView(StickyListHeadersListView stickyListHeadersListView) {
mStickyListHeadersListView = stickyListHeadersListView;
}
public StickyListHeadersListView getStickyListHeadersListView() {
return mStickyListHeadersListView;
}
public void setIsLocked(boolean locked) {
mIsLocked = locked;
}
public boolean getIsLocked() {
return mIsLocked;
}
@Override
public boolean canChildScrollUp() {
if (mStickyListHeadersListView == null) {
return super.canChildScrollUp();
}
return (mIsLocked || (
mStickyListHeadersListView.getWrappedList().getChildCount() > 0
&& (mStickyListHeadersListView.getWrappedList().getChildAt(0).getTop() < 0
|| mStickyListHeadersListView.getFirstVisiblePosition() > 0)
)
);
}
/** Called on a touch event, this method exempts a small area in the upper right from pull to
* refresh handling.
*
* If the touch event happens somewhere in the upper right corner of the screen, we return false
* to indicate that the event was not handled. This ensures events in that area are always
* handed through to the list scrollbar handle. For all other cases, we pass the message through
* to the pull to refresh handler.
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// The device may be null. This actually happens
if (event.getDevice() != null) {
// MotionEvent.AXIS_X is api level 12, for some reason, so we use a constant 0 here
float ratioX = event.getX() / event.getDevice().getMotionRange(0).getMax();
float ratioY = event.getY() / event.getDevice().getMotionRange(1).getMax();
// if this is the upper right corner, don't handle as pull to refresh event
if (ratioX > 0.85f && ratioY < 0.15f) {
return false;
}
}
return super.onTouchEvent(event);
}
}

View File

@ -7,8 +7,14 @@
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<FrameLayout
android:layout_below="@id/toolbar_include"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent">

View File

@ -6,7 +6,7 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="false"
android:fillViewport="true"
android:layout_above="@+id/create_key_button_divider">
<LinearLayout

View File

@ -7,8 +7,14 @@
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<LinearLayout
android:layout_below="@id/toolbar_include"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

View File

@ -6,9 +6,15 @@
<include
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<LinearLayout
android:layout_below="@id/toolbar_include"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

View File

@ -7,9 +7,15 @@
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<LinearLayout
android:layout_below="@id/toolbar_include"
android:id="@+id/content_frame"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

View File

@ -7,9 +7,15 @@
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<LinearLayout
android:layout_below="@id/toolbar_include"
android:id="@+id/content_frame"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

View File

@ -7,8 +7,14 @@
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<!--
fitsSystemWindows and layout_marginTop from
https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
-->
<LinearLayout
android:layout_below="@id/toolbar_include"
android:fitsSystemWindows="true"
android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

View File

@ -1,5 +1,4 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

View File

@ -4,46 +4,39 @@
android:layout_height="match_parent"
android:layout_width="match_parent">
<org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/key_list_swipe_container"
<!--rebuild functionality of ListFragment -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--rebuild functionality of ListFragment -->
<FrameLayout
android:layout_height="match_parent">
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:id="@+id/key_list_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:drawSelectorOnTop="true"
android:fastScrollEnabled="true"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="32dp"
android:scrollbarStyle="outsideOverlay" />
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:id="@+id/key_list_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:drawSelectorOnTop="true"
android:fastScrollEnabled="true"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="32dp"
android:scrollbarStyle="outsideOverlay" />
<LinearLayout
android:id="@+id/key_list_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">
<LinearLayout
android:id="@+id/key_list_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">
android:text="@string/key_list_empty_text1"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/key_list_empty_text1"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
</FrameLayout>
</org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout>
</LinearLayout>
</FrameLayout>
<com.getbase.floatingactionbutton.FloatingActionsMenu
android:id="@+id/fab_main"