redesign request key into dialog

This commit is contained in:
Vincent Breitmoser
2017-02-03 18:34:25 +01:00
parent 074be9e798
commit e06205ae55
9 changed files with 279 additions and 274 deletions

View File

@@ -873,6 +873,7 @@
<activity <activity
android:name=".remote.ui.RequestKeyPermissionActivity" android:name=".remote.ui.RequestKeyPermissionActivity"
android:exported="false" android:exported="false"
android:theme="@style/Theme.Keychain.Transparent"
android:label="@string/app_name" /> android:label="@string/app_name" />
<activity <activity
android:name=".remote.ui.AppSettingsActivity" android:name=".remote.ui.AppSettingsActivity"

View File

@@ -18,138 +18,192 @@
package org.sufficientlysecure.keychain.remote.ui; package org.sufficientlysecure.keychain.remote.ui;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ViewAnimator;
import org.openintents.openpgp.util.OpenPgpUtils.UserId; import org.openintents.openpgp.util.OpenPgpUtils.UserId;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.remote.ui.RequestKeyPermissionPresenter.RequestKeyPermissionMvpView; import org.sufficientlysecure.keychain.remote.ui.RequestKeyPermissionPresenter.RequestKeyPermissionMvpView;
import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
import org.sufficientlysecure.keychain.ui.util.ThemeChanger;
public class RequestKeyPermissionActivity extends BaseActivity { public class RequestKeyPermissionActivity extends FragmentActivity {
public static final String EXTRA_PACKAGE_NAME = "package_name"; public static final String EXTRA_PACKAGE_NAME = "package_name";
public static final String EXTRA_REQUESTED_KEY_IDS = "requested_key_ids"; public static final String EXTRA_REQUESTED_KEY_IDS = "requested_key_ids";
private RequestKeyPermissionPresenter presenter; private RequestKeyPermissionPresenter presenter;
private View keyInfoLayout;
private ViewAnimator viewAnimator;
private TextView titleText;
private ImageView iconClientApp;
private TextView keyUserIdView;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setFullScreenDialogClose( presenter = RequestKeyPermissionPresenter.createRequestKeyPermissionPresenter(getBaseContext());
new View.OnClickListener() {
@Override if (savedInstanceState == null) {
public void onClick(View v) { RequestKeyPermissionFragment frag = new RequestKeyPermissionFragment();
presenter.onClickCancelDialog(); frag.show(getSupportFragmentManager(), "requestKeyDialog");
} }
}); }
@Override
protected void onStart() {
super.onStart();
Intent intent = getIntent(); Intent intent = getIntent();
String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME); String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
long[] keyIds = intent.getLongArrayExtra(EXTRA_REQUESTED_KEY_IDS); long[] keyIds = intent.getLongArrayExtra(EXTRA_REQUESTED_KEY_IDS);
presenter = RequestKeyPermissionPresenter.createRequestKeyPermissionPresenter(getBaseContext(), view);
presenter.setupFromIntentData(packageName, keyIds); presenter.setupFromIntentData(packageName, keyIds);
} }
@Override public static class RequestKeyPermissionFragment extends DialogFragment {
protected void initLayout() { private RequestKeyPermissionMvpView mvpView;
setContentView(R.layout.api_remote_request_key_permission); private RequestKeyPermissionPresenter presenter;
private Button buttonCancel;
private Button buttonAllow;
keyUserIdView = (TextView) findViewById(R.id.select_key_item_name); @NonNull
iconClientApp = (ImageView) findViewById(R.id.icon_client_app); @Override
titleText = (TextView) findViewById(R.id.select_identity_key_title); public Dialog onCreateDialog(Bundle savedInstanceState) {
viewAnimator = (ViewAnimator) findViewById(R.id.status_animator); final Activity activity = getActivity();
keyInfoLayout = findViewById(R.id.key_info_layout);
findViewById(R.id.button_allow).setOnClickListener(new OnClickListener() { ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);
@Override CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(theme);
public void onClick(View view) {
presenter.onClickAllow(); @SuppressLint("InflateParams")
View view = LayoutInflater.from(theme).inflate(R.layout.api_remote_request_key_permission, null, false);
alert.setView(view);
buttonAllow = (Button) view.findViewById(R.id.button_allow);
buttonCancel = (Button) view.findViewById(R.id.button_cancel);
setupListenersForPresenter();
mvpView = createMvpView(view);
return alert.create();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
presenter = ((RequestKeyPermissionActivity) getActivity()).presenter;
presenter.setView(mvpView);
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
if (presenter != null) {
presenter.onCancel();
} }
}); }
findViewById(R.id.button_deny).setOnClickListener(new OnClickListener() { @Override
@Override public void onDismiss(DialogInterface dialog) {
public void onClick(View view) { super.onDismiss(dialog);
presenter.onClickDeny();
}
});
findViewById(R.id.display_key).setOnClickListener(new OnClickListener() { if (presenter != null) {
@Override presenter.setView(null);
public void onClick(View view) { presenter = null;
presenter.onClickDisplayKey();
} }
}); }
@NonNull
private RequestKeyPermissionMvpView createMvpView(View view) {
final TextView titleText = (TextView) view.findViewById(R.id.select_identity_key_title);
final TextView keyUserIdView = (TextView) view.findViewById(R.id.select_key_item_name);
final ImageView iconClientApp = (ImageView) view.findViewById(R.id.icon_client_app);
final View keyUnavailableWarning = view.findViewById(R.id.requested_key_unavailable_warning);
final View keyInfoLayout = view.findViewById(R.id.key_info_layout);
return new RequestKeyPermissionMvpView() {
@Override
public void switchToLayoutRequestKeyChoice() {
keyInfoLayout.setVisibility(View.VISIBLE);
keyUnavailableWarning.setVisibility(View.GONE);
buttonAllow.setEnabled(true);
}
@Override
public void switchToLayoutNoSecret() {
keyInfoLayout.setVisibility(View.VISIBLE);
keyUnavailableWarning.setVisibility(View.VISIBLE);
buttonAllow.setEnabled(false);
}
@Override
public void displayKeyInfo(UserId userId) {
keyUserIdView.setText(userId.name);
}
@Override
public void finish() {
FragmentActivity activity = getActivity();
if (activity == null) {
return;
}
activity.setResult(Activity.RESULT_OK);
activity.finish();
}
@Override
public void finishAsCancelled() {
FragmentActivity activity = getActivity();
if (activity == null) {
return;
}
activity.setResult(Activity.RESULT_CANCELED);
activity.finish();
}
@Override
public void setTitleText(String text) {
titleText.setText(text);
}
@Override
public void setTitleClientIcon(Drawable drawable) {
iconClientApp.setImageDrawable(drawable);
}
};
}
private void setupListenersForPresenter() {
buttonAllow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
presenter.onClickAllow();
}
});
buttonCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
presenter.onClickCancel();
}
});
}
} }
RequestKeyPermissionMvpView view = new RequestKeyPermissionMvpView() {
@Override
public void switchToLayoutRequestKeyChoice() {
keyInfoLayout.setVisibility(View.VISIBLE);
viewAnimator.setDisplayedChild(0);
}
@Override
public void switchToLayoutNoSecret() {
keyInfoLayout.setVisibility(View.VISIBLE);
viewAnimator.setDisplayedChild(1);
}
@Override
public void switchToLayoutUnknownKey() {
keyInfoLayout.setVisibility(View.GONE);
viewAnimator.setDisplayedChild(2);
}
@Override
public void displayKeyInfo(UserId userId) {
keyUserIdView.setText(userId.name);
}
@Override
public void finish() {
setResult(Activity.RESULT_OK);
RequestKeyPermissionActivity.this.finish();
}
@Override
public void finishAsCancelled() {
setResult(Activity.RESULT_CANCELED);
RequestKeyPermissionActivity.this.finish();
}
@Override
public void startActivity(Intent intent) {
RequestKeyPermissionActivity.this.startActivity(intent);
}
@Override
public void setTitleText(String text) {
titleText.setText(text);
}
@Override
public void setTitleClientIcon(Drawable drawable) {
iconClientApp.setImageDrawable(drawable);
}
};
} }

View File

@@ -2,63 +2,62 @@ package org.sufficientlysecure.keychain.remote.ui;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import com.android.annotations.VisibleForTesting;
import org.openintents.openpgp.util.OpenPgpUtils.UserId; import org.openintents.openpgp.util.OpenPgpUtils.UserId;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiDataAccessObject;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ApiPermissionHelper; import org.sufficientlysecure.keychain.remote.ApiPermissionHelper;
import org.sufficientlysecure.keychain.remote.ApiPermissionHelper.WrongPackageCertificateException; import org.sufficientlysecure.keychain.remote.ApiPermissionHelper.WrongPackageCertificateException;
import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
class RequestKeyPermissionPresenter { class RequestKeyPermissionPresenter {
private final Context context; private final Context context;
private final RequestKeyPermissionMvpView view;
private final PackageManager packageManager; private final PackageManager packageManager;
private final ApiDataAccessObject apiDataAccessObject; private final ApiDataAccessObject apiDataAccessObject;
private final ApiPermissionHelper apiPermissionHelper; private final ApiPermissionHelper apiPermissionHelper;
private RequestKeyPermissionMvpView view;
private String packageName; private String packageName;
private long masterKeyId; private long masterKeyId;
static RequestKeyPermissionPresenter createRequestKeyPermissionPresenter(Context context, static RequestKeyPermissionPresenter createRequestKeyPermissionPresenter(Context context) {
RequestKeyPermissionMvpView view) {
PackageManager packageManager = context.getPackageManager(); PackageManager packageManager = context.getPackageManager();
ApiDataAccessObject apiDataAccessObject = new ApiDataAccessObject(context); ApiDataAccessObject apiDataAccessObject = new ApiDataAccessObject(context);
ApiPermissionHelper apiPermissionHelper = new ApiPermissionHelper(context, apiDataAccessObject); ApiPermissionHelper apiPermissionHelper = new ApiPermissionHelper(context, apiDataAccessObject);
return new RequestKeyPermissionPresenter( return new RequestKeyPermissionPresenter(context, apiDataAccessObject, apiPermissionHelper, packageManager);
context, view, apiDataAccessObject, apiPermissionHelper, packageManager);
} }
@VisibleForTesting private RequestKeyPermissionPresenter(Context context, ApiDataAccessObject apiDataAccessObject,
RequestKeyPermissionPresenter(Context context, RequestKeyPermissionMvpView view, ApiPermissionHelper apiPermissionHelper, PackageManager packageManager) {
ApiDataAccessObject apiDataAccessObject, ApiPermissionHelper apiPermissionHelper,
PackageManager packageManager) {
this.context = context; this.context = context;
this.view = view;
this.apiDataAccessObject = apiDataAccessObject; this.apiDataAccessObject = apiDataAccessObject;
this.apiPermissionHelper = apiPermissionHelper; this.apiPermissionHelper = apiPermissionHelper;
this.packageManager = packageManager; this.packageManager = packageManager;
} }
void setView(RequestKeyPermissionMvpView view) {
this.view = view;
}
void setupFromIntentData(String packageName, long[] requestedMasterKeyIds) { void setupFromIntentData(String packageName, long[] requestedMasterKeyIds) {
checkPackageAllowed(packageName); checkPackageAllowed(packageName);
if (requestedMasterKeyIds.length < 1) {
view.finishAsCancelled();
}
try { try {
setPackageInfo(packageName); setPackageInfo(packageName);
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
@@ -69,7 +68,6 @@ class RequestKeyPermissionPresenter {
this.packageName = packageName; this.packageName = packageName;
this.masterKeyId = requestedMasterKeyIds[0]; this.masterKeyId = requestedMasterKeyIds[0];
// long masterKeyId = 4817915339785265755L;
try { try {
CachedPublicKeyRing cachedPublicKeyRing = new ProviderHelper(context).getCachedPublicKeyRing(masterKeyId); CachedPublicKeyRing cachedPublicKeyRing = new ProviderHelper(context).getCachedPublicKeyRing(masterKeyId);
@@ -82,21 +80,17 @@ class RequestKeyPermissionPresenter {
view.switchToLayoutNoSecret(); view.switchToLayoutNoSecret();
} }
} catch (PgpKeyNotFoundException e) { } catch (PgpKeyNotFoundException e) {
view.switchToLayoutUnknownKey(); view.finishAsCancelled();
} }
} }
private void setPackageInfo(String packageName) throws NameNotFoundException { private void setPackageInfo(String packageName) throws NameNotFoundException {
Drawable appIcon;
CharSequence appName;
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
appIcon = packageManager.getApplicationIcon(applicationInfo); Drawable appIcon = packageManager.getApplicationIcon(applicationInfo);
appName = packageManager.getApplicationLabel(applicationInfo); CharSequence appName = packageManager.getApplicationLabel(applicationInfo);
view.setTitleClientIcon(appIcon); view.setTitleClientIcon(appIcon);
view.setTitleText(context.getString(R.string.request_permission_title, appName)); view.setTitleText(context.getString(R.string.request_permission_msg, appName));
} }
private void checkPackageAllowed(String packageName) { private void checkPackageAllowed(String packageName) {
@@ -116,23 +110,16 @@ class RequestKeyPermissionPresenter {
view.finish(); view.finish();
} }
void onClickDeny() { void onClickCancel() {
view.finishAsCancelled(); view.finishAsCancelled();
} }
void onClickDisplayKey() { void onCancel() {
Intent intent = new Intent(context, ViewKeyActivity.class);
intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
view.startActivity(intent);
}
void onClickCancelDialog() {
view.finishAsCancelled(); view.finishAsCancelled();
} }
interface RequestKeyPermissionMvpView { interface RequestKeyPermissionMvpView {
void switchToLayoutRequestKeyChoice(); void switchToLayoutRequestKeyChoice();
void switchToLayoutUnknownKey();
void switchToLayoutNoSecret(); void switchToLayoutNoSecret();
void setTitleText(String text); void setTitleText(String text);
@@ -142,6 +129,5 @@ class RequestKeyPermissionPresenter {
void finish(); void finish();
void finishAsCancelled(); void finishAsCancelled();
void startActivity(Intent intent);
} }
} }

View File

@@ -293,7 +293,7 @@ public class BackupCodeFragment extends CryptoOperationFragment<BackupKeyringPar
setupEditTextFocusNext(mCodeEditText); setupEditTextFocusNext(mCodeEditText);
setupEditTextSuccessListener(mCodeEditText); setupEditTextSuccessListener(mCodeEditText);
mStatusAnimator = (ToolableViewAnimator) view.findViewById(R.id.status_animator); mStatusAnimator = (ToolableViewAnimator) view.findViewById(R.id.button_bar_animator);
mTitleAnimator = (ToolableViewAnimator) view.findViewById(R.id.title_animator); mTitleAnimator = (ToolableViewAnimator) view.findViewById(R.id.title_animator);
mCodeFieldsAnimator = (ToolableViewAnimator) view.findViewById(R.id.code_animator); mCodeFieldsAnimator = (ToolableViewAnimator) view.findViewById(R.id.code_animator);

View File

@@ -354,7 +354,7 @@
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator> </org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator <org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
android:id="@+id/status_animator" android:id="@+id/button_bar_animator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"

View File

@@ -354,7 +354,7 @@
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator> </org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator <org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
android:id="@+id/status_animator" android:id="@+id/button_bar_animator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"

View File

@@ -1,23 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
tools:layout_marginTop="24dp"
> >
<include
android:id="@+id/toolbar_include"
layout="@layout/toolbar_standalone" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_gravity="center_horizontal"
android:padding="16dp" android:padding="16dp"
android:id="@+id/iconLayout"> android:id="@+id/iconLayout"
android:elevation="4dp"
android:background="?attr/colorPrimary"
android:gravity="center_horizontal"
tools:targetApi="lollipop">
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -43,150 +41,111 @@
</LinearLayout> </LinearLayout>
<TextView <LinearLayout
android:id="@+id/select_identity_key_title" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:orientation="vertical"
android:padding="12dp" android:paddingLeft="24dp"
android:gravity="center_vertical" android:paddingRight="24dp"
android:textAppearance="?android:attr/textAppearanceMedium" android:paddingTop="24dp"
tools:text="@string/request_permission_title" android:paddingBottom="16dp"
/> >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceLarge"
android:text="@string/request_permission_title"
android:id="@+id/dialog_title"
/>
<TextView
android:id="@+id/select_identity_key_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:text="@string/request_permission_msg"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal"
android:background="?selectableItemBackground"
android:id="@+id/key_info_layout"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="8dp"
android:paddingRight="8dp"
android:src="@drawable/ic_vpn_key_grey_24dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/requested_key_label"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/select_key_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Alice Skywalker"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/requested_key_unavailable_warning"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="@color/android_red_dark"
android:id="@+id/requested_key_unavailable_warning"
android:visibility="gone"
tools:visibility="visible"
/>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginBottom="32dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:minHeight="?listPreferredItemHeight"
android:orientation="horizontal" android:orientation="horizontal"
android:id="@+id/key_info_layout"> android:gravity="end"
android:padding="8dp"
<LinearLayout style="?buttonBarStyle">
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Requested key:"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/select_key_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Alice Skywalker"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:text="@string/button_cancel"
android:id="@+id/display_key" android:id="@+id/button_cancel"
android:text="Display" style="?buttonBarButtonStyle"
style="@style/BorderlessButton" /> />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_allow"
android:id="@+id/button_allow"
tools:enabled="false"
style="?buttonBarButtonStyle" />
</LinearLayout> </LinearLayout>
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/status_animator"
custom:initialView="0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
<TextView
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Allow access to this key"
android:background="?android:selectableItemBackground"
android:drawableLeft="@drawable/ic_vpn_key_grey_24dp"
android:drawablePadding="16dp"
android:gravity="center_vertical"
android:clickable="true"
android:id="@+id/button_allow" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
<TextView
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Deny access"
android:background="?android:selectableItemBackground"
android:drawableLeft="@drawable/ic_close_grey_24dp"
android:drawablePadding="16dp"
android:gravity="center_vertical"
android:clickable="true"
android:id="@+id/button_deny" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Key but no secret!"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="center_vertical"
android:id="@+id/key_creation_done"
android:text="Unknown key! (Import?)"
/>
</LinearLayout>
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
</LinearLayout> </LinearLayout>

View File

@@ -384,7 +384,7 @@
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator> </org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator <org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
android:id="@+id/status_animator" android:id="@+id/button_bar_animator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"

View File

@@ -1798,5 +1798,10 @@
<string name="redirect_import_key_no">"Close"</string> <string name="redirect_import_key_no">"Close"</string>
<string name="title_activity_redirect_key">"Key import redirection"</string> <string name="title_activity_redirect_key">"Key import redirection"</string>
<string name="request_permission_title">%s wants to decrypt a message.</string> <string name="request_permission_title">Allow access to your key?</string>
<string name="request_permission_msg">%1$s requests access to one of your keys, which allows it to decrypt messages sent to this key. You can revoke access later in OpenKeychain.</string>
<string name="requested_key_unavailable_warning">This key is not available. To use it, you must import it as one of your own!</string>
<string name="button_allow">Allow</string>
<string name="button_cancel">Cancel</string>
<string name="requested_key_label">Requested key:</string>
</resources> </resources>