From 852bcd16b075d74f3c24373d8321f9b193200c2e Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Thu, 17 Dec 2015 21:32:46 +0800 Subject: Browser: runtime permissions Change-Id: I19caa970421898196c005aa9ad7cc651cd574c0a Signed-off-by: jrizzoli --- AndroidManifest.xml | 3 +- res/values/cm_strings.xml | 6 + src/com/android/browser/BrowserActivity.java | 29 ++++- src/com/android/browser/DownloadHandler.java | 64 +++++++++- src/com/android/browser/PermissionsActivity.java | 143 +++++++++++++++++++++++ src/com/android/browser/PermissionsPrompt.java | 39 ++++++- src/com/android/browser/Tab.java | 1 + 7 files changed, 279 insertions(+), 6 deletions(-) create mode 100644 src/com/android/browser/PermissionsActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0ffdec4..53c6325 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,7 +20,8 @@ - + diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index e5f22ac..321c33a 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -39,4 +39,10 @@ OneHand Navigation Easier web navigation with swipes and quick actions + + Permission not granted + The permission to write to external storage was not granted. Cannot download. + Browser error + Dismiss + The app does not have critical permissions needed to run. Please check your permissions settings. diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 4166b11..85af8af 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -17,12 +17,15 @@ package com.android.browser; import android.app.Activity; +import android.app.AlertDialog; import android.app.KeyguardManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.os.Bundle; import android.os.PowerManager; +import android.support.v4.app.ActivityCompat; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; @@ -37,7 +40,8 @@ import android.view.Window; import com.android.browser.stub.NullController; import com.google.common.annotations.VisibleForTesting; -public class BrowserActivity extends Activity { +public class BrowserActivity extends Activity + implements ActivityCompat.OnRequestPermissionsResultCallback { public static final String ACTION_SHOW_BOOKMARKS = "show_bookmarks"; public static final String ACTION_SHOW_BROWSER = "show_browser"; @@ -51,6 +55,8 @@ public class BrowserActivity extends Activity { private ActivityController mController = NullController.INSTANCE; + public static final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1; + @Override public void onCreate(Bundle icicle) { if (LOGV_ENABLED) { @@ -304,4 +310,25 @@ public class BrowserActivity extends Activity { super.dispatchGenericMotionEvent(ev); } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: + // If request is cancelled, the result array is empty + if (grantResults.length > 0 && + grantResults[0] == PackageManager.PERMISSION_GRANTED) { + DownloadHandler.checkPendingDownloads(this); + } else { + new AlertDialog.Builder(this) + .setTitle(R.string.permission_not_granted_dialog_title) + .setMessage(R.string.permission_not_granted_dialog_message) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + break; + } + } + } diff --git a/src/com/android/browser/DownloadHandler.java b/src/com/android/browser/DownloadHandler.java index 5fc5b79..37ab027 100755 --- a/src/com/android/browser/DownloadHandler.java +++ b/src/com/android/browser/DownloadHandler.java @@ -28,6 +28,8 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.net.WebAddress; import android.os.Environment; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.text.TextUtils; import android.util.Log; import android.webkit.CookieManager; @@ -44,6 +46,46 @@ public class DownloadHandler { private static final String LOGTAG = "DLHandler"; + //Singleton to hold the information about any pending downloads + private static PendingDownloadBundle pendingDownloadBundle; + + private static class PendingDownloadBundle { + String url; + String userAgent; + String contentDisposition; + String mimetype; + String referer; + boolean privateBrowsing; + + public static PendingDownloadBundle create(String url, String userAgent, + String contentDisposition, String mimetype, String referer, + boolean privateBrowsing) { + PendingDownloadBundle pdb = new PendingDownloadBundle(); + pdb.url = url; + pdb.userAgent = userAgent; + pdb.contentDisposition = contentDisposition; + pdb.mimetype = mimetype; + pdb.referer = referer; + pdb.privateBrowsing = privateBrowsing; + return pdb; + } + } + + /** + * Check if there is any pending download and start the download automatically in case + * there is one. + * @param activity Activity requesting the download. + */ + public static void checkPendingDownloads(Activity activity) { + if (pendingDownloadBundle != null) { + onDownloadStartNoStream(activity, pendingDownloadBundle.url, + pendingDownloadBundle.userAgent, pendingDownloadBundle.contentDisposition, + pendingDownloadBundle.mimetype, pendingDownloadBundle.referer, + pendingDownloadBundle.privateBrowsing); + pendingDownloadBundle = null; + } + } + /** * Notify the host application a download should be done, or that * the data should be streamed if a streaming viewer is available. @@ -130,7 +172,7 @@ public class DownloadHandler { /** * Notify the host application a download should be done, even if there - * is a streaming viewer available for thise type. + * is a streaming viewer available for this type. * @param activity Activity requesting the download. * @param url The full url to the content that should be downloaded * @param userAgent User agent of the downloading application. @@ -143,6 +185,26 @@ public class DownloadHandler { String url, String userAgent, String contentDisposition, String mimetype, String referer, boolean privateBrowsing) { + // Check permissions first when download will be start. + int permissionCheck = ContextCompat.checkSelfPermission(activity, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (permissionCheck == PackageManager.PERMISSION_GRANTED) { + onDownloadNoStreamImpl(activity, url, userAgent, contentDisposition, + mimetype, referer, privateBrowsing); + } else { + pendingDownloadBundle = PendingDownloadBundle.create(url, userAgent, + contentDisposition, mimetype, referer, privateBrowsing); + // Permission not granted, request it from the user + ActivityCompat.requestPermissions(activity, + new String[] {android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, + BrowserActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + } + } + + private static void onDownloadNoStreamImpl(Activity activity, + String url, String userAgent, String contentDisposition, + String mimetype, String referer, boolean privateBrowsing) { + String filename = URLUtil.guessFileName(url, contentDisposition, mimetype); diff --git a/src/com/android/browser/PermissionsActivity.java b/src/com/android/browser/PermissionsActivity.java new file mode 100644 index 0000000..68f2b19 --- /dev/null +++ b/src/com/android/browser/PermissionsActivity.java @@ -0,0 +1,143 @@ +package com.android.browser; + +import android.Manifest; +import android.app.Activity; +import android.app.Dialog; +import android.app.AlertDialog; +import android.app.KeyguardManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.pm.PackageManager; +import android.preference.PreferenceManager; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.Window; +import android.view.WindowManager; +import com.android.browser.R; + +/** + * Activity that shows permissions request dialogs and handles lack of critical permissions. + */ +public class PermissionsActivity extends Activity { + private static final String TAG = "PermissionsActivity"; + + private static String PREF_HAS_SEEN_PERMISSIONS_DIALOGS = "pref_has_seen_permissions_dialogs"; + private static int PERMISSION_REQUEST_CODE = 1; + private static int RESULT_CODE_OK = 1; + private static int RESULT_CODE_FAILED = 2; + + private int mIndexPermissionRequestStorage; + private boolean mShouldRequestStoragePermission; + private int mNumPermissionsToRequest; + private boolean mFlagHasStoragePermission; + private SharedPreferences mPrefs; + + /** + * Close activity when secure app passes lock screen or screen turns + * off. + */ + private final BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + Log.v(TAG, "received intent, finishing: " + intent.getAction()); + finish(); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + } + + @Override + protected void onResume() { + super.onResume(); + mNumPermissionsToRequest = 0; + checkPermissions(); + } + + private void checkPermissions() { + if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + mNumPermissionsToRequest++; + mShouldRequestStoragePermission = true; + } else { + mFlagHasStoragePermission = true; + } + + if (mNumPermissionsToRequest != 0) { + if (!mPrefs.getBoolean(PREF_HAS_SEEN_PERMISSIONS_DIALOGS, false)) { + buildPermissionsRequest(); + } else { + // Permissions dialog has already been shown + // and we're still missing permissions. + handlePermissionsFailure(); + } + } else { + handlePermissionsSuccess(); + } + } + + private void buildPermissionsRequest() { + String[] permissionsToRequest = new String[mNumPermissionsToRequest]; + int permissionsRequestIndex = 0; + + if (mShouldRequestStoragePermission) { + permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE; + mIndexPermissionRequestStorage = permissionsRequestIndex; + permissionsRequestIndex++; + } + + Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length); + requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length); + + if (mShouldRequestStoragePermission) { + if (grantResults.length > 0 && grantResults[mIndexPermissionRequestStorage] == + PackageManager.PERMISSION_GRANTED) { + mFlagHasStoragePermission = true; + } else { + handlePermissionsFailure(); + } + } + + if (mFlagHasStoragePermission) { + handlePermissionsSuccess(); + } + } + + private void handlePermissionsSuccess() { + Editor edit = mPrefs.edit(); + edit.putBoolean(PREF_HAS_SEEN_PERMISSIONS_DIALOGS, true); + edit.commit(); + + Intent intent = new Intent(this, BrowserActivity.class); + startActivity(intent); + finish(); + } + + private void handlePermissionsFailure() { + new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.browser_error_title)) + .setMessage(getResources().getString(R.string.error_permissions)) + .setPositiveButton(getResources().getString(R.string.dialog_dismiss), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }) + .show(); + } +} diff --git a/src/com/android/browser/PermissionsPrompt.java b/src/com/android/browser/PermissionsPrompt.java index 29412d9..47c6c4e 100644 --- a/src/com/android/browser/PermissionsPrompt.java +++ b/src/com/android/browser/PermissionsPrompt.java @@ -16,7 +16,11 @@ package com.android.browser; +import android.Manifest; +import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.util.AttributeSet; import android.view.Gravity; @@ -29,7 +33,9 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.List; import java.util.Vector; public class PermissionsPrompt extends RelativeLayout { @@ -37,14 +43,17 @@ public class PermissionsPrompt extends RelativeLayout { private Button mAllowButton; private Button mDenyButton; private CheckBox mRemember; + private Context mContext; private PermissionRequest mRequest; public PermissionsPrompt(Context context) { this(context, null); + mContext = context; } public PermissionsPrompt(Context context, AttributeSet attrs) { super(context, attrs); + mContext = context; } @Override @@ -117,9 +126,33 @@ public class PermissionsPrompt extends RelativeLayout { */ private void handleButtonClick(boolean allow) { hide(); - if (allow) - mRequest.grant(mRequest.getResources()); - else + if (allow) { + String[] resources = mRequest.getResources(); + List permissionsToRequest = new ArrayList(); + + for (String resource : resources) { + if (resource.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE) && + mContext.checkSelfPermission(Manifest.permission.CAMERA) != + PackageManager.PERMISSION_GRANTED) { + permissionsToRequest.add(Manifest.permission.CAMERA); + } else if (resource.equals(PermissionRequest.RESOURCE_AUDIO_CAPTURE) && + mContext.checkSelfPermission(Manifest.permission.RECORD_AUDIO) != + PackageManager.PERMISSION_GRANTED) { + permissionsToRequest.add(Manifest.permission.RECORD_AUDIO); + } + } + + if (permissionsToRequest.size() > 0) { + String[] permissions = permissionsToRequest.toArray( + new String[permissionsToRequest.size()]); + ((Activity) mContext).requestPermissions(permissions, 1); + Intent intent = new Intent(mContext, PermissionsActivity.class); + mContext.startActivity(intent); + } else { + mRequest.grant(mRequest.getResources()); + } + } else { mRequest.deny(); + } } } diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java index ceacd42..df4bc52 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -23,6 +23,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; -- cgit v1.1 From d2bc7087d1e2474124b286ed9047792a0cadce76 Mon Sep 17 00:00:00 2001 From: Umair Khan Date: Mon, 4 Jan 2016 12:34:03 +0530 Subject: Browser: Fix crash while loading a page view.getUrl() returns null sometimes while performing the redirection. syncCurrentState() already handles this case. Change-Id: I874a0260153441df76834fbb0bcba7bb122c2b95 Signed-off-by: Umair Khan --- src/com/android/browser/Tab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java index df4bc52..c99e9b2 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -399,7 +399,7 @@ class Tab implements PictureListener { syncCurrentState(view, url); mWebViewController.onPageFinished(Tab.this); - if (view.getUrl().equals(HomeProvider.MOST_VISITED_URL)) { + if (mCurrentState.mUrl.equals(HomeProvider.MOST_VISITED_URL)) { if (!mInMostVisitedPage) { loadUrl(HomeProvider.MOST_VISITED, null); mInMostVisitedPage = true; -- cgit v1.1 From b152ea3ea0d16e3034f81b84f0bd900cd2b66b13 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liew Date: Tue, 5 Jan 2016 13:51:02 +0800 Subject: Browser: Resurface incognito button The current method of entering incognito mode is too discreet, and there is no way of knowing how to enter it (long press new tab FAB). Resurface the incognito button in the tab navigation screen. Furthermore, on tablets, there is no way to enter incognito mode AFAIK (or it is ridiculously difficult to find). On tablets, add an entry to the overflow menu for creating new incognito tabs. Change-Id: I1c81d2addd16c11480d978aebf07336307ec694f --- res/layout-land/nav_screen.xml | 1 - res/layout/nav_screen.xml | 1 - res/menu/browser.xml | 5 +++++ src/com/android/browser/Controller.java | 4 ++++ src/com/android/browser/PhoneUi.java | 12 ++++++++---- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/res/layout-land/nav_screen.xml b/res/layout-land/nav_screen.xml index 4091573..ac70ab2 100644 --- a/res/layout-land/nav_screen.xml +++ b/res/layout-land/nav_screen.xml @@ -49,7 +49,6 @@ style="@style/BrowserButton" android:gravity="center_vertical" android:contentDescription="@string/accessibility_button_newincognitotab" - android:visibility="gone" android:src="@drawable/ic_incognito" /> + Date: Mon, 11 Jan 2016 22:41:22 +0200 Subject: Automatic translation import Change-Id: If69042f8e3dc80fb0b85fb9308f24f11440b3c72 --- res/values-de/cm_strings.xml | 4 ++++ res/values-el/cm_strings.xml | 8 ++++++++ res/values-en-rIN/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-es/cm_strings.xml | 2 ++ res/values-fr/cm_strings.xml | 5 +++++ res/values-gl-rES/cm_strings.xml | 33 +++++++++++++++++++++++++++++++++ res/values-hr/cm_strings.xml | 33 +++++++++++++++++++++++++++++++++ res/values-hu/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-it/cm_strings.xml | 5 +++++ res/values-iw/cm_strings.xml | 1 + res/values-nb/cm_strings.xml | 26 ++++++++++++++++++++++++++ res/values-nl/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-pl/cm_strings.xml | 6 ++++++ res/values-pt-rBR/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-ro/cm_strings.xml | 23 +++++++++++++++++++++++ res/values-ru/cm_strings.xml | 2 ++ res/values-sl/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-sv/cm_strings.xml | 23 +++++++++++++++++++++++ res/values-th/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-tr/cm_strings.xml | 28 ++++++++++++++++++++++++++++ res/values-zh-rCN/cm_strings.xml | 7 ++++++- 21 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 res/values-en-rIN/cm_strings.xml create mode 100644 res/values-gl-rES/cm_strings.xml create mode 100644 res/values-hr/cm_strings.xml create mode 100644 res/values-hu/cm_strings.xml create mode 100644 res/values-nb/cm_strings.xml create mode 100644 res/values-nl/cm_strings.xml create mode 100644 res/values-pt-rBR/cm_strings.xml create mode 100644 res/values-ro/cm_strings.xml create mode 100644 res/values-sl/cm_strings.xml create mode 100644 res/values-sv/cm_strings.xml create mode 100644 res/values-th/cm_strings.xml create mode 100644 res/values-tr/cm_strings.xml diff --git a/res/values-de/cm_strings.xml b/res/values-de/cm_strings.xml index f9518e3..cb16137 100644 --- a/res/values-de/cm_strings.xml +++ b/res/values-de/cm_strings.xml @@ -22,5 +22,9 @@ User-Agent Oberfläche Vollbild + Einhand-Navigation Einfachere Web-Navigation mit Wischen und Verknüpfungen + Berechtigung nicht erteilt + Die Berechtigung, den externen Speicher zu beschreiben, wurde nicht erteilt. Download nicht möglich. + Browser-Fehler diff --git a/res/values-el/cm_strings.xml b/res/values-el/cm_strings.xml index 980f754..6583c43 100644 --- a/res/values-el/cm_strings.xml +++ b/res/values-el/cm_strings.xml @@ -22,4 +22,12 @@ User agent Διεπαφή Πλήρης οθόνη + Ενεργοποίηση πλοήγησης σε πλήρη οθόνη + Πλοήγηση OneHand + Ευκολότερη περιήγηση στον ιστό με χρήση συρσίματος και γρήγορων δράσεων + Η άδεια δεν χορηγήθηκε + Η άδεια για εγγραφή στον εξωτερικό αποθηκευτικό χώρο δεν χορηγήθηκε. Δεν είναι δυνατή η λήψη. + Σφάλμα περιηγητή + Παράβλεψη + Η εφαρμογή δεν έχει κρίσιμα δικαιώματα που απαιτούνται για την εκτέλεση. Παρακαλώ ελέγξτε τις ρυθμίσεις δικαιωμάτων σας. diff --git a/res/values-en-rIN/cm_strings.xml b/res/values-en-rIN/cm_strings.xml new file mode 100644 index 0000000..5c375aa --- /dev/null +++ b/res/values-en-rIN/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Home screen + Open in new incognito tab + Open in new incognito background tab + User agent + Interface + Fullscreen + Enable immersive navigation + OneHand Navigation + Easier web navigation with swipes and quick actions + diff --git a/res/values-es/cm_strings.xml b/res/values-es/cm_strings.xml index f9cc12c..805bc7a 100644 --- a/res/values-es/cm_strings.xml +++ b/res/values-es/cm_strings.xml @@ -19,8 +19,10 @@ Pantalla Inicial Abrir nueva ventana en modo incógnito Abrir en nueva pestaña de incognito + Agente del usuario Interfaz Pantalla completa Activar navegacion inmersiva + Navegacion con una mano Navegación web más fácil con desplazamientos y acciones rápidas diff --git a/res/values-fr/cm_strings.xml b/res/values-fr/cm_strings.xml index 26af067..437b244 100644 --- a/res/values-fr/cm_strings.xml +++ b/res/values-fr/cm_strings.xml @@ -25,4 +25,9 @@ Activer la navigation immersive Navigation à une main Faciliter la navigation web avec balayages et actions rapides + Autorisation non accordée + L\'autorisation d\'écriture sur le stockage externe n\'a pas été accordée. Le téléchargement est impossible. + Erreur du navigateur + Annuler + L\'application ne dispose pas des autorisations critiques nécessaires à l\'exécution. Veuillez vérifier vos paramètres d\'autorisations. diff --git a/res/values-gl-rES/cm_strings.xml b/res/values-gl-rES/cm_strings.xml new file mode 100644 index 0000000..2b758ab --- /dev/null +++ b/res/values-gl-rES/cm_strings.xml @@ -0,0 +1,33 @@ + + + + + Páxina inicial + Abrir nunha nova lapela de incógnito + Abrir en segundo plano nunha nova lapela de incógnito + Axente de usuario + Interface + Pantalla completa + Activar navegacion inmersiva + Navegación cunha man + Navegación web máis doada con desprazamentos e accións rápidas + Permiso non concedido + Non se concedeu permiso para escribir no almacenamento externo. Non se pode descargar. + Erro no navegador + Desestimar + A aplicación non ten permisos imprescindíbeis para executarse. Comprobe a súa configuración de permisos. + diff --git a/res/values-hr/cm_strings.xml b/res/values-hr/cm_strings.xml new file mode 100644 index 0000000..cdb3c86 --- /dev/null +++ b/res/values-hr/cm_strings.xml @@ -0,0 +1,33 @@ + + + + + Početni zaslon + Otvori novu anonimnu karticu + Otvori novu anonimnu karticu u pozadini + Korisnički agent + Sučelje + Cijeli zaslon + Omogući cijeli zaslon + Navigacija jednom rukom + Lakša web navigacija pokretima i brzim akcijama + Dozvola nije odobrena + Dozvola za pisanjem na vanjsku pohranu nije odobrena. Preuzimanje nije moguće. + Pogreška preglednika + Odbaci + Aplikacija nema potrebnu dozvolu za pokretanje. Provjerite postavke dozvola. + diff --git a/res/values-hu/cm_strings.xml b/res/values-hu/cm_strings.xml new file mode 100644 index 0000000..ed81473 --- /dev/null +++ b/res/values-hu/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Kezdőlap + Megnyitás új lapfülön, inkognitó módban + Megnyitás új lapfülön, inkognitó módban (háttérben) + Böngészőazonosító + Felhasználói felület + Teljes képernyő + Teljes képernyős navigáció engedélyezése + Egykezes navigáció + Könnyebb web-böngészés csúsztatással és gyors műveletekkel + diff --git a/res/values-it/cm_strings.xml b/res/values-it/cm_strings.xml index 2c88a08..918e6a9 100644 --- a/res/values-it/cm_strings.xml +++ b/res/values-it/cm_strings.xml @@ -25,4 +25,9 @@ Abilita navigazione immersiva Navigazione OneHand Navigazione agevolata con gesture e azioni rapide + Permesso non concesso + Il permesso di accedere alla memoria interna non è stato concesso. Impossibile avviare download. + Errore Browser + Annulla + L\'applicazione non dispone dei permessi necessari per avviarsi. Controlla le impostazioni relative ai permessi. diff --git a/res/values-iw/cm_strings.xml b/res/values-iw/cm_strings.xml index 2c4a4a1..934359a 100644 --- a/res/values-iw/cm_strings.xml +++ b/res/values-iw/cm_strings.xml @@ -24,4 +24,5 @@ מסך מלא אפשר ניווט במסך מלא ניווט OneHand + ניווט פשוט יותר ברשת באמצעות החלקות ופעולות מהירות diff --git a/res/values-nb/cm_strings.xml b/res/values-nb/cm_strings.xml new file mode 100644 index 0000000..15d330a --- /dev/null +++ b/res/values-nb/cm_strings.xml @@ -0,0 +1,26 @@ + + + + + Hjem-skjermen + Åpne i ny inkognitofane + Åpne i ny inkognitofane i bakgrunnen + Brukeragent + Grensesnitt + Fullskjerm + OneHand navigasjon + diff --git a/res/values-nl/cm_strings.xml b/res/values-nl/cm_strings.xml new file mode 100644 index 0000000..72a99d7 --- /dev/null +++ b/res/values-nl/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Startscherm + Openen in nieuw incognitotabblad + Openen in nieuw incognitotabblad op de achtergrond + Useragent + Uiterlijk + Volledig scherm + Schermvullende weergave inschakelen + Bedienen met één hand + Makkelijkere webnavigatie met swipes en snelle acties + diff --git a/res/values-pl/cm_strings.xml b/res/values-pl/cm_strings.xml index fba7d4d..677f5bd 100644 --- a/res/values-pl/cm_strings.xml +++ b/res/values-pl/cm_strings.xml @@ -17,6 +17,12 @@ --> Ekran główny + Otwórz w nowej karcie incognito + Otwórz w nowej karcie incognito w tle + User agent Interfejs Pełny ekran + Włącz nawigację pełnoekranową + Nawigacja OneHand + Łatwiejsza nawigacja w sieci z przesunięciami i szybkimi akcjami diff --git a/res/values-pt-rBR/cm_strings.xml b/res/values-pt-rBR/cm_strings.xml new file mode 100644 index 0000000..e9a0b4e --- /dev/null +++ b/res/values-pt-rBR/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Tela inicial + Abrir em nova aba anônima + Abrir uma nova aba anônima em segundo plano + Agente de usuário + Interface + Tela cheia + Ativar navegação imersiva + Navegação com uma mão + Navegação na web mais fácil com gestos e ações rápidas + diff --git a/res/values-ro/cm_strings.xml b/res/values-ro/cm_strings.xml new file mode 100644 index 0000000..a7e787e --- /dev/null +++ b/res/values-ro/cm_strings.xml @@ -0,0 +1,23 @@ + + + + + Agent utilizator + Interfață + Pe tot ecranul + Navigare cu o singură mână + diff --git a/res/values-ru/cm_strings.xml b/res/values-ru/cm_strings.xml index bf137be..7ba846c 100644 --- a/res/values-ru/cm_strings.xml +++ b/res/values-ru/cm_strings.xml @@ -22,5 +22,7 @@ User Agent Интерфейс Полноэкранный режим + Скрывать строку состояния и панель навигации Управление одной рукой + Упрощённая веб-навигация с помощью жестов и быстрых действий diff --git a/res/values-sl/cm_strings.xml b/res/values-sl/cm_strings.xml new file mode 100644 index 0000000..d607c84 --- /dev/null +++ b/res/values-sl/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Domači zaslon + Odpri v novem zavihku brez beleženja zgodovine + Odpri v novem zavihku v ozadju brez beleženja zgodovine + Uporabniški posrednik + Vmesnik + Celozaslonski način + Omogoči krmarjenje na celem zaslonu + Krmarjenje z eno roko + Lažje krmarjenje po spletu s potegi in hitrimi dejanji + diff --git a/res/values-sv/cm_strings.xml b/res/values-sv/cm_strings.xml new file mode 100644 index 0000000..8d7ea22 --- /dev/null +++ b/res/values-sv/cm_strings.xml @@ -0,0 +1,23 @@ + + + + + Hemskärm + Öppna i ny inkognitoflik + Gränssnitt + Fullskärm + diff --git a/res/values-th/cm_strings.xml b/res/values-th/cm_strings.xml new file mode 100644 index 0000000..024b429 --- /dev/null +++ b/res/values-th/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + หน้าจอหลัก + เปิดใหม่ในแท็บไม่ระบุตัวตน + เปิดในแท็บใหม่เป็นพื้นหลังแบบไม่ระบุตัวตน + ตัวแทนผู้ใช้ + หน้าตา + เต็มจอ + เปิดใช้งานการนำทางเต็มหน้าจอ + การนำทางมือเดียว + ใช้งานเว็บไซต์ได้ง่ายขึ้นโดยใช้การเลื่อนและกวาดนิ้วแบบรวดเร็ว + diff --git a/res/values-tr/cm_strings.xml b/res/values-tr/cm_strings.xml new file mode 100644 index 0000000..d8432b1 --- /dev/null +++ b/res/values-tr/cm_strings.xml @@ -0,0 +1,28 @@ + + + + + Ana ekran + Yeni gizli sekmede aç + Yeni gizli arkaplan sekmesinde aç + Kullanıcı tanımlayıcısı + Arayüz + Tam ekran + Sürükleyici dolaşımı etkinleştir + Tek Elle Gezinme + Kaydırmalar ve çabuk eylemlerle daha kolay web gezinmesi + diff --git a/res/values-zh-rCN/cm_strings.xml b/res/values-zh-rCN/cm_strings.xml index c6dbfc5..a59d3d6 100644 --- a/res/values-zh-rCN/cm_strings.xml +++ b/res/values-zh-rCN/cm_strings.xml @@ -19,10 +19,15 @@ 主屏幕 在新的隐身标签页中打开 在新的后台隐身标签页中打开 - 用户代理 + 用户代理 (User agent) 界面 全屏 启用沉浸式导航 单手导航 使用滑动和快速操作来更容易的浏览网页 + 未授予权限 + 未被授予写入外部存储的权限。无法下载。 + 浏览器错误 + 忽略 + 应用没有运行所需的关键权限。请检查您的权限设置。 -- cgit v1.1