summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml9
-rw-r--r--jni/include/lib_wprint.h18
-rw-r--r--jni/include/printer_capabilities_types.h3
-rw-r--r--jni/include/wprint_status_types.h4
-rw-r--r--jni/ipphelper/ipp_print.c6
-rw-r--r--jni/ipphelper/ipphelper.c48
-rw-r--r--jni/ipphelper/ippstatus_capabilities.c2
-rw-r--r--jni/lib/lib_wprint.c136
-rw-r--r--jni/lib/printer.c3
-rw-r--r--jni/lib/wprintJNI.c60
-rw-r--r--jni/lib/wprint_msgq.c3
-rw-r--r--jni/plugins/lib_pclm.c14
-rw-r--r--jni/plugins/lib_pwg.c4
-rw-r--r--jni/plugins/plugin_pcl.c3
-rw-r--r--jni/plugins/plugin_pdf.c3
-rw-r--r--jni/plugins/wprint_image.c3
-rw-r--r--res/drawable/ic_download_from_market.xml25
-rw-r--r--res/drawable/ic_settings_gear.xml24
-rw-r--r--res/values-af/strings.xml7
-rw-r--r--res/values-am/strings.xml7
-rw-r--r--res/values-ar/strings.xml7
-rw-r--r--res/values-az/strings.xml7
-rw-r--r--res/values-b+sr+Latn/strings.xml7
-rw-r--r--res/values-be/strings.xml7
-rw-r--r--res/values-bg/strings.xml7
-rw-r--r--res/values-bn/strings.xml7
-rw-r--r--res/values-bs/strings.xml7
-rw-r--r--res/values-ca/lineage_strings.xml29
-rw-r--r--res/values-ca/strings.xml7
-rw-r--r--res/values-cs/strings.xml7
-rw-r--r--res/values-cy/lineage_strings.xml28
-rw-r--r--res/values-da/strings.xml7
-rw-r--r--res/values-de/strings.xml9
-rw-r--r--res/values-el/lineage_strings.xml29
-rw-r--r--res/values-el/strings.xml7
-rw-r--r--res/values-en-rAU/lineage_strings.xml29
-rw-r--r--res/values-en-rAU/strings.xml7
-rw-r--r--res/values-en-rCA/lineage_strings.xml29
-rw-r--r--res/values-en-rGB/lineage_strings.xml29
-rw-r--r--res/values-en-rGB/strings.xml7
-rw-r--r--res/values-en-rIN/lineage_strings.xml29
-rw-r--r--res/values-en-rIN/strings.xml7
-rw-r--r--res/values-en-rXC/strings.xml80
-rw-r--r--res/values-es-rUS/strings.xml7
-rw-r--r--res/values-es/strings.xml7
-rw-r--r--res/values-et/lineage_strings.xml28
-rw-r--r--res/values-et/strings.xml7
-rw-r--r--res/values-eu/strings.xml7
-rw-r--r--res/values-fa/strings.xml7
-rw-r--r--res/values-fi/strings.xml7
-rw-r--r--res/values-fr-rCA/strings.xml7
-rw-r--r--res/values-fr/strings.xml7
-rw-r--r--res/values-gl/strings.xml7
-rw-r--r--res/values-gu/strings.xml7
-rw-r--r--res/values-hi/strings.xml7
-rw-r--r--res/values-hr/strings.xml9
-rw-r--r--res/values-hu/strings.xml7
-rw-r--r--res/values-hy/strings.xml7
-rw-r--r--res/values-in/strings.xml7
-rw-r--r--res/values-is/strings.xml7
-rw-r--r--res/values-it/strings.xml7
-rw-r--r--res/values-iw/strings.xml7
-rw-r--r--res/values-ja/strings.xml7
-rw-r--r--res/values-ka/strings.xml7
-rw-r--r--res/values-kk/strings.xml7
-rw-r--r--res/values-km/strings.xml7
-rw-r--r--res/values-kn/strings.xml7
-rw-r--r--res/values-ko/strings.xml7
-rw-r--r--res/values-ky/strings.xml7
-rw-r--r--res/values-lo/strings.xml7
-rw-r--r--res/values-lt/strings.xml7
-rw-r--r--res/values-lv/strings.xml7
-rw-r--r--res/values-mk/strings.xml7
-rw-r--r--res/values-ml/strings.xml7
-rw-r--r--res/values-mn/strings.xml7
-rw-r--r--res/values-mr/strings.xml7
-rw-r--r--res/values-ms/strings.xml7
-rw-r--r--res/values-my/strings.xml7
-rw-r--r--res/values-nb/strings.xml7
-rw-r--r--res/values-ne/strings.xml7
-rw-r--r--res/values-nl/strings.xml7
-rw-r--r--res/values-pa/strings.xml7
-rw-r--r--res/values-pl/strings.xml7
-rw-r--r--res/values-pt-rBR/strings.xml7
-rw-r--r--res/values-pt-rPT/strings.xml7
-rw-r--r--res/values-pt/strings.xml7
-rw-r--r--res/values-ro/lineage_strings.xml28
-rw-r--r--res/values-ro/strings.xml7
-rw-r--r--res/values-ru/lineage_strings.xml20
-rw-r--r--res/values-ru/strings.xml7
-rw-r--r--res/values-si/strings.xml7
-rw-r--r--res/values-sk/strings.xml7
-rw-r--r--res/values-sl/strings.xml7
-rw-r--r--res/values-sq/strings.xml7
-rw-r--r--res/values-sr/strings.xml7
-rw-r--r--res/values-sv/strings.xml7
-rw-r--r--res/values-sw/strings.xml9
-rw-r--r--res/values-ta/strings.xml7
-rw-r--r--res/values-te/strings.xml7
-rw-r--r--res/values-th/strings.xml7
-rw-r--r--res/values-tl/strings.xml7
-rw-r--r--res/values-tr/lineage_strings.xml27
-rw-r--r--res/values-tr/strings.xml7
-rw-r--r--res/values-uk/strings.xml7
-rw-r--r--res/values-ur/strings.xml7
-rw-r--r--res/values-uz/strings.xml7
-rw-r--r--res/values-vi/strings.xml7
-rw-r--r--res/values-zh-rCN/lineage_strings.xml29
-rw-r--r--res/values-zh-rCN/strings.xml7
-rw-r--r--res/values-zh-rHK/strings.xml7
-rw-r--r--res/values-zh-rTW/strings.xml7
-rw-r--r--res/values-zu/strings.xml7
-rw-r--r--res/values/lineage_strings.xml40
-rw-r--r--res/values/strings.xml13
-rw-r--r--res/xml/add_printers_prefs.xml11
-rw-r--r--res/xml/more_options_prefs.xml37
-rw-r--r--res/xml/printservice.xml1
-rw-r--r--src/com/android/bips/BuiltInPrintService.java139
-rw-r--r--src/com/android/bips/JobQueue.java27
-rw-r--r--src/com/android/bips/LocalPrintJob.java74
-rw-r--r--src/com/android/bips/P2pPermissionManager.java303
-rw-r--r--src/com/android/bips/discovery/DiscoveredPrinter.java41
-rw-r--r--src/com/android/bips/discovery/MultiDiscovery.java39
-rw-r--r--src/com/android/bips/discovery/P2pDiscovery.java18
-rw-r--r--src/com/android/bips/ipp/Backend.java4
-rw-r--r--src/com/android/bips/ipp/CapabilitiesCache.java33
-rw-r--r--src/com/android/bips/ipp/CertificateStore.java189
-rw-r--r--src/com/android/bips/ipp/JobStatus.java15
-rw-r--r--src/com/android/bips/jni/BackendConstants.java1
-rw-r--r--src/com/android/bips/jni/JobCallbackParams.java1
-rw-r--r--src/com/android/bips/jni/LocalPrinterCapabilities.java4
-rw-r--r--src/com/android/bips/ui/AddPrintersActivity.java16
-rw-r--r--src/com/android/bips/ui/AddPrintersFragment.java71
-rw-r--r--src/com/android/bips/ui/FindP2pPrintersFragment.java32
-rw-r--r--src/com/android/bips/ui/MoreOptionsActivity.java123
-rw-r--r--src/com/android/bips/ui/MoreOptionsFragment.java234
136 files changed, 2656 insertions, 165 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e87f721..acd23d7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -18,7 +18,7 @@
<uses-feature android:name="android.hardware.wifi" android:required="false"/>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
@@ -52,6 +52,13 @@
</service>
<activity
+ android:name="com.android.bips.ui.MoreOptionsActivity"
+ android:theme="@android:style/Theme.DeviceDefault.Settings"
+ android:configChanges="orientation|screenSize"
+ android:exported="true"
+ android:permission="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY" />
+
+ <activity
android:name="com.android.bips.ui.AddPrintersActivity"
android:label="@string/title_activity_add_printer"
android:theme="@android:style/Theme.DeviceDefault.Settings"
diff --git a/jni/include/lib_wprint.h b/jni/include/lib_wprint.h
index 006f6c1..0d2fd12 100644
--- a/jni/include/lib_wprint.h
+++ b/jni/include/lib_wprint.h
@@ -184,10 +184,15 @@ typedef struct {
bool accepts_pclm;
bool accepts_pdf;
bool copies_supported;
+ int print_quality;
const char *useragent;
char docCategory[10];
const char *media_default;
+ // Expected certificate if any
+ uint8 *certificate;
+ int certificate_len;
+
// IPP max job-name is 2**31 - 1, we set a shorter limit
char job_name[MAX_ID_STRING_LENGTH + 1];
char job_originating_user_name[MAX_NAME_LENGTH + 1];
@@ -198,17 +203,23 @@ typedef struct {
bool accepts_os_version;
} wprint_job_params_t;
+typedef struct wprint_connect_info_st wprint_connect_info_t;
+
/*
* Parameters defining how to reach a remote printing service
*/
-typedef struct {
+struct wprint_connect_info_st {
const char *printer_addr;
const char *uri_path;
const char *uri_scheme;
int port_num;
/* Timeout per retry in milliseconds */
long timeout;
-} wprint_connect_info_t;
+ /* Return non-0 if the received certificate is not acceptable. */
+ int (*validate_certificate)(struct wprint_connect_info_st *connect_info, uint8 *data, int data_len);
+ /* User-supplied data. */
+ void *user;
+};
/*
* Current state of a queued job
@@ -224,6 +235,9 @@ typedef struct {
wprint_job_state_t state;
unsigned int blocked_reasons;
int job_done_result;
+ // Certificate received from printer, if any
+ uint8 *certificate;
+ int certificate_len;
} wprint_job_callback_params_t;
typedef enum {
diff --git a/jni/include/printer_capabilities_types.h b/jni/include/printer_capabilities_types.h
index 0f05b35..677f19c 100644
--- a/jni/include/printer_capabilities_types.h
+++ b/jni/include/printer_capabilities_types.h
@@ -22,6 +22,7 @@
#define MAX_MEDIA_TRAYS_SUPPORTED 10
#define MAX_MEDIA_TYPES_SUPPORTED 20
#define MAX_RESOLUTIONS_SUPPORTED 10
+#define MAX_QUALITY_SUPPORTED 3
#define MAX_URI_LENGTH 1024
#define MAX_STRING 256
#define MAX_UUID 46
@@ -43,6 +44,8 @@ typedef struct {
char location[MAX_STRING];
unsigned char canRotateDuplexBackPage;
unsigned char color;
+ int supportedQuality[MAX_QUALITY_SUPPORTED];
+ unsigned int numSupportedQuality;
unsigned char faceDownTray;
media_size_t supportedMediaSizes[MAX_SIZES_SUPPORTED];
unsigned int numSupportedMediaSizes;
diff --git a/jni/include/wprint_status_types.h b/jni/include/wprint_status_types.h
index 9fe1b1d..80b3c74 100644
--- a/jni/include/wprint_status_types.h
+++ b/jni/include/wprint_status_types.h
@@ -38,7 +38,8 @@
#define BLOCKED_REASON_IDLE (1 << PRINT_STATUS_IDLE)
#define BLOCKED_REASON_CANCELLED (1 << PRINT_STATUS_CANCELLED)
#define BLOCKED_REASON_PRINT_STATUS_VERY_LOW_ON_INK (1 << PRINT_STATUS_VERY_LOW_ON_INK)
-#define BLOCKED_REASON_PARTIAL_CANCEL (1 << PRINT_STATUS_PARTIAL_CANCEL)
+#define BLOCKED_REASON_PARTIAL_CANCEL (1 << PRINT_STATUS_PARTIAL_CANCEL)
+#define BLOCKED_REASON_BAD_CERTIFICATE (1 << PRINT_STATUS_BAD_CERTIFICATE)
/*
* Enumeration for printer statuses
@@ -68,6 +69,7 @@ typedef enum {
PRINT_STATUS_VERY_LOW_ON_INK,
PRINT_STATUS_PARTIAL_CANCEL,
+ PRINT_STATUS_BAD_CERTIFICATE,
PRINT_STATUS_MAX_STATE // Add new entries above this line.
} print_status_t;
diff --git a/jni/ipphelper/ipp_print.c b/jni/ipphelper/ipp_print.c
index 57914b3..36b7015 100644
--- a/jni/ipphelper/ipp_print.c
+++ b/jni/ipphelper/ipp_print.c
@@ -293,6 +293,12 @@ static ipp_t *_fill_job(int ipp_op, char *printer_uri, const wprint_job_params_t
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", job_params->num_copies);
}
+ // Add print quality if requested
+ if (job_params->print_quality) {
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
+ job_params->print_quality);
+ }
+
ippAddResolution(request, IPP_TAG_JOB, "printer-resolution", IPP_RES_PER_INCH,
job_params->pixel_units, job_params->pixel_units);
if (job_params->duplex == DUPLEX_MODE_BOOK) {
diff --git a/jni/ipphelper/ipphelper.c b/jni/ipphelper/ipphelper.c
index 60758ac..d9803e7 100644
--- a/jni/ipphelper/ipphelper.c
+++ b/jni/ipphelper/ipphelper.c
@@ -643,8 +643,6 @@ void parse_getMediaSupported(ipp_t *response, media_supported_t *media_supported
LOGD("media-supported found; number of values %d", ippGetCount(attrptr));
for (i = 0; i < ippGetCount(attrptr); i++) {
idx = ipp_find_media_size(ippGetString(attrptr, i, NULL), &media_sizeTemp);
- LOGD(" Temp - i: %d idx %d keyword: %s PT_size %d", i, idx, ippGetString(
- attrptr, i, NULL), media_sizeTemp);
// Modified since anytime the find media size returned 0 it could either mean
// NOT found or na_letter.
@@ -786,6 +784,15 @@ void parse_printerAttributes(ipp_t *response, printer_capabilities_t *capabiliti
}
}
}
+ if ((attrptr = ippFindAttribute(response, "print-quality-supported", IPP_TAG_ENUM)) !=
+ NULL) {
+ for (i = 0; i < ippGetCount(attrptr) && capabilities->numSupportedQuality
+ < MAX_QUALITY_SUPPORTED; i++) {
+ LOGD("print-quality-supported: %d", ippGetInteger(attrptr, i));
+ capabilities->supportedQuality[capabilities->numSupportedQuality++] =
+ ippGetInteger(attrptr, i);
+ }
+ }
char imagePCLm[] = "application/PCLm";
char imagePWG[] = "image/pwg-raster";
@@ -968,15 +975,14 @@ void parse_printerAttributes(ipp_t *response, printer_capabilities_t *capabiliti
LOGD("pclm-compression-method-preferred=%s", ippGetString(attrptr, 0, NULL));
}
- // is device able to rotate back page for duplex jobs?
- if ((attrptr = ippFindAttribute(response, "pclm-raster-back-side", IPP_TAG_KEYWORD)) != NULL) {
- LOGD("pclm-raster-back-side=%s", ippGetString(attrptr, 0, NULL));
- if (strcmp(ippGetString(attrptr, 0, NULL), "rotated") == 0) {
- capabilities->canRotateDuplexBackPage = 0;
- LOGD("Device cannot rotate back page for duplex jobs.");
- } else {
- capabilities->canRotateDuplexBackPage = 1;
- }
+ // is device able to rotate back page for duplex jobs? (assume PCLM and PWG are similar)
+ capabilities->canRotateDuplexBackPage = 0;
+ if ((attrptr = ippFindAttribute(response, "pclm-raster-back-side", IPP_TAG_KEYWORD)) == NULL) {
+ attrptr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD);
+ }
+ if (attrptr != NULL && strcmp(ippGetString(attrptr, 0, NULL), "rotated") != 0) {
+ LOGD("Device can rotate back page for duplex jobs.");
+ capabilities->canRotateDuplexBackPage = 1;
}
// look for full-bleed supported by looking for 0 on all margins
@@ -1171,11 +1177,29 @@ void debuglist_printerStatus(printer_state_dyn_t *printer_state_dyn) {
}
}
+/*
+ * Handle server certificate information.
+ */
+static int ipp_server_cert_cb(http_t *http, void *tls, cups_array_t *certs, void *user_data) {
+ wprint_connect_info_t *connect_info = (wprint_connect_info_t *)user_data;
+ int error = 0;
+ if (connect_info->validate_certificate) {
+ http_credential_t *credential = cupsArrayFirst(certs);
+ if (credential) {
+ LOGD("ipp_server_cert_cb: validate_certificate (len=%d)", credential->datalen);
+ error = connect_info->validate_certificate(connect_info, credential->data, credential->datalen);
+ }
+ }
+ return error;
+}
+
http_t *ipp_cups_connect(const wprint_connect_info_t *connect_info, char *printer_uri,
unsigned int uriLength) {
const char *uri_path;
http_t *curl_http = NULL;
+ cupsSetServerCertCB(ipp_server_cert_cb, (void *)connect_info);
+
if ((connect_info->uri_path == NULL) || (strlen(connect_info->uri_path) == 0)) {
uri_path = DEFAULT_IPP_URI_RESOURCE;
} else {
@@ -1202,6 +1226,8 @@ http_t *ipp_cups_connect(const wprint_connect_info_t *connect_info, char *printe
if (curl_http == NULL) {
LOGD("ipp_cups_connect failed addr=%s port=%d", connect_info->printer_addr, ippPortNumber);
}
+
+ cupsSetServerCertCB(NULL, NULL);
return curl_http;
}
diff --git a/jni/ipphelper/ippstatus_capabilities.c b/jni/ipphelper/ippstatus_capabilities.c
index 2c34861..9c596cb 100644
--- a/jni/ipphelper/ippstatus_capabilities.c
+++ b/jni/ipphelper/ippstatus_capabilities.c
@@ -55,6 +55,7 @@ static const char *pattrs[] = {
"media-type-supported",
"output-bin-supported",
"print-color-mode-supported",
+ "print-quality-supported",
"printer-resolution-supported",
"sides-supported",
"printer-device-id",
@@ -63,6 +64,7 @@ static const char *pattrs[] = {
"pclm-strip-height-preferred",
"pclm-compression-method-preferred",
"pclm-source-resolution-supported",
+ "pwg-raster-document-sheet-back",
"document-format-details-supported"
};
diff --git a/jni/lib/lib_wprint.c b/jni/lib/lib_wprint.c
index e7aebfe..508c47f 100644
--- a/jni/lib/lib_wprint.c
+++ b/jni/lib/lib_wprint.c
@@ -154,6 +154,10 @@ typedef struct {
char printer_uri[1024];
int job_debug_fd;
int page_debug_fd;
+
+ /* A buffer of bytes containing the certificate received while setting up this job, if any. */
+ uint8 *certificate;
+ int certificate_len;
} _job_queue_t;
/*
@@ -480,7 +484,10 @@ static int _recycle_handle(wJob_t job_handle) {
}
jq->page_debug_fd = -1;
jq->debug_path[0] = 0;
-
+ if (jq->certificate) {
+ free(jq->certificate);
+ jq->certificate = NULL;
+ }
return OK;
} else {
return ERROR;
@@ -516,6 +523,8 @@ static void _job_status_callback(const printer_state_dyn_t *new_status,
statusnew = new_status->printer_status & ~PRINTER_IDLE_BIT;
statusold = old_status->printer_status & ~PRINTER_IDLE_BIT;
+ cb_param.certificate = jq->certificate;
+ cb_param.certificate_len = jq->certificate_len;
LOGD("_job_status_callback(): current printer state: %d", statusnew);
blocked_reasons = 0;
@@ -689,10 +698,86 @@ static int _start_status_thread(_job_queue_t *jq) {
}
/*
+ * Return true unless the server gave an unexpected certificate
+ */
+static bool _is_certificate_allowed(_job_queue_t *jq) {
+ int result = true;
+
+ // Compare certificates if both are known
+ if (jq->job_params.certificate && jq->certificate) {
+ if (jq->job_params.certificate_len != jq->certificate_len) {
+ LOGD("_is_certificate_allowed: certificate length mismatch allowed=%d, received=%d",
+ jq->job_params.certificate_len, jq->certificate_len);
+ result = false;
+ } else if (0 != memcmp(jq->job_params.certificate, jq->certificate, jq->certificate_len)) {
+ LOGD("_is_certificate_allowed: certificate content mismatch");
+ result = false;
+ } else {
+ LOGD("_is_certificate_allowed: certificate match, len=%d",
+ jq->job_params.certificate_len);
+ }
+ }
+
+ return result;
+}
+
+/*
+ * Callback from lower layers containing certificate data, if any.
+ */
+static int _validate_certificate(wprint_connect_info_t *connect_info, uint8 *data, int data_len) {
+ _job_queue_t *jq = connect_info->user;
+ LOGD("_validate_certificate: %s://%s:%d%s handling server cert len=%d for job %ld",
+ connect_info->uri_scheme, connect_info->printer_addr, connect_info->port_num,
+ connect_info->uri_path, data_len, jq->job_handle);
+
+ // Free any old certificate we have and save new certificate data
+ if (jq->certificate) {
+ free(jq->certificate);
+ jq->certificate = NULL;
+ }
+ jq->certificate = (uint8 *)malloc(data_len);
+ int error = 0;
+ if (jq->certificate == NULL) {
+ LOGD("_validate_certificate: malloc failed");
+ error = -1;
+ } else {
+ memcpy(jq->certificate, data, data_len);
+ jq->certificate_len = data_len;
+ if (!_is_certificate_allowed(jq)) {
+ LOGD("_validate_certificate: received certificate disallowed.");
+ error = -1;
+ }
+ }
+ return error;
+}
+
+/*
+ * Initialize the status interface (so we can use it to query for printer status.
+ */
+static void _initialize_status_ifc(_job_queue_t *jq) {
+ wprint_connect_info_t connect_info;
+ connect_info.printer_addr = jq->printer_addr;
+ connect_info.uri_path = jq->printer_uri;
+ connect_info.port_num = jq->port_num;
+ if (jq->use_secure_uri) {
+ connect_info.uri_scheme = IPPS_PREFIX;
+ connect_info.user = jq;
+ connect_info.validate_certificate = _validate_certificate;
+ } else {
+ connect_info.uri_scheme = IPP_PREFIX;
+ connect_info.validate_certificate = NULL;
+ }
+ connect_info.timeout = DEFAULT_IPP_TIMEOUT;
+
+ // Initialize the status interface with this connection info
+ jq->status_ifc->init(jq->status_ifc, &connect_info);
+}
+
+/*
* Runs a print job. Contains logic for what to do given different printer statuses.
*/
static void *_job_thread(void *param) {
- wprint_job_callback_params_t cb_param;
+ wprint_job_callback_params_t cb_param = { 0 };
_msg_t msg;
wJob_t job_handle;
_job_queue_t *jq;
@@ -737,17 +822,7 @@ static void *_job_thread(void *param) {
// initialize the status ifc
if (jq->status_ifc != NULL) {
- wprint_connect_info_t connect_info;
- connect_info.printer_addr = jq->printer_addr;
- connect_info.uri_path = jq->printer_uri;
- connect_info.port_num = jq->port_num;
- if (jq->use_secure_uri) {
- connect_info.uri_scheme = IPPS_PREFIX;
- } else {
- connect_info.uri_scheme = IPP_PREFIX;
- }
- connect_info.timeout = DEFAULT_IPP_TIMEOUT;
- jq->status_ifc->init(jq->status_ifc, &connect_info);
+ _initialize_status_ifc(jq);
}
// wait for the printer to be idle
if ((jq->status_ifc != NULL) && (jq->status_ifc->get_status != NULL)) {
@@ -759,6 +834,10 @@ static void *_job_thread(void *param) {
jq->status_ifc->get_status(jq->status_ifc, &printer_state);
status = printer_state.printer_status & ~PRINTER_IDLE_BIT;
+ // Pass along any certificate received in future callbacks
+ cb_param.certificate = jq->certificate;
+ cb_param.certificate_len = jq->certificate_len;
+
switch (status) {
case PRINT_STATUS_IDLE:
printer_state.printer_status = PRINT_STATUS_IDLE;
@@ -776,8 +855,13 @@ static void *_job_thread(void *param) {
case PRINT_STATUS_SVC_REQUEST:
if ((printer_state.printer_reasons[0] == PRINT_STATUS_UNABLE_TO_CONNECT)
|| (printer_state.printer_reasons[0] == PRINT_STATUS_OFFLINE)) {
- LOGD("_job_thread: Received an Unable to Connect message");
- jq->blocked_reasons = BLOCKED_REASON_UNABLE_TO_CONNECT;
+ if (_is_certificate_allowed(jq)) {
+ LOGD("_job_thread: Received an Unable to Connect message");
+ jq->blocked_reasons = BLOCKED_REASON_UNABLE_TO_CONNECT;
+ } else {
+ LOGD("_job_thread: Bad certificate");
+ jq->blocked_reasons = BLOCKED_REASON_BAD_CERTIFICATE;
+ }
loop = 0;
break;
}
@@ -960,7 +1044,7 @@ static void *_job_thread(void *param) {
jq->job_params.copy_num = (i + 1);
jq->job_params.copy_page_num = page.page_num;
- jq->job_params.page_backside = (per_copy_page_num & 0x1);
+ jq->job_params.page_backside = !(per_copy_page_num & 0x1);
jq->job_params.page_corrupted = (page.corrupted ? 1 : 0);
jq->job_params.page_printing = true;
_unlock();
@@ -1006,7 +1090,7 @@ static void *_job_thread(void *param) {
// make sure we always print an even number of pages in duplex jobs
if (page.last_page && (jq->job_params.duplex != DUPLEX_MODE_NONE)
- && (jq->job_params.page_backside)
+ && !(jq->job_params.page_backside)
&& (jq->plugin->print_blank_page != NULL)) {
_unlock();
jq->plugin->print_blank_page(job_handle, &(jq->job_params));
@@ -1371,6 +1455,16 @@ static bool is_supported(media_size_t media_size) {
}
/*
+ * Return true if the specified int array of the supplied length contains a value.
+ */
+static bool int_array_contains(const int *array, int length, int value) {
+ for (int i = 0; i < length; i++) {
+ if (array[i] == value) return true;
+ }
+ return false;
+}
+
+/*
* Checks printers reported media sizes and validates that wprint supports them
*/
static void _validate_supported_media_sizes(printer_capabilities_t *printer_cap) {
@@ -1639,6 +1733,12 @@ status_t wprintGetFinalJobParams(wprint_job_params_t *job_params,
job_params->num_copies = 1;
}
+ // If printing photo and HIGH quality is supported, specify it.
+ if (strcasecmp(job_params->docCategory, "photo") == 0 && int_array_contains(
+ printer_cap->supportedQuality, printer_cap->numSupportedQuality, IPP_QUALITY_HIGH)) {
+ job_params->print_quality = IPP_QUALITY_HIGH;
+ }
+
// confirm that the media size is supported
for (i = 0; i < printer_cap->numSupportedMediaSizes; i++) {
if (job_params->media_size == printer_cap->supportedMediaSizes[i]) {
@@ -2047,6 +2147,8 @@ status_t wprintCancelJob(wJob_t job_handle) {
cb_param.state = JOB_DONE;
cb_param.blocked_reasons = BLOCKED_REASONS_CANCELLED;
cb_param.job_done_result = CANCELLED;
+ cb_param.certificate = jq->certificate;
+ cb_param.certificate_len = jq->certificate_len;
jq->cb_fn(job_handle, (void *) &cb_param);
}
diff --git a/jni/lib/printer.c b/jni/lib/printer.c
index 55eca67..fa4c9ab 100644
--- a/jni/lib/printer.c
+++ b/jni/lib/printer.c
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
@@ -264,4 +265,4 @@ const ifc_print_job_t *printer_connect(int port_num) {
} else {
return NULL;
}
-} \ No newline at end of file
+}
diff --git a/jni/lib/wprintJNI.c b/jni/lib/wprintJNI.c
index 913198a..869ba7f 100644
--- a/jni/lib/wprintJNI.c
+++ b/jni/lib/wprintJNI.c
@@ -18,6 +18,7 @@
#include <jni.h>
#include "lib_wprint.h"
+#include <string.h>
#include "wprint_debug.h"
#include <errno.h>
#include "../plugins/wprint_mupdf.h"
@@ -75,6 +76,7 @@ static jfieldID _LocalPrinterCapabilitiesField__mediaDefault;
static jfieldID _LocalPrinterCapabilitiesField__supportedMediaTypes;
static jfieldID _LocalPrinterCapabilitiesField__supportedMediaSizes;
static jfieldID _LocalPrinterCapabilitiesField__nativeData;
+static jfieldID _LocalPrinterCapabilitiesField__certificate;
static jclass _JobCallbackClass;
static jobject _callbackReceiver;
@@ -86,6 +88,7 @@ static jfieldID _JobCallbackParamsField__jobId;
static jfieldID _JobCallbackParamsField__jobState;
static jfieldID _JobCallbackParamsField__jobDoneResult;
static jfieldID _JobCallbackParamsField__blockedReasons;
+static jfieldID _JobCallbackParamsField__certificate;
static jclass _PrintServiceStringsClass;
static jfieldID _PrintServiceStringsField__JOB_STATE_QUEUED;
@@ -110,6 +113,7 @@ static jfieldID _PrintServiceStringsField__BLOCKED_REASON__SERVICE_REQUEST;
static jfieldID _PrintServiceStringsField__BLOCKED_REASON__LOW_ON_INK;
static jfieldID _PrintServiceStringsField__BLOCKED_REASON__LOW_ON_TONER;
static jfieldID _PrintServiceStringsField__BLOCKED_REASON__REALLY_LOW_ON_INK;
+static jfieldID _PrintServiceStringsField__BLOCKED_REASON__BAD_CERTIFICATE;
static jfieldID _PrintServiceStringsField__BLOCKED_REASON__UNKNOWN;
static jfieldID _PrintServiceStringsField__ALIGNMENT__CENTER;
static jfieldID _PrintServiceStringsField__ALIGNMENT__CENTER_HORIZONTAL;
@@ -482,6 +486,8 @@ static void _initJNI(JNIEnv *env, jobject callbackReceiver, jstring fakeDir) {
env, _LocalPrinterCapabilitiesClass, "supportedMediaSizes", "[I");
_LocalPrinterCapabilitiesField__nativeData = (*env)->GetFieldID(
env, _LocalPrinterCapabilitiesClass, "nativeData", "[B");
+ _LocalPrinterCapabilitiesField__certificate = (*env)->GetFieldID(
+ env, _LocalPrinterCapabilitiesClass, "certificate", "[B");
_JobCallbackParamsClass = (jclass) (*env)->NewGlobalRef(env, (*env)->FindClass(
env, "com/android/bips/jni/JobCallbackParams"));
@@ -495,6 +501,8 @@ static void _initJNI(JNIEnv *env, jobject callbackReceiver, jstring fakeDir) {
env, _JobCallbackParamsClass, "jobDoneResult", "Ljava/lang/String;");
_JobCallbackParamsField__blockedReasons = (*env)->GetFieldID(
env, _JobCallbackParamsClass, "blockedReasons", "[Ljava/lang/String;");
+ _JobCallbackParamsField__certificate = (*env)->GetFieldID(
+ env, _JobCallbackParamsClass, "certificate", "[B");
if (callbackReceiver) {
_callbackReceiver = (jobject) (*env)->NewGlobalRef(env, callbackReceiver);
@@ -557,6 +565,9 @@ static void _initJNI(JNIEnv *env, jobject callbackReceiver, jstring fakeDir) {
_PrintServiceStringsField__BLOCKED_REASON__REALLY_LOW_ON_INK = (*env)->GetStaticFieldID(
env, _PrintServiceStringsClass, "BLOCKED_REASON__REALLY_LOW_ON_INK",
"Ljava/lang/String;");
+ _PrintServiceStringsField__BLOCKED_REASON__BAD_CERTIFICATE = (*env)->GetStaticFieldID(
+ env, _PrintServiceStringsClass, "BLOCKED_REASON__BAD_CERTIFICATE",
+ "Ljava/lang/String;");
_PrintServiceStringsField__BLOCKED_REASON__UNKNOWN = (*env)->GetStaticFieldID(
env, _PrintServiceStringsClass, "BLOCKED_REASON__UNKNOWN", "Ljava/lang/String;");
@@ -589,7 +600,7 @@ static int _convertPrinterCaps_to_C(JNIEnv *env, jobject javaPrinterCaps,
}
jbyte *nativeDataPtr = (*env)->GetByteArrayElements(env, nativeDataObject, NULL);
memcpy(wprintPrinterCaps, (const void *) nativeDataPtr, sizeof(printer_capabilities_t));
- (*env)->ReleaseByteArrayElements(env, nativeDataObject, nativeDataPtr, JNI_ABORT);
+ (*env)->ReleaseByteArrayElements(env, nativeDataObject, nativeDataPtr, 0);
return OK;
}
@@ -1076,6 +1087,10 @@ static void _wprint_callback_fn(wJob_t job_handle, void *param) {
jStr = (jstring) (*env)->GetStaticObjectField(
env, _PrintServiceStringsClass,
_PrintServiceStringsField__BLOCKED_REASON__REALLY_LOW_ON_INK);
+ } else if (blocked_reasons & BLOCKED_REASON_BAD_CERTIFICATE) {
+ jStr = (jstring) (*env)->GetStaticObjectField(
+ env, _PrintServiceStringsClass,
+ _PrintServiceStringsField__BLOCKED_REASON__BAD_CERTIFICATE);
} else if (blocked_reasons & BLOCKED_REASON_UNKNOWN) {
jStr = (jstring) (*env)->GetStaticObjectField(
env, _PrintServiceStringsClass,
@@ -1094,6 +1109,24 @@ static void _wprint_callback_fn(wJob_t job_handle, void *param) {
(*env)->SetIntField(env, callbackParams, _JobCallbackParamsField__jobId,
(jint) job_handle);
+
+ if (cb_param->certificate) {
+ LOGI("_wprint_callback_fn: copying certificate len=%d", cb_param->certificate_len);
+ jbyteArray certificate = (*env)->NewByteArray(env, cb_param->certificate_len);
+ jbyte *certificateBytes = (*env)->GetByteArrayElements(env, certificate, 0);
+ memcpy(certificateBytes, (const void *) cb_param->certificate,
+ cb_param->certificate_len);
+ (*env)->ReleaseByteArrayElements(env, certificate, certificateBytes, 0);
+ (*env)->SetObjectField(env, callbackParams, _JobCallbackParamsField__certificate,
+ certificate);
+ (*env)->DeleteLocalRef(env, certificate);
+ } else {
+ LOGI("_wprint_callback_fn: there is no certificate");
+ // No cert, set NULL
+ (*env)->SetObjectField(env, callbackParams, _JobCallbackParamsField__certificate,
+ NULL);
+ }
+
(*env)->CallVoidMethod(env, _callbackReceiver, _JobCallbackMethod__jobCallback,
(jint) job_handle, callbackParams);
(*env)->DeleteLocalRef(env, callbackParams);
@@ -1160,6 +1193,7 @@ JNIEXPORT jint JNICALL Java_com_android_bips_ipp_Backend_nativeGetCapabilities(
connect_info.uri_scheme = copyToNewString(env, uriScheme);
connect_info.port_num = port;
connect_info.timeout = timeout;
+ connect_info.validate_certificate = NULL;
LOGI("nativeGetCapabilities for %s JNIenv is %p", connect_info.printer_addr, env);
@@ -1222,6 +1256,24 @@ JNIEXPORT jint JNICALL Java_com_android_bips_ipp_Backend_nativeGetFinalJobParame
}
/*
+ * Convert certificate (if present) from printer capabilities into job_params.
+ */
+static void _convertCertificate(JNIEnv *env, jobject printerCaps, wprint_job_params_t *params) {
+ params->certificate = NULL;
+ jbyteArray certificate = (jbyteArray) (*env)->GetObjectField(env, printerCaps,
+ _LocalPrinterCapabilitiesField__certificate);
+ if (certificate) {
+ params->certificate_len = (*env)->GetArrayLength(env, certificate);
+ params->certificate = malloc(params->certificate_len);
+ if (params->certificate) {
+ jbyte *certificateBytes = (*env)->GetByteArrayElements(env, certificate, NULL);
+ memcpy(params->certificate, certificateBytes, params->certificate_len);
+ (*env)->ReleaseByteArrayElements(env, certificate, certificateBytes, JNI_ABORT);
+ }
+ }
+}
+
+/*
* JNI call to wprint to start a print job. Takes connection params, job params, caps, and file
* array to complete the job
*/
@@ -1238,6 +1290,7 @@ JNIEXPORT jint JNICALL Java_com_android_bips_ipp_Backend_nativeStartJob(
_convertJobParams_to_C(env, jobParams, &params);
_convertPrinterCaps_to_C(env, printerCaps, &caps);
+ _convertCertificate(env, printerCaps, &params);
LOGD("nativeStartJob: After _convertJobParams_to_C: res=%d, name=%s",
params.pdf_render_resolution, params.job_name);
@@ -1360,6 +1413,9 @@ JNIEXPORT jint JNICALL Java_com_android_bips_ipp_Backend_nativeStartJob(
}
}
+ if (params.certificate) {
+ free(params.certificate);
+ }
(*env)->ReleaseStringUTFChars(env, mimeType, mimeTypeStr);
(*env)->ReleaseStringUTFChars(env, address, addressStr);
(*env)->ReleaseStringUTFChars(env, _fakeDir, dataDirStr);
@@ -1420,4 +1476,4 @@ JNIEXPORT void JNICALL Java_com_android_bips_ipp_Backend_nativeSetSourceInfo(
(*env)->ReleaseStringUTFChars(env, appName, appNameStr);
(*env)->ReleaseStringUTFChars(env, appVersion, appVersionStr);
(*env)->ReleaseStringUTFChars(env, osName, osNameStr);
-} \ No newline at end of file
+}
diff --git a/jni/lib/wprint_msgq.c b/jni/lib/wprint_msgq.c
index ac412aa..0e20de0 100644
--- a/jni/lib/wprint_msgq.c
+++ b/jni/lib/wprint_msgq.c
@@ -22,6 +22,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <pthread.h>
#include <semaphore.h>
@@ -155,4 +156,4 @@ int msgQNumMsgs(msg_q_id msgQ) {
pthread_mutex_unlock(&(msgq->mutex));
}
return num_msgs;
-} \ No newline at end of file
+}
diff --git a/jni/plugins/lib_pclm.c b/jni/plugins/lib_pclm.c
index aed183e..ae44bd6 100644
--- a/jni/plugins/lib_pclm.c
+++ b/jni/plugins/lib_pclm.c
@@ -19,6 +19,7 @@
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <math.h>
#include "lib_pcl.h"
@@ -183,6 +184,7 @@ static int _start_page(pcl_job_info_t *job_info, int pixel_width, int pixel_heig
int outBuffSize = 0;
_START_PAGE(job_info, pixel_width, pixel_height);
+ job_info->pixel_width = pixel_width;
page_info->sourceHeight = (float) pixel_height / job_info->standard_scale;
page_info->sourceWidth = (float) pixel_width / job_info->standard_scale;
@@ -272,10 +274,14 @@ static int _end_page(pcl_job_info_t *job_info, int page_number) {
if (page_number == -1) {
LOGI("_end_page(): writing blank page");
- _start_page(job_info, 0, 0);
- unsigned char blank_data[1] = {0xFF};
- PCLmEncapsulate(job_info->pclmgen_obj, (void *) blank_data, 1, 1,
+ _start_page(job_info, job_info->pixel_width, job_info->strip_height);
+ size_t blank_data_size = (size_t) job_info->strip_height * job_info->pixel_width *
+ job_info->num_components;
+ void *blank_data = malloc(blank_data_size);
+ memset(blank_data, 0xff, blank_data_size);
+ PCLmEncapsulate(job_info->pclmgen_obj, blank_data, blank_data_size, job_info->strip_height,
(void **) &job_info->pclm_output_buffer, &outBuffSize);
+ free(blank_data);
_WRITE(job_info, (const char *) job_info->pclm_output_buffer, outBuffSize);
}
LOGI("_end_page()");
@@ -308,4 +314,4 @@ static const ifc_pcl_t _pcl_ifc = {
ifc_pcl_t *pclm_connect(void) {
return ((ifc_pcl_t *) &_pcl_ifc);
-} \ No newline at end of file
+}
diff --git a/jni/plugins/lib_pwg.c b/jni/plugins/lib_pwg.c
index 5f60a10..8e3e525 100644
--- a/jni/plugins/lib_pwg.c
+++ b/jni/plugins/lib_pwg.c
@@ -70,7 +70,6 @@ static void _write_header_pwg(int pixel_width, int pixel_height, cups_page_heade
h->PageSize[1] = (int) h->cupsPageSize[1];
h->Separations = CUPS_TRUE;
h->TraySwitch = CUPS_TRUE;
- h->Tumble = CUPS_TRUE;
h->cupsWidth = pixel_width;
h->cupsHeight = pixel_height;
h->cupsBitsPerPixel = (monochrome ? 8 : 24);
@@ -219,12 +218,15 @@ static wJob_t _start_job(wJob_t job_handle, pcl_job_info_t *job_info, media_size
if (duplex == DUPLEX_MODE_BOOK) {
job_info->pclm_page_info.duplexDisposition = duplex_longEdge;
header_pwg.Duplex = CUPS_TRUE;
+ header_pwg.Tumble = CUPS_FALSE;
} else if (duplex == DUPLEX_MODE_TABLET) {
job_info->pclm_page_info.duplexDisposition = duplex_shortEdge;
header_pwg.Duplex = CUPS_TRUE;
+ header_pwg.Tumble = CUPS_TRUE;
} else {
job_info->pclm_page_info.duplexDisposition = simplex;
header_pwg.Duplex = CUPS_FALSE;
+ header_pwg.Tumble = CUPS_FALSE;
}
job_info->pclm_page_info.mirrorBackside = false;
diff --git a/jni/plugins/plugin_pcl.c b/jni/plugins/plugin_pcl.c
index 4170173..ab51c81 100644
--- a/jni/plugins/plugin_pcl.c
+++ b/jni/plugins/plugin_pcl.c
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "ifc_print_job.h"
#include "lib_pcl.h"
@@ -529,4 +530,4 @@ wprint_plugin_t *libwprintplugin_pcl_reg(void) {
.get_print_formats = _get_print_formats, .start_job = _start_job,
.print_page = _print_page, .print_blank_page = _print_blank_page, .end_job = _end_job,};
return ((wprint_plugin_t *) &_pcl_plugin);
-} \ No newline at end of file
+}
diff --git a/jni/plugins/plugin_pdf.c b/jni/plugins/plugin_pdf.c
index 2e7854b..4c54fd7 100644
--- a/jni/plugins/plugin_pdf.c
+++ b/jni/plugins/plugin_pdf.c
@@ -18,6 +18,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -130,4 +131,4 @@ wprint_plugin_t *libwprintplugin_pdf_reg(void) {
.get_print_formats = _get_print_formats, .start_job = _start_job,
.print_page = _print_page, .print_blank_page = NULL, .end_job = _end_job,};
return ((wprint_plugin_t *) &_pdf_plugin);
-} \ No newline at end of file
+}
diff --git a/jni/plugins/wprint_image.c b/jni/plugins/wprint_image.c
index fc0dc9e..0e5647c 100644
--- a/jni/plugins/wprint_image.c
+++ b/jni/plugins/wprint_image.c
@@ -17,6 +17,7 @@
*/
#include <stdlib.h>
+#include <string.h>
#include <math.h>
#include "wprint_image.h"
#include "lib_wprint.h"
@@ -1090,4 +1091,4 @@ void wprint_image_cleanup(wprint_image_info_t *image_info) {
free(image_info->output_cache);
image_info->output_cache = NULL;
}
-} \ No newline at end of file
+}
diff --git a/res/drawable/ic_download_from_market.xml b/res/drawable/ic_download_from_market.xml
new file mode 100644
index 0000000..44a5edf
--- /dev/null
+++ b/res/drawable/ic_download_from_market.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="36dp"
+ android:height="36dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M40,12h-8L32,8l-4,-4h-8l-4,4v4L8,12c-2.21,0 -3.98,1.79 -3.98,4L4,38c0,2.21 1.79,4 4,4h32c2.21,0 4,-1.79 4,-4L44,16c0,-2.21 -1.79,-4 -4,-4zM20,8h8v4h-8L20,8zM24,38L14,28h6v-8h8v8h6L24,38z"
+ android:fillColor="?android:attr/colorAccent"/>
+</vector>
diff --git a/res/drawable/ic_settings_gear.xml b/res/drawable/ic_settings_gear.xml
new file mode 100644
index 0000000..df02917
--- /dev/null
+++ b/res/drawable/ic_settings_gear.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2017 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.
+-->
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="24dp"
+ android:width="24dp"
+ android:viewportHeight="48.0"
+ android:viewportWidth="48.0"
+ android:tint="?android:attr/colorAccent">
+ <path android:fillColor="#000000" android:pathData="M38.86,25.95c0.08,-0.64 0.14,-1.29 0.14,-1.95s-0.06,-1.31 -0.14,-1.95l4.23,-3.31c0.38,-0.3 0.49,-0.84 0.24,-1.28l-4,-6.93c-0.25,-0.43 -0.77,-0.61 -1.22,-0.43l-4.98,2.01c-1.03,-0.79 -2.16,-1.46 -3.38,-1.97L29,4.84c-0.09,-0.47 -0.5,-0.84 -1,-0.84h-8c-0.5,0 -0.91,0.37 -0.99,0.84l-0.75,5.3c-1.22,0.51 -2.35,1.17 -3.38,1.97L9.9,10.1c-0.45,-0.17 -0.97,0 -1.22,0.43l-4,6.93c-0.25,0.43 -0.14,0.97 0.24,1.28l4.22,3.31C9.06,22.69 9,23.34 9,24s0.06,1.31 0.14,1.95l-4.22,3.31c-0.38,0.3 -0.49,0.84 -0.24,1.28l4,6.93c0.25,0.43 0.77,0.61 1.22,0.43l4.98,-2.01c1.03,0.79 2.16,1.46 3.38,1.97l0.75,5.3c0.08,0.47 0.49,0.84 0.99,0.84h8c0.5,0 0.91,-0.37 0.99,-0.84l0.75,-5.3c1.22,-0.51 2.35,-1.17 3.38,-1.97l4.98,2.01c0.45,0.17 0.97,0 1.22,-0.43l4,-6.93c0.25,-0.43 0.14,-0.97 -0.24,-1.28l-4.22,-3.31zM24,31c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
+</vector>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 08836fb..a4ca6a8 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Deur is oop"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Iets sit vas"</string>
<string name="printer_offline" msgid="9196864753298645066">"Vanlyn"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Swak sertifikaat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nie geënkripteer nie"</string>
<string name="printer_check" msgid="6428369671197132828">"Gaan drukker na"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Wag om te stuur"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Kon nie dokument lees nie"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Vergeet"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Koppel via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Koppel via huidige netwerk by <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sekuriteit"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Hierdie drukker het \'n nuwe sekuriteitsertifikaat verskaf, of \'n ander toestel boots dit tans na. Aanvaar die nuwe sertifikaat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Hierdie drukker aanvaar nie meer geënkripteerde take nie. Hou aan druk?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aanvaar"</string>
+ <string name="reject" msgid="24751635160440693">"Weier"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 48b0b8f..cc35e64 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"በር ክፍት ነው"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ወረቀት ታጭቋል"</string>
<string name="printer_offline" msgid="9196864753298645066">"ከመስመር ውጪ"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"መጥፎ የእውቅና ማረጋገጫ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"አልተመሰጠረም"</string>
<string name="printer_check" msgid="6428369671197132828">"አታሚን ይፈትሹ"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ለመላክ በመጠበቅ ላይ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ሰነዱን ማነበብ አልተቻለም"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"እርሳ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"በWi-Fi Direct በኩል ያገናኛል"</string>
<string name="connects_via_network" msgid="5990041581556733898">"አሁን ባለ አውታረ መረብ በኩል በ<xliff:g id="IP_ADDRESS">%1$s</xliff:g> ላይ ያገናኛል"</string>
+ <string name="security" msgid="2279008326210305401">"ደኅንነት"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ይህ አታሚ አዲስ የደህንነት እውቅና ማረጋገጫ አቅርቧል፣ ወይም ሌላ መሣሪያ እያስመሰለው ነው። አዲሱ የእውቅና ማረጋገጫ ይቀበሉ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ይህ አታሚ ከእንግዲህ የተመሰጠሩ ስራዎችን አይቀበልም። ማተም ይቀጥሉ?"</string>
+ <string name="accept" msgid="4426153292469698134">"ተቀበል"</string>
+ <string name="reject" msgid="24751635160440693">"አትቀበል"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 87461f6..81fd249 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"الباب مفتوح"</string>
<string name="printer_jammed" msgid="5104099859384749499">"الأوراق عالقة"</string>
<string name="printer_offline" msgid="9196864753298645066">"بلا اتصال"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"شهادة غير صالحة"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"بدون تشفير"</string>
<string name="printer_check" msgid="6428369671197132828">"التحقق من الطابعة"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"في انتظار الإرسال"</string>
<string name="unreadable_input" msgid="2199948329556527912">"تعذرت قراءة المستند"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"حذف"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"‏يتم الاتصال عبر اتصال Wi-Fi مباشر."</string>
<string name="connects_via_network" msgid="5990041581556733898">"يتم الاتصال عبر الشبكة الحالية باستخدام العنوان <xliff:g id="IP_ADDRESS">%1$s</xliff:g>."</string>
+ <string name="security" msgid="2279008326210305401">"الأمان"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"قدّمت هذه الطابعة شهادة أمان جديدة، أو هناك جهاز آخر يمثل وظيفتها. هل توافق على الشهادة الجديدة؟"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"لم تعُد هذه الطابعة تقبل المهام المشفّرة. هل تريد متابعة الطباعة؟"</string>
+ <string name="accept" msgid="4426153292469698134">"موافقة"</string>
+ <string name="reject" msgid="24751635160440693">"رفض"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 13fb929..92c72c1 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Açıq qapı"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Sıxılmış"</string>
<string name="printer_offline" msgid="9196864753298645066">"Oflayn"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Uyğun olmayan sertifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Şifrələnmədi"</string>
<string name="printer_check" msgid="6428369671197132828">"Printeri yoxlayın"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Göndərmək üçü gözlənilir"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Sənədi oxumaq mümkün deyil"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Unudun"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct ilə qoşulur"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Cari şəbəkə ilə <xliff:g id="IP_ADDRESS">%1$s</xliff:g> ünvanında qoşulur"</string>
+ <string name="security" msgid="2279008326210305401">"Təhlükəsizlik"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Bu printer yeni sertifikat təqdim etdi və ya digər cihaz onun şəxsiyyətini oğurlayır. Yeni sertifikat qəbul edilsin?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Bu printer artıq şifrələnmiş işləri qəbul etmir. Çapa davam edilsin?"</string>
+ <string name="accept" msgid="4426153292469698134">"Qəbul edin"</string>
+ <string name="reject" msgid="24751635160440693">"Rədd edin"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 21a4af1..8e82abf 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Vrata su otvorena"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Papir je zaglavljen"</string>
<string name="printer_offline" msgid="9196864753298645066">"Oflajn"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Neispravan sertifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nije šifrovano"</string>
<string name="printer_check" msgid="6428369671197132828">"Proverite štampač"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čeka se na slanje"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Čitanje dokumenta nije uspelo"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Zaboravi"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Povezuje se preko Wi-Fi Direct-a"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Povezuje se preko trenutne mreže pomoću IP adrese <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Bezbednost"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ovaj štampač pruža novi bezbednosni sertifikat ili se neki drugi uređaj lažno predstavlja kao on. Želite li da prihvatite novi sertifikat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ovaj štampač više ne prihvata šifrovane zadatke. Želite li da nastavite sa štampanjem?"</string>
+ <string name="accept" msgid="4426153292469698134">"Prihvati"</string>
+ <string name="reject" msgid="24751635160440693">"Odbij"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index fa123e8..f218334 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Дзверцы адкрытыя"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Папера захрасла"</string>
<string name="printer_offline" msgid="9196864753298645066">"Пазасеткавы рэжым"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Недапушчальны сертыфікат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Не зашыфравана"</string>
<string name="printer_check" msgid="6428369671197132828">"Праверце прынтар"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Чаканне адпраўкі"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Не атрымалася прачытаць дакумент"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Забыць"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Падключэнне праз Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Падключэнне праз бягучую сетку па адрасе <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Бяспека"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Гэты прынтар мае новы сертыфікат бяспекі, ці пад яго выглядам працуе іншая прылада. Прыняць новы сертыфікат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Гэты прынтар больш не прымае зашыфраваныя заданні. Прадоўжыць друкаванне?"</string>
+ <string name="accept" msgid="4426153292469698134">"Прыняць"</string>
+ <string name="reject" msgid="24751635160440693">"Адхіліць"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 75a8020..3c87dfd 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Входът е отворен"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Заседнала хартия"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлайн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Невалиден сертификат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Нешифровано"</string>
<string name="printer_check" msgid="6428369671197132828">"Проверка на принтера"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Изчаква се изпращане"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Документът не можа да бъде прочетен"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Забравяне"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Свързва се чрез Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Свързва се чрез текущата мрежа на адрес <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Сигурност"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Този принтер предостави нов сертификат за сигурност или друго устройство се представя за него. Приемате ли новия сертификат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Този принтер вече не приема шифровани задания. Искате ли да продължите да отпечатвате?"</string>
+ <string name="accept" msgid="4426153292469698134">"Приемам"</string>
+ <string name="reject" msgid="24751635160440693">"Отхвърляне"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index b8cb801..4ce1715 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ঢাকনাটি খোলা"</string>
<string name="printer_jammed" msgid="5104099859384749499">"জ্যাম হয়েছে"</string>
<string name="printer_offline" msgid="9196864753298645066">"অফলাইন"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"খারাপ সার্টিফিকেট"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"এনক্রিপ্ট করা হয়নি"</string>
<string name="printer_check" msgid="6428369671197132828">"প্রিন্টারটি পরীক্ষা করুন"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"পাঠানোর জন্য অপেক্ষা করা হচ্ছে"</string>
<string name="unreadable_input" msgid="2199948329556527912">"দস্তাবেজটি পড়া যাবেনা"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ভুলে যান"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"ওয়াই-ফাই ডাইরেক্টের মাধ্যমে সংযুক্ত হয়"</string>
<string name="connects_via_network" msgid="5990041581556733898">"বর্তমান নেটওয়ার্কের মাধ্যমে <xliff:g id="IP_ADDRESS">%1$s</xliff:g> অ্যাড্রেসে সংযুক্ত হয়"</string>
+ <string name="security" msgid="2279008326210305401">"নিরাপত্তা"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"এই প্রিন্টার একটি নতুন নিরাপত্তার সার্টিফিকেট দেবে, অথবা ডিভাইস থেকে এটি ব্যবহার করা হচ্ছে। নতুন সার্টিফিকেট গ্রহণ করতে চান?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"এই প্রিন্টারের মাধ্যমে আর এনক্রিপ্ট করা ডকুমেন্ট প্রিন্ট করা যাবে না। প্রিন্টিং করা চালিয়ে যেতে চান?"</string>
+ <string name="accept" msgid="4426153292469698134">"গ্রহণ করুন"</string>
+ <string name="reject" msgid="24751635160440693">"বাতিল করুন"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index d505d6a..9c901ca 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Poklopac je otvoren"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zaglavljeno"</string>
<string name="printer_offline" msgid="9196864753298645066">"Van mreže"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Pogrešna potvrda"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nije šifrirano"</string>
<string name="printer_check" msgid="6428369671197132828">"Provjerite štampač"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čeka se slanje"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokument nije pročitan"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Zaboravi"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Povezivanje putem opcije WiFi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Povezivanje putem trenutne mreže na <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sigurnost"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ovaj štampač je pružio novu potvrdu sigurnosti ili ga drugi uređaj imitira. Prihvatiti novu potvrdu?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ovaj štampač više ne prihvata šifrirane zadatke. Nastaviti štampati?"</string>
+ <string name="accept" msgid="4426153292469698134">"Prihvati"</string>
+ <string name="reject" msgid="24751635160440693">"Odbij"</string>
</resources>
diff --git a/res/values-ca/lineage_strings.xml b/res/values-ca/lineage_strings.xml
new file mode 100644
index 0000000..6f25f8d
--- /dev/null
+++ b/res/values-ca/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Impressió Wi-Fi Direct</string>
+ <string name="recommendation_summary">El servei d\'impressió per defecte proporciona opcions bàsiques. Podeu disposar d\'altres opcions per a aquesta impressora des d\'un altre servei d\'impressió.</string>
+ <string name="recommendations_heading">Serveis recomanats</string>
+ <string name="recommendation_install_summary">Seleccioneu per instal·lar-lo</string>
+ <string name="recommendation_enable_summary">Seleccioneu-lo per activar-lo</string>
+ <string name="recommendation_manage">Gestiona els serveis</string>
+ <string name="connections">Connexions</string>
+ <string name="wifi_direct_permission_rationale">El servei d\'impressió per defecte necessita permisos d\'ubicació
+ per accedir a les impresores Wi-Fi Direct perquè la vostra ubicació pot inferir als dispositius propers.</string>
+ <string name="fix">Repara</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index f4f1c31..0df42ed 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porta oberta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Paper encallat"</string>
<string name="printer_offline" msgid="9196864753298645066">"Sense connexió"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificat incorrecte"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Sense encriptar"</string>
<string name="printer_check" msgid="6428369671197132828">"Comprova la impressora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"S\'està esperant que s\'enviï"</string>
<string name="unreadable_input" msgid="2199948329556527912">"No s\'ha pogut llegir el document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Oblida"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Es connecta per Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Es connecta a través de la xarxa actual a l\'adreça IP <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Seguretat"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Aquesta impressora ha proporcionat un certificat de seguretat nou o bé hi ha un altre dispositiu suplantant-la. Vols acceptar el certificat nou?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Aquesta impressora ja no accepta tasques encriptades. Vols continuar imprimint?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accepta"</string>
+ <string name="reject" msgid="24751635160440693">"Rebutja"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 8dfd423..38a8cac 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Otevřená dvířka"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zaseknutý papír"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Nesprávný certifikát"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Není šifrováno"</string>
<string name="printer_check" msgid="6428369671197132828">"Zkontrolovat tiskárnu"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čekání na odeslání"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokument nelze přečíst"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Odstranit"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Připojení prostřednictvím Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Připojení prostřednictvím stávající sítě s IP adresou <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Zabezpečení"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Tato tiskárna poskytla nový bezpečnostní certifikát, nebo se za ni vydává jiné zařízení. Chcete nový certifikát přijmout?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Tato tiskárna už nepřijímá šifrované tiskové úlohy. Pokračovat v tisku?"</string>
+ <string name="accept" msgid="4426153292469698134">"Přijmout"</string>
+ <string name="reject" msgid="24751635160440693">"Odmítnout"</string>
</resources>
diff --git a/res/values-cy/lineage_strings.xml b/res/values-cy/lineage_strings.xml
new file mode 100644
index 0000000..3f93a51
--- /dev/null
+++ b/res/values-cy/lineage_strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Argraffu Wi-Fi Uniongyrchol</string>
+ <string name="recommendation_summary">Mae\'r Gwasanaeth Argraffu Rhagosodedig yn cynnig dewisiadau sylfaenol. Gall fod rhagor o ddewisiadau ar gyfer yr argraffydd hwn ar gael gan wasanaeth argraffu arall.</string>
+ <string name="recommendations_heading">Gwasanaethau argymelledig</string>
+ <string name="recommendation_install_summary">Dewisa i osod</string>
+ <string name="recommendation_enable_summary">Dewisa i alluogi</string>
+ <string name="recommendation_manage">Rheoli gwasanaethau</string>
+ <string name="connections">Cysylltiadau</string>
+ <string name="wifi_direct_permission_rationale">Mae ar Wasanaeth Argraffu Rhagosodedig angen caniatâd lleoliad er cysylltu ag argraffyddion Wi-Fi Uniongyrchol am na ellir canfod dy leoliad o ddyfeisiau gerllaw.</string>
+ <string name="fix">Trwsio</string>
+</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 12863f5..2e1ef92 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Lågen er åben"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Papirstop"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ugyldigt certifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Ikke krypteret"</string>
<string name="printer_check" msgid="6428369671197132828">"Tjek printeren"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Venter på at sende"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokumentet kunne ikke læses"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Glem"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Opretter forbindelse via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Opretter forbindelse via netværk med adressen <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sikkerhed"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Denne printer angav et nyt sikkerhedscertifikat, eller en anden enhed efterligner den. Vil du acceptere det nye certifikat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Denne printer understøtter ikke længere krypterede jobs. Vil du fortsætte med at udskrive?"</string>
+ <string name="accept" msgid="4426153292469698134">"Acceptér"</string>
+ <string name="reject" msgid="24751635160440693">"Afvis"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 5f5169d..e97f9e9 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Klappe geöffnet"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Papierstau"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ungültiges Zertifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nicht verschlüsselt"</string>
<string name="printer_check" msgid="6428369671197132828">"Drucker prüfen"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Auf Senden wird gewartet"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokument konnte nicht gelesen werden"</string>
@@ -49,7 +51,7 @@
<string name="find_wifi_direct" msgid="5270504288829123954">"Wi-Fi Direct-Drucker suchen"</string>
<string name="wifi_direct_printers" msgid="541168032444693191">"Wi-Fi Direct-Drucker"</string>
<string name="searching" msgid="2114018057619514587">"Wird gesucht…"</string>
- <string name="connect_hint_text" msgid="587112503851044234">"Möglicherweise musst du diese Verbindung auf dem Display deines Druckers bestätigen"</string>
+ <string name="connect_hint_text" msgid="587112503851044234">"Eventuell musst du diese Verbindung auf dem Display deines Druckers bestätigen"</string>
<string name="connecting_to" msgid="2665161014972086194">"Verbindung zu <xliff:g id="PRINTER">%1$s</xliff:g> wird hergestellt"</string>
<string name="failed_printer_connection" msgid="4196305972749960362">"Es konnte keine Verbindung zum Drucker hergestellt werden"</string>
<string name="failed_connection" msgid="8068661997318286575">"Es konnte keine Verbindung zu <xliff:g id="PRINTER">%1$s</xliff:g> hergestellt werden"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Entfernen"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Verbindung über Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Verbindung über das aktuelle Netzwerk mit der IP-Adresse <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sicherheit"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Dieser Drucker hat ein neues Sicherheitszertifikat oder ein anderes Gerät nutzt dessen Identität. Möchtest du das neue Zertifikat akzeptieren?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Dieser Drucker akzeptiert keine verschlüsselten Aufträge mehr. Weiter drucken?"</string>
+ <string name="accept" msgid="4426153292469698134">"Akzeptieren"</string>
+ <string name="reject" msgid="24751635160440693">"Ablehnen"</string>
</resources>
diff --git a/res/values-el/lineage_strings.xml b/res/values-el/lineage_strings.xml
new file mode 100644
index 0000000..0ce4b3b
--- /dev/null
+++ b/res/values-el/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Εκτύπωση Wi-Fi Direct</string>
+ <string name="recommendation_summary">Η προεπιλεγμένη υπηρεσία εκτύπωσης παρέχει βασικές επιλογές. Άλλες επιλογές για αυτόν τον εκτυπωτή ενδέχεται να είναι διαθέσιμες από άλλη υπηρεσία εκτύπωσης.</string>
+ <string name="recommendations_heading">Συνιστώμενες υπηρεσίες</string>
+ <string name="recommendation_install_summary">Επιλέξτε για εγκατάσταση</string>
+ <string name="recommendation_enable_summary">Επιλέξτε για ενεργοποίηση</string>
+ <string name="recommendation_manage">Διαχείριση υπηρεσιών</string>
+ <string name="connections">Συνδέσεις</string>
+ <string name="wifi_direct_permission_rationale">Η προεπιλεγμένη υπηρεσία εκτύπωσης χρειάζεται δικαιώματα τοποθεσίας
+ για πρόσβαση σε εκτυπωτές Wi-Fi Direct, επειδή η τοποθεσία σας μπορεί να συναχθεί από κοντινές συσκευές.</string>
+ <string name="fix">Επιδιόρθωση</string>
+</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 9a0584d..24d189e 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Η θύρα είναι ανοιχτή"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Εμπλοκή χαρτιού"</string>
<string name="printer_offline" msgid="9196864753298645066">"Εκτός σύνδεσης"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ακατάλληλο πιστοποιητικό"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Χωρίς κρυπτογράφηση"</string>
<string name="printer_check" msgid="6428369671197132828">"Έλεγχος εκτυπωτή"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Αναμονή για αποστολή"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Δεν ήταν δυνατή η ανάγνωση του εγγράφου"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Κατάργηση απομνημόνευσης"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Συνδέεται μέσω του Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Συνδέεται μέσω του τρέχοντος δικτύου στη διεύθυνση <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Ασφάλεια"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Αυτός ο εκτυπωτής παρείχε ένα νέο πιστοποιητικό ασφαλείας ή κάποια άλλη συσκευή έχει κλέψει τα στοιχεία ταυτότητάς του. Αποδοχή του νέου πιστοποιητικού ασφαλείας;"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Αυτός ο εκτυπωτής δεν δέχεται πλέον κρυπτογραφημένες εργασίες. Να συνεχιστεί η εκτύπωση;"</string>
+ <string name="accept" msgid="4426153292469698134">"Αποδοχή"</string>
+ <string name="reject" msgid="24751635160440693">"Απόρριψη"</string>
</resources>
diff --git a/res/values-en-rAU/lineage_strings.xml b/res/values-en-rAU/lineage_strings.xml
new file mode 100644
index 0000000..3409960
--- /dev/null
+++ b/res/values-en-rAU/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi Direct printing</string>
+ <string name="recommendation_summary">The Default Print Service provides basic options. Other options for this printer may be available from another print service.</string>
+ <string name="recommendations_heading">Recommended services</string>
+ <string name="recommendation_install_summary">Select to install</string>
+ <string name="recommendation_enable_summary">Select to enable</string>
+ <string name="recommendation_manage">Manage services</string>
+ <string name="connections">Connections</string>
+ <string name="wifi_direct_permission_rationale">Default Print Service needs location permissions
+ to access Wi-Fi Direct printers because your location can be inferred from nearby devices.</string>
+ <string name="fix">Fix</string>
+</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 6b6d47d..9e23076 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Door open"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Jammed"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Bad certificate"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Not encrypted"</string>
<string name="printer_check" msgid="6428369671197132828">"Check printer"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Waiting to send"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Could not read document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Forget"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Connects via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Connects via current network at <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Security"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"This printer provided a new security certificate, or another device is impersonating it. Accept the new certificate?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"This printer no longer accepts encrypted jobs. Continue printing?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accept"</string>
+ <string name="reject" msgid="24751635160440693">"Reject"</string>
</resources>
diff --git a/res/values-en-rCA/lineage_strings.xml b/res/values-en-rCA/lineage_strings.xml
new file mode 100644
index 0000000..3409960
--- /dev/null
+++ b/res/values-en-rCA/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi Direct printing</string>
+ <string name="recommendation_summary">The Default Print Service provides basic options. Other options for this printer may be available from another print service.</string>
+ <string name="recommendations_heading">Recommended services</string>
+ <string name="recommendation_install_summary">Select to install</string>
+ <string name="recommendation_enable_summary">Select to enable</string>
+ <string name="recommendation_manage">Manage services</string>
+ <string name="connections">Connections</string>
+ <string name="wifi_direct_permission_rationale">Default Print Service needs location permissions
+ to access Wi-Fi Direct printers because your location can be inferred from nearby devices.</string>
+ <string name="fix">Fix</string>
+</resources>
diff --git a/res/values-en-rGB/lineage_strings.xml b/res/values-en-rGB/lineage_strings.xml
new file mode 100644
index 0000000..3409960
--- /dev/null
+++ b/res/values-en-rGB/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi Direct printing</string>
+ <string name="recommendation_summary">The Default Print Service provides basic options. Other options for this printer may be available from another print service.</string>
+ <string name="recommendations_heading">Recommended services</string>
+ <string name="recommendation_install_summary">Select to install</string>
+ <string name="recommendation_enable_summary">Select to enable</string>
+ <string name="recommendation_manage">Manage services</string>
+ <string name="connections">Connections</string>
+ <string name="wifi_direct_permission_rationale">Default Print Service needs location permissions
+ to access Wi-Fi Direct printers because your location can be inferred from nearby devices.</string>
+ <string name="fix">Fix</string>
+</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 6b6d47d..9e23076 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Door open"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Jammed"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Bad certificate"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Not encrypted"</string>
<string name="printer_check" msgid="6428369671197132828">"Check printer"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Waiting to send"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Could not read document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Forget"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Connects via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Connects via current network at <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Security"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"This printer provided a new security certificate, or another device is impersonating it. Accept the new certificate?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"This printer no longer accepts encrypted jobs. Continue printing?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accept"</string>
+ <string name="reject" msgid="24751635160440693">"Reject"</string>
</resources>
diff --git a/res/values-en-rIN/lineage_strings.xml b/res/values-en-rIN/lineage_strings.xml
new file mode 100644
index 0000000..3409960
--- /dev/null
+++ b/res/values-en-rIN/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi Direct printing</string>
+ <string name="recommendation_summary">The Default Print Service provides basic options. Other options for this printer may be available from another print service.</string>
+ <string name="recommendations_heading">Recommended services</string>
+ <string name="recommendation_install_summary">Select to install</string>
+ <string name="recommendation_enable_summary">Select to enable</string>
+ <string name="recommendation_manage">Manage services</string>
+ <string name="connections">Connections</string>
+ <string name="wifi_direct_permission_rationale">Default Print Service needs location permissions
+ to access Wi-Fi Direct printers because your location can be inferred from nearby devices.</string>
+ <string name="fix">Fix</string>
+</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 6b6d47d..9e23076 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Door open"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Jammed"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Bad certificate"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Not encrypted"</string>
<string name="printer_check" msgid="6428369671197132828">"Check printer"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Waiting to send"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Could not read document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Forget"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Connects via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Connects via current network at <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Security"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"This printer provided a new security certificate, or another device is impersonating it. Accept the new certificate?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"This printer no longer accepts encrypted jobs. Continue printing?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accept"</string>
+ <string name="reject" msgid="24751635160440693">"Reject"</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 06cf494..9aab97b 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -17,44 +17,44 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="3551052199033657984">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎Default Print Service‎‏‎‎‏‎"</string>
- <string name="printer_busy" msgid="8604311528104955859">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎Busy‎‏‎‎‏‎"</string>
- <string name="printer_out_of_paper" msgid="4882186432807703877">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎Out of paper‎‏‎‎‏‎"</string>
- <string name="printer_out_of_ink" msgid="7361897651097675464">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎Out of ink‎‏‎‎‏‎"</string>
- <string name="printer_out_of_toner" msgid="2077516357225364154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎Out of toner‎‏‎‎‏‎"</string>
- <string name="printer_low_on_ink" msgid="3515015872393897705">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎Low on ink‎‏‎‎‏‎"</string>
- <string name="printer_low_on_toner" msgid="8807858294038587130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎Low on toner‎‏‎‎‏‎"</string>
- <string name="printer_door_open" msgid="2446302931916940874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎Door open‎‏‎‎‏‎"</string>
- <string name="printer_jammed" msgid="5104099859384749499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎Jammed‎‏‎‎‏‎"</string>
- <string name="printer_offline" msgid="9196864753298645066">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎Offline‎‏‎‎‏‎"</string>
- <string name="printer_check" msgid="6428369671197132828">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎Check printer‎‏‎‎‏‎"</string>
- <string name="waiting_to_send" msgid="2022115199902822180">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎Waiting to send‎‏‎‎‏‎"</string>
- <string name="unreadable_input" msgid="2199948329556527912">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎Could not read document‎‏‎‎‏‎"</string>
- <string name="media_size_l" msgid="164416542021598181">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎L‎‏‎‎‏‎"</string>
- <string name="media_size_5x7in" msgid="1275128379533195285">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‎5x7 in‎‏‎‎‏‎"</string>
- <string name="media_size_89x119mm" msgid="6828167243395807385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎89x119 mm‎‏‎‎‏‎"</string>
- <string name="media_size_54x86mm" msgid="1301991206183343895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎54x86 mm‎‏‎‎‏‎"</string>
- <string name="media_size_8x10in" msgid="1872576638522812402">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‎8x10 in‎‏‎‎‏‎"</string>
- <string name="media_size_4x6in" msgid="3093276425529958253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎4x6 in‎‏‎‎‏‎"</string>
- <string name="printer_description" msgid="8580767673213837142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎%1$s – %2$s‎‏‎‎‏‎"</string>
- <string name="title_activity_add_printer" msgid="9119216095769228566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎Add printer‎‏‎‎‏‎"</string>
- <string name="add_printer_by_ip" msgid="562864787592910327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎Add printer by IP address‎‏‎‎‏‎"</string>
- <string name="hostname_or_ip" msgid="3460546103553992915">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎Hostname or IP address‎‏‎‎‏‎"</string>
- <string name="ip_hint" msgid="7939777481941979799">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎192.168.0.4‎‏‎‎‏‎"</string>
- <string name="add" msgid="1950342261671100906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎Add‎‏‎‎‏‎"</string>
- <string name="add_named" msgid="9074106244018070583">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‎Add ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
- <string name="no_printer_found" msgid="4777867380924351173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎No printer found at this address‎‏‎‎‏‎"</string>
- <string name="printer_not_supported" msgid="281955849350938408">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎Printer not supported‎‏‎‎‏‎"</string>
- <string name="wifi_direct" msgid="4629404342852294985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎Wi-Fi Direct‎‏‎‎‏‎"</string>
- <string name="find_wifi_direct" msgid="5270504288829123954">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎Find Wi-Fi Direct printers‎‏‎‎‏‎"</string>
- <string name="wifi_direct_printers" msgid="541168032444693191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎Wi-Fi Direct printers‎‏‎‎‏‎"</string>
- <string name="searching" msgid="2114018057619514587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‎Searching…‎‏‎‎‏‎"</string>
- <string name="connect_hint_text" msgid="587112503851044234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎You may need to approve this connection on your printer\'s front panel‎‏‎‎‏‎"</string>
- <string name="connecting_to" msgid="2665161014972086194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎Connecting to ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
- <string name="failed_printer_connection" msgid="4196305972749960362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎Could not connect to printer‎‏‎‎‏‎"</string>
- <string name="failed_connection" msgid="8068661997318286575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎Could not connect to ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
- <string name="saved_printers" msgid="4567534965213125526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎Saved printers‎‏‎‎‏‎"</string>
- <string name="forget" msgid="892068061425802502">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎Forget‎‏‎‎‏‎"</string>
- <string name="connects_via_wifi_direct" msgid="652300632780158437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎Connects via Wi-Fi Direct‎‏‎‎‏‎"</string>
- <string name="connects_via_network" msgid="5990041581556733898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎Connects via current network at ‎‏‎‎‏‏‎<xliff:g id="IP_ADDRESS">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="app_name" msgid="3551052199033657984">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎Default Print Service‎‏‎‎‏‎"</string>
+ <string name="printer_busy" msgid="8604311528104955859">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎Busy‎‏‎‎‏‎"</string>
+ <string name="printer_out_of_paper" msgid="4882186432807703877">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎Out of paper‎‏‎‎‏‎"</string>
+ <string name="printer_out_of_ink" msgid="7361897651097675464">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎Out of ink‎‏‎‎‏‎"</string>
+ <string name="printer_out_of_toner" msgid="2077516357225364154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎Out of toner‎‏‎‎‏‎"</string>
+ <string name="printer_low_on_ink" msgid="3515015872393897705">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎Low on ink‎‏‎‎‏‎"</string>
+ <string name="printer_low_on_toner" msgid="8807858294038587130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎Low on toner‎‏‎‎‏‎"</string>
+ <string name="printer_door_open" msgid="2446302931916940874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎Door open‎‏‎‎‏‎"</string>
+ <string name="printer_jammed" msgid="5104099859384749499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎Jammed‎‏‎‎‏‎"</string>
+ <string name="printer_offline" msgid="9196864753298645066">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎Offline‎‏‎‎‏‎"</string>
+ <string name="printer_check" msgid="6428369671197132828">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎Check printer‎‏‎‎‏‎"</string>
+ <string name="waiting_to_send" msgid="2022115199902822180">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎Waiting to send‎‏‎‎‏‎"</string>
+ <string name="unreadable_input" msgid="2199948329556527912">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎Could not read document‎‏‎‎‏‎"</string>
+ <string name="media_size_l" msgid="164416542021598181">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎L‎‏‎‎‏‎"</string>
+ <string name="media_size_5x7in" msgid="1275128379533195285">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‎5x7 in‎‏‎‎‏‎"</string>
+ <string name="media_size_89x119mm" msgid="6828167243395807385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎89x119 mm‎‏‎‎‏‎"</string>
+ <string name="media_size_54x86mm" msgid="1301991206183343895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎54x86 mm‎‏‎‎‏‎"</string>
+ <string name="media_size_8x10in" msgid="1872576638522812402">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‎8x10 in‎‏‎‎‏‎"</string>
+ <string name="media_size_4x6in" msgid="3093276425529958253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎4x6 in‎‏‎‎‏‎"</string>
+ <string name="printer_description" msgid="8580767673213837142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎%1$s – %2$s‎‏‎‎‏‎"</string>
+ <string name="title_activity_add_printer" msgid="9119216095769228566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎Add printer‎‏‎‎‏‎"</string>
+ <string name="add_printer_by_ip" msgid="562864787592910327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎Add printer by IP address‎‏‎‎‏‎"</string>
+ <string name="hostname_or_ip" msgid="3460546103553992915">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎Hostname or IP address‎‏‎‎‏‎"</string>
+ <string name="ip_hint" msgid="7939777481941979799">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎192.168.0.4‎‏‎‎‏‎"</string>
+ <string name="add" msgid="1950342261671100906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎Add‎‏‎‎‏‎"</string>
+ <string name="add_named" msgid="9074106244018070583">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‎Add ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="no_printer_found" msgid="4777867380924351173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎No printer found at this address‎‏‎‎‏‎"</string>
+ <string name="printer_not_supported" msgid="281955849350938408">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎Printer not supported‎‏‎‎‏‎"</string>
+ <string name="wifi_direct" msgid="4629404342852294985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎Wi-Fi Direct‎‏‎‎‏‎"</string>
+ <string name="find_wifi_direct" msgid="5270504288829123954">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎Find Wi-Fi Direct printers‎‏‎‎‏‎"</string>
+ <string name="wifi_direct_printers" msgid="541168032444693191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎Wi-Fi Direct printers‎‏‎‎‏‎"</string>
+ <string name="searching" msgid="2114018057619514587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‎Searching…‎‏‎‎‏‎"</string>
+ <string name="connect_hint_text" msgid="587112503851044234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎You may need to approve this connection on your printer\'s front panel‎‏‎‎‏‎"</string>
+ <string name="connecting_to" msgid="2665161014972086194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎Connecting to ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="failed_printer_connection" msgid="4196305972749960362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎Could not connect to printer‎‏‎‎‏‎"</string>
+ <string name="failed_connection" msgid="8068661997318286575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎Could not connect to ‎‏‎‎‏‏‎<xliff:g id="PRINTER">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="saved_printers" msgid="4567534965213125526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎Saved printers‎‏‎‎‏‎"</string>
+ <string name="forget" msgid="892068061425802502">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎Forget‎‏‎‎‏‎"</string>
+ <string name="connects_via_wifi_direct" msgid="652300632780158437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎Connects via Wi-Fi Direct‎‏‎‎‏‎"</string>
+ <string name="connects_via_network" msgid="5990041581556733898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎Connects via current network at ‎‏‎‎‏‏‎<xliff:g id="IP_ADDRESS">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index f86ec88..b3d9f11 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Puerta abierta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Papel atascado"</string>
<string name="printer_offline" msgid="9196864753298645066">"Sin conexión"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado incorrecto"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Sin encriptar"</string>
<string name="printer_check" msgid="6428369671197132828">"Verificar impresora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Esperando para enviar"</string>
<string name="unreadable_input" msgid="2199948329556527912">"No se pudo leer el documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Olvidar"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Se conecta mediante Wi-Fi directo"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Se conecta mediante la red actual a <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Seguridad"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Esta impresora emitió un nuevo certificado de seguridad, o bien está suplantándola otro dispositivo. ¿Quieres aceptar el nuevo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impresora ya no acepta tareas encriptadas. ¿Quieres continuar con la impresión?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceptar"</string>
+ <string name="reject" msgid="24751635160440693">"Rechazar"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 9864468..ad2f0a1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Puerta abierta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Atascada"</string>
<string name="printer_offline" msgid="9196864753298645066">"Sin conexión"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado erróneo"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Sin cifrar"</string>
<string name="printer_check" msgid="6428369671197132828">"Comprobar impresora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Pendiente de envío"</string>
<string name="unreadable_input" msgid="2199948329556527912">"No se ha podido leer el documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Olvidar"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Se conecta a través de Wi‑Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Se conecta a través de la red actual con la dirección IP <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Seguridad"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Esta impresora ha proporcionado un nuevo certificado de seguridad, o bien otro dispositivo está suplantándola. ¿Quieres aceptar el nuevo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impresora ya no acepta tareas cifradas. ¿Quieres continuar con la impresión?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceptar"</string>
+ <string name="reject" msgid="24751635160440693">"Rechazar"</string>
</resources>
diff --git a/res/values-et/lineage_strings.xml b/res/values-et/lineage_strings.xml
new file mode 100644
index 0000000..320e923
--- /dev/null
+++ b/res/values-et/lineage_strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">WiFi Direct printimine</string>
+ <string name="recommendation_summary">Printimise vaiketeenus pakub põhilisi valikuid. Teisi valikuid selle printeri jaoks võib leida mõnelt teiselt printimise teenuselt.</string>
+ <string name="recommendations_heading">Soovitatud teenused</string>
+ <string name="recommendation_install_summary">Vali installimiseks</string>
+ <string name="recommendation_enable_summary">Vali lubamiseks</string>
+ <string name="recommendation_manage">Halda teenuseid</string>
+ <string name="connections">Ühendused</string>
+ <string name="wifi_direct_permission_rationale">Printimise vaiketeenus vajab asukoha luba et pääseda ligi Wi-Fi Direct printeritele, kuna sinu asukohta saab järeldada lähedalolevatelt seadmetelt.</string>
+ <string name="fix">Paranda</string>
+</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 33ac631..169b964 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Luuk on avatud"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Ummistunud"</string>
<string name="printer_offline" msgid="9196864753298645066">"Võrguühenduseta"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Sobimatu sertifikaat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Pole krüpteeritud"</string>
<string name="printer_check" msgid="6428369671197132828">"Printeri kontrollimine"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Saatmise ootel"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokumenti ei õnnestunud lugeda"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Unusta"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Ühendab funktsiooni Wi-Fi Direct kaudu"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Ühendab praeguse võrgu kaudu IP-aadressil <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Turvalisus"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"See printer esitas uue turvasertifikaadi mõni teine seade esineb selle printerina. Kas nõustuda uue sertifikaadiga?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"See printer ei aktsepteeri enam krüpteeritud töid. Kas jätkata printimist?"</string>
+ <string name="accept" msgid="4426153292469698134">"Nõustu"</string>
+ <string name="reject" msgid="24751635160440693">"Keeldu"</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index bb7a356..d5a648a 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Atea irekita dago"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Papera trabatuta dago"</string>
<string name="printer_offline" msgid="9196864753298645066">"Konexiorik gabe"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ziurtagiri okerra"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Enkriptatu gabe"</string>
<string name="printer_check" msgid="6428369671197132828">"Egiaztatu inprimagailua"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Bidaltzeko zain"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Ezin izan da irakurri dokumentua"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Ahaztu"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct zerbitzuaren bidez konektatzen da"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Uneko sarearen bidez konektatzen da (<xliff:g id="IP_ADDRESS">%1$s</xliff:g>)"</string>
+ <string name="security" msgid="2279008326210305401">"Segurtasuna"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Inprimagailuak segurtasun-ziurtagiri berri bat eman du, edo beste gailu bat ziurtagiria faltsutzen ari da. Ziurtagiri berria onartu nahi duzu?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Inprimagailu honek ez du jada onartzen lan enkriptaturik. Aurrera egin nahi duzu inprimaketarekin?"</string>
+ <string name="accept" msgid="4426153292469698134">"Onartu"</string>
+ <string name="reject" msgid="24751635160440693">"Baztertu"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 41a90ef..e5d3797 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"در باز است"</string>
<string name="printer_jammed" msgid="5104099859384749499">"گیر کرده است"</string>
<string name="printer_offline" msgid="9196864753298645066">"آفلاین"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"گواهینامه نادرست است"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"رمزگذاری‌نشده"</string>
<string name="printer_check" msgid="6428369671197132828">"بررسی چاپگر"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"درانتظار ارسال"</string>
<string name="unreadable_input" msgid="2199948329556527912">"سند خوانده نشد"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"فراموش کردن"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"‏ازطریق Wi-Fi بی‌واسطه متصل می‌شود"</string>
<string name="connects_via_network" msgid="5990041581556733898">"ازطریق شبکه فعلی به نشانی <xliff:g id="IP_ADDRESS">%1$s</xliff:g> متصل می‌شود"</string>
+ <string name="security" msgid="2279008326210305401">"امنیت"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"این چاپگر گواهینامه امنیتی جدیدی ارائه کرده است، یا دستگاه دیگری درحال جعل کردن هویت آن است. گواهینامه جدید پذیرفته شود؟"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"این چاپگر دیگر کارهای رمزگذاری‌شده را نمی‌پذیرد. به چاپ کردن ادامه می‌دهید؟"</string>
+ <string name="accept" msgid="4426153292469698134">"پذیرفتن"</string>
+ <string name="reject" msgid="24751635160440693">"رد کردن"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index da0c32b..171ffcf 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Luukku auki"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Jumissa"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline-tilassa"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Virheellinen varmenne"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Ei salattu"</string>
<string name="printer_check" msgid="6428369671197132828">"Tarkista tulostin."</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Odotetaan lähetystä."</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokumentin lukeminen epäonnistui."</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Unohda"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Yhteys muodostettu Wi-Fi Directin kautta"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Yhdistetään nykyisen verkon kautta osoitteessa <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Suojaus"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Tämä tulostin antoi uuden turvallisuusvarmenteen, tai toinen laite esiintyy tulostimena. Hyväksytäänkö uusi varmenne?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Tämä tulostin ei enää hyväksy salattuja töitä. Jatketaanko tulostamista?"</string>
+ <string name="accept" msgid="4426153292469698134">"Hyväksy"</string>
+ <string name="reject" msgid="24751635160440693">"Hylkää"</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 9a83c54..17e0dfc 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porte ouverte"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Bourrage"</string>
<string name="printer_offline" msgid="9196864753298645066">"Hors ligne"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificat non fiable"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Non chiffrée"</string>
<string name="printer_check" msgid="6428369671197132828">"Vérifiez l\'imprimante"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"En attente d\'envoi"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Impossible de lire le document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Oublier"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Se connecte par Wi-Fi direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Se connecte à l\'aide du réseau actuel, avec l\'adresse <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sécurité"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Cette imprimante a fourni un nouveau certificat de sécurité, ou bien un autre appareil tente d\'usurper son identité. Accepter le nouveau certificat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Cette imprimante n\'accepte plus les tâches chiffrées. Continuer l\'impression?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accepter"</string>
+ <string name="reject" msgid="24751635160440693">"Refuser"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 97ebb9c..733fd21 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porte ouverte"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Bourrage papier"</string>
<string name="printer_offline" msgid="9196864753298645066">"Hors connexion"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificat non fiable"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Non chiffrée"</string>
<string name="printer_check" msgid="6428369671197132828">"Vérifier l\'imprimante"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Envoi en attente"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Impossible de lire le document"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Supprimer"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Se connecte via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Se connecte via le réseau actuel à l\'adresse <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sécurité"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Cette imprimante a fourni un nouveau certificat de sécurité, ou bien un autre appareil a usurpé son identité. Voulez-vous accepter le nouveau certificat ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Cette imprimante n\'accepte plus les tâches chiffrées. Poursuivre l\'impression ?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accepter"</string>
+ <string name="reject" msgid="24751635160440693">"Refuser"</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 85fad8a..f3ab38d 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Tapa aberta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Atasco"</string>
<string name="printer_offline" msgid="9196864753298645066">"Sen conexión"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado incorrecto"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Sen encriptar"</string>
<string name="printer_check" msgid="6428369671197132828">"Comprobar impresora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Esperando para o envío"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Non se puido ler o documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Borrar"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Conéctase a través de Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Conéctase a través da rede actual ao enderezo IP <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Seguranza"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Esta impresora proporcionou un novo certificado de seguranza ou ben outro dispositivo está suplantando a súa identidade. Queres aceptar o novo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impresora xa non acepta traballos encriptados. Queres continuar coa impresión?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceptar"</string>
+ <string name="reject" msgid="24751635160440693">"Rexeitar"</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 2bf5fa2..95d1c72 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ખુલ્લો દરવાજો"</string>
<string name="printer_jammed" msgid="5104099859384749499">"જામ થઇ ગયું છે"</string>
<string name="printer_offline" msgid="9196864753298645066">"ઑફલાઇન"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"ખોટું પ્રમાણપત્ર"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"એન્ક્રિપ્ટ કરેલું નથી"</string>
<string name="printer_check" msgid="6428369671197132828">"પ્રિન્ટર તપાસો"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"મોકલવાની રાહ જોઇ રહ્યાં છીએ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"દસ્તાવેજ વાંચી શકાતા નથી"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ભૂલી જાઓ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct મારફતે કનેક્ટ થશે"</string>
<string name="connects_via_network" msgid="5990041581556733898">"હાલના નેટવર્ક મારફતે <xliff:g id="IP_ADDRESS">%1$s</xliff:g> પર કનેક્ટ થશે"</string>
+ <string name="security" msgid="2279008326210305401">"સુરક્ષા"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"આ પ્રિન્ટરે નવું સુરક્ષા પ્રમાણપત્ર રજૂ કર્યું છે અથવા કોઈ અન્ય ડિવાઇસ ખોટી ઓળખ રજૂ કરી રહ્યું છે. શું નવા પ્રમાણપત્રનો સ્વીકાર કરીએ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"આ પ્રિન્ટર હવે કોઈ એન્ક્રિપ્ટ કરેલા કાર્યનો સ્વીકાર કરતું નથી. પ્રિન્ટ કરવાનું ચાલુ રાખીએ?"</string>
+ <string name="accept" msgid="4426153292469698134">"સ્વીકારો"</string>
+ <string name="reject" msgid="24751635160440693">"નકારો"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3456a70..2405bbc 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"दरवाज़ा खुला है"</string>
<string name="printer_jammed" msgid="5104099859384749499">"जाम है"</string>
<string name="printer_offline" msgid="9196864753298645066">"ऑफ़लाइन"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"गलत प्रमाणपत्र"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"सुरक्षित नहीं किया गया है"</string>
<string name="printer_check" msgid="6428369671197132828">"प्रिंटर जाँचें"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"भेजने की प्रतीक्षा की जा रही है"</string>
<string name="unreadable_input" msgid="2199948329556527912">"दस्तावेज़ पढ़ा नहीं जा सका"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"भूल जाएं"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct के ज़रिए कनेक्ट किया जाता है"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> पर मौजूदा नेटवर्क के ज़रिए कनेक्ट किया जाता है"</string>
+ <string name="security" msgid="2279008326210305401">"सुरक्षा"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"इस प्रिंटर ने एक नया सुरक्षा प्रमाणपत्र दिया या फिर कोई दूसरा डिवाइस इसके नाम से काम कर रहा है. नया प्रमाणपत्र स्वीकार करें?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"यह प्रिंटर अब सुरक्षित किए गए काम स्वीकार नहीं करता है प्रिंट करना चाहते हैं?"</string>
+ <string name="accept" msgid="4426153292469698134">"स्वीकार करें"</string>
+ <string name="reject" msgid="24751635160440693">"अस्‍वीकार करें"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 665e083..4c5ad9b 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Otvorena vrata"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zaglavljeno"</string>
<string name="printer_offline" msgid="9196864753298645066">"Izvanmrežno"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Neispravan certifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nije kriptirano"</string>
<string name="printer_check" msgid="6428369671197132828">"Provjerite pisač"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čeka se slanje"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokument se ne može pročitati"</string>
@@ -55,6 +57,11 @@
<string name="failed_connection" msgid="8068661997318286575">"Povezivanje s pisačem <xliff:g id="PRINTER">%1$s</xliff:g> nije uspjelo"</string>
<string name="saved_printers" msgid="4567534965213125526">"Spremljeni pisači"</string>
<string name="forget" msgid="892068061425802502">"Zaboravi"</string>
- <string name="connects_via_wifi_direct" msgid="652300632780158437">"Povezuje se putem Izravnog Wi-Fi-ja"</string>
+ <string name="connects_via_wifi_direct" msgid="652300632780158437">"Povezuje se putem Izravnog Wi-Fija"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Povezuje se putem trenutačne mreže na IP adresi <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sigurnost"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ovaj je pisač pružio novi sigurnosni certifikat ili ga drugi uređaj lažno predstavlja. Želite li prihvatiti novi certifikat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ovaj pisač više ne prihvaća kriptirane zadatke. Želite li nastaviti s ispisom?"</string>
+ <string name="accept" msgid="4426153292469698134">"Prihvati"</string>
+ <string name="reject" msgid="24751635160440693">"Odbij"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 124f921..e6778f5 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Nyitott ajtó"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Elakadt"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Helytelen tanúsítvány"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nem titkosított"</string>
<string name="printer_check" msgid="6428369671197132828">"Nyomtató ellenőrzése"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Várakozás a küldésre"</string>
<string name="unreadable_input" msgid="2199948329556527912">"A dokumentum nem olvasható"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Elfelejtés"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Directen keresztül csatlakozik"</string>
<string name="connects_via_network" msgid="5990041581556733898">"A következő címen csatlakozik az aktuális hálózaton keresztül: <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Biztonság"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"A nyomtató új biztonsági tanúsítványt adott meg, vagy egy másik eszköz a nyomtatónak álcázza magát. Elfogadja az új tanúsítványt?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ez a nyomtató már nem fogad titkosított feladatokat. Folytatja a nyomtatást?"</string>
+ <string name="accept" msgid="4426153292469698134">"Elfogadás"</string>
+ <string name="reject" msgid="24751635160440693">"Elutasítás"</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 7d02654..58e25ce 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Կափարիչը բաց է"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Թղթի ծամում"</string>
<string name="printer_offline" msgid="9196864753298645066">"Անցանց"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Անվավեր հավաստագիր"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Գաղտնագրված չէ"</string>
<string name="printer_check" msgid="6428369671197132828">"Ստուգել տպիչը"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Սպասում է ուղարկման"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Հնարավոր չէ կարդալ փաստաթուղթը"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Չհիշել"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Միանում է Wi-Fi Direct-ի միջոցով"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Միանում է ընթացիկ ցանցի միջոցով (IP հասցե՝ <xliff:g id="IP_ADDRESS">%1$s</xliff:g>)"</string>
+ <string name="security" msgid="2279008326210305401">"Անվտանգություն"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Այս տպիչը տրամադրել է անվտանգության նոր հավաստագիր, կամ մեկ այլ սարք նմանակում է դրան։ Ընդունե՞լ նոր հավաստագիրը:"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Տպիչն այլևս չի ընդունում գաղտնագրված առաջադրանքներ: Շարունակե՞լ տպումը:"</string>
+ <string name="accept" msgid="4426153292469698134">"Ընդունել"</string>
+ <string name="reject" msgid="24751635160440693">"Մերժել"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index f7a0c66..595dec4 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Pintu terbuka"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Macet"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Sertifikat buruk"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Tidak dienkripsi"</string>
<string name="printer_check" msgid="6428369671197132828">"Periksa printer"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Menunggu untuk mengirim"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Tidak dapat membaca dokumen"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Lupakan"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Menghubungkan melalui Wi-Fi Langsung"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Menghubungkan melalui jaringan saat ini di <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Keamanan"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Printer ini menyediakan sertifikat keamanan baru, atau perangkat lain sedang meniru identitasnya. Setujui sertifikat baru?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Printer ini tidak menerima pekerjaan yang terenkripsi lagi. Lanjutkan mencetak?"</string>
+ <string name="accept" msgid="4426153292469698134">"Setuju"</string>
+ <string name="reject" msgid="24751635160440693">"Tolak"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index f44e03b..315c849 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Hlíf opin"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Stífla"</string>
<string name="printer_offline" msgid="9196864753298645066">"Ótengdur"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ógilt vottorð"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Ekki dulkóðað"</string>
<string name="printer_check" msgid="6428369671197132828">"Athugaðu prentara"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Bíður eftir að senda"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Ekki tókst að lesa skjal"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Gleyma"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Tengist um Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Tengist um núverandi netkerfi á <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Öryggi"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Þessi prentari útvegaði öryggisvottorð, eða annað tæki er að villa á sér heimildir. Viltu samþykkja nýja vottorðið?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Þessi prentari styður ekki lengur dulkóðuð verk. Halda áfram að prenta?"</string>
+ <string name="accept" msgid="4426153292469698134">"Samþykkja"</string>
+ <string name="reject" msgid="24751635160440693">"Hafna"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index fd945f9..2ad34b1 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Sportello aperto"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Bloccata"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificato non valido"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Non criptata"</string>
<string name="printer_check" msgid="6428369671197132828">"Controlla la stampante"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"In attesa di invio"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Impossibile leggere il documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Elimina"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Si connette tramite Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Si connette tramite la rete attuale all\'indirizzo <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sicurezza"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"La stampante ha fornito un nuovo certificato di sicurezza oppure un altro dispositivo viene identificato come tale. Accettare il nuovo certificato?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Questa stampante non accetta più processi criptati. Vuoi continuare a stampare?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accetta"</string>
+ <string name="reject" msgid="24751635160440693">"Rifiuta"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 54147b3..cdfae43 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"דלת המדפסת פתוחה"</string>
<string name="printer_jammed" msgid="5104099859384749499">"חסימה"</string>
<string name="printer_offline" msgid="9196864753298645066">"המדפסת לא מחוברת"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"אישור פגום"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ללא הצפנה"</string>
<string name="printer_check" msgid="6428369671197132828">"בדוק את המדפסת"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ממתין לשליחה"</string>
<string name="unreadable_input" msgid="2199948329556527912">"לא ניתן היה לקרוא את המסמך"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"מחיקה"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"‏מתחבר דרך Wi-Fi ישיר"</string>
<string name="connects_via_network" msgid="5990041581556733898">"מתחבר דרך הרשת הנוכחית בכתובת <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"אבטחה"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"המדפסת הזו סיפקה אישור אבטחה חדש, או שמכשיר אחר מתחזה לה. האם לקבל את האישור החדש?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"מדפסת זו כבר לא מקבלת משימות מוצפנות. האם להמשיך בהדפסה?"</string>
+ <string name="accept" msgid="4426153292469698134">"אישור"</string>
+ <string name="reject" msgid="24751635160440693">"דחייה"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 739ec4e..93bc046 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ドアが開いています"</string>
<string name="printer_jammed" msgid="5104099859384749499">"詰まっています"</string>
<string name="printer_offline" msgid="9196864753298645066">"オフラインです"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"不適切な証明書"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"暗号化なし"</string>
<string name="printer_check" msgid="6428369671197132828">"プリンタを確認してください"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"送信を待機しています"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ドキュメントを読み込めませんでした"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"削除"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct 経由で接続する"</string>
<string name="connects_via_network" msgid="5990041581556733898">"現在のネットワーク(<xliff:g id="IP_ADDRESS">%1$s</xliff:g>)経由で接続する"</string>
+ <string name="security" msgid="2279008326210305401">"セキュリティ"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"このプリンタが新しいセキュリティ証明書を提示しました。これは他のデバイスによるなりすましの可能性もあります。新しい証明書を承認しますか?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"このプリンタは暗号化されたジョブに対応しなくなりました。印刷を続行しますか?"</string>
+ <string name="accept" msgid="4426153292469698134">"承認"</string>
+ <string name="reject" msgid="24751635160440693">"拒否"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 0b63a29..de03480 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"კარი ღიაა"</string>
<string name="printer_jammed" msgid="5104099859384749499">"გაიჭედა"</string>
<string name="printer_offline" msgid="9196864753298645066">"ხაზგარეშე"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"სერტიფიკატი არასათანადოა"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"დაუშიფრავი"</string>
<string name="printer_check" msgid="6428369671197132828">"პრინტერის შემოწმება"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ელოდება გაგზავნას"</string>
<string name="unreadable_input" msgid="2199948329556527912">"დოკუმენტის წაკითხვა ვერ მოხერხდა"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"დავიწყება"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"უკავშირდება Wi-Fi Direct-ის მეშვეობით"</string>
<string name="connects_via_network" msgid="5990041581556733898">"უკავშირდება ამჟამინდელი ქსელით, შემდეგ IP მისამართზე: <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"უსაფრთხოება"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ამ პრინტერმა უზრუნველყო უსაფრთხოების ახალი სერტიფიკატი, ან მის იმიტირებას ახდენს სხვა მოწყობილობა. გსურთ ახალი სერტიფიკატის მიღება?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ეს პრინტერი აღარ იღებს დაშიფრულ დავალებებს. გსურთ ბეჭდვის გაგრძელება?"</string>
+ <string name="accept" msgid="4426153292469698134">"მიღება"</string>
+ <string name="reject" msgid="24751635160440693">"უარყოფა"</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 9502dbe..bc887f6 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Есігі ашық"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Кептелген"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлайн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Сертификат жарамсыз"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Шифрланбаған"</string>
<string name="printer_check" msgid="6428369671197132828">"Принтерді тексеру"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Жіберуді күтуде"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Құжат оқылмады"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Ұмыту"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct арқылы жалғанады"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> мекенжайындағы желі арқылы жалғанады"</string>
+ <string name="security" msgid="2279008326210305401">"Қауіпсіздік"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Бұл принтер жаңа қауіпсіздік сертификатын ұсынды немесе оның атынан басқа бір құрылғы жұмыс істеп тұр. Жаңа сертификатты қабылдайсыз ба?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Принтер енді шифрланған тапсырмаларды қабылдамайды. Басып шығару жалғассын ба?"</string>
+ <string name="accept" msgid="4426153292469698134">"Қабылдау"</string>
+ <string name="reject" msgid="24751635160440693">"Қабылдамау"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 4a20004..680aead 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ទ្វារចំហ"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ស្ទះ"</string>
<string name="printer_offline" msgid="9196864753298645066">"គ្មានអ៊ីនធឺណិត"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"វិញ្ញាបនបត្រ​មិនល្អ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"មិនបាន​អ៊ីនគ្រីប​ទេ"</string>
<string name="printer_check" msgid="6428369671197132828">"ពិនិត្យ​ម៉ាស៊ីនបោះពុម្ព"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"កំពុងរង់ចាំផ្ញើ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"មិនអាច​អាន​ឯកសារ​បាន​ទេ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"បំភ្លេច"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"ភ្ជាប់​តាមរយៈ Wi-Fi​ ផ្ទាល់"</string>
<string name="connects_via_network" msgid="5990041581556733898">"ភ្ជាប់​តាមរយៈ​បណ្តាញបច្ចុប្បន្ន​នៅ <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"សុវត្ថិភាព"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ម៉ាស៊ីនបោះពុម្ព​នេះបានផ្តល់​វិញ្ញាបនបត្រ​សុវត្ថិភាពថ្មី ឬ​មានឧបករណ៍​ផ្សេងកំពុង​បន្លំខ្លួនជា​ម៉ាស៊ីនបោះពុម្ព។ ទទួលយក​វិញ្ញាបនបត្រ​ថ្មី?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ម៉ាស៊ីនបោះ​ពុម្ពនេះលែង​ទទួល​កិច្ចការ​ដែលមាន​ការអ៊ីនគ្រីប​ទៀតហើយ។ បន្តបោះ​ពុម្ព?"</string>
+ <string name="accept" msgid="4426153292469698134">"ទទួលយក"</string>
+ <string name="reject" msgid="24751635160440693">"បដិសេធ"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index cb11261..59768bf 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ಬಾಗಿಲು ತೆರೆದಿದೆ"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ಜಾಮ್ ಆಗಿದೆ"</string>
<string name="printer_offline" msgid="9196864753298645066">"ಆಫ್‌ಲೈನ್"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"ತಪ್ಪು ಪ್ರಮಾಣಪತ್ರ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
<string name="printer_check" msgid="6428369671197132828">"ಪ್ರಿಂಟರ್ ಪರಿಶೀಲಿಸಿ"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ಕಳುಹಿಸಲು ಕಾಯುತ್ತಿದೆ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ಡಾಕ್ಯುಮೆಂಟ್ ಓದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ಮರೆಯಿರಿ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"ವೈ-ಫೈ ಡೈರೆಕ್ಟ್ ಮೂಲಕ ಸಂಪರ್ಕಿಸುತ್ತದೆ"</string>
<string name="connects_via_network" msgid="5990041581556733898">"ಪ್ರಸ್ತುತ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ <xliff:g id="IP_ADDRESS">%1$s</xliff:g> ಮೂಲಕ ಸಂಪರ್ಕಿಸುತ್ತದೆ"</string>
+ <string name="security" msgid="2279008326210305401">"ಭದ್ರತೆ"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ಈ ಪ್ರಿಂಟರ್ ಹೊಸ ಭದ್ರತೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಒದಗಿಸಿದೆ ಅಥವಾ ಇನ್ನೊಂದು ಸಾಧನ ಅದನ್ನು ಸೋಗು ಹಾಕುತ್ತಿದೆ. ಹೊಸ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸ್ವೀಕರಿಸುವುದೇ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ಪ್ರಿಂಟರ್ ಇನ್ನು ಮುಂದೆ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಕೆಲಸಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ. ಪ್ರಿಂಟಿಂಗ್ ಮುಂದುವರಿಸುವುದೇ?"</string>
+ <string name="accept" msgid="4426153292469698134">"ಸ್ವೀಕರಿಸಿ"</string>
+ <string name="reject" msgid="24751635160440693">"ತಿರಸ್ಕರಿಸಿ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index e379682..a298fde 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"덮개 열림"</string>
<string name="printer_jammed" msgid="5104099859384749499">"종이가 낌"</string>
<string name="printer_offline" msgid="9196864753298645066">"오프라인"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"잘못된 인증서"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"암호화되지 않음"</string>
<string name="printer_check" msgid="6428369671197132828">"프린터 확인"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"전송 대기 중"</string>
<string name="unreadable_input" msgid="2199948329556527912">"문서를 읽을 수 없음"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"삭제"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct를 통해 연결"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g>에서 현재 네트워크를 통해 연결"</string>
+ <string name="security" msgid="2279008326210305401">"보안"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"이 프린터에서 새로운 보안 인증서를 제공했거나 다른 기기가 이 프린터로 위장하고 있습니다. 새 인증서를 수락할까요?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"프린터가 더 이상 암호화된 작업을 지원하지 않습니다. 인쇄를 계속하시겠습니까?"</string>
+ <string name="accept" msgid="4426153292469698134">"수락"</string>
+ <string name="reject" msgid="24751635160440693">"거부"</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index cb6d4ab..d63f859 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Капкагы ачык"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Кагаз чайналды"</string>
<string name="printer_offline" msgid="9196864753298645066">"Оффлайн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Начар тастыктама"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Шифрленген эмес"</string>
<string name="printer_check" msgid="6428369671197132828">"Принтерди текшерүү"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Жөнөтүлгөнү жатат"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Документ окулбай койду"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Унутулсун"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct аркылуу туташат"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> IP дарегиндеги учурдагы тармак аркылуу туташат"</string>
+ <string name="security" msgid="2279008326210305401">"Коопсуздук"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Бул принтердин жаңы коопсуздук тастыктамасы бар же анын ордуна башка түзмөк иштеп жатат. Жаңы тастыктама кабыл алынсынбы?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Бул принтер мындан ары шифрленген тапшырмаларды кабыл албайт. Бастыра бересизби?"</string>
+ <string name="accept" msgid="4426153292469698134">"Макул"</string>
+ <string name="reject" msgid="24751635160440693">"Четке кагуу"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 36656c1..e378864 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ປະຕູເປີດຢູ່"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ເຈ້ຍຕິດ"</string>
<string name="printer_offline" msgid="9196864753298645066">"ອອບລາຍ"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"ໃບຮັບຮອງບໍ່ຖືກຕ້ອງ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ບໍ່ໄດ້ເຂົ້າລະຫັດ"</string>
<string name="printer_check" msgid="6428369671197132828">"ກວດສອບເຄື່ອງພິມ"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ກຳລັງລໍຖ້າສົ່ງ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ບໍ່ສາມາດອ່ານເອກະສານໄດ້"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ລືມ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"ເຊື່ອມຕໍ່ຜ່ານ Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"ເຊື່ອມຕໍ່ຜ່ານເຄືອຂ່າຍປັດຈຸບັນທີ່ <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"ຄວາມປອດໄພ"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ເຄື່ອງພິມນີ້ໃຫ້ໃບຮັບຮອງຄວາມປອດໄພໃໝ່ ຫຼື ອຸປະກອນອື່ນກຳລັງປອມເປັນມັນຢູ່. ຍອມຮັບໃບຮັບຮອງໃໝ່ບໍ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ເຄື່ອງພິມນີ້ບໍ່ຮັບໜ້າວຽກທີ່ເຂົ້າລະຫັດໄວ້. ສືບຕໍ່ການພິມບໍ?"</string>
+ <string name="accept" msgid="4426153292469698134">"ຍອມຮັບ"</string>
+ <string name="reject" msgid="24751635160440693">"ປະຕິເສດ"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index a11f257..6f1286f 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Atidarytos durelės"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Užstrigęs"</string>
<string name="printer_offline" msgid="9196864753298645066">"Neprisijungęs"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Netinkamas sertifikatas"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nešifruota"</string>
<string name="printer_check" msgid="6428369671197132828">"Tikrinti spausdintuvą"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Laukiama, kol bus išsiųsta"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Nepavyko nuskaityti dokumento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Pamiršti"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Užmezgamas ryšys per „Wi-Fi Direct“"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Užmezgamas ryšys per dabartinį tinklą adresu <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sauga"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Šis spausdintuvas pateikė naują saugos sertifikatą arba kitas įrenginys juo apsimetinėja. Priimti naują sertifikatą?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Šis spausdintuvas nebepriima šifruotų užduočių. Spausdinti toliau?"</string>
+ <string name="accept" msgid="4426153292469698134">"Sutikti"</string>
+ <string name="reject" msgid="24751635160440693">"Atmesti"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 5efc547..2a78f64 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Atvērtas piekļuves durvis"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Iestrēdzis papīrs"</string>
<string name="printer_offline" msgid="9196864753298645066">"Bezsaistē"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Nederīgs sertifikāts"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nešifrēts"</string>
<string name="printer_check" msgid="6428369671197132828">"Pārbaudīt printeri"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Gaida sūtīšanu"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Nevarēja nolasīt dokumentu"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Aizmirst"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Notiek savienojuma izveide, izmantojot Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Notiek savienojuma izveide, izmantojot pašreizējo tīklu ar šādu IP adresi: <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Drošība"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Šim printerim ir jauns drošības sertifikāts, vai arī cita ierīce uzdodas par to. Vai apstiprināt jauno sertifikātu?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Šis printeris vairs nepieņem šifrētus uzdevumus. Vai turpināt drukāšanu?"</string>
+ <string name="accept" msgid="4426153292469698134">"Apstiprināt"</string>
+ <string name="reject" msgid="24751635160440693">"Noraidīt"</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 674d37c..7d42fbb 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Отворена врата"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Заглавен"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлајн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Лош сертификат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Не е шифриран"</string>
<string name="printer_check" msgid="6428369671197132828">"Проверете го печатачот"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Се чека за испраќање"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Не може да се прочита документот"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Избриши го"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Се поврзува преку Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Се поврзува преку моменталната мрежа на <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Безбедност"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Овој печатач обезбедил нов безбедносен сертификат или друг уред лажно се претставува како него. Да се прифати новиот сертификат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Овој печатач веќе не прифаќа шифрирани задачи. Да се продолжи со печатење?"</string>
+ <string name="accept" msgid="4426153292469698134">"Прифати"</string>
+ <string name="reject" msgid="24751635160440693">"Одбиј"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 7d331bc..8f42a0d 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ഡോർ തുറന്നിരിക്കുന്നു"</string>
<string name="printer_jammed" msgid="5104099859384749499">"അമര്‍ത്തുക"</string>
<string name="printer_offline" msgid="9196864753298645066">"ഓഫ്‌ലൈന്‍‍"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"മോശം സർട്ടിഫിക്കറ്റ്"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"എൻക്രിപ്റ്റ് ചെയ്‌തിട്ടില്ല"</string>
<string name="printer_check" msgid="6428369671197132828">"പ്രിന്റർ പരിശോധിക്കുക"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"അയയ്‌ക്കാൻ കാത്തിരിക്കുന്നു"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ഡോക്യുമെന്റ് റീഡുചെയ്യാനായില്ല"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"മറന്നു"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"വൈഫൈ ഡയറക്‌റ്റ് വഴി കണക്റ്റ് ചെയ്യുന്നു"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> വിലാസത്തിലെ നിലവിലെ നെറ്റ്‍വര്‍ക്ക് വഴി കണക്റ്റ് ചെയ്യുന്നു"</string>
+ <string name="security" msgid="2279008326210305401">"സുരക്ഷ"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ഈ പ്രിന്റർ ഒരു പുതിയ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് നൽകുകയോ മറ്റൊരു ഉപകരണം ഇതായി ആൾമാറാട്ടം നടത്തുകയോ ചെയ്യുന്നു. പുതിയ സർട്ടിഫിക്കറ്റ് സ്വീകരിക്കട്ടെ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ഈ പ്രിന്റർ ഇനി എൻക്രിപ്റ്റ് ചെയ്‌ത ജോലികൾ സ്വീകരിക്കില്ല. പ്രിന്റ് ചെയ്യൽ തുടരണോ?"</string>
+ <string name="accept" msgid="4426153292469698134">"അംഗീകരിക്കുക"</string>
+ <string name="reject" msgid="24751635160440693">"നിരസിക്കുക"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 415a7a3..af8ecdd 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Хаалга нээлттэй"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Гацсан"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлайн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Муу сертификат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Шифрлээгүй байна"</string>
<string name="printer_check" msgid="6428369671197132828">"Хэвлэгчийг шалгах"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Илгээхээр хүлээж байна"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Документыг унших боломжгүй байна"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Мартах"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Шуудаар холбогддог"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Одоогийн сүлжээгээр <xliff:g id="IP_ADDRESS">%1$s</xliff:g>-д холбогддог"</string>
+ <string name="security" msgid="2279008326210305401">"Аюулгүй байдал"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Энэ хэвлэгч аюулгүй байдлын шинэ сертификат олгосон эсвэл үүнийг өөр төхөөрөмж хуурамчаар дуурайж байна. Шинэ сертификатыг зөвшөөрөх үү?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Энэ хэвлэгч шифрлэсэн ажлыг цаашид зөвшөөрөхөө больсон байна. Үргэлжлүүлэн хэвлэх үү?"</string>
+ <string name="accept" msgid="4426153292469698134">"Зөвшөөрөх"</string>
+ <string name="reject" msgid="24751635160440693">"Татгалзах"</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 5cfcb23..048094d 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"दार उघडे आहे"</string>
<string name="printer_jammed" msgid="5104099859384749499">"अडकले"</string>
<string name="printer_offline" msgid="9196864753298645066">"ऑफलाइन"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"खराब सर्टिफिकेट"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"एंक्रिप्ट केलेले नाही"</string>
<string name="printer_check" msgid="6428369671197132828">"प्रिंटर तपासा"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"पाठवण्‍याची प्रतीक्षा करत आहे"</string>
<string name="unreadable_input" msgid="2199948329556527912">"दस्तऐवज वाचता आला नाही"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"विसरा"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"वाय-फाय थेट मार्फत कनेक्ट होते"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> वर सध्याच्या नेटवर्कमार्फत कनेक्ट होते"</string>
+ <string name="security" msgid="2279008326210305401">"सुरक्षितता"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"हा प्रिंटर नवीन सुरक्षा सर्टिफिकेट प्रदान करतो किंवा दुसरे एखादे डिव्हाइस तोतयागिरी करत असेल. नवीन सर्टिफिकेट स्वीकारायचे का?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"यापुढे हा प्रिंटर एंक्रिप्ट केलेली कामे स्वीकारणार नाही. प्रिंट करणे सुरू ठेवायचे आहे का?"</string>
+ <string name="accept" msgid="4426153292469698134">"स्वीकारा"</string>
+ <string name="reject" msgid="24751635160440693">"नकार द्या"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index fc968e3..89546f2 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Pintu terbuka"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Tersekat"</string>
<string name="printer_offline" msgid="9196864753298645066">"Luar talian"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Sijil tidak sah"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Tidak disulitkan"</string>
<string name="printer_check" msgid="6428369671197132828">"Semak pencetak"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Menunggu untuk dihantar"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Tidak dapat membaca dokumen"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Lupakan"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Bersambung melalui Wi-Fi Langsung"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Bersambung melalui rangkaian semasa di <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Keselamatan"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Pencetak ini memberikan sijil keselamatan baharu atau peranti lain sedang menyamar menjadi pencetak tersebut. Terima sijil baharu?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Pencetak ini tidak lagi menerima kerja yang disulitkan. Teruskan mencetak?"</string>
+ <string name="accept" msgid="4426153292469698134">"Terima"</string>
+ <string name="reject" msgid="24751635160440693">"Tolak"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 5d90879..136cfd0 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"တံခါးပွင့်နေသည်"</string>
<string name="printer_jammed" msgid="5104099859384749499">"စာရွက်ညှပ်နေသည်"</string>
<string name="printer_offline" msgid="9196864753298645066">"အော့ဖ်လိုင်းဖြစ်နေသည်"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"အသိအမှတ်ပြုလက်မှတ် မမှန်ကန်ပါ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"အသွင်ဝှက် မထားပါ"</string>
<string name="printer_check" msgid="6428369671197132828">"ပုံနှိပ်စက်ကို စစ်ဆေးရန်"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ပို့ရန် စောင့်နေသည်"</string>
<string name="unreadable_input" msgid="2199948329556527912">"စာရွက်စာတမ်းကို ဖတ်၍မရပါ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"မေ့ပစ်ရန်"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct ဖြင့် ချိတ်ဆက်သည်"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> ရှိ လက်ရှိကွန်ရက် မှတစ်ဆင့် ချိတ်ဆက်သည်"</string>
+ <string name="security" msgid="2279008326210305401">"လုံခြုံရေး"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ဤပုံနှိပ်ထုတ်စက်က လုံခြုံရေး အသိအမှတ်ပြုလက်မှတ်အသစ်ကို ထုတ်ပေးလိုက်သည် သို့မဟုတ် အခြားစက်ပစ္စည်းတစ်ခုက ၎င်းအဖြစ် အယောင်ဆောင်နေခြင်းဖြစ်သည်။ အသိအမှတ်ပြုလက်မှတ်အသစ်ကို လက်ခံမလား။"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ဤပုံနှိပ်ထုတ်စက်က အသွင်ဝှက်ထားသော အလုပ်များကို လက်ခံတော့မည် မဟုတ်ပါ။ ဆက်လက် ပုံနှိပ်ထုတ်လိုသလား။"</string>
+ <string name="accept" msgid="4426153292469698134">"လက်ခံရန်"</string>
+ <string name="reject" msgid="24751635160440693">"ပယ်ရန်"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 82c481c..3114ee0 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Døren er åpen"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Fastkjørt papir"</string>
<string name="printer_offline" msgid="9196864753298645066">"Uten nett"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Ugyldig sertifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Ikke kryptert"</string>
<string name="printer_check" msgid="6428369671197132828">"Sjekk skriveren"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Venter på å sende"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Kunne ikke lese dokumentet"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Glem"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Kobler til via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Kobler til via nåværende nettverk på <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Sikkerhet"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Denne skriveren har oppgitt et nytt sikkerhetssertifikat, eller en annen enhet utgir seg for å være den. Vil du akseptere det nye sertifikatet?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Denne skriveren aksepterer ikke krypterte jobber lenger. Vil du fortsette utskriften?"</string>
+ <string name="accept" msgid="4426153292469698134">"Godta"</string>
+ <string name="reject" msgid="24751635160440693">"Avvis"</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 29ea9d0..1ff84f5 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"प्रिन्टरको ढोका खुला छ"</string>
<string name="printer_jammed" msgid="5104099859384749499">"प्रिन्टर जाम भयो"</string>
<string name="printer_offline" msgid="9196864753298645066">"अफलाइन"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"खराब प्रमाणपत्र"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"इन्क्रिप्ट गरिएको छैन"</string>
<string name="printer_check" msgid="6428369671197132828">"प्रिन्टर जाँच्नुहोस्"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"पठाउन कुर्दै"</string>
<string name="unreadable_input" msgid="2199948329556527912">"कागजात पढ्न सकिएन"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"बिर्सनुहोस्"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi प्रत्यक्षमार्फत जडान गर्छ"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> को हालको नेटवर्कमार्फत जडान गर्छ"</string>
+ <string name="security" msgid="2279008326210305401">"सुरक्षा"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"यो प्रिन्टरले सुरक्षासम्बन्धी कुनै नयाँ प्रमाणपत्र प्रदान गर्‍यो नयाँ प्रमाणपत्र स्वीकार गर्ने हो?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"यो प्रिन्टरले अब उप्रान्त इन्क्रिप्ट गरिएका कार्यहरू स्वीकार गर्दैन। छाप्ने कार्य जारी राख्ने हो?"</string>
+ <string name="accept" msgid="4426153292469698134">"स्वीकार गर्नुहोस्"</string>
+ <string name="reject" msgid="24751635160440693">"अस्वीकार गर्नुहोस्"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a9505f0..02f5c4b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Klep geopend"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Vastgelopen"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Verkeerd certificaat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Niet versleuteld"</string>
<string name="printer_check" msgid="6428369671197132828">"Printer controleren"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Wachten om te verzenden"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Kan document niet lezen"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Vergeten"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Maakt verbinding via Wifi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Maakt verbinding via huidige netwerk op <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Beveiliging"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Deze printer biedt een nieuw beveiligingscertificaat aan, of een ander apparaat imiteert deze printer. Wil je het nieuwe certificaat accepteren?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Deze printer accepteert geen versleutelde taken meer. Doorgaan met afdrukken?"</string>
+ <string name="accept" msgid="4426153292469698134">"Accepteren"</string>
+ <string name="reject" msgid="24751635160440693">"Weigeren"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index ce2f9d1..284bede 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ਢੱਕਣ ਖੁੱਲ੍ਹਾ ਹੈ"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ਜਾਮ ਹੋ ਗਿਆ ਹੈ"</string>
<string name="printer_offline" msgid="9196864753298645066">"ਆਫ਼ਲਾਈਨ"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"ਖ਼ਰਾਬ ਪ੍ਰਮਾਣ-ਪੱਤਰ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ਇਨਕ੍ਰਿਪਟਡ ਨਹੀਂ ਹੈ"</string>
<string name="printer_check" msgid="6428369671197132828">"ਪ੍ਰਿੰਟਰ ਚੈੱਕ ਕਰੋ"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"ਭੇਜਣ ਲਈ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ਦਸਤਾਵੇਜ਼ ਨੂੰ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ਛੱਡੋ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"ਵਾਈ-ਫਾਈ ਡਾਇਰੈਕਟ ਰਾਹੀਂ ਕਨੈਕਟ ਕਰਦਾ ਹੈ"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> \'ਤੇ ਵਰਤਮਾਨ ਨੈੱਟਵਰਕ ਰਾਹੀਂ ਕਨੈਕਟ ਕਰਦਾ ਹੈ"</string>
+ <string name="security" msgid="2279008326210305401">"ਸੁਰੱਖਿਆ"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ਇਸ ਪ੍ਰਿੰਟਰ ਨੇ ਇੱਕ ਨਵਾਂ ਸੁਰ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਮੁਹੱਈਆ ਕਰਵਾਇਆ ਹੈ, ਜਾਂ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਨੇ ਇਸਦਾ ਪਰਰੂਪਣ ਕੀਤਾ ਹੈ। ਨਵਾਂ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਸਵੀਕਾਰ ਕਰੋ?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ਇਹ ਪ੍ਰਿੰਟਰ ਹੁਣ ਇਨਕ੍ਰਿਪਟਡ ਜੌਬਾਂ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕੀ ਪ੍ਰਿੰਟਿੰਗ ਜਾਰੀ ਰੱਖਣੀ ਹੈ?"</string>
+ <string name="accept" msgid="4426153292469698134">"ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="reject" msgid="24751635160440693">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5d72cb7..d746996 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Pokrywa otwarta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zakleszczenie"</string>
<string name="printer_offline" msgid="9196864753298645066">"Tryb offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Zły certyfikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Niezaszyfrowana"</string>
<string name="printer_check" msgid="6428369671197132828">"Sprawdź drukarkę"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Czeka na wysłanie"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Nie można odczytać dokumentu"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Zapomnij"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Łączenie przez Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Łączenie przez bieżącą sieć, adres: <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Zabezpieczenia"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ta drukarka przekazała nowy certyfikat bezpieczeństwa lub inne urządzenie podszywa się pod nią. Zaakceptować nowy certyfikat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ta drukarka nie przyjmuje już zaszyfrowanych zadań. Kontynuować drukowanie?"</string>
+ <string name="accept" msgid="4426153292469698134">"Zaakceptuj"</string>
+ <string name="reject" msgid="24751635160440693">"Odrzuć"</string>
</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index ae2f913..19b4fe9 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porta aberta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Atolamento"</string>
<string name="printer_offline" msgid="9196864753298645066">"Off-line"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado inválido"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Não criptografado"</string>
<string name="printer_check" msgid="6428369671197132828">"Verificar impressora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Aguardando para enviar"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Não foi possível ler o documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Ignorar"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Conecta via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Conecta via rede atual em <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Segurança"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Um novo certificado de segurança foi emitido pela impressora ou a identidade dela foi falsificada por outro dispositivo. Aceitar o novo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impressora não aceita mais trabalhos criptografados. Continuar imprimindo?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceitar"</string>
+ <string name="reject" msgid="24751635160440693">"Recusar"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 625b5a4..d57e9c6 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porta aberta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Encravada"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado incorreto"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Não encriptada."</string>
<string name="printer_check" msgid="6428369671197132828">"Verificar impressora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"A aguardar para enviar…"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Não foi possível ler o documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Esquecer"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"A ligação é efetuada através de Wi-Fi Direct."</string>
<string name="connects_via_network" msgid="5990041581556733898">"A ligação é efetuada através da rede atual em <xliff:g id="IP_ADDRESS">%1$s</xliff:g>."</string>
+ <string name="security" msgid="2279008326210305401">"Segurança"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Esta impressora forneceu um novo certificado de segurança ou outro dispositivo está a roubar a respetiva identidade. Pretende aceitar o novo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impressora já não aceita tarefas encriptadas. Pretende continuar com a impressão?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceitar"</string>
+ <string name="reject" msgid="24751635160440693">"Rejeitar"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index ae2f913..19b4fe9 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Porta aberta"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Atolamento"</string>
<string name="printer_offline" msgid="9196864753298645066">"Off-line"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificado inválido"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Não criptografado"</string>
<string name="printer_check" msgid="6428369671197132828">"Verificar impressora"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Aguardando para enviar"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Não foi possível ler o documento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Ignorar"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Conecta via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Conecta via rede atual em <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Segurança"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Um novo certificado de segurança foi emitido pela impressora ou a identidade dela foi falsificada por outro dispositivo. Aceitar o novo certificado?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Esta impressora não aceita mais trabalhos criptografados. Continuar imprimindo?"</string>
+ <string name="accept" msgid="4426153292469698134">"Aceitar"</string>
+ <string name="reject" msgid="24751635160440693">"Recusar"</string>
</resources>
diff --git a/res/values-ro/lineage_strings.xml b/res/values-ro/lineage_strings.xml
new file mode 100644
index 0000000..1f87ec5
--- /dev/null
+++ b/res/values-ro/lineage_strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Printare prin Wi-Fi Direct</string>
+ <string name="recommendation_summary">Serviciul de Printare Prestabilit oferă opțiuni de bază. Alte opțiuni pentru această imprimantă ar putea fi disponibile din cadrul unui alt serviciu de printare.</string>
+ <string name="recommendations_heading">Servicii recomandate</string>
+ <string name="recommendation_install_summary">Selectați pentru a instala</string>
+ <string name="recommendation_enable_summary">Selectați pentru a activa</string>
+ <string name="recommendation_manage">Gestionați servicii</string>
+ <string name="connections">Conexiuni</string>
+ <string name="wifi_direct_permission_rationale">Serviciul de Printare Prestabilit necesită permisiunea la locație pentru a accesa imprimantele Wi-Fi Direct pentru că locația dvs. poate fi dedusă de la dispozitivele din apropiere.</string>
+ <string name="fix">Fixați</string>
+</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 3b56dda..2607277 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Ușă deschisă"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Blocat"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certificat necorespunzător"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nu este criptată"</string>
<string name="printer_check" msgid="6428369671197132828">"Bifați imprimanta"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Se așteaptă trimiterea"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Nu s-a putut citi documentul"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Eliminați"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Se conectează prin Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Se conectează prin rețeaua curentă la <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Securitate"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Imprimanta a oferit un nou certificat de securitate sau un alt dispozitiv îi folosește identitatea. Acceptați noul certificat?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Această imprimantă nu mai acceptă sarcini criptate. Continuați printarea?"</string>
+ <string name="accept" msgid="4426153292469698134">"Acceptați"</string>
+ <string name="reject" msgid="24751635160440693">"Respingeți"</string>
</resources>
diff --git a/res/values-ru/lineage_strings.xml b/res/values-ru/lineage_strings.xml
new file mode 100644
index 0000000..9c439c8
--- /dev/null
+++ b/res/values-ru/lineage_strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="fix">Исправить</string>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 13b8040..8326e5d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Дверца открыта"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Застряла бумага"</string>
<string name="printer_offline" msgid="9196864753298645066">"Нет подключения к Интернету"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Недопустимый сертификат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Не зашифровано"</string>
<string name="printer_check" msgid="6428369671197132828">"Проверить принтер"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Ожидание отправки…"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Не удалось прочитать документ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Удалить"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Подключено через Wi-Fi Direct."</string>
<string name="connects_via_network" msgid="5990041581556733898">"Подключено к текущей сети с IP-адресом <xliff:g id="IP_ADDRESS">%1$s</xliff:g>."</string>
+ <string name="security" msgid="2279008326210305401">"Безопасность"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Для принтера предоставлен новый сертификат безопасности. Возможно, под видом принтера работает другое устройство. Принять новый сертификат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Принтер больше не принимает зашифрованные задания. Продолжить печать?"</string>
+ <string name="accept" msgid="4426153292469698134">"Принять"</string>
+ <string name="reject" msgid="24751635160440693">"Отклонить"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 85a99e1..987e681 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"දොර විවෘතයි"</string>
<string name="printer_jammed" msgid="5104099859384749499">"තදබදය"</string>
<string name="printer_offline" msgid="9196864753298645066">"නොබැඳි"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"නරක සහතිකය"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"සංකේතනය කර නැත"</string>
<string name="printer_check" msgid="6428369671197132828">"මුද්‍රණ යන්ත්‍රය පරීක්ෂා කරන්න"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"යැවීමට රැඳී සිටිමින්"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ලේඛනය කියවීමට නොහැකිය"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"අමතක කරන්න"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct හරහා සම්බන්ධ වෙමින්"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> හි වත්මන් ජාලය හරහා සම්බන්ධ වෙමින්"</string>
+ <string name="security" msgid="2279008326210305401">"ආරක්‍ෂාව"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"මෙම මුද්‍රකය නව ආරක්‍ෂණ සහතිතකයක් සැපයුවේය, නැති නම් වෙනත් උපාංගයක් එය මූර්තිමත් කරයි. නව සහතිකය පිළිගන්නේද?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"මෙම මුද්‍රණ යන්ත්‍රය සංකේතනය කළ කාර්යයන් තවදුරටත් පිළිනොගනී. මුද්‍රණය කිරිම දිගටම කර ගෙන යන්නද?"</string>
+ <string name="accept" msgid="4426153292469698134">"පිළිගන්න"</string>
+ <string name="reject" msgid="24751635160440693">"ප්‍රතික්‍ෂේප කරන්න"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 2043512..bb42702 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Otvorené dvierka"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zablokované"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Nesprávny certifikát"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nešifrované"</string>
<string name="printer_check" msgid="6428369671197132828">"Skontrolovať tlačiareň"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čaká sa na odoslanie"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokument sa nepodarilo prečítať"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Odstrániť"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Pripája sa prostredníctvom rozhrania Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Pripája sa prostredníctvom aktuálnej siete na adrese IP – <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Zabezpečenie"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Táto tlačiareň poskytla nový bezpečnostný certifikát alebo ju napodobňuje iné zariadenie. Chcete nový certifikát prijať?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Tlačiareň už neprijíma šifrované úlohy. Chcete pokračovať v tlačení?"</string>
+ <string name="accept" msgid="4426153292469698134">"Prijať"</string>
+ <string name="reject" msgid="24751635160440693">"Odmietnuť"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 6b98ae2..0cb97c3 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Odprta vratca"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Zagozden"</string>
<string name="printer_offline" msgid="9196864753298645066">"Brez povezave"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Neustrezno potrdilo"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Ni šifrirano"</string>
<string name="printer_check" msgid="6428369671197132828">"Preveri tiskalnik"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Čakanje na pošiljanje"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokumenta ni bilo mogoče prebrati"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Pozabi"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Vzpostavitev povezave prek povezave Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Vzpostavitev povezave prek trenutnega omrežja z naslovom <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Varnost"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ta tiskalnik je posredoval novo varnostno potrdilo ali pa se zanj lažno predstavlja druga naprava. Želite sprejeti novo potrdilo?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ta tiskalnik ne sprejema več šifriranih opravil. Želite nadaljevati tiskanje?"</string>
+ <string name="accept" msgid="4426153292469698134">"Sprejmi"</string>
+ <string name="reject" msgid="24751635160440693">"Zavrni"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 1874fd1..acca0c9 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Dera e hapur"</string>
<string name="printer_jammed" msgid="5104099859384749499">"I bllokuar"</string>
<string name="printer_offline" msgid="9196864753298645066">"Jashtë linje"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Certifikatë me probleme"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Nuk është enkriptuar"</string>
<string name="printer_check" msgid="6428369671197132828">"Kontrollo printerin"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Në pritje për të dërguar"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Dokumenti nuk mund të lexohej"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Harro"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Lidhet përmes Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Lidhet përmes rrjetit aktual në <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Siguria"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Ky printer ka dhënë një certifikatë të re sigurie ose një pajisje tjetër po e imiton atë. Do ta pranosh certifikatën e re?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Ky printer nuk pranon më punë të enkriptuara. Të vazhdohet printimi?"</string>
+ <string name="accept" msgid="4426153292469698134">"Prano"</string>
+ <string name="reject" msgid="24751635160440693">"Refuzo"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 186202d..d79b9a2 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Врата су отворена"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Папир је заглављен"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлајн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Неисправан сертификат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Није шифровано"</string>
<string name="printer_check" msgid="6428369671197132828">"Проверите штампач"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Чека се на слање"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Читање документа није успело"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Заборави"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Повезује се преко Wi-Fi Direct-а"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Повезује се преко тренутне мреже помоћу IP адресе <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Безбедност"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Овај штампач пружа нови безбедносни сертификат или се неки други уређај лажно представља као он. Желите ли да прихватите нови сертификат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Овај штампач више не прихвата шифроване задатке. Желите ли да наставите са штампањем?"</string>
+ <string name="accept" msgid="4426153292469698134">"Прихвати"</string>
+ <string name="reject" msgid="24751635160440693">"Одбиј"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 839e86e..d306af7 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Luckan är öppen"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Blockerad"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Felaktigt certifikat"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Inte krypterad"</string>
<string name="printer_check" msgid="6428369671197132828">"Kontrollera skrivare"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Väntar på att skicka"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Det gick inte att läsa dokumentet"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Glöm"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Ansluter via Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Ansluter via det nuvarande nätverket på <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Säkerhet"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Skrivaren har ett nytt säkerhetscertifikat, om inte en annan enhet har övertagit dess identitet. Godkänner du det nya certifikatet?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Krypterade jobb godkänns inte längre på denna skrivare. Vill du fortsätta att skriva ut?"</string>
+ <string name="accept" msgid="4426153292469698134">"Godkänn"</string>
+ <string name="reject" msgid="24751635160440693">"Godkänn inte"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 186a561..8177ae5 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="3551052199033657984">"Huduma Chaguo msingi ya Kuchapisha"</string>
+ <string name="app_name" msgid="3551052199033657984">"Huduma Chaguomsingi ya Kuchapisha"</string>
<string name="printer_busy" msgid="8604311528104955859">"Inatumika"</string>
<string name="printer_out_of_paper" msgid="4882186432807703877">"Karatasi zimeisha"</string>
<string name="printer_out_of_ink" msgid="7361897651097675464">"Wino umeisha"</string>
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Mlango umefunguliwa"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Karatasi imekwama ndani"</string>
<string name="printer_offline" msgid="9196864753298645066">"Nje ya mtandao"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Cheti kina tatizo"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Haijasimbwa kwa njia fiche"</string>
<string name="printer_check" msgid="6428369671197132828">"Angalia printa"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Inasubiri kutuma"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Haikuweza kusoma hati"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Sahau"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Huunganisha kupitia Wi-Fi moja kwa moja"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Huunganisha kupitia mtandao wa sasa kwenye <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Usalama"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Printa hii imetoa cheti kipya cha usalama au kifaa kingine kinaiiga. Je, ungependa kukubali cheti kipya?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Printa hii haichapishi tena kazi zilizosimbwa kwa njia fiche. Ungependa kuendelea kuchapisha?"</string>
+ <string name="accept" msgid="4426153292469698134">"Kubali"</string>
+ <string name="reject" msgid="24751635160440693">"Kataa"</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 5ab7d7f..69bc30c 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"டோர் திறந்துள்ளது"</string>
<string name="printer_jammed" msgid="5104099859384749499">"காகிதம் சிக்கிக்கொண்டது"</string>
<string name="printer_offline" msgid="9196864753298645066">"ஆஃப்லைன்"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"தவறான சான்றிதழ்"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"என்க்ரிப்ஷன் செய்யப்படவில்லை"</string>
<string name="printer_check" msgid="6428369671197132828">"பிரிண்டரைச் சரிபார்"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"அனுப்பக் காத்திருக்கிறது"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ஆவணத்தைப் படிக்க முடியவில்லை"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"அகற்று"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"வைஃபை டைரக்ட் மூலமாக இணைக்கிறது"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> இல் தற்போதைய நெட்வொர்க் மூலம் இணைக்கிறது"</string>
+ <string name="security" msgid="2279008326210305401">"பாதுகாப்பு"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"இந்தப் பிரிண்டரோ இதன் பெயரில் வேறொரு சாதனமோ புதிய பாதுகாப்பு சான்றிதழை வழங்கியுள்ளது. புதிய சான்றிதழை ஏற்கவா?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"இந்தப் பிரிண்ட்டரானது என்க்ரிப்ஷன் செய்தவற்றை அச்சிடாது. அச்சிடுவதைத் தொடரவா?"</string>
+ <string name="accept" msgid="4426153292469698134">"ஏற்கிறேன்"</string>
+ <string name="reject" msgid="24751635160440693">"நிராகரி"</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 494c5db..8870a02 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"తలుపు తెరుచుకుని ఉంది"</string>
<string name="printer_jammed" msgid="5104099859384749499">"ఇరుక్కుపోయింది"</string>
<string name="printer_offline" msgid="9196864753298645066">"ఆఫ్‌లైన్"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"సర్టిఫికెట్‌ చెల్లదు"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ఎన్‌క్రిప్ట్ చేయబడలేదు"</string>
<string name="printer_check" msgid="6428369671197132828">"ప్రింటర్‌ని తనిఖీ చేయి"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"పంపడానికి వేచి ఉంది"</string>
<string name="unreadable_input" msgid="2199948329556527912">"పత్రాన్ని చదవడం సాధ్యం కాలేదు"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"విస్మరించండి"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct ద్వారా కనెక్ట్ చేస్తోంది"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> వద్ద ప్రస్తుత నెట్‌వర్క్ ద్వారా కనెక్ట్ చేస్తోంది"</string>
+ <string name="security" msgid="2279008326210305401">"భద్రత"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"ఈ ప్రింటర్‌కి కొత్త భద్రతా సర్టిఫికెట్‌ అందించి ఉండవచ్చు లేదా వేరే పరికరం ఏదైనా దీన్ని అనుకరిస్తూ ఉండవచ్చు. కొత్త సర్టిఫికెట్‌ని ఆమోదిస్తారా?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"ఈ ప్రింటర్ ఇకపై ఎన్‌క్రిప్ట్ చేసిన ఫైల్‌లను తీసుకోదు అయినా ప్రింట్ చేయడాన్ని కొనసాగిస్తారా?"</string>
+ <string name="accept" msgid="4426153292469698134">"ఆమోదించు"</string>
+ <string name="reject" msgid="24751635160440693">"తిరస్కరించు"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index cf6f148..e73d8b9 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"ประตูเปิดอยู่"</string>
<string name="printer_jammed" msgid="5104099859384749499">"กระดาษติด"</string>
<string name="printer_offline" msgid="9196864753298645066">"ออฟไลน์"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"ใบรับรองไม่ถูกต้อง"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"ไม่ได้เข้ารหัส"</string>
<string name="printer_check" msgid="6428369671197132828">"ตรวจสอบเครื่องพิมพ์"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"กำลังรอส่ง"</string>
<string name="unreadable_input" msgid="2199948329556527912">"ไม่สามารถอ่านเอกสาร"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"ไม่ต้องจำ"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"เชื่อมต่อผ่าน Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"เชื่อมต่อผ่านเครือข่ายปัจจุบันที่ <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"ความปลอดภัย"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"เครื่องพิมพ์นี้ให้ใบรับรองความปลอดภัยใหม่ หรืออุปกรณ์อื่นแอบอ้างว่าเป็นเครื่องพิมพ์นี้ ยอมรับใบรับรองใหม่ไหม"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"เครื่องพิมพ์นี้ไม่ยอมรับงานที่เข้ารหัสอีกต่อไป พิมพ์ต่อไหม"</string>
+ <string name="accept" msgid="4426153292469698134">"ยอมรับ"</string>
+ <string name="reject" msgid="24751635160440693">"ปฏิเสธ"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 3419bea..390789e 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Bukas ang takip"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Na-stuck"</string>
<string name="printer_offline" msgid="9196864753298645066">"Offline"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Invalid ang certificate"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Hindi naka-encrypt"</string>
<string name="printer_check" msgid="6428369671197132828">"Suriin ang printer"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Naghihintay upang ipadala"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Hindi mabasa ang dokumento"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Kalimutan"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Kumokonekta sa pamamagitan ng Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Kumokonekta sa pamamagitan ng kasalukuyang network sa <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Seguridad"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Nagbigay ang printer na ito ng bagong certificate ng seguridad, o may ibang device na nagpapanggap bilang ito. Tanggapin ang bagong certificate?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Hindi na tumatanggap ng mga naka-encrypt na gawa ang printer na ito. Ipagpatuloy ang pag-print?"</string>
+ <string name="accept" msgid="4426153292469698134">"Tanggapin"</string>
+ <string name="reject" msgid="24751635160440693">"Tanggihan"</string>
</resources>
diff --git a/res/values-tr/lineage_strings.xml b/res/values-tr/lineage_strings.xml
new file mode 100644
index 0000000..ca114b3
--- /dev/null
+++ b/res/values-tr/lineage_strings.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi Doğrudan baskı</string>
+ <string name="recommendation_summary">Varsayılan Baskı Hizmeti temel seçenekler sunar. Bu yazıcının diğer seçenekleri başka bir baskı servisinden edinilebilir.</string>
+ <string name="recommendations_heading">Önerilen servisler</string>
+ <string name="recommendation_install_summary">Yüklemek için seçin</string>
+ <string name="recommendation_enable_summary">Etkinleştirmek için seçin</string>
+ <string name="recommendation_manage">Servisleri yönet</string>
+ <string name="connections">Bağlantılar</string>
+ <string name="fix">Düzelt</string>
+</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 6b3e43d..af02375 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Kapı açık"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Kağıt sıkıştı"</string>
<string name="printer_offline" msgid="9196864753298645066">"Çevrimdışı"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Bozuk sertifika"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Şifrelenmedi"</string>
<string name="printer_check" msgid="6428369671197132828">"Yazıcıyı kontrol et"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Gönderilmeyi bekliyor"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Doküman okunamadı"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Unut"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Kablosuz Doğrudan Bağlantı ile bağlanıyor"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Geçerli ağ ile <xliff:g id="IP_ADDRESS">%1$s</xliff:g> adresinden bağlanıyor"</string>
+ <string name="security" msgid="2279008326210305401">"Güvenlik"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Bu yazıcı yeni bir güvenlik sertifikası sağladı veya başka bir cihaz bu yazıcının kimliğine bürünüyor. Yeni sertifikayı kabul ediyor musunuz?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Bu yazıcı artık şifrelenmiş işleri kabul etmiyor. Yazdırmaya devam etmek istiyor musunuz?"</string>
+ <string name="accept" msgid="4426153292469698134">"Kabul et"</string>
+ <string name="reject" msgid="24751635160440693">"Reddet"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 5587f34..c3ed2e0 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Дверцята відчинені"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Застряг папір"</string>
<string name="printer_offline" msgid="9196864753298645066">"Офлайн"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Недійсний сертифікат"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Не зашифровано"</string>
<string name="printer_check" msgid="6428369671197132828">"Вибрати принтер"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Очікує надсилання"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Не вдалося прочитати документ"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Забути"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Під’єднується через Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Під’єднується через поточну мережу за IP-адресою <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Безпека"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Цей принтер надав новий сертифікат безпеки або інший пристрій видає себе за нього. Прийняти новий сертифікат?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Цей принтер більше не підтримує зашифровані завдання. Продовжити друк?"</string>
+ <string name="accept" msgid="4426153292469698134">"Прийняти"</string>
+ <string name="reject" msgid="24751635160440693">"Відхилити"</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index c47aa86..ca193e8 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"پرنٹر کا دروازہ کھلا ہے"</string>
<string name="printer_jammed" msgid="5104099859384749499">"پرنٹر میں رکاوٹ ہے"</string>
<string name="printer_offline" msgid="9196864753298645066">"آف لائن"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"بُرا سرٹیفیکیٹ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"مرموز کردہ نہیں ہے"</string>
<string name="printer_check" msgid="6428369671197132828">"پرنٹر چیک کریں"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"بھیجنے کیلئے منتظر ہے"</string>
<string name="unreadable_input" msgid="2199948329556527912">"دستاویز پڑھا نہیں جا سکا"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"بھول جائیں"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"‏بذریعہ Wi-Fi ڈائریکٹ منسلک کرتا ہے"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> پر موجودہ نیٹ ورک کے ذریعہ منسلک کرتا ہے"</string>
+ <string name="security" msgid="2279008326210305401">"سیکیورٹی"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"اس پرنٹر نے سیکیورٹی کا ایک نیا سرٹیفیکیٹ فراہم کیا ہے یا کوئی دوسرا آلہ اس کی شخصیت گیری کر رہا ہے۔ نیا سرٹیفیکیٹ قبول کریں؟"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"یہ پرنٹر اب مرموز کردہ جابز کو قبول نہیں کرتا ہے۔ پرنٹ کرنا جاری رکھیں؟"</string>
+ <string name="accept" msgid="4426153292469698134">"قبول کریں"</string>
+ <string name="reject" msgid="24751635160440693">"مسترد کریں"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 75de110..a1bc61d 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Eshikchasi ochiq"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Tiqilib qolgan"</string>
<string name="printer_offline" msgid="9196864753298645066">"Oflayn"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Sertifikat buzilgan"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Shifrlanmagan"</string>
<string name="printer_check" msgid="6428369671197132828">"Printerni tekshirish"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Yuborilishi kutilmoqda"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Hujjatni o‘qib bo‘lmadi"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Olib tashlash"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Wi-Fi Direct orqali ulanadi"</string>
<string name="connects_via_network" msgid="5990041581556733898">"<xliff:g id="IP_ADDRESS">%1$s</xliff:g> manzilida joriy tarmoq orqali ulanadi"</string>
+ <string name="security" msgid="2279008326210305401">"Xavfsizlik"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Bu printerga yangi xavfsizlik sertifikati berilgan. Bu printer nomi ostida boshqa printer ishlayotganga oʻxshaydi. Yangi sertifikatni qabul qilasizmi?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Bu printer endi shifrlangan vazifalarni qabul qilmaydi. Bosmaga chiqarilsinmi?"</string>
+ <string name="accept" msgid="4426153292469698134">"Roziman"</string>
+ <string name="reject" msgid="24751635160440693">"Rad etaman"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 765f492..2687ffb 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Cửa mở"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Kẹt giấy"</string>
<string name="printer_offline" msgid="9196864753298645066">"Ngoại tuyến"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Chứng chỉ không hợp lệ"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Không được mã hóa"</string>
<string name="printer_check" msgid="6428369671197132828">"Kiểm tra máy in"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Đang đợi gửi"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Không thể đọc tài liệu"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Xóa"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Kết nối qua Wi-Fi Direct"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Kết nối qua mạng hiện tại tại <xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Bảo mật"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Máy in này đã cung cấp một chứng chỉ bảo mật mới hoặc một thiết bị khác đang mạo danh máy in này. Chấp nhận chứng chỉ mới?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Máy in này không còn chấp nhận các lệnh in đã mã hóa. Bạn muốn tiếp tục in?"</string>
+ <string name="accept" msgid="4426153292469698134">"Chấp nhận"</string>
+ <string name="reject" msgid="24751635160440693">"Từ chối"</string>
</resources>
diff --git a/res/values-zh-rCN/lineage_strings.xml b/res/values-zh-rCN/lineage_strings.xml
new file mode 100644
index 0000000..04103f8
--- /dev/null
+++ b/res/values-zh-rCN/lineage_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2016 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_direct_printing">Wi-Fi 直连打印</string>
+ <string name="recommendation_summary">默认的打印服务提供基本选项。此打印机的其他选项可以从另一个打印服务中找到。</string>
+ <string name="recommendations_heading">建议的服务</string>
+ <string name="recommendation_install_summary">选择以安装</string>
+ <string name="recommendation_enable_summary">选择以启用</string>
+ <string name="recommendation_manage">管理服务</string>
+ <string name="connections">连接</string>
+ <string name="wifi_direct_permission_rationale">默认打印服务需要位置权限
+ 以访问 Wi-Fi 直连打印机,因为您的位置可以从附近的设备中推断出。</string>
+ <string name="fix">修复</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 0770ab7..0426d09 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"机盖未关"</string>
<string name="printer_jammed" msgid="5104099859384749499">"卡纸"</string>
<string name="printer_offline" msgid="9196864753298645066">"离线"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"证书有误"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"未加密"</string>
<string name="printer_check" msgid="6428369671197132828">"检查打印机"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"正在等待发送"</string>
<string name="unreadable_input" msgid="2199948329556527912">"无法读取文档"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"忽略"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"通过 WLAN 直连连接"</string>
<string name="connects_via_network" msgid="5990041581556733898">"在 <xliff:g id="IP_ADDRESS">%1$s</xliff:g> 通过当前网络连接"</string>
+ <string name="security" msgid="2279008326210305401">"安全"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"此打印机提供了新的安全证书,或其他设备正在冒充此打印机。要接受新证书吗?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"此打印机不再接受加密的作业。要继续打印吗?"</string>
+ <string name="accept" msgid="4426153292469698134">"接受"</string>
+ <string name="reject" msgid="24751635160440693">"拒绝"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index c577b9c..9144528 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"機門未關"</string>
<string name="printer_jammed" msgid="5104099859384749499">"卡紙"</string>
<string name="printer_offline" msgid="9196864753298645066">"離線"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"無效的憑證"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"未經加密"</string>
<string name="printer_check" msgid="6428369671197132828">"檢查打印機"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"正在等待傳送"</string>
<string name="unreadable_input" msgid="2199948329556527912">"無法讀取文件"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"清除"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"透過 Wi-Fi Direct 連線"</string>
<string name="connects_via_network" msgid="5990041581556733898">"透過目前的網絡 (<xliff:g id="IP_ADDRESS">%1$s</xliff:g>) 連線"</string>
+ <string name="security" msgid="2279008326210305401">"安全性"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"此打印機提供了新的安全憑證,或者另一部裝置正在冒用其身分。要接受新的憑證嗎?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"此打印機不再接受加密工作。要繼續列印嗎?"</string>
+ <string name="accept" msgid="4426153292469698134">"接受"</string>
+ <string name="reject" msgid="24751635160440693">"拒絕"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e46c7bf..ff5643b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"擋門處於開啟狀態"</string>
<string name="printer_jammed" msgid="5104099859384749499">"卡紙"</string>
<string name="printer_offline" msgid="9196864753298645066">"離線"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"錯誤的憑證"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"未加密"</string>
<string name="printer_check" msgid="6428369671197132828">"請檢查印表機"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"正在等待傳送"</string>
<string name="unreadable_input" msgid="2199948329556527912">"無法讀取文件"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"清除"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"透過 Wi-Fi Direct 連線"</string>
<string name="connects_via_network" msgid="5990041581556733898">"透過目前的網路 (<xliff:g id="IP_ADDRESS">%1$s</xliff:g>) 連線"</string>
+ <string name="security" msgid="2279008326210305401">"安全性"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"這台印表機提供新的安全性憑證,或有其他裝置冒用該印表機的身分。要接受新的憑證嗎?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"這台印表機不再支援已加密的工作。要繼續列印嗎?"</string>
+ <string name="accept" msgid="4426153292469698134">"接受"</string>
+ <string name="reject" msgid="24751635160440693">"拒絕"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index b8433f0..3904068 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -27,6 +27,8 @@
<string name="printer_door_open" msgid="2446302931916940874">"Umnyango uvulekile"</string>
<string name="printer_jammed" msgid="5104099859384749499">"Ijemile"</string>
<string name="printer_offline" msgid="9196864753298645066">"Okungaxhunyiwe kwi-inthanethi"</string>
+ <string name="printer_bad_certificate" msgid="1366180387095466268">"Isitifiketi esingalungile"</string>
+ <string name="printer_not_encrypted" msgid="1913051469275483673">"Akubetheliwe"</string>
<string name="printer_check" msgid="6428369671197132828">"Hlola iphrinta"</string>
<string name="waiting_to_send" msgid="2022115199902822180">"Ilindele ukuthumela"</string>
<string name="unreadable_input" msgid="2199948329556527912">"Ayikwazanga ukufunda idokhumenti"</string>
@@ -57,4 +59,9 @@
<string name="forget" msgid="892068061425802502">"Khohlwa"</string>
<string name="connects_via_wifi_direct" msgid="652300632780158437">"Ixhuma nge-Wi-Fi eqondile"</string>
<string name="connects_via_network" msgid="5990041581556733898">"Ixhuma ngenethiwekhi ku-<xliff:g id="IP_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="security" msgid="2279008326210305401">"Ukuvikela"</string>
+ <string name="certificate_update_request" msgid="1314796413107139475">"Le phrinta inikeze isitifiketi esisha sokuvikela, noma enye idivayisi izenza yona. Yamukela isitifiketi esisha?"</string>
+ <string name="not_encrypted_request" msgid="4871472176807381642">"Le phrinta ayisamukeli imisebenzi ebetheliwe. Qhubeka uphrinte?"</string>
+ <string name="accept" msgid="4426153292469698134">"Yamukela"</string>
+ <string name="reject" msgid="24751635160440693">"Nqaba"</string>
</resources>
diff --git a/res/values/lineage_strings.xml b/res/values/lineage_strings.xml
new file mode 100644
index 0000000..eb1d246
--- /dev/null
+++ b/res/values/lineage_strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Preference name for enable/disable of Wi-Fi Direct printing [CHAR LIMIT=UNLIMITED] -->
+ <string name="wifi_direct_printing">Wi-Fi Direct printing</string>
+
+ <!-- Explain purpose of recommendation fragment [CHAR LIMIT=UNLIMITED] -->
+ <string name="recommendation_summary">The Default Print Service provides basic options. Other options for this printer may be available from another print service.</string>
+ <!-- Heading for services that are not currently installed, but recommended [CHAR LIMIT=UNLIMITED] -->
+ <string name="recommendations_heading">Recommended services</string>
+ <!-- Summary for recommended services that are not installed [CHAR LIMIT=UNLIMITED] -->
+ <string name="recommendation_install_summary">Select to install</string>
+ <!-- Summary for recommended services that are installed [CHAR LIMIT=UNLIMITED] -->
+ <string name="recommendation_enable_summary">Select to enable</string>
+ <!-- Button to allow user to enable/disable installed print services. [CHAR LIMIT=UNLIMITED] -->
+ <string name="recommendation_manage">Manage services</string>
+
+ <!-- Channel name for connection-related notifications [CHAR LIMIT=40] -->
+ <string name="connections">Connections</string>
+ <!-- Message shown in dialog, toast, or notification if the service cannot get Wi-Fi Direct permissions [CHAR LIMIT=UNLIMITED] -->
+ <string name="wifi_direct_permission_rationale">Default Print Service needs location permissions
+ to access Wi-Fi Direct printers because your location can be inferred from nearby devices.</string>
+ <!-- Button label in a notification or dialog. This button leads to a request to grant permissions [CHAR LIMIT=20] -->
+ <string name="fix">Fix</string>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index eac63ce..54cc5b9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -29,6 +29,8 @@
<string name="printer_door_open">Door open</string>
<string name="printer_jammed">Jammed</string>
<string name="printer_offline">Offline</string>
+ <string name="printer_bad_certificate">Bad certificate</string>
+ <string name="printer_not_encrypted">Not encrypted</string>
<string name="printer_check">Check printer</string>
<string name="waiting_to_send">Waiting to send</string>
@@ -82,4 +84,15 @@
<xliff:g example="192.168.0.101" id="ip_address">%1$s</xliff:g>
</string>
+ <!-- Channel name for security-related notifications [CHAR LIMIT=40] -->
+ <string name="security">Security</string>
+ <!-- Message shown in notification if a printer presented a changes security certificate [CHAR LIMIT=UNLIMITED] -->
+ <string name="certificate_update_request">This printer provided a new security certificate, or another
+ device is impersonating it. Accept the new certificate?</string>
+ <!-- Message shown in notification if a printer no longer supports encryption [CHAR LIMIT=UNLIMITED] -->
+ <string name="not_encrypted_request">This printer no longer accepts encrypted jobs. Continue printing?</string>
+ <!-- Button label in a notification. This button accepts a printer security change [CHAR LIMIT=20] -->
+ <string name="accept">Accept</string>
+ <!-- Button label in a notification. This button rejects a printer security change [CHAR LIMIT=20] -->
+ <string name="reject">Reject</string>
</resources>
diff --git a/res/xml/add_printers_prefs.xml b/res/xml/add_printers_prefs.xml
index ce44052..2f6d981 100644
--- a/res/xml/add_printers_prefs.xml
+++ b/res/xml/add_printers_prefs.xml
@@ -25,17 +25,24 @@
android:persistent="false"
android:order="1" />
+ <SwitchPreference
+ android:key="wifi_direct_printing"
+ android:title="@string/wifi_direct_printing"
+ android:iconSpaceReserved="true"
+ android:persistent="false"
+ android:order="2" />
+
<Preference
android:key="find_wifi_direct"
android:title="@string/find_wifi_direct"
android:icon="@drawable/ic_menu_search"
android:persistent="false"
- android:order="2" />
+ android:order="3" />
<PreferenceCategory
android:key="saved_printers"
android:title="@string/saved_printers"
android:persistent="false"
- android:order="3" />
+ android:order="4" />
</PreferenceScreen>
diff --git a/res/xml/more_options_prefs.xml b/res/xml/more_options_prefs.xml
new file mode 100644
index 0000000..b491a74
--- /dev/null
+++ b/res/xml/more_options_prefs.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+-->
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <Preference
+ android:key="pref_static_explanation"
+ android:selectable="false"
+ android:summary="@string/recommendation_summary"
+ android:order="0" />
+
+ <PreferenceCategory
+ android:key="recommendation_category"
+ android:title="@string/recommendations_heading"
+ android:persistent="false"
+ android:order="1"/>
+
+ <Preference
+ android:key="manage"
+ android:title="@string/recommendation_manage"
+ android:icon="@drawable/ic_settings_gear"
+ android:persistent="false"
+ android:order="2" />
+</PreferenceScreen>
diff --git a/res/xml/printservice.xml b/res/xml/printservice.xml
index 141e246..bcc7b97 100644
--- a/res/xml/printservice.xml
+++ b/res/xml/printservice.xml
@@ -17,4 +17,5 @@
<print-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:addPrintersActivity="com.android.bips.ui.AddPrintersActivity"
+ android:advancedPrintOptionsActivity="com.android.bips.ui.MoreOptionsActivity"
/> \ No newline at end of file
diff --git a/src/com/android/bips/BuiltInPrintService.java b/src/com/android/bips/BuiltInPrintService.java
index 2bb73ef..f9931a5 100644
--- a/src/com/android/bips/BuiltInPrintService.java
+++ b/src/com/android/bips/BuiltInPrintService.java
@@ -17,13 +17,20 @@
package com.android.bips;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
import android.net.nsd.NsdManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
+import android.print.PrinterId;
import android.printservice.PrintJob;
import android.printservice.PrintService;
import android.printservice.PrinterDiscoverySession;
@@ -40,6 +47,7 @@ import com.android.bips.discovery.NsdResolveQueue;
import com.android.bips.discovery.P2pDiscovery;
import com.android.bips.ipp.Backend;
import com.android.bips.ipp.CapabilitiesCache;
+import com.android.bips.ipp.CertificateStore;
import com.android.bips.p2p.P2pMonitor;
import com.android.bips.p2p.P2pUtils;
import com.android.bips.util.BroadcastMonitor;
@@ -51,6 +59,20 @@ public class BuiltInPrintService extends PrintService {
private static final boolean DEBUG = false;
private static final int IPPS_PRINTER_DELAY = 150;
private static final int P2P_DISCOVERY_DELAY = 1000;
+ private static final String CHANNEL_ID_SECURITY = "security";
+ private static final String TAG_CERTIFICATE_REQUEST =
+ BuiltInPrintService.class.getCanonicalName() + ".CERTIFICATE_REQUEST";
+ private static final String ACTION_CERTIFICATE_ACCEPT =
+ BuiltInPrintService.class.getCanonicalName() + ".CERTIFICATE_ACCEPT";
+ private static final String ACTION_CERTIFICATE_REJECT =
+ BuiltInPrintService.class.getCanonicalName() + ".CERTIFICATE_REJECT";
+ public static final String ACTION_P2P_PERMISSION_CANCEL =
+ BuiltInPrintService.class.getCanonicalName() + ".P2P_PERMISSION_CANCEL";
+ private static final String EXTRA_CERTIFICATE = "certificate";
+ private static final String EXTRA_PRINTER_ID = "printer-id";
+ private static final String EXTRA_PRINTER_UUID = "printer-uuid";
+ private static final int CERTIFICATE_REQUEST_ID = 1000;
+ public static final int P2P_PERMISSION_REQUEST_ID = 1001;
// Present because local activities can bind, but cannot access this object directly
private static WeakReference<BuiltInPrintService> sInstance;
@@ -60,12 +82,14 @@ public class BuiltInPrintService extends PrintService {
private Discovery mMdnsDiscovery;
private ManualDiscovery mManualDiscovery;
private CapabilitiesCache mCapabilitiesCache;
+ private CertificateStore mCertificateStore;
private JobQueue mJobQueue;
private Handler mMainHandler;
private Backend mBackend;
private WifiManager.WifiLock mWifiLock;
private P2pMonitor mP2pMonitor;
private NsdResolveQueue mNsdResolveQueue;
+ private P2pPermissionManager mP2pPermissionManager;
/**
* Return the current print service instance, if running
@@ -85,9 +109,13 @@ public class BuiltInPrintService extends PrintService {
}
}
super.onCreate();
+ createNotificationChannel();
+ mP2pPermissionManager = new P2pPermissionManager(this);
+ mP2pPermissionManager.reset();
sInstance = new WeakReference<>(this);
mBackend = new Backend(this);
+ mCertificateStore = new CertificateStore(this);
mCapabilitiesCache = new CapabilitiesCache(this, mBackend,
CapabilitiesCache.DEFAULT_MAX_CONCURRENT);
mP2pMonitor = new P2pMonitor(this);
@@ -116,6 +144,7 @@ public class BuiltInPrintService extends PrintService {
@Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy()");
+ mP2pPermissionManager.closeNotification();
mCapabilitiesCache.close();
mP2pMonitor.stopAll();
mBackend.close();
@@ -186,6 +215,13 @@ public class BuiltInPrintService extends PrintService {
}
/**
+ * Return a general {@link P2pPermissionManager}
+ */
+ public P2pPermissionManager getP2pPermissionManager() {
+ return mP2pPermissionManager;
+ }
+
+ /**
* Listen for a set of broadcast messages until stopped
*/
public BroadcastMonitor receiveBroadcasts(BroadcastReceiver receiver, String... actions) {
@@ -200,6 +236,13 @@ public class BuiltInPrintService extends PrintService {
}
/**
+ * Return a store of certificate public keys for supporting trust-on-first-use.
+ */
+ public CertificateStore getCertificateStore() {
+ return mCertificateStore;
+ }
+
+ /**
* Return the main handler for posting {@link Runnable} objects to the main UI
*/
public Handler getMainHandler() {
@@ -241,4 +284,100 @@ public class BuiltInPrintService extends PrintService {
mWifiLock.release();
}
}
+
+ /**
+ * Set up a channel for notifications.
+ */
+ private void createNotificationChannel() {
+ NotificationChannel channel = new NotificationChannel(CHANNEL_ID_SECURITY,
+ getString(R.string.security), NotificationManager.IMPORTANCE_HIGH);
+
+ NotificationManager manager = (NotificationManager) getSystemService(
+ Context.NOTIFICATION_SERVICE);
+ manager.createNotificationChannel(channel);
+ }
+
+ /**
+ * Notify the user of a certificate change (could be a MITM attack) and allow response.
+ *
+ * When certificate is null, the printer is being downgraded to no-encryption.
+ */
+ void notifyCertificateChange(String printerName, PrinterId printerId, String printerUuid,
+ byte[] certificate) {
+ String message;
+ if (certificate == null) {
+ message = getString(R.string.not_encrypted_request);
+ } else {
+ message = getString(R.string.certificate_update_request);
+ }
+
+ Intent rejectIntent = new Intent(this, BuiltInPrintService.class)
+ .setAction(ACTION_CERTIFICATE_REJECT)
+ .putExtra(EXTRA_PRINTER_ID, printerId);
+ PendingIntent pendingRejectIntent = PendingIntent.getService(this, CERTIFICATE_REQUEST_ID,
+ rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ Notification.Action rejectAction = new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_printservice),
+ getString(R.string.reject), pendingRejectIntent).build();
+
+ PendingIntent deleteIntent = PendingIntent.getService(this, CERTIFICATE_REQUEST_ID,
+ rejectIntent, 0);
+
+ Intent acceptIntent = new Intent(this, BuiltInPrintService.class)
+ .setAction(ACTION_CERTIFICATE_ACCEPT)
+ .putExtra(EXTRA_PRINTER_UUID, printerUuid)
+ .putExtra(EXTRA_PRINTER_ID, printerId);
+ if (certificate != null) {
+ acceptIntent.putExtra(EXTRA_CERTIFICATE, certificate);
+ }
+ PendingIntent pendingAcceptIntent = PendingIntent.getService(this, CERTIFICATE_REQUEST_ID,
+ acceptIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ Notification.Action acceptAction = new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_printservice),
+ getString(R.string.accept), pendingAcceptIntent).build();
+
+ Notification notification = new Notification.Builder(this, CHANNEL_ID_SECURITY)
+ .setContentTitle(printerName)
+ .setSmallIcon(R.drawable.ic_printservice)
+ .setStyle(new Notification.BigTextStyle().bigText(message))
+ .setContentText(message)
+ .setAutoCancel(true)
+ .addAction(rejectAction)
+ .addAction(acceptAction)
+ .setDeleteIntent(deleteIntent)
+ .build();
+
+ NotificationManager manager = (NotificationManager) getSystemService(
+ Context.NOTIFICATION_SERVICE);
+ manager.notify(TAG_CERTIFICATE_REQUEST, CERTIFICATE_REQUEST_ID, notification);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ if (DEBUG) Log.d(TAG, "Received action=" + intent.getAction());
+ NotificationManager manager = (NotificationManager) getSystemService(
+ Context.NOTIFICATION_SERVICE);
+ if (ACTION_CERTIFICATE_ACCEPT.equals(intent.getAction())) {
+ byte[] certificate = intent.getByteArrayExtra(EXTRA_CERTIFICATE);
+ PrinterId printerId = intent.getParcelableExtra(EXTRA_PRINTER_ID);
+ String printerUuid = intent.getStringExtra(EXTRA_PRINTER_UUID);
+ if (certificate != null) {
+ mCertificateStore.put(printerUuid, certificate);
+ } else {
+ mCertificateStore.remove(printerUuid);
+ }
+ // Restart the job with the updated certificate in place
+ mJobQueue.restart(printerId);
+ manager.cancel(TAG_CERTIFICATE_REQUEST, CERTIFICATE_REQUEST_ID);
+ } else if (ACTION_CERTIFICATE_REJECT.equals(intent.getAction())) {
+ // Cancel any job in certificate state for this uuid
+ PrinterId printerId = intent.getParcelableExtra(EXTRA_PRINTER_ID);
+ mJobQueue.cancel(printerId);
+ manager.cancel(TAG_CERTIFICATE_REQUEST, CERTIFICATE_REQUEST_ID);
+ } else if (ACTION_P2P_PERMISSION_CANCEL.equals(intent.getAction())) {
+ // Inform p2pPermissionManager the user canceled the notification (non-permanent)
+ mP2pPermissionManager.applyPermissionChange(false);
+ }
+ return START_NOT_STICKY;
+ }
}
diff --git a/src/com/android/bips/JobQueue.java b/src/com/android/bips/JobQueue.java
index 6b64b41..f34dcdf 100644
--- a/src/com/android/bips/JobQueue.java
+++ b/src/com/android/bips/JobQueue.java
@@ -18,13 +18,16 @@
package com.android.bips;
import android.print.PrintJobId;
+import android.print.PrinterId;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
/** Manages a job queue, ensuring only one job is printed at a time */
class JobQueue {
- private final List<LocalPrintJob> mJobs = new ArrayList<>();
+ private final List<LocalPrintJob> mJobs = new CopyOnWriteArrayList<>();
private LocalPrintJob mCurrent;
/** Queue a print job for printing at the next available opportunity */
@@ -33,6 +36,26 @@ class JobQueue {
startNextJob();
}
+ /** Cancel any previously queued job for a printer with the supplied ID. */
+ void cancel(PrinterId printerId) {
+ for (LocalPrintJob job : mJobs) {
+ if (printerId.equals(job.getPrintJob().getInfo().getPrinterId())) {
+ cancel(job.getPrintJobId());
+ }
+ }
+
+ if (mCurrent != null && printerId.equals(mCurrent.getPrintJob().getInfo().getPrinterId())) {
+ cancel(mCurrent.getPrintJobId());
+ }
+ }
+
+ /** Restart any blocked job for a printer with this ID. */
+ void restart(PrinterId printerId) {
+ if (mCurrent != null && printerId.equals(mCurrent.getPrintJob().getInfo().getPrinterId())) {
+ mCurrent.restart();
+ }
+ }
+
/** Cancel a previously queued job */
void cancel(PrintJobId id) {
// If a job hasn't started, kill it instantly.
@@ -44,7 +67,7 @@ class JobQueue {
}
}
- if (mCurrent.getPrintJobId().equals(id)) {
+ if (mCurrent != null && mCurrent.getPrintJobId().equals(id)) {
mCurrent.cancel();
}
}
diff --git a/src/com/android/bips/LocalPrintJob.java b/src/com/android/bips/LocalPrintJob.java
index ba0776c..adadd14 100644
--- a/src/com/android/bips/LocalPrintJob.java
+++ b/src/com/android/bips/LocalPrintJob.java
@@ -27,6 +27,7 @@ import com.android.bips.discovery.DiscoveredPrinter;
import com.android.bips.discovery.MdnsDiscovery;
import com.android.bips.ipp.Backend;
import com.android.bips.ipp.CapabilitiesCache;
+import com.android.bips.ipp.CertificateStore;
import com.android.bips.ipp.JobStatus;
import com.android.bips.jni.BackendConstants;
import com.android.bips.jni.LocalPrinterCapabilities;
@@ -42,6 +43,7 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
CapabilitiesCache.OnLocalPrinterCapabilities {
private static final String TAG = LocalPrintJob.class.getSimpleName();
private static final boolean DEBUG = false;
+ private static final String IPPS_SCHEME = "ipps";
/** Maximum time to wait to find a printer before failing the job */
private static final int DISCOVERY_TIMEOUT = 2 * 60 * 1000;
@@ -51,8 +53,9 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
private static final int STATE_DISCOVERY = 1;
private static final int STATE_CAPABILITIES = 2;
private static final int STATE_DELIVERING = 3;
- private static final int STATE_CANCEL = 4;
- private static final int STATE_DONE = 5;
+ private static final int STATE_SECURITY = 4;
+ private static final int STATE_CANCEL = 5;
+ private static final int STATE_DONE = 6;
private final BuiltInPrintService mPrintService;
private final PrintJob mPrintJob;
@@ -63,6 +66,8 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
private Uri mPath;
private DelayedAction mDiscoveryTimeout;
private P2pPrinterConnection mConnection;
+ private LocalPrinterCapabilities mCapabilities;
+ private CertificateStore mCertificateStore;
/**
* Construct the object; use {@link #start(Consumer)} to begin job processing.
@@ -71,6 +76,7 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
mPrintService = printService;
mBackend = backend;
mPrintJob = printJob;
+ mCertificateStore = mPrintService.getCertificateStore();
mState = STATE_INIT;
// Tell the job it is blocked (until start())
@@ -107,12 +113,24 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
mPrintService.getDiscovery().start(this);
}
+ /**
+ * Restart the job if possible.
+ */
+ void restart() {
+ if (DEBUG) Log.d(TAG, "restart() " + mPrintJob + " in state " + mState);
+ if (mState == STATE_SECURITY) {
+ mCapabilities.certificate = mCertificateStore.get(mCapabilities.uuid);
+ deliver();
+ }
+ }
+
void cancel() {
if (DEBUG) Log.d(TAG, "cancel() " + mPrintJob + " in state " + mState);
switch (mState) {
case STATE_DISCOVERY:
case STATE_CAPABILITIES:
+ case STATE_SECURITY:
// Cancel immediately
mState = STATE_CANCEL;
finish(false, null);
@@ -156,6 +174,14 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
mPrintService.getDiscovery().stop(this);
mState = STATE_CAPABILITIES;
mPath = printer.path;
+ // Upgrade to IPPS path if present
+ for (Uri path : printer.paths) {
+ if (IPPS_SCHEME.equals(path.getScheme())) {
+ mPath = path;
+ break;
+ }
+ }
+
mPrintService.getCapabilitiesCache().request(printer, true, this);
}
@@ -213,14 +239,36 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
if (mDiscoveryTimeout != null) {
mDiscoveryTimeout.cancel();
}
+ mCapabilities = capabilities;
+ deliver();
+ }
+ }
+
+ private void deliver() {
+ if (mCapabilities.certificate != null && !IPPS_SCHEME.equals(mPath.getScheme())) {
+ mState = STATE_SECURITY;
+ mPrintJob.block(mPrintService.getString(R.string.printer_not_encrypted));
+ mPrintService.notifyCertificateChange(mCapabilities.name,
+ mPrintJob.getInfo().getPrinterId(), mCapabilities.uuid, null);
+ } else {
mState = STATE_DELIVERING;
mPrintJob.start();
- mBackend.print(mPath, mPrintJob, capabilities, this::handleJobStatus);
+ mBackend.print(mPath, mPrintJob, mCapabilities, this::handleJobStatus);
}
}
private void handleJobStatus(JobStatus jobStatus) {
if (DEBUG) Log.d(TAG, "onJobStatus() " + jobStatus);
+
+ byte[] certificate = jobStatus.getCertificate();
+ if (certificate != null && mCapabilities != null) {
+ // If there is no certificate, record this one
+ if (mCertificateStore.get(mCapabilities.uuid) == null) {
+ if (DEBUG) Log.d(TAG, "Recording new certificate");
+ mCertificateStore.put(mCapabilities.uuid, certificate);
+ }
+ }
+
switch (jobStatus.getJobState()) {
case BackendConstants.JOB_STATE_DONE:
switch (jobStatus.getJobResult()) {
@@ -236,7 +284,11 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
break;
default:
// Job failed
- finish(false, null);
+ if (jobStatus.getBlockedReasonId() == R.string.printer_bad_certificate) {
+ handleBadCertificate(jobStatus);
+ } else {
+ finish(false, null);
+ }
break;
}
break;
@@ -260,6 +312,20 @@ class LocalPrintJob implements MdnsDiscovery.Listener, ConnectionListener,
}
}
+ private void handleBadCertificate(JobStatus jobStatus) {
+ byte[] certificate = jobStatus.getCertificate();
+
+ if (certificate == null) {
+ mPrintJob.fail(mPrintService.getString(R.string.printer_bad_certificate));
+ } else {
+ if (DEBUG) Log.d(TAG, "Certificate change detected.");
+ mState = STATE_SECURITY;
+ mPrintJob.block(mPrintService.getString(R.string.printer_bad_certificate));
+ mPrintService.notifyCertificateChange(mCapabilities.name,
+ mPrintJob.getInfo().getPrinterId(), mCapabilities.uuid, certificate);
+ }
+ }
+
/**
* Terminate the job, issuing appropriate notifications.
*
diff --git a/src/com/android/bips/P2pPermissionManager.java b/src/com/android/bips/P2pPermissionManager.java
new file mode 100644
index 0000000..4773818
--- /dev/null
+++ b/src/com/android/bips/P2pPermissionManager.java
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2019 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 com.android.bips;
+
+import static android.Manifest.permission.ACCESS_FINE_LOCATION;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.widget.Toast;
+
+import com.android.bips.ui.AddPrintersActivity;
+import com.android.bips.ui.AddPrintersFragment;
+
+/**
+ * Manage Wi-Fi Direct permission requirements and state.
+ */
+public class P2pPermissionManager {
+ private static final String TAG = P2pPermissionManager.class.getCanonicalName();
+ private static final boolean DEBUG = false;
+
+ private static final String CHANNEL_ID_CONNECTIONS = "connections";
+ public static final int REQUEST_P2P_PERMISSION_CODE = 1000;
+
+ private static final String STATE_KEY = "state";
+
+ private static final P2pPermissionRequest sFinishedRequest = () -> { };
+
+ private final Context mContext;
+ private final SharedPreferences mPrefs;
+ private final NotificationManager mNotificationManager;
+
+ public P2pPermissionManager(Context context) {
+ mContext = context;
+ mPrefs = mContext.getSharedPreferences(TAG, 0);
+ mNotificationManager = mContext.getSystemService(NotificationManager.class);
+ }
+
+ /**
+ * Reset any temporary modes.
+ */
+ public void reset() {
+ if (getState() == State.TEMPORARILY_DISABLED) {
+ setState(State.DENIED);
+ }
+ }
+
+ /**
+ * Update the current P2P permissions request state.
+ */
+ public void setState(State state) {
+ if (DEBUG) Log.d(TAG, "Setting state=" + state);
+ mPrefs.edit().putString(STATE_KEY, state.name()).apply();
+ }
+
+ /**
+ * Return true if P2P features are enabled.
+ */
+ public boolean isP2pEnabled() {
+ return getState() == State.ALLOWED;
+ }
+
+ /**
+ * The user has made a permissions-related choice.
+ */
+ public void applyPermissionChange(boolean permanent) {
+ closeNotification();
+ if (hasP2pPermission()) {
+ setState(State.ALLOWED);
+ } else {
+ // Inform the user and don't try again for the rest of this session.
+ setState(permanent ? State.DISABLED : State.TEMPORARILY_DISABLED);
+ Toast.makeText(mContext, R.string.wifi_direct_permission_rationale, Toast.LENGTH_LONG)
+ .show();
+ }
+ }
+
+ /**
+ * Return true if the user has granted P2P-related permission.
+ */
+ private boolean hasP2pPermission() {
+ return mContext.checkSelfPermission(ACCESS_FINE_LOCATION)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
+ * Request P2P permission from the user, until the user makes a selection or the returned
+ * {@link P2pPermissionRequest} is closed.
+ *
+ * Note: if requested on behalf of an Activity, the Activity MUST call
+ * {@link P2pPermissionManager#applyPermissionChange(boolean)} whenever
+ * {@link Activity#onRequestPermissionsResult(int, String[], int[])} is called with code
+ * {@link P2pPermissionManager#REQUEST_P2P_PERMISSION_CODE}.
+ */
+ public P2pPermissionRequest request(boolean explain, P2pPermissionListener listener) {
+ // Check current permission level
+ State state = getState();
+
+ if (DEBUG) Log.d(TAG, "request() state=" + state);
+
+ if (state.isTerminal()) {
+ listener.onP2pPermissionComplete(state == State.ALLOWED);
+ // Nothing to close because no listener registered.
+ return sFinishedRequest;
+ }
+
+ SharedPreferences.OnSharedPreferenceChangeListener preferenceListener =
+ listenForPreferenceChanges(listener);
+
+ if (mContext instanceof Activity) {
+ Activity activity = (Activity) mContext;
+ if (explain && activity.shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
+ explain(activity);
+ } else {
+ request(activity);
+ }
+ } else {
+ showNotification();
+ }
+
+ return () -> {
+ // Allow the caller to close this request if it no longer cares about the result
+ closeNotification();
+ mPrefs.unregisterOnSharedPreferenceChangeListener(preferenceListener);
+ };
+ }
+
+ /**
+ * Use the activity to request permissions if possible.
+ */
+ private void request(Activity activity) {
+ activity.requestPermissions(new String[]{ACCESS_FINE_LOCATION},
+ REQUEST_P2P_PERMISSION_CODE);
+ }
+
+ private void explain(Activity activity) {
+ // User denied, but asked us to use P2P, so explain and redirect to settings
+ DialogInterface.OnClickListener clickListener = (dialog, which) -> {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ request(activity);
+ }
+ };
+
+ new AlertDialog.Builder(new ContextThemeWrapper(activity,
+ android.R.style.Theme_Material_Settings))
+ .setMessage(mContext.getString(R.string.wifi_direct_permission_rationale))
+ .setPositiveButton(R.string.fix, clickListener)
+ .show();
+ }
+
+ private SharedPreferences.OnSharedPreferenceChangeListener listenForPreferenceChanges(
+ P2pPermissionListener listener) {
+ SharedPreferences.OnSharedPreferenceChangeListener preferenceListener =
+ new SharedPreferences.OnSharedPreferenceChangeListener() {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+ String key) {
+ State state = getState();
+ if (state.isTerminal() || state == State.DENIED) {
+ listener.onP2pPermissionComplete(state == State.ALLOWED);
+ mPrefs.unregisterOnSharedPreferenceChangeListener(this);
+ }
+ }
+ };
+ mPrefs.registerOnSharedPreferenceChangeListener(preferenceListener);
+ return preferenceListener;
+ }
+
+ /**
+ * Deliver a notification to the user.
+ */
+ private void showNotification() {
+ // Because we are not in an activity create a notification to do the work
+ mNotificationManager.createNotificationChannel(new NotificationChannel(
+ CHANNEL_ID_CONNECTIONS, mContext.getString(R.string.connections),
+ NotificationManager.IMPORTANCE_HIGH));
+
+ Intent proceedIntent = new Intent(mContext, AddPrintersActivity.class);
+ proceedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ proceedIntent.putExtra(AddPrintersFragment.EXTRA_FIX_P2P_PERMISSION, true);
+ PendingIntent proceedPendingIntent = PendingIntent.getActivity(mContext, 0,
+ proceedIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ Notification.Action fixAction = new Notification.Action.Builder(
+ Icon.createWithResource(mContext, R.drawable.ic_printservice),
+ mContext.getString(R.string.fix), proceedPendingIntent).build();
+
+ Intent cancelIntent = new Intent(mContext, BuiltInPrintService.class)
+ .setAction(BuiltInPrintService.ACTION_P2P_PERMISSION_CANCEL);
+ PendingIntent cancelPendingIndent = PendingIntent.getService(mContext,
+ BuiltInPrintService.P2P_PERMISSION_REQUEST_ID, cancelIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ Notification.Action cancelAction = new Notification.Action.Builder(
+ Icon.createWithResource(mContext, R.drawable.ic_printservice),
+ mContext.getString(android.R.string.cancel), cancelPendingIndent).build();
+
+ Notification notification = new Notification.Builder(mContext, CHANNEL_ID_CONNECTIONS)
+ .setSmallIcon(R.drawable.ic_printservice)
+ .setStyle(new Notification.BigTextStyle().bigText(
+ mContext.getString(R.string.wifi_direct_permission_rationale)))
+ .setAutoCancel(true)
+ .setContentIntent(proceedPendingIntent)
+ .setDeleteIntent(cancelPendingIndent)
+ .addAction(fixAction)
+ .addAction(cancelAction)
+ .build();
+
+ mNotificationManager.notify(BuiltInPrintService.P2P_PERMISSION_REQUEST_ID, notification);
+ }
+
+ /**
+ * Return the current {@link State}.
+ */
+ public State getState() {
+ // Look up stored state
+ String stateString = mPrefs.getString(STATE_KEY, State.DENIED.name());
+ State state = State.valueOf(stateString);
+
+ if (state == State.DISABLED) {
+ // If disabled do no further checking
+ return state;
+ }
+
+ boolean hasPermission = hasP2pPermission();
+ if (hasPermission && state != State.ALLOWED) {
+ // Upgrade state if now allowed
+ state = State.ALLOWED;
+ setState(state);
+ } else if (!hasPermission && state == State.ALLOWED) {
+ state = State.DENIED;
+ setState(state);
+ }
+ return state;
+ }
+
+ /**
+ * Close any outstanding notification.
+ */
+ void closeNotification() {
+ mNotificationManager.cancel(BuiltInPrintService.P2P_PERMISSION_REQUEST_ID);
+ }
+
+ /**
+ * The current P2P permission request state.
+ */
+ public enum State {
+ // The user has not granted permissions.
+ DENIED,
+ // The user did not grant permissions this time but try again next time.
+ TEMPORARILY_DISABLED,
+ // The user explicitly disabled or chose not to enable P2P.
+ DISABLED,
+ // Permissions are granted.
+ ALLOWED;
+
+ /** Return true if the user {@link State} is at a final permissions state. */
+ public boolean isTerminal() {
+ return this != DENIED;
+ }
+ }
+
+ /**
+ * Listener for determining when a P2P permission request is complete.
+ */
+ public interface P2pPermissionListener {
+ /**
+ * Invoked when it is known that the user has allowed or denied the permission request.
+ */
+ void onP2pPermissionComplete(boolean allowed);
+ }
+
+ /**
+ * A closeable request for grant of P2P permissions.
+ */
+ public interface P2pPermissionRequest extends AutoCloseable {
+ @Override
+ void close();
+ }
+}
diff --git a/src/com/android/bips/discovery/DiscoveredPrinter.java b/src/com/android/bips/discovery/DiscoveredPrinter.java
index 5d452af..6a135b8 100644
--- a/src/com/android/bips/discovery/DiscoveredPrinter.java
+++ b/src/com/android/bips/discovery/DiscoveredPrinter.java
@@ -26,6 +26,8 @@ import android.util.JsonWriter;
import java.io.IOException;
import java.io.StringWriter;
+import java.util.Collections;
+import java.util.List;
import java.util.Objects;
/** Represents a network-visible printer */
@@ -42,6 +44,9 @@ public class DiscoveredPrinter {
/** Resource path at which the print service can be reached */
public final Uri path;
+ /** All paths at which this this printer can be reached. Includes "path". */
+ public final List<Uri> paths;
+
/** Lazily-created printer id. */
private PrinterId mPrinterId;
@@ -50,16 +55,29 @@ public class DiscoveredPrinter {
*
* @param uuid Unique identification of the network printer, if known
* @param name Self-identified printer or service name
- * @param path Network path at which the printer is currently available
+ * @param paths One or more network paths at which the printer is currently available
* @param location Self-advertised location of the printer, if known
*/
- public DiscoveredPrinter(Uri uuid, String name, Uri path, String location) {
+ public DiscoveredPrinter(Uri uuid, String name, List<Uri> paths, String location) {
this.uuid = uuid;
this.name = name;
- this.path = path;
+ this.path = paths.get(0);
+ this.paths = Collections.unmodifiableList(paths);
this.location = location;
}
+ /**
+ * Construct minimal information about a network printer
+ *
+ * @param uuid Unique identification of the network printer, if known
+ * @param name Self-identified printer or service name
+ * @param path Network path at which the printer is currently available
+ * @param location Self-advertised location of the printer, if known
+ */
+ public DiscoveredPrinter(Uri uuid, String name, Uri path, String location) {
+ this(uuid, name, Collections.singletonList(path), location);
+ }
+
/** Construct an object based on field values of an JSON object found next in the JsonReader */
public DiscoveredPrinter(JsonReader reader) throws IOException {
String printerName = null, location = null;
@@ -91,6 +109,7 @@ public class DiscoveredPrinter {
this.uuid = uuid;
this.name = printerName;
this.path = path;
+ this.paths = Collections.singletonList(path);
this.location = location;
}
@@ -103,6 +122,18 @@ public class DiscoveredPrinter {
}
/**
+ * Return true if this printer has a secure (encrypted) path.
+ */
+ public boolean isSecure() {
+ for (Uri path : paths) {
+ if (path.getScheme().equals("ipps")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Return a host string for the user to see (an IP address or hostname without port number)
*/
public String getHost() {
@@ -139,7 +170,7 @@ public class DiscoveredPrinter {
DiscoveredPrinter other = (DiscoveredPrinter) obj;
return Objects.equals(uuid, other.uuid)
&& Objects.equals(name, other.name)
- && Objects.equals(path, other.path)
+ && Objects.equals(paths, other.paths)
&& Objects.equals(location, other.location);
}
@@ -148,7 +179,7 @@ public class DiscoveredPrinter {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + (uuid != null ? uuid.hashCode() : 0);
- result = 31 * result + path.hashCode();
+ result = 31 * result + paths.hashCode();
result = 31 * result + (location != null ? location.hashCode() : 0);
return result;
}
diff --git a/src/com/android/bips/discovery/MultiDiscovery.java b/src/com/android/bips/discovery/MultiDiscovery.java
index d564db9..93f68b4 100644
--- a/src/com/android/bips/discovery/MultiDiscovery.java
+++ b/src/com/android/bips/discovery/MultiDiscovery.java
@@ -44,31 +44,50 @@ public class MultiDiscovery extends Discovery {
mChildListener = new Listener() {
@Override
public void onPrinterFound(DiscoveredPrinter printer) {
- printerFound(first(printer.getUri()));
+ printerFound(merged(printer.getUri()));
}
@Override
public void onPrinterLost(DiscoveredPrinter printer) {
// Merge remaining printer records, if any
- DiscoveredPrinter first = first(printer.getUri());
- if (first == null) {
+ DiscoveredPrinter remaining = merged(printer.getUri());
+ if (remaining == null) {
printerLost(printer.getUri());
} else {
- printerFound(first);
+ printerFound(remaining);
}
}
};
}
- /** For a given URI return the first matching record, based on discovery mechanism order */
- private DiscoveredPrinter first(Uri printerUri) {
+ /**
+ * For a given URI combine and return records with the same printerUri, based on discovery
+ * mechanism order.
+ */
+ private DiscoveredPrinter merged(Uri printerUri) {
+ DiscoveredPrinter combined = null;
+
for (Discovery discovery : getChildren()) {
- DiscoveredPrinter found = discovery.getPrinter(printerUri);
- if (found != null) {
- return found;
+ DiscoveredPrinter discovered = discovery.getPrinter(printerUri);
+ if (discovered != null) {
+ if (combined == null) {
+ combined = discovered;
+ } else {
+ // Merge all paths found, in order, without duplicates
+ List<Uri> allPaths = new ArrayList<>(combined.paths);
+ for (Uri path : discovered.paths) {
+ if (!allPaths.contains(path)) {
+ allPaths.add(path);
+ }
+ }
+ // Assemble a new printer containing paths.
+ combined = new DiscoveredPrinter(discovered.uuid, discovered.name, allPaths,
+ discovered.location);
+ }
}
}
- return null;
+
+ return combined;
}
@Override
diff --git a/src/com/android/bips/discovery/P2pDiscovery.java b/src/com/android/bips/discovery/P2pDiscovery.java
index 4b6776a..083e88d 100644
--- a/src/com/android/bips/discovery/P2pDiscovery.java
+++ b/src/com/android/bips/discovery/P2pDiscovery.java
@@ -21,6 +21,7 @@ import android.net.wifi.p2p.WifiP2pDevice;
import android.util.Log;
import com.android.bips.BuiltInPrintService;
+import com.android.bips.P2pPermissionManager;
import com.android.bips.p2p.P2pPeerListener;
/**
@@ -32,6 +33,7 @@ public class P2pDiscovery extends SavedDiscovery implements P2pPeerListener {
private static final boolean DEBUG = false;
private boolean mDiscoveringPeers = false;
+ private P2pPermissionManager.P2pPermissionRequest mP2pPermissionRequest;
public P2pDiscovery(BuiltInPrintService printService) {
super(printService);
@@ -61,6 +63,10 @@ public class P2pDiscovery extends SavedDiscovery implements P2pPeerListener {
@Override
void onStop() {
if (DEBUG) Log.d(TAG, "onStop()");
+ if (mP2pPermissionRequest != null) {
+ mP2pPermissionRequest.close();
+ mP2pPermissionRequest = null;
+ }
if (mDiscoveringPeers) {
mDiscoveringPeers = false;
getPrintService().getP2pMonitor().stopDiscover(this);
@@ -73,8 +79,16 @@ public class P2pDiscovery extends SavedDiscovery implements P2pPeerListener {
if (mDiscoveringPeers || getSavedPrinters().isEmpty()) {
return;
}
- mDiscoveringPeers = true;
- getPrintService().getP2pMonitor().discover(this);
+
+ // Only begin discovery if the user has granted permissions
+ P2pPermissionManager permissionManager = getPrintService().getP2pPermissionManager();
+ mP2pPermissionRequest = permissionManager.request(true, approved -> {
+ if (approved) {
+ mDiscoveringPeers = true;
+ getPrintService().getP2pMonitor().discover(this);
+ }
+ mP2pPermissionRequest = null;
+ });
}
@Override
diff --git a/src/com/android/bips/ipp/Backend.java b/src/com/android/bips/ipp/Backend.java
index 94d6a11..0e4affd 100644
--- a/src/com/android/bips/ipp/Backend.java
+++ b/src/com/android/bips/ipp/Backend.java
@@ -191,6 +191,10 @@ public class Backend implements JobCallback {
builder.setId(params.jobId);
+ if (params.certificate != null) {
+ builder.setCertificate(params.certificate);
+ }
+
if (!TextUtils.isEmpty(params.printerState)) {
updateBlockedReasons(builder, params);
} else if (!TextUtils.isEmpty(params.jobState)) {
diff --git a/src/com/android/bips/ipp/CapabilitiesCache.java b/src/com/android/bips/ipp/CapabilitiesCache.java
index dd4d258..7c361f1 100644
--- a/src/com/android/bips/ipp/CapabilitiesCache.java
+++ b/src/com/android/bips/ipp/CapabilitiesCache.java
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2016 The Android Open Source Project
- * Copyright (C) 2016 Mopria Alliance, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,7 +22,6 @@ import android.content.Intent;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pManager;
-import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import android.util.LruCache;
@@ -48,8 +46,7 @@ import java.util.function.Consumer;
* with the ability to fetch them on cache misses. {@link #close} must be called when use
* is complete.
*/
-public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> implements
- AutoCloseable {
+public class CapabilitiesCache implements AutoCloseable {
private static final String TAG = CapabilitiesCache.class.getSimpleName();
private static final boolean DEBUG = false;
@@ -66,6 +63,9 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
// Maximum time per retry before giving up on second pass. Must differ from FIRST_PASS_TIMEOUT.
private static final int SECOND_PASS_TIMEOUT = 8000;
+ // Underlying cache
+ private final LruCache<Uri, LocalPrinterCapabilities> mCache = new LruCache<>(CACHE_SIZE);
+
// Outstanding requests based on printer path
private final Map<Uri, Request> mRequests = new HashMap<>();
private final Set<Uri> mToEvict = new HashSet<>();
@@ -81,7 +81,6 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
* @param maxConcurrent Maximum number of capabilities requests to make at any one time
*/
public CapabilitiesCache(BuiltInPrintService service, Backend backend, int maxConcurrent) {
- super(CACHE_SIZE);
if (DEBUG) Log.d(TAG, "CapabilitiesCache()");
mService = service;
@@ -96,7 +95,7 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
// Evict specified device capabilities when P2P network is lost.
if (DEBUG) Log.d(TAG, "Evicting P2P " + mToEvictP2p);
for (Uri uri : mToEvictP2p) {
- remove(uri);
+ mCache.remove(uri);
}
mToEvictP2p.clear();
}
@@ -108,7 +107,7 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
// Evict specified device capabilities when network is lost.
if (DEBUG) Log.d(TAG, "Evicting Wi-Fi " + mToEvict);
for (Uri uri : mToEvict) {
- remove(uri);
+ mCache.remove(uri);
}
mToEvict.clear();
}
@@ -173,7 +172,20 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
* Returns capabilities for the specified printer, if known
*/
public LocalPrinterCapabilities get(DiscoveredPrinter printer) {
- return get(printer.path);
+ LocalPrinterCapabilities capabilities = mCache.get(printer.path);
+ // Populate certificate from store if possible
+ if (capabilities != null) {
+ capabilities.certificate = mService.getCertificateStore().get(capabilities.uuid);
+ }
+ return capabilities;
+ }
+
+ /**
+ * Remove capabilities corresponding to a Printer URI
+ * @return The removed capabilities, if any
+ */
+ public LocalPrinterCapabilities remove(Uri printerUri) {
+ return mCache.remove(printerUri);
}
/**
@@ -281,10 +293,11 @@ public class CapabilitiesCache extends LruCache<Uri, LocalPrinterCapabilities> i
startNextRequest();
return;
} else {
- remove(printer.getUri());
+ mCache.remove(printer.getUri());
}
} else {
- put(printer.path, capabilities);
+ capabilities.certificate = mService.getCertificateStore().get(capabilities.uuid);
+ mCache.put(printer.path, capabilities);
}
LocalPrinterCapabilities result = capabilities;
diff --git a/src/com/android/bips/ipp/CertificateStore.java b/src/com/android/bips/ipp/CertificateStore.java
new file mode 100644
index 0000000..76e0868
--- /dev/null
+++ b/src/com/android/bips/ipp/CertificateStore.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2018 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 com.android.bips.ipp;
+
+import android.util.JsonReader;
+import android.util.JsonWriter;
+import android.util.Log;
+
+import com.android.bips.BuiltInPrintService;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A persistent cache of certificate public keys known to be associated with certain printer
+ * UUIDs.
+ */
+public class CertificateStore {
+ private static final String TAG = CertificateStore.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ /** File location of the on-disk certificate store. */
+ private final File mStoreFile;
+
+ /** RAM-based store of certificates (UUID to certificate) */
+ private final Map<String, byte[]> mCertificates = new HashMap<>();
+
+ public CertificateStore(BuiltInPrintService service) {
+ mStoreFile = new File(service.getCacheDir(), getClass().getSimpleName() + ".json");
+ load();
+ }
+
+ /** Write a new, non-null certificate to the store. */
+ public void put(String uuid, byte[] certificate) {
+ byte[] oldCertificate = mCertificates.put(uuid, certificate);
+ if (oldCertificate == null || !Arrays.equals(oldCertificate, certificate)) {
+ // Cache the certificate for later
+ if (DEBUG) Log.d(TAG, "New certificate uuid=" + uuid + " len=" + certificate.length);
+ save();
+ }
+ }
+
+ /** Remove any certificate associated with the specified UUID. */
+ public void remove(String uuid) {
+ if (mCertificates.remove(uuid) != null) {
+ save();
+ }
+ }
+
+ /** Return the known certificate public key for a printer having the specified UUID, or null. */
+ public byte[] get(String uuid) {
+ return mCertificates.get(uuid);
+ }
+
+ /** Write to storage immediately. */
+ private void save() {
+ if (mStoreFile.exists()) {
+ mStoreFile.delete();
+ }
+
+ try (JsonWriter writer = new JsonWriter(new BufferedWriter(new FileWriter(mStoreFile)))) {
+ writer.beginObject();
+ writer.name("certificates");
+ writer.beginArray();
+ for (Map.Entry<String, byte[]> entry : mCertificates.entrySet()) {
+ writer.beginObject();
+ writer.name("uuid").value(entry.getKey());
+ writer.name("pubkey").value(bytesToHex(entry.getValue()));
+ writer.endObject();
+ }
+ writer.endArray();
+ writer.endObject();
+ if (DEBUG) Log.d(TAG, "Wrote " + mCertificates.size() + " certificates to store");
+ } catch (NullPointerException | IOException e) {
+ Log.w(TAG, "Error while storing to " + mStoreFile, e);
+ }
+ }
+
+ /** Load known certificates from storage into RAM. */
+ private void load() {
+ if (!mStoreFile.exists()) {
+ return;
+ }
+
+ try (JsonReader reader = new JsonReader(new BufferedReader(new FileReader(mStoreFile)))) {
+ reader.beginObject();
+ while (reader.hasNext()) {
+ String itemName = reader.nextName();
+ if (itemName.equals("certificates")) {
+ reader.beginArray();
+ while (reader.hasNext()) {
+ loadItem(reader);
+ }
+ reader.endArray();
+ } else {
+ reader.skipValue();
+ }
+ }
+ reader.endObject();
+ } catch (IllegalStateException | IOException error) {
+ Log.w(TAG, "Error while loading from " + mStoreFile, error);
+ }
+ if (DEBUG) Log.d(TAG, "Loaded size=" + mCertificates.size() + " from " + mStoreFile);
+ }
+
+ /** Load a single certificate entry into RAM. */
+ private void loadItem(JsonReader reader) throws IOException {
+ String uuid = null;
+ byte[] pubkey = null;
+ reader.beginObject();
+ while (reader.hasNext()) {
+ String itemName = reader.nextName();
+ switch(itemName) {
+ case "uuid":
+ uuid = reader.nextString();
+ break;
+ case "pubkey":
+ try {
+ pubkey = hexToBytes(reader.nextString());
+ } catch (IllegalArgumentException ignored) {
+ }
+ break;
+ default:
+ reader.skipValue();
+ }
+ }
+ reader.endObject();
+ if (uuid != null && pubkey != null) {
+ mCertificates.put(uuid, pubkey);
+ }
+ }
+
+ private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
+
+ /** Converts a byte array to a hexadecimal string, or null if bytes are null. */
+ private static String bytesToHex(byte[] bytes) {
+ if (bytes == null) {
+ return null;
+ }
+
+ char[] hexChars = new char[bytes.length * 2];
+ for (int i = 0; i < bytes.length; i++) {
+ int b = bytes[i] & 0xFF;
+ hexChars[i * 2] = HEX_CHARS[b >>> 4];
+ hexChars[i * 2 + 1] = HEX_CHARS[b & 0x0F];
+ }
+ return new String(hexChars);
+ }
+
+ /** Converts a hexadecimal string to a byte array, or null if hexString is null. */
+ private static byte[] hexToBytes(String hexString) {
+ if (hexString == null) {
+ return null;
+ }
+
+ char[] source = hexString.toCharArray();
+ byte[] dest = new byte[source.length / 2];
+ for (int sourcePos = 0, destPos = 0; sourcePos < source.length; ) {
+ int hi = Character.digit(source[sourcePos++], 16);
+ int lo = Character.digit(source[sourcePos++], 16);
+ if ((hi < 0) || (lo < 0)) {
+ throw new IllegalArgumentException();
+ }
+ dest[destPos++] = (byte) (hi << 4 | lo);
+ }
+ return dest;
+ }
+}
diff --git a/src/com/android/bips/ipp/JobStatus.java b/src/com/android/bips/ipp/JobStatus.java
index 72be347..b2d07e2 100644
--- a/src/com/android/bips/ipp/JobStatus.java
+++ b/src/com/android/bips/ipp/JobStatus.java
@@ -53,12 +53,15 @@ public class JobStatus {
R.string.printer_low_on_toner);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BUSY, R.string.printer_busy);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OFFLINE, R.string.printer_offline);
+ sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BAD_CERTIFICATE,
+ R.string.printer_bad_certificate);
}
private int mId;
private String mJobState;
private String mJobResult;
private final Set<String> mBlockedReasons;
+ private byte[] mCertificate;
/** Create a new, blank job status */
public JobStatus() {
@@ -72,6 +75,7 @@ public class JobStatus {
mJobState = other.mJobState;
mJobResult = other.mJobResult;
mBlockedReasons = other.mBlockedReasons;
+ mCertificate = other.mCertificate;
}
/** Returns a string resource ID corresponding to a blocked reason, or 0 if none found */
@@ -104,12 +108,18 @@ public class JobStatus {
return !TextUtils.isEmpty(mJobResult);
}
+ /** Return certificate if supplied as part of this status. */
+ public byte[] getCertificate() {
+ return mCertificate;
+ }
+
@Override
public String toString() {
return "JobStatus{id=" + mId
+ ", jobState=" + mJobState
+ ", jobResult=" + mJobResult
+ ", blockedReasons=" + mBlockedReasons
+ + ", certificate=" + (mCertificate != null)
+ "}";
}
@@ -139,6 +149,11 @@ public class JobStatus {
return this;
}
+ Builder setCertificate(byte[] certificate) {
+ mPrototype.mCertificate = certificate;
+ return this;
+ }
+
Builder clearBlockedReasons() {
mPrototype.mBlockedReasons.clear();
return this;
diff --git a/src/com/android/bips/jni/BackendConstants.java b/src/com/android/bips/jni/BackendConstants.java
index a734a46..9960a47 100644
--- a/src/com/android/bips/jni/BackendConstants.java
+++ b/src/com/android/bips/jni/BackendConstants.java
@@ -67,5 +67,6 @@ public class BackendConstants {
public static final String BLOCKED_REASON__LOW_ON_INK = "marker-ink-almost-empty";
public static final String BLOCKED_REASON__LOW_ON_TONER = "marker-toner-almost-empty";
public static final String BLOCKED_REASON__REALLY_LOW_ON_INK = "marker-ink-really-low";
+ public static final String BLOCKED_REASON__BAD_CERTIFICATE = "bad-certificate";
public static final String BLOCKED_REASON__UNKNOWN = "unknown";
}
diff --git a/src/com/android/bips/jni/JobCallbackParams.java b/src/com/android/bips/jni/JobCallbackParams.java
index 97badec..f0b9aee 100644
--- a/src/com/android/bips/jni/JobCallbackParams.java
+++ b/src/com/android/bips/jni/JobCallbackParams.java
@@ -24,4 +24,5 @@ public final class JobCallbackParams {
public String jobState;
public String jobDoneResult;
public String[] blockedReasons;
+ public byte[] certificate;
}
diff --git a/src/com/android/bips/jni/LocalPrinterCapabilities.java b/src/com/android/bips/jni/LocalPrinterCapabilities.java
index f30b24a..332ce5d 100644
--- a/src/com/android/bips/jni/LocalPrinterCapabilities.java
+++ b/src/com/android/bips/jni/LocalPrinterCapabilities.java
@@ -54,6 +54,9 @@ public class LocalPrinterCapabilities {
/** Bears the underlying native C structure (printer_capabilities_t) or null if not present */
public byte[] nativeData;
+ /** Public key of certificate for this printer, if known */
+ public byte[] certificate;
+
public void buildCapabilities(BuiltInPrintService service,
PrinterCapabilitiesInfo.Builder builder) {
builder.setColorModes(
@@ -122,6 +125,7 @@ public class LocalPrinterCapabilities {
+ " supportedMediaTypes=" + Arrays.toString(supportedMediaTypes)
+ " supportedMediaSizes=" + Arrays.toString(supportedMediaSizes)
+ " inetAddress=" + inetAddress
+ + " certificate=" + (certificate != null)
+ "}";
}
}
diff --git a/src/com/android/bips/ui/AddPrintersActivity.java b/src/com/android/bips/ui/AddPrintersActivity.java
index 78de1dc..182b108 100644
--- a/src/com/android/bips/ui/AddPrintersActivity.java
+++ b/src/com/android/bips/ui/AddPrintersActivity.java
@@ -19,10 +19,11 @@ package com.android.bips.ui;
import android.app.ActionBar;
import android.app.Activity;
-import android.app.Fragment;
import android.os.Bundle;
import android.view.MenuItem;
+import com.android.bips.P2pPermissionManager;
+
/**
* Launched by system in response to an Add Printer request
*/
@@ -53,14 +54,11 @@ public class AddPrintersActivity extends Activity {
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
- int[] grantResults) {
- Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
- if (fragment != null && fragment instanceof OnPermissionChangeListener) {
- ((OnPermissionChangeListener) fragment).onPermissionChange();
+ int[] grantResults) {
+ // Update permission status on any change requested by a fragment.
+ if (requestCode == P2pPermissionManager.REQUEST_P2P_PERMISSION_CODE) {
+ new P2pPermissionManager(this).applyPermissionChange(true);
}
- }
-
- interface OnPermissionChangeListener {
- void onPermissionChange();
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
diff --git a/src/com/android/bips/ui/AddPrintersFragment.java b/src/com/android/bips/ui/AddPrintersFragment.java
index 7b51447..e122cad 100644
--- a/src/com/android/bips/ui/AddPrintersFragment.java
+++ b/src/com/android/bips/ui/AddPrintersFragment.java
@@ -26,9 +26,11 @@ import android.os.IBinder;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
+import android.preference.SwitchPreference;
import android.util.Log;
import com.android.bips.BuiltInPrintService;
+import com.android.bips.P2pPermissionManager;
import com.android.bips.R;
import com.android.bips.discovery.DiscoveredPrinter;
import com.android.bips.p2p.P2pUtils;
@@ -42,12 +44,18 @@ public class AddPrintersFragment extends PreferenceFragment implements ServiceCo
private static final String KEY_ADD_BY_IP = "add_by_ip";
private static final String KEY_FIND_WIFI_DIRECT = "find_wifi_direct";
+ private static final String KEY_WIFI_DIRECT_PRINTING = "wifi_direct_printing";
private static final String KEY_SAVED_PRINTERS = "saved_printers";
+ public static final String EXTRA_FIX_P2P_PERMISSION = "fix_p2p_permission";
+
private static final int ORDER_SAVED = 2;
private PreferenceCategory mSavedPrintersCategory;
private Preference mAddPrinterByIpPreference;
+ private Preference mFindP2pPrintersPreference;
+ private SwitchPreference mP2pEnablePreference;
private BuiltInPrintService mPrintService;
+ private P2pPermissionManager mP2pPermissionManager;
@Override
public void onCreate(Bundle in) {
@@ -56,16 +64,17 @@ public class AddPrintersFragment extends PreferenceFragment implements ServiceCo
addPreferencesFromResource(R.xml.add_printers_prefs);
mAddPrinterByIpPreference = getPreferenceScreen().findPreference(KEY_ADD_BY_IP);
- Preference findP2pPrintersPreference = getPreferenceScreen().findPreference(
+ mFindP2pPrintersPreference = getPreferenceScreen().findPreference(
KEY_FIND_WIFI_DIRECT);
- findP2pPrintersPreference.setOnPreferenceClickListener(preference -> {
+ mFindP2pPrintersPreference.setOnPreferenceClickListener(preference -> {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new FindP2pPrintersFragment())
.addToBackStack(null)
.commit();
return true;
});
-
+ mP2pEnablePreference = (SwitchPreference) getPreferenceScreen()
+ .findPreference(KEY_WIFI_DIRECT_PRINTING);
mSavedPrintersCategory = (PreferenceCategory) getPreferenceScreen()
.findPreference(KEY_SAVED_PRINTERS);
}
@@ -78,6 +87,37 @@ public class AddPrintersFragment extends PreferenceFragment implements ServiceCo
getActivity().setTitle(R.string.title_activity_add_printer);
getContext().bindService(new Intent(getContext(), BuiltInPrintService.class), this,
Context.BIND_AUTO_CREATE);
+
+ mP2pPermissionManager = new P2pPermissionManager(getActivity());
+ updateP2pPreferences();
+
+ if (getActivity().getIntent().getBooleanExtra(EXTRA_FIX_P2P_PERMISSION, false)) {
+ // Additional explanation is redundant, since the user saw it in notification.
+ mP2pPermissionManager.request(false, approve -> {
+ updateP2pPreferences();
+ if (!approve) {
+ // The user is choosing to disable by denying Location.
+ mP2pPermissionManager.setState(P2pPermissionManager.State.DISABLED);
+ }
+ });
+ }
+
+ mP2pEnablePreference.setOnPreferenceClickListener(preference -> {
+ if (mP2pEnablePreference.isChecked()) {
+ mP2pEnablePreference.setChecked(false);
+ if (mP2pPermissionManager.getState() == P2pPermissionManager.State.DISABLED) {
+ // We're no longer disabled, just denied
+ mP2pPermissionManager.setState(P2pPermissionManager.State.DENIED);
+ }
+ mP2pPermissionManager.reset();
+ mP2pPermissionManager.request(true, approve -> updateP2pPreferences());
+ } else {
+ // User disabled P2P
+ mP2pPermissionManager.setState(P2pPermissionManager.State.DISABLED);
+ updateP2pPreferences();
+ }
+ return true;
+ });
}
@Override
@@ -104,13 +144,31 @@ public class AddPrintersFragment extends PreferenceFragment implements ServiceCo
updateSavedPrinters();
}
+ private void updateP2pPreferences() {
+ // Only allow the user to find new P2P printers when enabled
+ if (mP2pPermissionManager.isP2pEnabled()) {
+ mP2pEnablePreference.setChecked(true);
+ getPreferenceScreen().addPreference(mFindP2pPrintersPreference);
+ if (getActivity().getIntent().getBooleanExtra(EXTRA_FIX_P2P_PERMISSION, false)) {
+ // If we were only here to enable P2P permissions, go back to the print now.
+ getActivity().finish();
+ }
+ } else {
+ mP2pEnablePreference.setChecked(false);
+ getPreferenceScreen().removePreference(mFindP2pPrintersPreference);
+ }
+
+ updateSavedPrinters();
+ }
+
@Override
public void onServiceDisconnected(ComponentName componentName) {
mPrintService = null;
}
private void updateSavedPrinters() {
- int savedCount = mPrintService.getDiscovery().getSavedPrinters().size();
+ int savedCount = mPrintService == null ? 0 : mPrintService.getDiscovery()
+ .getSavedPrinters().size();
if (savedCount == 0) {
if (getPreferenceScreen().findPreference(mSavedPrintersCategory.getKey()) != null) {
@@ -124,7 +182,12 @@ public class AddPrintersFragment extends PreferenceFragment implements ServiceCo
mSavedPrintersCategory.removeAll();
// With the service enumerate all saved printers
+ boolean p2pEnabled = mP2pPermissionManager.isP2pEnabled();
for (DiscoveredPrinter printer : mPrintService.getDiscovery().getSavedPrinters()) {
+ // Don't show P2P printers while P2P is disabled.
+ if (P2pUtils.isP2p(printer) && !p2pEnabled) {
+ continue;
+ }
if (DEBUG) Log.d(TAG, "Adding saved printer " + printer);
PrinterPreference pref = new PrinterPreference(getContext(), mPrintService,
printer, false);
diff --git a/src/com/android/bips/ui/FindP2pPrintersFragment.java b/src/com/android/bips/ui/FindP2pPrintersFragment.java
index 6d8bb83..39b9495 100644
--- a/src/com/android/bips/ui/FindP2pPrintersFragment.java
+++ b/src/com/android/bips/ui/FindP2pPrintersFragment.java
@@ -16,12 +16,10 @@
package com.android.bips.ui;
-import android.Manifest;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pDevice;
import android.os.Bundle;
@@ -41,13 +39,11 @@ import com.android.bips.p2p.P2pPeerListener;
/**
* Present a list of previously-saved printers, and allow them to be removed
*/
-public class FindP2pPrintersFragment extends PreferenceFragment implements ServiceConnection,
- AddPrintersActivity.OnPermissionChangeListener {
+public class FindP2pPrintersFragment extends PreferenceFragment implements ServiceConnection {
private static final String TAG = FindP2pPrintersFragment.class.getSimpleName();
private static final boolean DEBUG = false;
private static final String KEY_AVAILABLE = "available";
- private static final int REQUEST_PERMISSION = 1;
private BuiltInPrintService mPrintService;
private P2pListener mPeerDiscoveryListener;
@@ -90,37 +86,13 @@ public class FindP2pPrintersFragment extends PreferenceFragment implements Servi
return;
}
- // If we do not yet have permissions, ask.
- if (getContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- getActivity().requestPermissions(
- new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
- REQUEST_PERMISSION);
- } else {
- startP2pDiscovery();
- }
- }
-
- private void startP2pDiscovery() {
- if (mPrintService != null && mPeerDiscoveryListener == null) {
+ if (mPeerDiscoveryListener == null) {
mPeerDiscoveryListener = new P2pListener();
mPrintService.getP2pMonitor().discover(mPeerDiscoveryListener);
}
}
@Override
- public void onPermissionChange() {
- // P2P discovery requires dangerous ACCESS_COARSE_LOCATION
- if (getContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- == PackageManager.PERMISSION_GRANTED) {
- startP2pDiscovery();
- } else {
- // Wind back out of this fragment
- getActivity().onBackPressed();
- }
- }
-
- @Override
public void onServiceDisconnected(ComponentName componentName) {
mPrintService = null;
}
diff --git a/src/com/android/bips/ui/MoreOptionsActivity.java b/src/com/android/bips/ui/MoreOptionsActivity.java
new file mode 100644
index 0000000..d185ff3
--- /dev/null
+++ b/src/com/android/bips/ui/MoreOptionsActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2019 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 com.android.bips.ui;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.print.PrintJobInfo;
+import android.print.PrinterId;
+import android.printservice.PrintService;
+import android.view.MenuItem;
+
+import com.android.bips.BuiltInPrintService;
+import com.android.bips.discovery.DiscoveredPrinter;
+import com.android.bips.discovery.Discovery;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Launched by system in response to a "More Options" request while tracking a printer.
+ */
+public class MoreOptionsActivity extends Activity implements ServiceConnection, Discovery.Listener {
+ private BuiltInPrintService mPrintService;
+ PrinterId mPrinterId;
+ DiscoveredPrinter mPrinter;
+ InetAddress mPrinterAddress;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ PrintJobInfo jobInfo = getIntent().getParcelableExtra(PrintService.EXTRA_PRINT_JOB_INFO);
+ mPrinterId = jobInfo.getPrinterId();
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ bindService(new Intent(this, BuiltInPrintService.class), this,
+ Context.BIND_AUTO_CREATE);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mPrintService != null) {
+ mPrintService.getDiscovery().stop(this);
+ }
+ unbindService(this);
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mPrintService = BuiltInPrintService.getInstance();
+ mPrintService.getDiscovery().start(this);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mPrintService = null;
+ }
+
+ @Override
+ public void onPrinterFound(DiscoveredPrinter printer) {
+ if (printer.getUri().toString().equals(mPrinterId.getLocalId())) {
+ // We discovered a printer matching the job's PrinterId, so show recommendations
+ mPrinter = printer;
+ setTitle(mPrinter.name);
+ try {
+ mPrinterAddress = InetAddress.getByName(mPrinter.path.getHost());
+ if (getFragmentManager().getFragments().isEmpty()) {
+ MoreOptionsFragment fragment = new MoreOptionsFragment();
+ getFragmentManager().beginTransaction()
+ .replace(android.R.id.content, fragment)
+ .commit();
+ }
+ // No need for continued discovery after we find the printer.
+ mPrintService.getDiscovery().stop(this);
+ } catch (UnknownHostException ignored) { }
+ }
+ }
+
+ @Override
+ public void onPrinterLost(DiscoveredPrinter printer) {
+ // Ignore
+ }
+}
diff --git a/src/com/android/bips/ui/MoreOptionsFragment.java b/src/com/android/bips/ui/MoreOptionsFragment.java
new file mode 100644
index 0000000..5798a3d
--- /dev/null
+++ b/src/com/android/bips/ui/MoreOptionsFragment.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2019 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 com.android.bips.ui;
+
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.print.PrintManager;
+import android.printservice.recommendation.RecommendationInfo;
+import android.util.Log;
+
+import com.android.bips.R;
+
+import java.net.InetAddress;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A fragment allowing the user to review recommended print services and install or enable them.
+ */
+public class MoreOptionsFragment extends PreferenceFragment implements
+ PrintManager.PrintServiceRecommendationsChangeListener {
+ private static final String TAG = MoreOptionsFragment.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ private static final String KEY_RECOMMENDATION_CATEGORY = "recommendation_category";
+ private static final String KEY_MANAGE = "manage";
+ private static final String PACKAGE_NAME_VENDING = "com.android.vending";
+ private static final Collator COLLATOR = Collator.getInstance();
+
+ private PrintManager mPrintManager;
+ private PackageManager mPackageManager;
+ private PreferenceCategory mRecommendations;
+ private MoreOptionsActivity mActivity;
+ private boolean mHasVending = false;
+ private Map<String, RecommendationItem> mItems = new HashMap<>();
+
+ @Override
+ public void onCreate(Bundle in) {
+ super.onCreate(in);
+
+ addPreferencesFromResource(R.xml.more_options_prefs);
+
+ mRecommendations = (PreferenceCategory) getPreferenceScreen().findPreference(
+ KEY_RECOMMENDATION_CATEGORY);
+
+ getPreferenceScreen().findPreference(KEY_MANAGE)
+ .setOnPreferenceClickListener(preference -> {
+ startActivity(new Intent(android.provider.Settings.ACTION_PRINT_SETTINGS)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ return true;
+ });
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mPackageManager = getContext().getPackageManager();
+
+ try {
+ // Attempt to get vending package, throws if missing
+ mPackageManager.getPackageInfo(PACKAGE_NAME_VENDING, 0);
+ mHasVending = true;
+ } catch (PackageManager.NameNotFoundException ignored) {
+ }
+
+ mActivity = (MoreOptionsActivity) getActivity();
+
+ mPrintManager = getContext().getSystemService(PrintManager.class);
+
+ // Start listening for recommendation changes
+ mPrintManager.addPrintServiceRecommendationsChangeListener(this, null);
+ onPrintServiceRecommendationsChanged();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ mPrintManager.removePrintServiceRecommendationsChangeListener(this);
+ }
+
+ @Override
+ public void onPrintServiceRecommendationsChanged() {
+ List<RecommendationInfo> infos = mPrintManager.getPrintServiceRecommendations();
+ if (DEBUG) Log.d(TAG, "All recommendations count=" + infos.size());
+ // Update items list with new recommendations. Recommendations don't go away.
+ for (RecommendationInfo info : infos) {
+ for (InetAddress address : info.getDiscoveredPrinters()) {
+ if (address.equals(mActivity.mPrinterAddress)) {
+ // This recommendation matches so create or update an item for it
+ String packageName = info.getPackageName().toString();
+ RecommendationItem item = getOrCreateItem(info);
+ try {
+ // If this doesn't throw then the service is installed
+ item.mPrintService = mPackageManager.getPackageInfo(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ item.mPrintService = null;
+ }
+ break;
+ }
+ }
+ }
+
+ // Update preferences with ordering
+ List<RecommendationItem> itemList = new ArrayList<>(mItems.values());
+ Collections.sort(itemList);
+ for (int index = 0; index < itemList.size(); index++) {
+ itemList.get(index).updatePreference(index);
+ }
+
+ if (DEBUG) Log.d(TAG, "For this printer=" + mRecommendations.getPreferenceCount());
+
+ // Show group if not empty
+ if (mRecommendations.getPreferenceCount() == 0) {
+ getPreferenceScreen().removePreference(mRecommendations);
+ } else {
+ getPreferenceScreen().addPreference(mRecommendations);
+ }
+ }
+
+ private RecommendationItem getOrCreateItem(RecommendationInfo recommendationInfo) {
+ String packageName = recommendationInfo.getPackageName().toString();
+ RecommendationItem item = mItems.get(packageName);
+ if (item == null) {
+ item = new RecommendationItem(recommendationInfo);
+ mItems.put(packageName, item);
+ } else {
+ item.mRecommendationInfo = recommendationInfo;
+ }
+ return item;
+ }
+
+ /** An item corresponding to a recommended print service. */
+ private class RecommendationItem implements Comparable<RecommendationItem> {
+ RecommendationInfo mRecommendationInfo;
+ String mPackageName;
+ Preference mPreference = new Preference(getContext());
+ /** Present only if the corresponding print service is installed. */
+ PackageInfo mPrintService;
+
+ RecommendationItem(RecommendationInfo info) {
+ mRecommendationInfo = info;
+ mPackageName = mRecommendationInfo.getPackageName().toString();
+ }
+
+ void updatePreference(int order) {
+ mPreference.setKey(mPackageName);
+ mPreference.setTitle(mRecommendationInfo.getName());
+ mPreference.setOrder(order);
+ if (mPrintService != null) {
+ updateEnabler();
+ if (mRecommendations.findPreference(mPackageName) == null) {
+ mRecommendations.addPreference(mPreference);
+ }
+ } else if (mHasVending) {
+ updateDownloader();
+ if (mRecommendations.findPreference(mPackageName) == null) {
+ mRecommendations.addPreference(mPreference);
+ }
+ } else {
+ mRecommendations.removePreference(mPreference);
+ }
+ }
+
+ /** Update the preference to allow the user to enable an installed print service. */
+ private void updateEnabler() {
+ try {
+ // Set icon from application if possible
+ mPreference.setIcon(mPackageManager.getApplicationIcon(
+ mPrintService.packageName));
+ } catch (PackageManager.NameNotFoundException e) {
+ mPreference.setIcon(null);
+ mPreference.setIconSpaceReserved(true);
+ }
+ mPreference.setSummary(R.string.recommendation_enable_summary);
+ mPreference.setOnPreferenceClickListener(preference -> {
+ // There's no activity to go directly to the print service screen
+ startActivity(new Intent(android.provider.Settings.ACTION_PRINT_SETTINGS)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ return true;
+ });
+ }
+
+ /** Update this preference to reflect a print service that must be downloaded. */
+ private void updateDownloader() {
+ mPreference.setIcon(R.drawable.ic_download_from_market);
+ mPreference.setSummary(R.string.recommendation_install_summary);
+ mPreference.setOnPreferenceClickListener(preference -> {
+ Uri printServiceUri = Uri.parse("market://details?id="
+ + mRecommendationInfo.getPackageName());
+ startActivity(new Intent(Intent.ACTION_VIEW, printServiceUri).setFlags(
+ Intent.FLAG_ACTIVITY_NEW_TASK));
+ return true;
+ });
+ }
+
+ @Override
+ public int compareTo(RecommendationItem other) {
+ // Sort items:
+ // - first by single-vendor (more likely to be manufacturer-specific),
+ // - then alphabetically.
+ if (mRecommendationInfo.recommendsMultiVendorService()
+ != other.mRecommendationInfo.recommendsMultiVendorService()) {
+ return mRecommendationInfo.recommendsMultiVendorService() ? 1 : -1;
+ }
+
+ return COLLATOR.compare(mRecommendationInfo.getName().toString(),
+ other.mRecommendationInfo.getName().toString());
+ }
+ }
+}