From b7da1f5f9886ff8a4ad81b0d617d442c461ca1e5 Mon Sep 17 00:00:00 2001 From: Anthony Hugh Date: Wed, 19 Aug 2015 11:44:43 -0700 Subject: Implement base version of GrantPermissions dialog With the Emerald release, we need to support the new permission APIs. This changelist adds a dialog for the Activity.requestPermissions() API so that users can request permissions. This check in is a functional version, but not polished. will need to be a follow up CL to add the correct animations and update the UI to the appropriate redlines. The implementation for the confirmation dialog is modeled after the one in the clockwork libs/Views folder. There are some tweaks to match the designed behavior of the permission dialog. When there's more time in the future, we should try to condense this to one implementation. BUG: 23118402 Change-Id: Ic90d37a2ce8a7adacb7c4e004b0a5260b624f5c8 --- Android.mk | 8 +- res/drawable-watch-280dpi/ic_cc_cancel.png | Bin 0 -> 14774 bytes res/drawable-watch-280dpi/ic_cc_checkmark.png | Bin 0 -> 14840 bytes res/drawable-watch-hdpi/ic_cc_cancel.png | Bin 0 -> 678 bytes res/drawable-watch-hdpi/ic_cc_checkmark.png | Bin 0 -> 760 bytes res/drawable-watch-mdpi/ic_cc_cancel.png | Bin 0 -> 535 bytes res/drawable-watch-mdpi/ic_cc_checkmark.png | Bin 0 -> 612 bytes res/drawable-watch-xhdpi/ic_cc_cancel.png | Bin 0 -> 312 bytes res/drawable-watch-xhdpi/ic_cc_checkmark.png | Bin 0 -> 421 bytes res/drawable-watch/action_negative_bg.xml | 21 +++ res/drawable-watch/action_positive_bg.xml | 21 +++ res/drawable-watch/cancel_button.xml | 7 + res/drawable-watch/confirm_button.xml | 7 + res/layout-watch/grant_permissions.xml | 126 ++++++++++++++++ res/values-watch/colors.xml | 26 ++++ res/values-watch/dimens.xml | 28 ++++ res/values-watch/strings.xml | 29 ++++ res/values-watch/themes.xml | 46 ++++++ .../permission/ui/GrantPermissionsActivity.java | 7 + .../ui/GrantPermissionsWatchViewHandler.java | 159 +++++++++++++++++++++ .../ui/PermissionConfirmationViewHandler.java | 149 +++++++++++++++++++ 21 files changed, 630 insertions(+), 4 deletions(-) create mode 100644 res/drawable-watch-280dpi/ic_cc_cancel.png create mode 100644 res/drawable-watch-280dpi/ic_cc_checkmark.png create mode 100644 res/drawable-watch-hdpi/ic_cc_cancel.png create mode 100644 res/drawable-watch-hdpi/ic_cc_checkmark.png create mode 100644 res/drawable-watch-mdpi/ic_cc_cancel.png create mode 100644 res/drawable-watch-mdpi/ic_cc_checkmark.png create mode 100644 res/drawable-watch-xhdpi/ic_cc_cancel.png create mode 100644 res/drawable-watch-xhdpi/ic_cc_checkmark.png create mode 100644 res/drawable-watch/action_negative_bg.xml create mode 100644 res/drawable-watch/action_positive_bg.xml create mode 100644 res/drawable-watch/cancel_button.xml create mode 100644 res/drawable-watch/confirm_button.xml create mode 100644 res/layout-watch/grant_permissions.xml create mode 100644 res/values-watch/colors.xml create mode 100644 res/values-watch/dimens.xml create mode 100644 res/values-watch/strings.xml create mode 100644 res/values-watch/themes.xml create mode 100644 src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java create mode 100644 src/com/android/packageinstaller/permission/ui/PermissionConfirmationViewHandler.java diff --git a/Android.mk b/Android.mk index 5a53086e..9a7fcc42 100644 --- a/Android.mk +++ b/Android.mk @@ -9,12 +9,11 @@ LOCAL_SRC_FILES := \ LOCAL_STATIC_JAVA_LIBRARIES += \ android-support-v4 \ - android-support-v7-recyclerview \ android-support-v7-preference \ android-support-v7-appcompat \ android-support-v14-preference \ android-support-v17-preference-leanback \ - android-support-v17-leanback + android-support-v17-leanback \ LOCAL_RESOURCE_DIR := \ frameworks/support/v17/leanback/res \ @@ -22,11 +21,10 @@ LOCAL_RESOURCE_DIR := \ frameworks/support/v14/preference/res \ frameworks/support/v17/preference-leanback/res \ frameworks/support/v7/appcompat/res \ - frameworks/support/v7/recyclerview/res \ $(LOCAL_PATH)/res LOCAL_AAPT_FLAGS := --auto-add-overlay \ - --extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview + --extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat LOCAL_PACKAGE_NAME := PackageInstaller LOCAL_CERTIFICATE := platform @@ -35,4 +33,6 @@ LOCAL_PRIVILEGED_MODULE := true LOCAL_PROGUARD_FLAG_FILES := proguard.flags +include vendor/unbundled_google/libs/wearable/wearable-support.mk + include $(BUILD_PACKAGE) diff --git a/res/drawable-watch-280dpi/ic_cc_cancel.png b/res/drawable-watch-280dpi/ic_cc_cancel.png new file mode 100644 index 00000000..249b8697 Binary files /dev/null and b/res/drawable-watch-280dpi/ic_cc_cancel.png differ diff --git a/res/drawable-watch-280dpi/ic_cc_checkmark.png b/res/drawable-watch-280dpi/ic_cc_checkmark.png new file mode 100644 index 00000000..94db9ab0 Binary files /dev/null and b/res/drawable-watch-280dpi/ic_cc_checkmark.png differ diff --git a/res/drawable-watch-hdpi/ic_cc_cancel.png b/res/drawable-watch-hdpi/ic_cc_cancel.png new file mode 100644 index 00000000..a57893e1 Binary files /dev/null and b/res/drawable-watch-hdpi/ic_cc_cancel.png differ diff --git a/res/drawable-watch-hdpi/ic_cc_checkmark.png b/res/drawable-watch-hdpi/ic_cc_checkmark.png new file mode 100644 index 00000000..29f9ecd9 Binary files /dev/null and b/res/drawable-watch-hdpi/ic_cc_checkmark.png differ diff --git a/res/drawable-watch-mdpi/ic_cc_cancel.png b/res/drawable-watch-mdpi/ic_cc_cancel.png new file mode 100644 index 00000000..87fc65ab Binary files /dev/null and b/res/drawable-watch-mdpi/ic_cc_cancel.png differ diff --git a/res/drawable-watch-mdpi/ic_cc_checkmark.png b/res/drawable-watch-mdpi/ic_cc_checkmark.png new file mode 100644 index 00000000..0989daa6 Binary files /dev/null and b/res/drawable-watch-mdpi/ic_cc_checkmark.png differ diff --git a/res/drawable-watch-xhdpi/ic_cc_cancel.png b/res/drawable-watch-xhdpi/ic_cc_cancel.png new file mode 100644 index 00000000..fec6ecb8 Binary files /dev/null and b/res/drawable-watch-xhdpi/ic_cc_cancel.png differ diff --git a/res/drawable-watch-xhdpi/ic_cc_checkmark.png b/res/drawable-watch-xhdpi/ic_cc_checkmark.png new file mode 100644 index 00000000..f98cc1ec Binary files /dev/null and b/res/drawable-watch-xhdpi/ic_cc_checkmark.png differ diff --git a/res/drawable-watch/action_negative_bg.xml b/res/drawable-watch/action_negative_bg.xml new file mode 100644 index 00000000..f1c33b54 --- /dev/null +++ b/res/drawable-watch/action_negative_bg.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable-watch/action_positive_bg.xml b/res/drawable-watch/action_positive_bg.xml new file mode 100644 index 00000000..bc3e88ba --- /dev/null +++ b/res/drawable-watch/action_positive_bg.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable-watch/cancel_button.xml b/res/drawable-watch/cancel_button.xml new file mode 100644 index 00000000..5b16f549 --- /dev/null +++ b/res/drawable-watch/cancel_button.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/drawable-watch/confirm_button.xml b/res/drawable-watch/confirm_button.xml new file mode 100644 index 00000000..6a895ec6 --- /dev/null +++ b/res/drawable-watch/confirm_button.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/layout-watch/grant_permissions.xml b/res/layout-watch/grant_permissions.xml new file mode 100644 index 00000000..80ed5b92 --- /dev/null +++ b/res/layout-watch/grant_permissions.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + - + + diff --git a/res/layout/header.xml b/res/layout/header.xml index 0e000a4d..f158e442 100644 --- a/res/layout/header.xml +++ b/res/layout/header.xml @@ -17,9 +17,8 @@ + android:background="?android:attr/colorPrimary" + android:gravity="center_vertical" > - - - diff --git a/res/layout/install_confirm.xml b/res/layout/install_confirm.xml index 86ea1652..72d5e377 100644 --- a/res/layout/install_confirm.xml +++ b/res/layout/install_confirm.xml @@ -31,9 +31,10 @@ android:id="@+id/install_confirm_question" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:paddingStart="16dip" + android:paddingEnd="16dip" android:text="@string/install_confirm_question" android:textAppearance="?android:attr/textAppearanceMedium" - style="@style/padded" android:paddingTop="4dip" /> + android:scaleType="fitCenter" > + diff --git a/res/layout/permissions_frame.xml b/res/layout/permissions_frame.xml index 8f1f2789..156af57e 100644 --- a/res/layout/permissions_frame.xml +++ b/res/layout/permissions_frame.xml @@ -30,8 +30,8 @@ android:layout_height="match_parent" android:text="@string/no_permissions" android:gravity="center" - android:textAppearance="@android:style/TextAppearance.Large" - /> + style="?android:attr/textAppearanceLarge"> + diff --git a/res/layout/preference_permissions.xml b/res/layout/preference_permissions.xml index 67b4469c..631d56bd 100644 --- a/res/layout/preference_permissions.xml +++ b/res/layout/preference_permissions.xml @@ -37,7 +37,7 @@ android:paddingEnd="20dp" android:paddingTop="4dp" android:paddingBottom="4dp"> - - diff --git a/res/values-television/colors.xml b/res/values-television/colors.xml index eb6bfa7d..08209600 100644 --- a/res/values-television/colors.xml +++ b/res/values-television/colors.xml @@ -15,6 +15,13 @@ --> + + #FFF1F1F1 + #88F1F1F1 + #88F1F1F1 + #FF111111 + #77000000 + #ff263238 @color/grant_permissions_white_text_alpha_100 @color/grant_permissions_white_text_alpha_100 diff --git a/res/values-television/styles.xml b/res/values-television/styles.xml new file mode 100644 index 00000000..5f712f7d --- /dev/null +++ b/res/values-television/styles.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml deleted file mode 100755 index 549f55fd..00000000 --- a/res/values/colors.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - #cc222222 - #00000000 - #ff37474f - @*android:color/primary_text_default_material_light - #60000000 - - #FFF1F1F1 - #88F1F1F1 - #88F1F1F1 - #FF111111 - #77000000 - - - diff --git a/res/values/styles.xml b/res/values/styles.xml index 9c166971..7f6a4693 100755 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -15,37 +15,22 @@ --> - - - - - - - - - + diff --git a/res/values/themes.xml b/res/values/themes.xml index 2f9c2b55..026c77fa 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -16,11 +16,13 @@ --> - + diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java index 9365bf13..e5d96d55 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionApps.java +++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java @@ -31,6 +31,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.SparseArray; +import com.android.packageinstaller.R; import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; @@ -275,7 +276,7 @@ public class PermissionApps { if (info.icon != 0) { mIcon = info.loadUnbadgedIcon(mPm); } else { - mIcon = mContext.getDrawable(com.android.internal.R.drawable.ic_perm_device_info); + mIcon = mContext.getDrawable(R.drawable.ic_perm_device_info); } mIcon = Utils.applyTint(mContext, mIcon, android.R.attr.colorControlNormal); } diff --git a/src/com/android/packageinstaller/permission/ui/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AllAppPermissionsFragment.java deleted file mode 100644 index 2fb9a510..00000000 --- a/src/com/android/packageinstaller/permission/ui/AllAppPermissionsFragment.java +++ /dev/null @@ -1,217 +0,0 @@ -/* -* Copyright (C) 2015 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.packageinstaller.permission.ui; - -import android.app.ActionBar; -import android.app.AlertDialog; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageItemInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PermissionGroupInfo; -import android.content.pm.PermissionInfo; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.provider.Settings; -import android.support.v7.preference.Preference; -import android.support.v7.preference.Preference.OnPreferenceClickListener; -import android.support.v7.preference.PreferenceCategory; -import android.support.v7.preference.PreferenceGroup; -import android.util.Log; -import android.view.MenuItem; - -import com.android.packageinstaller.R; -import com.android.packageinstaller.permission.utils.Utils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; - -public final class AllAppPermissionsFragment extends SettingsWithHeader { - - private static final String LOG_TAG = "AllAppPermissionsFragment"; - - private static final String KEY_OTHER = "other_perms"; - - public static AllAppPermissionsFragment newInstance(String packageName) { - AllAppPermissionsFragment instance = new AllAppPermissionsFragment(); - Bundle arguments = new Bundle(); - arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); - instance.setArguments(arguments); - return instance; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - final ActionBar ab = getActivity().getActionBar(); - if (ab != null) { - ab.setTitle(R.string.all_permissions); - ab.setDisplayHomeAsUpEnabled(true); - } - } - - @Override - public void onResume() { - super.onResume(); - updateUi(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: { - getFragmentManager().popBackStack(); - return true; - } - } - return super.onOptionsItemSelected(item); - } - - private void updateUi() { - if (getPreferenceScreen() != null) { - getPreferenceScreen().removeAll(); - } - addPreferencesFromResource(R.xml.all_permissions); - PreferenceGroup otherGroup = (PreferenceGroup) findPreference(KEY_OTHER); - ArrayList prefs = new ArrayList<>(); // Used for sorting. - prefs.add(otherGroup); - String pkg = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); - otherGroup.removeAll(); - PackageManager pm = getContext().getPackageManager(); - - try { - PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_PERMISSIONS); - - ApplicationInfo appInfo = info.applicationInfo; - final Drawable icon = appInfo.loadIcon(pm); - final CharSequence label = appInfo.loadLabel(pm); - Intent infoIntent = null; - if (!getActivity().getIntent().getBooleanExtra( - AppPermissionsFragment.EXTRA_HIDE_INFO_BUTTON, false)) { - infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.fromParts("package", pkg, null)); - } - setHeader(icon, label, infoIntent); - - if (info.requestedPermissions != null) { - for (int i = 0; i < info.requestedPermissions.length; i++) { - PermissionInfo perm; - try { - perm = pm.getPermissionInfo(info.requestedPermissions[i], 0); - } catch (NameNotFoundException e) { - Log.e(LOG_TAG, - "Can't get permission info for " + info.requestedPermissions[i], e); - continue; - } - - if ((perm.flags & PermissionInfo.FLAG_INSTALLED) == 0 - || (perm.flags & PermissionInfo.FLAG_HIDDEN) != 0) { - continue; - } - - if (perm.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) { - PermissionGroupInfo group = getGroup(perm.group, pm); - PreferenceGroup pref = - findOrCreate(group != null ? group : perm, pm, prefs); - pref.addPreference(getPreference(perm, group, pm)); - } else if (perm.protectionLevel == PermissionInfo.PROTECTION_NORMAL) { - PermissionGroupInfo group = getGroup(perm.group, pm); - otherGroup.addPreference(getPreference(perm, group, pm)); - } - } - } - } catch (NameNotFoundException e) { - Log.e(LOG_TAG, "Problem getting package info for " + pkg, e); - } - // Sort an ArrayList of the groups and then set the order from the sorting. - Collections.sort(prefs, new Comparator() { - @Override - public int compare(Preference lhs, Preference rhs) { - String lKey = lhs.getKey(); - String rKey = rhs.getKey(); - if (lKey.equals(KEY_OTHER)) { - return 1; - } else if (rKey.equals(KEY_OTHER)) { - return -1; - } else if (Utils.isModernPermissionGroup(lKey) - != Utils.isModernPermissionGroup(rKey)) { - return Utils.isModernPermissionGroup(lKey) ? -1 : 1; - } - return lhs.getTitle().toString().compareTo(rhs.getTitle().toString()); - } - }); - for (int i = 0; i < prefs.size(); i++) { - prefs.get(i).setOrder(i); - } - } - - private PermissionGroupInfo getGroup(String group, PackageManager pm) { - try { - return pm.getPermissionGroupInfo(group, 0); - } catch (NameNotFoundException e) { - return null; - } - } - - private PreferenceGroup findOrCreate(PackageItemInfo group, PackageManager pm, - ArrayList prefs) { - PreferenceGroup pref = (PreferenceGroup) findPreference(group.name); - if (pref == null) { - pref = new PreferenceCategory(getContext()); - pref.setKey(group.name); - pref.setLayoutResource(R.layout.preference_category_material); - pref.setTitle(group.loadLabel(pm)); - prefs.add(pref); - getPreferenceScreen().addPreference(pref); - } - return pref; - } - - private Preference getPreference(PermissionInfo perm, PermissionGroupInfo group, - PackageManager pm) { - Preference pref = new Preference(getContext()); - pref.setLayoutResource(R.layout.preference_permissions); - Drawable icon = null; - if (perm.icon != 0) { - icon = perm.loadIcon(pm); - } else if (group != null && group.icon != 0) { - icon = group.loadIcon(pm); - } else { - icon = getContext().getDrawable(R.drawable.ic_perm_device_info); - } - pref.setIcon(Utils.applyTint(getContext(), icon, android.R.attr.colorControlNormal)); - pref.setTitle(perm.loadLabel(pm)); - final CharSequence desc = perm.loadDescription(pm); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - new AlertDialog.Builder(getContext()) - .setMessage(desc) - .setPositiveButton(android.R.string.ok, null) - .show(); - return true; - } - }); - - return pref; - } -} \ No newline at end of file diff --git a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java deleted file mode 100644 index 6396c61e..00000000 --- a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java +++ /dev/null @@ -1,403 +0,0 @@ -/* -* Copyright (C) 2015 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.packageinstaller.permission.ui; - -import android.annotation.Nullable; -import android.app.ActionBar; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Fragment; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.provider.Settings; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.Preference.OnPreferenceChangeListener; -import android.support.v7.preference.Preference.OnPreferenceClickListener; -import android.support.v7.preference.PreferenceScreen; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.android.packageinstaller.R; -import com.android.packageinstaller.permission.model.AppPermissionGroup; -import com.android.packageinstaller.permission.model.AppPermissions; -import com.android.packageinstaller.permission.utils.LocationUtils; -import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.permission.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public final class AppPermissionsFragment extends SettingsWithHeader - implements OnPreferenceChangeListener { - - private static final String LOG_TAG = "ManagePermsFragment"; - - static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton"; - - private static final int MENU_ALL_PERMS = 0; - - private List mToggledGroups; - private AppPermissions mAppPermissions; - private PreferenceScreen mExtraScreen; - - private boolean mHasConfirmedRevoke; - - public static AppPermissionsFragment newInstance(String packageName) { - return setPackageName(new AppPermissionsFragment(), packageName); - } - - private static T setPackageName(T fragment, String packageName) { - Bundle arguments = new Bundle(); - arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); - fragment.setArguments(arguments); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setLoading(true /* loading */, false /* animate */); - setHasOptionsMenu(true); - final ActionBar ab = getActivity().getActionBar(); - if (ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - } - - String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); - Activity activity = getActivity(); - PackageInfo packageInfo = getPackageInfo(activity, packageName); - if (packageInfo == null) { - Toast.makeText(activity, R.string.app_not_found_dlg_title, Toast.LENGTH_LONG).show(); - activity.finish(); - return; - } - - mAppPermissions = new AppPermissions(activity, packageInfo, null, true, new Runnable() { - @Override - public void run() { - getActivity().finish(); - } - }); - loadPreferences(); - } - - @Override - public void onResume() { - super.onResume(); - mAppPermissions.refresh(); - setPreferencesCheckedState(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: { - getActivity().finish(); - return true; - } - - case MENU_ALL_PERMS: { - Fragment frag = AllAppPermissionsFragment.newInstance( - getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, frag) - .addToBackStack("AllPerms") - .commit(); - return true; - } - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - if (mAppPermissions != null) { - bindUi(this, mAppPermissions.getPackageInfo()); - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - menu.add(Menu.NONE, MENU_ALL_PERMS, Menu.NONE, R.string.all_permissions); - } - - private static void bindUi(SettingsWithHeader fragment, PackageInfo packageInfo) { - Activity activity = fragment.getActivity(); - PackageManager pm = activity.getPackageManager(); - ApplicationInfo appInfo = packageInfo.applicationInfo; - Intent infoIntent = null; - if (!activity.getIntent().getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { - infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.fromParts("package", packageInfo.packageName, null)); - } - - Drawable icon = appInfo.loadIcon(pm); - CharSequence label = appInfo.loadLabel(pm); - fragment.setHeader(icon, label, infoIntent); - - ActionBar ab = activity.getActionBar(); - if (ab != null) { - ab.setTitle(R.string.app_permissions); - } - - ViewGroup rootView = (ViewGroup) fragment.getView(); - ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); - if (iconView != null) { - iconView.setImageDrawable(icon); - } - TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); - if (titleView != null) { - titleView.setText(R.string.app_permissions); - } - TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); - if (breadcrumbView != null) { - breadcrumbView.setText(label); - } - } - - private void loadPreferences() { - Context context = getPreferenceManager().getContext(); - if (context == null) { - return; - } - - PreferenceScreen screen = getPreferenceScreen(); - screen.removeAll(); - - if (mExtraScreen != null) { - mExtraScreen.removeAll(); - } - - final Preference extraPerms = new Preference(context); - extraPerms.setIcon(R.drawable.ic_toc); - extraPerms.setTitle(R.string.additional_permissions); - - for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { - if (!Utils.shouldShowPermission(group, mAppPermissions.getPackageInfo().packageName)) { - continue; - } - - boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); - - SwitchPreference preference = new SwitchPreference(context); - preference.setOnPreferenceChangeListener(this); - preference.setKey(group.getName()); - Drawable icon = Utils.loadDrawable(context.getPackageManager(), - group.getIconPkg(), group.getIconResId()); - preference.setIcon(Utils.applyTint(getContext(), icon, - android.R.attr.colorControlNormal)); - preference.setTitle(group.getLabel()); - if (group.isPolicyFixed()) { - preference.setSummary(getString(R.string.permission_summary_enforced_by_policy)); - } - preference.setPersistent(false); - preference.setEnabled(!group.isPolicyFixed()); - preference.setChecked(group.areRuntimePermissionsGranted()); - - if (isPlatform) { - screen.addPreference(preference); - } else { - if (mExtraScreen == null) { - mExtraScreen = getPreferenceManager().createPreferenceScreen(context); - } - mExtraScreen.addPreference(preference); - } - } - - if (mExtraScreen != null) { - extraPerms.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); - setPackageName(frag, getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); - frag.setTargetFragment(AppPermissionsFragment.this, 0); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, frag) - .addToBackStack(null) - .commit(); - return true; - } - }); - int count = mExtraScreen.getPreferenceCount(); - extraPerms.setSummary(getResources().getQuantityString( - R.plurals.additional_permissions_more, count, count)); - screen.addPreference(extraPerms); - } - - setLoading(false /* loading */, true /* animate */); - } - - @Override - public boolean onPreferenceChange(final Preference preference, Object newValue) { - String groupName = preference.getKey(); - final AppPermissionGroup group = mAppPermissions.getPermissionGroup(groupName); - - if (group == null) { - return false; - } - - OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); - if (activity.isObscuredTouch()) { - activity.showOverlayDialog(); - return false; - } - - addToggledGroup(group); - - if (LocationUtils.isLocationGroupAndProvider(group.getName(), group.getApp().packageName)) { - LocationUtils.showLocationDialog(getContext(), mAppPermissions.getAppLabel()); - return false; - } - if (newValue == Boolean.TRUE) { - group.grantRuntimePermissions(false); - } else { - final boolean grantedByDefault = group.hasGrantedByDefaultPermission(); - if (grantedByDefault || (!group.hasRuntimePermission() && !mHasConfirmedRevoke)) { - new AlertDialog.Builder(getContext()) - .setMessage(grantedByDefault ? R.string.system_warning - : R.string.old_sdk_deny_warning) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.grant_dialog_button_deny, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ((SwitchPreference) preference).setChecked(false); - group.revokeRuntimePermissions(false); - if (!grantedByDefault) { - mHasConfirmedRevoke = true; - } - } - }) - .show(); - return false; - } else { - group.revokeRuntimePermissions(false); - } - } - - return true; - } - - @Override - public void onPause() { - super.onPause(); - logToggledGroups(); - } - - private void addToggledGroup(AppPermissionGroup group) { - if (mToggledGroups == null) { - mToggledGroups = new ArrayList<>(); - } - // Double toggle is back to initial state. - if (mToggledGroups.contains(group)) { - mToggledGroups.remove(group); - } else { - mToggledGroups.add(group); - } - } - - private void logToggledGroups() { - if (mToggledGroups != null) { - String packageName = mAppPermissions.getPackageInfo().packageName; - SafetyNetLogger.logPermissionsToggled(packageName, mToggledGroups); - mToggledGroups = null; - } - } - - private void setPreferencesCheckedState() { - setPreferencesCheckedState(getPreferenceScreen()); - if (mExtraScreen != null) { - setPreferencesCheckedState(mExtraScreen); - } - } - - private void setPreferencesCheckedState(PreferenceScreen screen) { - int preferenceCount = screen.getPreferenceCount(); - for (int i = 0; i < preferenceCount; i++) { - Preference preference = screen.getPreference(i); - if (preference instanceof SwitchPreference) { - SwitchPreference switchPref = (SwitchPreference) preference; - AppPermissionGroup group = mAppPermissions.getPermissionGroup(switchPref.getKey()); - if (group != null) { - switchPref.setChecked(group.areRuntimePermissionsGranted()); - } - } - } - } - - private static PackageInfo getPackageInfo(Activity activity, String packageName) { - try { - return activity.getPackageManager().getPackageInfo( - packageName, PackageManager.GET_PERMISSIONS); - } catch (PackageManager.NameNotFoundException e) { - Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); - return null; - } - } - - public static class AdditionalPermissionsFragment extends SettingsWithHeader { - AppPermissionsFragment mOuterFragment; - - @Override - public void onCreate(Bundle savedInstanceState) { - mOuterFragment = (AppPermissionsFragment) getTargetFragment(); - super.onCreate(savedInstanceState); - setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent); - setHasOptionsMenu(true); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferenceScreen(mOuterFragment.mExtraScreen); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); - bindUi(this, getPackageInfo(getActivity(), packageName)); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - getFragmentManager().popBackStack(); - return true; - } - return super.onOptionsItemSelected(item); - } - } -} diff --git a/src/com/android/packageinstaller/permission/ui/ButtonBarLayout.java b/src/com/android/packageinstaller/permission/ui/ButtonBarLayout.java new file mode 100644 index 00000000..59e54707 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/ButtonBarLayout.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; +import com.android.packageinstaller.R; + +/** + * An extension of LinearLayout that automatically switches to vertical + * orientation when it can't fit its child views horizontally. + */ +public class ButtonBarLayout extends LinearLayout { + /** Whether the current configuration allows stacking. */ + private boolean mAllowStacking; + + private int mLastWidthSize = -1; + + public ButtonBarLayout(Context context, AttributeSet attrs) { + super(context, attrs); + mAllowStacking = true; + } + + public void setAllowStacking(boolean allowStacking) { + if (mAllowStacking != allowStacking) { + mAllowStacking = allowStacking; + if (!mAllowStacking && getOrientation() == LinearLayout.VERTICAL) { + setStacked(false); + } + requestLayout(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + + if (mAllowStacking) { + if (widthSize > mLastWidthSize && isStacked()) { + // We're being measured wider this time, try un-stacking. + setStacked(false); + } + + mLastWidthSize = widthSize; + } + + boolean needsRemeasure = false; + + // If we're not stacked, make sure the measure spec is AT_MOST rather + // than EXACTLY. This ensures that we'll still get TOO_SMALL so that we + // know to stack the buttons. + final int initialWidthMeasureSpec; + if (!isStacked() && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) { + initialWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST); + + // We'll need to remeasure again to fill excess space. + needsRemeasure = true; + } else { + initialWidthMeasureSpec = widthMeasureSpec; + } + + super.onMeasure(initialWidthMeasureSpec, heightMeasureSpec); + + if (mAllowStacking && !isStacked()) { + final int measuredWidth = getMeasuredWidthAndState(); + final int measuredWidthState = measuredWidth & MEASURED_STATE_MASK; + if (measuredWidthState == MEASURED_STATE_TOO_SMALL) { + setStacked(true); + + // Measure again in the new orientation. + needsRemeasure = true; + } + } + + if (needsRemeasure) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + private void setStacked(boolean stacked) { + setOrientation(stacked ? LinearLayout.VERTICAL : LinearLayout.HORIZONTAL); + setGravity(stacked ? Gravity.RIGHT : Gravity.BOTTOM); + + final View spacer = findViewById(R.id.spacer); + if (spacer != null) { + spacer.setVisibility(stacked ? View.GONE : View.INVISIBLE); + } + + // Reverse the child order. This is specific to the Material button + // bar's layout XML and will probably not generalize. + final int childCount = getChildCount(); + for (int i = childCount - 2; i >= 0; i--) { + bringChildToFront(getChildAt(i)); + } + } + + private boolean isStacked() { + return getOrientation() == LinearLayout.VERTICAL; + } +} diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java index ffa8bf35..102fd6ef 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java @@ -26,11 +26,12 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionInfo; import android.content.res.Resources; +import android.graphics.Typeface; import android.graphics.drawable.Icon; import android.hardware.camera2.utils.ArrayUtils; import android.os.Bundle; import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; @@ -73,11 +74,13 @@ public class GrantPermissionsActivity extends OverlayTouchActivity setTitle(R.string.permission_request_title); if (DeviceUtils.isTelevision(this)) { - mViewHandler = new GrantPermissionsTvViewHandler(this).setResultListener(this); + mViewHandler = new com.android.packageinstaller.permission.ui.television + .GrantPermissionsViewHandlerImpl(this).setResultListener(this); } else if (DeviceUtils.isWear(this)) { mViewHandler = new GrantPermissionsWatchViewHandler(this).setResultListener(this); } else { - mViewHandler = new GrantPermissionsDefaultViewHandler(this).setResultListener(this); + mViewHandler = new com.android.packageinstaller.permission.ui.handheld + .GrantPermissionsViewHandlerImpl(this).setResultListener(this); } mRequestedPermissions = getIntent().getStringArrayExtra( @@ -209,8 +212,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity // Color the app name. int appLabelStart = message.toString().indexOf(appLabel.toString(), 0); int appLabelLength = appLabel.length(); - int color = getColor(R.color.grant_permissions_app_color); - message.setSpan(new ForegroundColorSpan(color), appLabelStart, + message.setSpan(new StyleSpan(Typeface.BOLD), appLabelStart, appLabelStart + appLabelLength, 0); // Set the new grant view diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java deleted file mode 100644 index c5d78784..00000000 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright (C) 2015 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.packageinstaller.permission.ui; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.drawable.Icon; -import android.os.Bundle; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnLayoutChangeListener; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.ViewRootImpl; -import android.view.WindowManager.LayoutParams; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.internal.widget.ButtonBarLayout; -import com.android.packageinstaller.R; - -import java.util.ArrayList; - -final class GrantPermissionsDefaultViewHandler - implements GrantPermissionsViewHandler, OnClickListener { - - public static final String ARG_GROUP_NAME = "ARG_GROUP_NAME"; - public static final String ARG_GROUP_COUNT = "ARG_GROUP_COUNT"; - public static final String ARG_GROUP_INDEX = "ARG_GROUP_INDEX"; - public static final String ARG_GROUP_ICON = "ARG_GROUP_ICON"; - public static final String ARG_GROUP_MESSAGE = "ARG_GROUP_MESSAGE"; - public static final String ARG_GROUP_SHOW_DO_NOT_ASK = "ARG_GROUP_SHOW_DO_NOT_ASK"; - public static final String ARG_GROUP_DO_NOT_ASK_CHECKED = "ARG_GROUP_DO_NOT_ASK_CHECKED"; - - // Animation parameters. - private static final long SIZE_START_DELAY = 300; - private static final long SIZE_START_LENGTH = 233; - private static final long FADE_OUT_START_DELAY = 300; - private static final long FADE_OUT_START_LENGTH = 217; - private static final long TRANSLATE_START_DELAY = 367; - private static final long TRANSLATE_LENGTH = 317; - private static final long GROUP_UPDATE_DELAY = 400; - private static final long DO_NOT_ASK_CHECK_DELAY = 450; - - private final Context mContext; - - private ResultListener mResultListener; - - private String mGroupName; - private int mGroupCount; - private int mGroupIndex; - private Icon mGroupIcon; - private CharSequence mGroupMessage; - private boolean mShowDonNotAsk; - private boolean mDoNotAskChecked; - - private ImageView mIconView; - private TextView mCurrentGroupView; - private TextView mMessageView; - private CheckBox mDoNotAskCheckbox; - private Button mAllowButton; - - private ArrayList mHeightControllers; - private ManualLayoutFrame mRootView; - - // Needed for animation - private ViewGroup mDescContainer; - private ViewGroup mCurrentDesc; - private ViewGroup mNextDesc; - - private ViewGroup mDialogContainer; - - private final Runnable mUpdateGroup = new Runnable() { - @Override - public void run() { - updateGroup(); - } - }; - - GrantPermissionsDefaultViewHandler(Context context) { - mContext = context; - } - - @Override - public GrantPermissionsDefaultViewHandler setResultListener(ResultListener listener) { - mResultListener = listener; - return this; - } - - @Override - public void saveInstanceState(Bundle arguments) { - arguments.putString(ARG_GROUP_NAME, mGroupName); - arguments.putInt(ARG_GROUP_COUNT, mGroupCount); - arguments.putInt(ARG_GROUP_INDEX, mGroupIndex); - arguments.putParcelable(ARG_GROUP_ICON, mGroupIcon); - arguments.putCharSequence(ARG_GROUP_MESSAGE, mGroupMessage); - arguments.putBoolean(ARG_GROUP_SHOW_DO_NOT_ASK, mShowDonNotAsk); - arguments.putBoolean(ARG_GROUP_DO_NOT_ASK_CHECKED, mDoNotAskCheckbox.isChecked()); - } - - @Override - public void loadInstanceState(Bundle savedInstanceState) { - mGroupName = savedInstanceState.getString(ARG_GROUP_NAME); - mGroupMessage = savedInstanceState.getCharSequence(ARG_GROUP_MESSAGE); - mGroupIcon = savedInstanceState.getParcelable(ARG_GROUP_ICON); - mGroupCount = savedInstanceState.getInt(ARG_GROUP_COUNT); - mGroupIndex = savedInstanceState.getInt(ARG_GROUP_INDEX); - mShowDonNotAsk = savedInstanceState.getBoolean(ARG_GROUP_SHOW_DO_NOT_ASK); - mDoNotAskChecked = savedInstanceState.getBoolean(ARG_GROUP_DO_NOT_ASK_CHECKED); - } - - @Override - public void updateUi(String groupName, int groupCount, int groupIndex, Icon icon, - CharSequence message, boolean showDonNotAsk) { - mGroupName = groupName; - mGroupCount = groupCount; - mGroupIndex = groupIndex; - mGroupIcon = icon; - mGroupMessage = message; - mShowDonNotAsk = showDonNotAsk; - mDoNotAskChecked = false; - // If this is a second (or later) permission and the views exist, then animate. - if (mIconView != null) { - if (mGroupIndex > 0) { - // The first message will be announced as the title of the activity, all others - // we need to announce ourselves. - mDescContainer.announceForAccessibility(message); - animateToPermission(); - } else { - updateDescription(); - updateGroup(); - updateDoNotAskCheckBox(); - } - } - } - - private void animateToPermission() { - if (mHeightControllers == null) { - // We need to manually control the height of any views heigher than the root that - // we inflate. Find all the views up to the root and create ViewHeightControllers for - // them. - mHeightControllers = new ArrayList<>(); - ViewRootImpl viewRoot = mRootView.getViewRootImpl(); - ViewParent v = mRootView.getParent(); - addHeightController(mDialogContainer); - addHeightController(mRootView); - while (v != viewRoot) { - addHeightController((View) v); - v = v.getParent(); - } - // On the heighest level view, we want to setTop rather than setBottom to control the - // height, this way the dialog will grow up rather than down. - ViewHeightController realRootView = - mHeightControllers.get(mHeightControllers.size() - 1); - realRootView.setControlTop(true); - } - - // Grab the current height/y positions, then wait for the layout to change, - // so we can get the end height/y positions. - final SparseArray startPositions = getViewPositions(); - final int startHeight = mRootView.getLayoutHeight(); - mRootView.addOnLayoutChangeListener(new OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, - int oldTop, int oldRight, int oldBottom) { - mRootView.removeOnLayoutChangeListener(this); - SparseArray endPositions = getViewPositions(); - int endHeight = mRootView.getLayoutHeight(); - if (startPositions.get(R.id.do_not_ask_checkbox) == 0 - && endPositions.get(R.id.do_not_ask_checkbox) != 0) { - // If the checkbox didn't have a position before but has one now then set - // the start position to the end position because it just became visible. - startPositions.put(R.id.do_not_ask_checkbox, - endPositions.get(R.id.do_not_ask_checkbox)); - } - animateYPos(startPositions, endPositions, endHeight - startHeight); - } - }); - - // Fade out old description group and scale out the icon for it. - Interpolator interpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.fast_out_linear_in); - mIconView.animate() - .scaleX(0) - .scaleY(0) - .setStartDelay(FADE_OUT_START_DELAY) - .setDuration(FADE_OUT_START_LENGTH) - .setInterpolator(interpolator) - .start(); - mCurrentDesc.animate() - .alpha(0) - .setStartDelay(FADE_OUT_START_DELAY) - .setDuration(FADE_OUT_START_LENGTH) - .setInterpolator(interpolator) - .setListener(null) - .start(); - - // Update the index of the permission after the animations have started. - mCurrentGroupView.getHandler().postDelayed(mUpdateGroup, GROUP_UPDATE_DELAY); - - // Add the new description and translate it in. - mNextDesc = (ViewGroup) LayoutInflater.from(mContext).inflate( - R.layout.permission_description, mDescContainer, false); - - mMessageView = (TextView) mNextDesc.findViewById(R.id.permission_message); - mIconView = (ImageView) mNextDesc.findViewById(R.id.permission_icon); - updateDescription(); - - int width = mDescContainer.getRootView().getWidth(); - mDescContainer.addView(mNextDesc); - mNextDesc.setTranslationX(width); - - final View oldDesc = mCurrentDesc; - // Remove the old view from the description, so that we can shrink if necessary. - mDescContainer.removeView(oldDesc); - oldDesc.setPadding(mDescContainer.getLeft(), mDescContainer.getTop(), - mRootView.getRight() - mDescContainer.getRight(), 0); - mRootView.addView(oldDesc); - - mCurrentDesc = mNextDesc; - mNextDesc.animate() - .translationX(0) - .setStartDelay(TRANSLATE_START_DELAY) - .setDuration(TRANSLATE_LENGTH) - .setInterpolator(AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.linear_out_slow_in)) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - // This is the longest animation, when it finishes, we are done. - mRootView.removeView(oldDesc); - } - }) - .start(); - - boolean visibleBefore = mDoNotAskCheckbox.getVisibility() == View.VISIBLE; - updateDoNotAskCheckBox(); - boolean visibleAfter = mDoNotAskCheckbox.getVisibility() == View.VISIBLE; - if (visibleBefore != visibleAfter) { - Animation anim = AnimationUtils.loadAnimation(mContext, - visibleAfter ? android.R.anim.fade_in : android.R.anim.fade_out); - anim.setStartOffset(visibleAfter ? DO_NOT_ASK_CHECK_DELAY : 0); - mDoNotAskCheckbox.startAnimation(anim); - } - } - - private void addHeightController(View v) { - ViewHeightController heightController = new ViewHeightController(v); - heightController.setHeight(v.getHeight()); - mHeightControllers.add(heightController); - } - - private SparseArray getViewPositions() { - SparseArray locMap = new SparseArray<>(); - final int N = mDialogContainer.getChildCount(); - for (int i = 0; i < N; i++) { - View child = mDialogContainer.getChildAt(i); - if (child.getId() <= 0) { - // Only track views with ids. - continue; - } - locMap.put(child.getId(), child.getY()); - } - return locMap; - } - - private void animateYPos(SparseArray startPositions, SparseArray endPositions, - int heightDiff) { - final int N = startPositions.size(); - for (int i = 0; i < N; i++) { - int key = startPositions.keyAt(i); - float start = startPositions.get(key); - float end = endPositions.get(key); - if (start != end) { - final View child = mDialogContainer.findViewById(key); - child.setTranslationY(start - end); - child.animate() - .setStartDelay(SIZE_START_DELAY) - .setDuration(SIZE_START_LENGTH) - .translationY(0) - .start(); - } - } - for (int i = 0; i < mHeightControllers.size(); i++) { - mHeightControllers.get(i).animateAddHeight(heightDiff); - } - } - - @Override - public View createView() { - mRootView = (ManualLayoutFrame) LayoutInflater.from(mContext) - .inflate(R.layout.grant_permissions, null); - ((ButtonBarLayout) mRootView.findViewById(R.id.button_group)).setAllowStacking( - Resources.getSystem().getBoolean( - com.android.internal.R.bool.allow_stacked_button_bar)); - - mDialogContainer = (ViewGroup) mRootView.findViewById(R.id.dialog_container); - mMessageView = (TextView) mRootView.findViewById(R.id.permission_message); - mIconView = (ImageView) mRootView.findViewById(R.id.permission_icon); - mCurrentGroupView = (TextView) mRootView.findViewById(R.id.current_page_text); - mDoNotAskCheckbox = (CheckBox) mRootView.findViewById(R.id.do_not_ask_checkbox); - mAllowButton = (Button) mRootView.findViewById(R.id.permission_allow_button); - - mDescContainer = (ViewGroup) mRootView.findViewById(R.id.desc_container); - mCurrentDesc = (ViewGroup) mRootView.findViewById(R.id.perm_desc_root); - - mAllowButton.setOnClickListener(this); - mRootView.findViewById(R.id.permission_deny_button).setOnClickListener(this); - mDoNotAskCheckbox.setOnClickListener(this); - - if (mGroupName != null) { - updateDescription(); - updateGroup(); - updateDoNotAskCheckBox(); - } - - return mRootView; - } - - @Override - public void updateWindowAttributes(LayoutParams outLayoutParams) { - // No-op - } - - private void updateDescription() { - mIconView.setImageDrawable(mGroupIcon.loadDrawable(mContext)); - mMessageView.setText(mGroupMessage); - } - - private void updateGroup() { - if (mGroupCount > 1) { - mCurrentGroupView.setVisibility(View.VISIBLE); - mCurrentGroupView.setText(mContext.getString(R.string.current_permission_template, - mGroupIndex + 1, mGroupCount)); - } else { - mCurrentGroupView.setVisibility(View.INVISIBLE); - } - } - - private void updateDoNotAskCheckBox() { - if (mShowDonNotAsk) { - mDoNotAskCheckbox.setVisibility(View.VISIBLE); - mDoNotAskCheckbox.setOnClickListener(this); - mDoNotAskCheckbox.setChecked(mDoNotAskChecked); - } else { - mDoNotAskCheckbox.setVisibility(View.GONE); - mDoNotAskCheckbox.setOnClickListener(null); - } - } - - @Override - public void onClick(View view) { - switch (view.getId()) { - case R.id.permission_allow_button: - if (mResultListener != null) { - view.clearAccessibilityFocus(); - mResultListener.onPermissionGrantResult(mGroupName, true, false); - } - break; - case R.id.permission_deny_button: - mAllowButton.setEnabled(true); - if (mResultListener != null) { - view.clearAccessibilityFocus(); - mResultListener.onPermissionGrantResult(mGroupName, false, - mDoNotAskCheckbox.isChecked()); - } - break; - case R.id.do_not_ask_checkbox: - mAllowButton.setEnabled(!mDoNotAskCheckbox.isChecked()); - break; - } - } - - @Override - public void onBackPressed() { - if (mResultListener != null) { - final boolean doNotAskAgain = mDoNotAskCheckbox.isChecked(); - mResultListener.onPermissionGrantResult(mGroupName, false, doNotAskAgain); - } - } - - /** - * Manually controls the height of a view through getBottom/setTop. Also listens - * for layout changes and sets the height again to be sure it doesn't change. - */ - private static final class ViewHeightController implements OnLayoutChangeListener { - private final View mView; - private int mHeight; - private int mNextHeight; - private boolean mControlTop; - private ObjectAnimator mAnimator; - - public ViewHeightController(View view) { - mView = view; - mView.addOnLayoutChangeListener(this); - } - - public void setControlTop(boolean controlTop) { - mControlTop = controlTop; - } - - public void animateAddHeight(int heightDiff) { - if (heightDiff != 0) { - if (mNextHeight == 0) { - mNextHeight = mHeight; - } - mNextHeight += heightDiff; - if (mAnimator != null) { - mAnimator.cancel(); - } - mAnimator = ObjectAnimator.ofInt(this, "height", mHeight, mNextHeight); - mAnimator.setStartDelay(SIZE_START_DELAY); - mAnimator.setDuration(SIZE_START_LENGTH); - mAnimator.start(); - } - } - - public void setHeight(int height) { - mHeight = height; - updateHeight(); - } - - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, - int oldTop, int oldRight, int oldBottom) { - // Ensure that the height never changes. - updateHeight(); - } - - private void updateHeight() { - if (mControlTop) { - mView.setTop(mView.getBottom() - mHeight); - } else { - mView.setBottom(mView.getTop() + mHeight); - } - } - } -} diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsTvViewHandler.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsTvViewHandler.java deleted file mode 100644 index 0e979ab6..00000000 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsTvViewHandler.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.android.packageinstaller.permission.ui; - -import android.content.Context; -import android.graphics.PixelFormat; -import android.graphics.drawable.Icon; -import android.os.Bundle; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.packageinstaller.R; - -/** - * TV-specific view handler for the grant permissions activity. - */ -final class GrantPermissionsTvViewHandler implements GrantPermissionsViewHandler, OnClickListener { - - private static final String ARG_GROUP_NAME = "ARG_GROUP_NAME"; - - private final Context mContext; - - private ResultListener mResultListener; - - private String mGroupName; - - private LinearLayout mRootView; - private TextView mMessageView; - private ImageView mIconView; - private TextView mCurrentGroupView; - private Button mAllowButton; - private Button mSoftDenyButton; - private Button mHardDenyButton; - - GrantPermissionsTvViewHandler(Context context) { - mContext = context; - } - - @Override - public GrantPermissionsTvViewHandler setResultListener(ResultListener listener) { - mResultListener = listener; - return this; - } - - @Override - public View createView() { - mRootView = (LinearLayout) LayoutInflater.from(mContext) - .inflate(R.layout.grant_permissions, null); - - mMessageView = (TextView) mRootView.findViewById(R.id.permission_message); - mIconView = (ImageView) mRootView.findViewById(R.id.permission_icon); - mCurrentGroupView = (TextView) mRootView.findViewById(R.id.current_page_text); - mAllowButton = (Button) mRootView.findViewById(R.id.permission_allow_button); - mSoftDenyButton = (Button) mRootView.findViewById(R.id.permission_deny_button); - mHardDenyButton = (Button) mRootView.findViewById( - R.id.permission_deny_dont_ask_again_button); - - mAllowButton.setOnClickListener(this); - mSoftDenyButton.setOnClickListener(this); - mHardDenyButton.setOnClickListener(this); - - return mRootView; - } - - @Override - public void updateWindowAttributes(WindowManager.LayoutParams outLayoutParams) { - outLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; - outLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; - outLayoutParams.format = PixelFormat.OPAQUE; - outLayoutParams.gravity = Gravity.BOTTOM; - outLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; - outLayoutParams.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; - } - - @Override - public void updateUi(String groupName, int groupCount, int groupIndex, Icon icon, - CharSequence message, boolean showDoNotAsk) { - mGroupName = groupName; - - mMessageView.setText(message); - mIconView.setImageIcon(icon); - mHardDenyButton.setVisibility(showDoNotAsk ? View.VISIBLE : View.GONE); - if (groupCount > 1) { - mCurrentGroupView.setVisibility(View.VISIBLE); - mCurrentGroupView.setText(mContext.getString(R.string.current_permission_template, - groupIndex + 1, groupCount)); - } else { - mCurrentGroupView.setVisibility(View.INVISIBLE); - } - } - - @Override - public void saveInstanceState(Bundle outState) { - outState.putString(ARG_GROUP_NAME, mGroupName); - } - - @Override - public void loadInstanceState(Bundle savedInstanceState) { - mGroupName = savedInstanceState.getString(ARG_GROUP_NAME); - } - - @Override - public void onClick(View view) { - boolean granted = false; - boolean doNotAskAgain = false; - switch (view.getId()) { - case R.id.permission_allow_button: - granted = true; - break; - case R.id.permission_deny_dont_ask_again_button: - doNotAskAgain = true; - break; - } - if (mResultListener != null) { - mResultListener.onPermissionGrantResult(mGroupName, granted, doNotAskAgain); - } - } - - @Override - public void onBackPressed() { - if (mResultListener != null) { - mResultListener.onPermissionGrantResult(mGroupName, false, false); - } - } -} diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsViewHandler.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsViewHandler.java index 4032abb2..5e2259af 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsViewHandler.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsViewHandler.java @@ -25,7 +25,7 @@ import android.view.WindowManager; * Class for managing the presentation and user interaction of the "grant * permissions" user interface. */ -interface GrantPermissionsViewHandler { +public interface GrantPermissionsViewHandler { /** * Listener interface for getting notified when the user responds to a diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java index f7fcec5e..419dbf42 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java @@ -20,6 +20,7 @@ import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.util.Log; +import com.android.packageinstaller.permission.utils.Utils; import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear; import com.android.packageinstaller.DeviceUtils; @@ -40,7 +41,13 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { switch (action) { case Intent.ACTION_MANAGE_PERMISSIONS: { - fragment = ManagePermissionsFragment.newInstance(); + if (Utils.isTelevision(this)) { + fragment = com.android.packageinstaller.permission.ui.television + .ManagePermissionsFragment.newInstance(); + } else { + fragment = com.android.packageinstaller.permission.ui.handheld + .ManagePermissionsFragment.newInstance(); + } } break; case Intent.ACTION_MANAGE_APP_PERMISSIONS: { @@ -50,11 +57,14 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { finish(); return; } - if (DeviceUtils.isWear(this)) { fragment = AppPermissionsFragmentWear.newInstance(packageName); + } else if (Utils.isTelevision(this)) { + fragment = com.android.packageinstaller.permission.ui.television + .AppPermissionsFragment.newInstance(packageName); } else { - fragment = AppPermissionsFragment.newInstance(packageName); + fragment = com.android.packageinstaller.permission.ui.handheld + .AppPermissionsFragment.newInstance(packageName); } } break; @@ -65,7 +75,13 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { finish(); return; } - fragment = PermissionAppsFragment.newInstance(permissionName); + if (Utils.isTelevision(this)) { + fragment = com.android.packageinstaller.permission.ui.television + .PermissionAppsFragment.newInstance(permissionName); + } else { + fragment = com.android.packageinstaller.permission.ui.handheld + .PermissionAppsFragment.newInstance(permissionName); + } } break; default: { diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java deleted file mode 100644 index e5e06e09..00000000 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2015 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.packageinstaller.permission.ui; - -import android.annotation.Nullable; -import android.app.ActionBar; -import android.app.FragmentTransaction; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.v7.preference.Preference; -import android.support.v7.preference.Preference.OnPreferenceClickListener; -import android.support.v7.preference.PreferenceScreen; -import android.util.ArraySet; -import android.util.Log; -import android.view.MenuItem; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.packageinstaller.R; -import com.android.packageinstaller.permission.model.PermissionApps; -import com.android.packageinstaller.permission.model.PermissionApps.PmCache; -import com.android.packageinstaller.permission.model.PermissionGroup; -import com.android.packageinstaller.permission.model.PermissionGroups; -import com.android.packageinstaller.permission.utils.Utils; - -import java.util.List; - -public final class ManagePermissionsFragment extends PermissionsFrameFragment - implements PermissionGroups.PermissionsGroupsChangeCallback, OnPreferenceClickListener { - private static final String LOG_TAG = "ManagePermissionsFragment"; - - private static final String OS_PKG = "android"; - - private static final String EXTRA_PREFS_KEY = "extra_prefs_key"; - - private ArraySet mLauncherPkgs; - - private PermissionGroups mPermissions; - - private PreferenceScreen mExtraScreen; - - public static ManagePermissionsFragment newInstance() { - return new ManagePermissionsFragment(); - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - setLoading(true /* loading */, false /* animate */); - setHasOptionsMenu(true); - final ActionBar ab = getActivity().getActionBar(); - if (ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - } - mLauncherPkgs = Utils.getLauncherPackages(getContext()); - mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this); - } - - @Override - public void onResume() { - super.onResume(); - mPermissions.refresh(); - updatePermissionsUi(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - getActivity().finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public boolean onPreferenceClick(Preference preference) { - String key = preference.getKey(); - - PermissionGroup group = mPermissions.getGroup(key); - if (group == null) { - return false; - } - - Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) - .putExtra(Intent.EXTRA_PERMISSION_NAME, key); - try { - getActivity().startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.w(LOG_TAG, "No app to handle " + intent); - } - - return true; - } - - @Override - public void onPermissionGroupsChanged() { - updatePermissionsUi(); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - bindPermissionUi(getActivity(), getView()); - } - - private static void bindPermissionUi(@Nullable Context context, @Nullable View rootView) { - if (context == null || rootView == null) { - return; - } - - ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); - if (iconView != null) { - // Set the icon as the background instead of the image because ImageView - // doesn't properly scale vector drawables beyond their intrinsic size - Drawable icon = context.getDrawable(R.drawable.ic_lock); - icon.setTint(context.getColor(R.color.off_white)); - iconView.setBackground(icon); - } - TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); - if (titleView != null) { - titleView.setText(R.string.app_permissions); - } - TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); - if (breadcrumbView != null) { - breadcrumbView.setText(R.string.app_permissions_breadcrumb); - } - } - - private void updatePermissionsUi() { - Context context = getPreferenceManager().getContext(); - if (context == null) { - return; - } - - List groups = mPermissions.getGroups(); - PreferenceScreen screen = getPreferenceScreen(); - - // Use this to speed up getting the info for all of the PermissionApps below. - // Create a new one for each refresh to make sure it has fresh data. - PmCache cache = new PmCache(getContext().getPackageManager()); - for (PermissionGroup group : groups) { - boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG); - - Preference preference = findPreference(group.getName()); - if (preference == null && mExtraScreen != null) { - preference = mExtraScreen.findPreference(group.getName()); - } - if (preference == null) { - preference = new Preference(context); - preference.setOnPreferenceClickListener(this); - preference.setKey(group.getName()); - preference.setIcon(Utils.applyTint(context, group.getIcon(), - android.R.attr.colorControlNormal)); - preference.setTitle(group.getLabel()); - // Set blank summary so that no resizing/jumping happens when the summary is loaded. - preference.setSummary(" "); - preference.setPersistent(false); - if (isSystemPermission) { - screen.addPreference(preference); - } else { - if (mExtraScreen == null) { - mExtraScreen = getPreferenceManager().createPreferenceScreen(context); - } - mExtraScreen.addPreference(preference); - } - } - final Preference finalPref = preference; - - new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() { - @Override - public void onPermissionsLoaded(PermissionApps permissionApps) { - if (getActivity() == null) { - return; - } - int granted = permissionApps.getGrantedCount(mLauncherPkgs); - int total = permissionApps.getTotalCount(mLauncherPkgs); - finalPref.setSummary(getString(R.string.app_permissions_group_summary, - granted, total)); - } - }, cache).refresh(false); - } - - if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0 - && screen.findPreference(EXTRA_PREFS_KEY) == null) { - Preference extraScreenPreference = new Preference(context); - extraScreenPreference.setKey(EXTRA_PREFS_KEY); - extraScreenPreference.setIcon(Utils.applyTint(context, - com.android.internal.R.drawable.ic_more_items, - android.R.attr.colorControlNormal)); - extraScreenPreference.setTitle(R.string.additional_permissions); - extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); - frag.setTargetFragment(ManagePermissionsFragment.this, 0); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, frag); - ft.addToBackStack(null); - ft.commit(); - return true; - } - }); - int count = mExtraScreen.getPreferenceCount(); - extraScreenPreference.setSummary(getResources().getQuantityString( - R.plurals.additional_permissions_more, count, count)); - screen.addPreference(extraScreenPreference); - } - if (screen.getPreferenceCount() != 0) { - setLoading(false /* loading */, true /* animate */); - } - } - - public static class AdditionalPermissionsFragment extends PermissionsFrameFragment { - @Override - public void onCreate(Bundle icicle) { - setLoading(true /* loading */, false /* animate */); - super.onCreate(icicle); - getActivity().setTitle(R.string.additional_permissions); - setHasOptionsMenu(true); - } - - @Override - public void onDestroy() { - getActivity().setTitle(R.string.app_permissions); - super.onDestroy(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - getFragmentManager().popBackStack(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - bindPermissionUi(getActivity(), getView()); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen); - setLoading(false /* loading */, true /* animate */); - } - } -} diff --git a/src/com/android/packageinstaller/permission/ui/OverlayWarningDialog.java b/src/com/android/packageinstaller/permission/ui/OverlayWarningDialog.java index a7c1e2a1..61734b47 100644 --- a/src/com/android/packageinstaller/permission/ui/OverlayWarningDialog.java +++ b/src/com/android/packageinstaller/permission/ui/OverlayWarningDialog.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.packageinstaller.permission.ui; import android.app.Activity; diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java deleted file mode 100644 index 1e588939..00000000 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright (C) 2015 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.packageinstaller.permission.ui; - -import android.app.ActionBar; -import android.app.AlertDialog; -import android.app.Fragment; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.v14.preference.SwitchPreference; -import android.support.v4.util.ArrayMap; -import android.support.v7.preference.Preference; -import android.support.v7.preference.Preference.OnPreferenceChangeListener; -import android.support.v7.preference.Preference.OnPreferenceClickListener; -import android.support.v7.preference.PreferenceScreen; -import android.util.ArraySet; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.packageinstaller.DeviceUtils; -import com.android.packageinstaller.R; -import com.android.packageinstaller.permission.model.AppPermissionGroup; -import com.android.packageinstaller.permission.model.PermissionApps; -import com.android.packageinstaller.permission.model.PermissionApps.Callback; -import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; -import com.android.packageinstaller.permission.utils.LocationUtils; -import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.permission.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback, - OnPreferenceChangeListener { - - private static final int MENU_SHOW_SYSTEM = Menu.FIRST; - private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1; - private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem"; - - public static PermissionAppsFragment newInstance(String permissionName) { - return setPermissionName(new PermissionAppsFragment(), permissionName); - } - - private static T setPermissionName(T fragment, String permissionName) { - Bundle arguments = new Bundle(); - arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName); - fragment.setArguments(arguments); - return fragment; - } - - private PermissionApps mPermissionApps; - - private PreferenceScreen mExtraScreen; - - private ArrayMap mToggledGroups; - private ArraySet mLauncherPkgs; - private boolean mHasConfirmedRevoke; - - private boolean mShowSystem; - private MenuItem mShowSystemMenu; - private MenuItem mHideSystemMenu; - - private Callback mOnPermissionsLoadedListener; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setLoading(true /* loading */, false /* animate */); - setHasOptionsMenu(true); - final ActionBar ab = getActivity().getActionBar(); - if (ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - } - mLauncherPkgs = Utils.getLauncherPackages(getContext()); - - String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); - mPermissionApps = new PermissionApps(getActivity(), groupName, this); - mPermissionApps.refresh(true); - } - - @Override - public void onResume() { - super.onResume(); - mPermissionApps.refresh(true); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE, - R.string.menu_show_system); - mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE, - R.string.menu_hide_system); - updateMenu(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - getActivity().finish(); - return true; - case MENU_SHOW_SYSTEM: - case MENU_HIDE_SYSTEM: - mShowSystem = item.getItemId() == MENU_SHOW_SYSTEM; - if (mPermissionApps.getApps() != null) { - onPermissionsLoaded(mPermissionApps); - } - updateMenu(); - break; - } - return super.onOptionsItemSelected(item); - } - - private void updateMenu() { - mShowSystemMenu.setVisible(!mShowSystem); - mHideSystemMenu.setVisible(mShowSystem); - } - - @Override - protected void onSetEmptyText(TextView textView) { - textView.setText(R.string.no_apps); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - bindUi(this, mPermissionApps); - } - - private static void bindUi(Fragment fragment, PermissionApps permissionApps) { - final Drawable icon = permissionApps.getIcon(); - final CharSequence label = permissionApps.getLabel(); - final ActionBar ab = fragment.getActivity().getActionBar(); - if (ab != null) { - ab.setTitle(fragment.getString(R.string.permission_title, label)); - } - - final ViewGroup rootView = (ViewGroup) fragment.getView(); - final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); - if (iconView != null) { - // Set the icon as the background instead of the image because ImageView - // doesn't properly scale vector drawables beyond their intrinsic size - iconView.setBackground(icon); - } - final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); - if (titleView != null) { - titleView.setText(label); - } - final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); - if (breadcrumbView != null) { - breadcrumbView.setText(R.string.app_permissions); - } - } - - private void setOnPermissionsLoadedListener(Callback callback) { - mOnPermissionsLoadedListener = callback; - } - - @Override - public void onPermissionsLoaded(PermissionApps permissionApps) { - Context context = getPreferenceManager().getContext(); - - if (context == null) { - return; - } - - boolean isTelevision = DeviceUtils.isTelevision(context); - PreferenceScreen screen = getPreferenceScreen(); - - ArraySet preferencesToRemove = new ArraySet<>(); - for (int i = 0, n = screen.getPreferenceCount(); i < n; i++) { - preferencesToRemove.add(screen.getPreference(i).getKey()); - } - if (mExtraScreen != null) { - for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { - preferencesToRemove.add(mExtraScreen.getPreference(i).getKey()); - } - } - - for (PermissionApp app : permissionApps.getApps()) { - if (!Utils.shouldShowPermission(app)) { - continue; - } - - String key = app.getKey(); - preferencesToRemove.remove(key); - Preference existingPref = screen.findPreference(key); - if (existingPref == null && mExtraScreen != null) { - existingPref = mExtraScreen.findPreference(key); - } - - boolean isSystemApp = Utils.isSystem(app, mLauncherPkgs); - if (isSystemApp && !isTelevision && !mShowSystem) { - if (existingPref != null) { - screen.removePreference(existingPref); - } - continue; - } - - if (existingPref != null) { - // If existing preference - only update its state. - if (app.isPolicyFixed()) { - existingPref.setSummary(getString( - R.string.permission_summary_enforced_by_policy)); - } - existingPref.setPersistent(false); - existingPref.setEnabled(!app.isPolicyFixed()); - if (existingPref instanceof SwitchPreference) { - ((SwitchPreference) existingPref) - .setChecked(app.areRuntimePermissionsGranted()); - } - continue; - } - - SwitchPreference pref = new SwitchPreference(context); - pref.setOnPreferenceChangeListener(this); - pref.setKey(app.getKey()); - pref.setIcon(app.getIcon()); - pref.setTitle(app.getLabel()); - if (app.isPolicyFixed()) { - pref.setSummary(getString(R.string.permission_summary_enforced_by_policy)); - } - pref.setPersistent(false); - pref.setEnabled(!app.isPolicyFixed()); - pref.setChecked(app.areRuntimePermissionsGranted()); - - if (isSystemApp && isTelevision) { - if (mExtraScreen == null) { - mExtraScreen = getPreferenceManager().createPreferenceScreen(context); - } - mExtraScreen.addPreference(pref); - } else { - screen.addPreference(pref); - } - } - - if (mExtraScreen != null) { - preferencesToRemove.remove(KEY_SHOW_SYSTEM_PREFS); - Preference pref = screen.findPreference(KEY_SHOW_SYSTEM_PREFS); - - if (pref == null) { - pref = new Preference(context); - pref.setKey(KEY_SHOW_SYSTEM_PREFS); - pref.setIcon(Utils.applyTint(context, R.drawable.ic_toc, - android.R.attr.colorControlNormal)); - pref.setTitle(R.string.preference_show_system_apps); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - SystemAppsFragment frag = new SystemAppsFragment(); - setPermissionName(frag, getArguments().getString(Intent.EXTRA_PERMISSION_NAME)); - frag.setTargetFragment(PermissionAppsFragment.this, 0); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, frag) - .addToBackStack("SystemApps") - .commit(); - return true; - } - }); - screen.addPreference(pref); - } - - int grantedCount = 0; - for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { - if (((SwitchPreference) mExtraScreen.getPreference(i)).isChecked()) { - grantedCount++; - } - } - pref.setSummary(getString(R.string.app_permissions_group_summary, - grantedCount, mExtraScreen.getPreferenceCount())); - } - - for (String key : preferencesToRemove) { - Preference pref = screen.findPreference(key); - if (pref != null) { - screen.removePreference(pref); - } else if (mExtraScreen != null) { - pref = mExtraScreen.findPreference(key); - if (pref != null) { - mExtraScreen.removePreference(pref); - } - } - } - - setLoading(false /* loading */, true /* animate */); - - if (mOnPermissionsLoadedListener != null) { - mOnPermissionsLoadedListener.onPermissionsLoaded(permissionApps); - } - } - - @Override - public boolean onPreferenceChange(final Preference preference, Object newValue) { - String pkg = preference.getKey(); - final PermissionApp app = mPermissionApps.getApp(pkg); - - if (app == null) { - return false; - } - - OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); - if (activity.isObscuredTouch()) { - activity.showOverlayDialog(); - return false; - } - - addToggledGroup(app.getPackageName(), app.getPermissionGroup()); - - if (LocationUtils.isLocationGroupAndProvider(mPermissionApps.getGroupName(), - app.getPackageName())) { - LocationUtils.showLocationDialog(getContext(), app.getLabel()); - return false; - } - if (newValue == Boolean.TRUE) { - app.grantRuntimePermissions(); - } else { - final boolean grantedByDefault = app.hasGrantedByDefaultPermissions(); - if (grantedByDefault || (!app.hasRuntimePermissions() && !mHasConfirmedRevoke)) { - new AlertDialog.Builder(getContext()) - .setMessage(grantedByDefault ? R.string.system_warning - : R.string.old_sdk_deny_warning) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.grant_dialog_button_deny, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ((SwitchPreference) preference).setChecked(false); - app.revokeRuntimePermissions(); - if (!grantedByDefault) { - mHasConfirmedRevoke = true; - } - } - }) - .show(); - return false; - } else { - app.revokeRuntimePermissions(); - } - } - return true; - } - - @Override - public void onPause() { - super.onPause(); - logToggledGroups(); - } - - private void addToggledGroup(String packageName, AppPermissionGroup group) { - if (mToggledGroups == null) { - mToggledGroups = new ArrayMap<>(); - } - // Double toggle is back to initial state. - if (mToggledGroups.containsKey(packageName)) { - mToggledGroups.remove(packageName); - } else { - mToggledGroups.put(packageName, group); - } - } - - private void logToggledGroups() { - if (mToggledGroups != null) { - final int groupCount = mToggledGroups.size(); - for (int i = 0; i < groupCount; i++) { - String packageName = mToggledGroups.keyAt(i); - List groups = new ArrayList<>(); - groups.add(mToggledGroups.valueAt(i)); - SafetyNetLogger.logPermissionsToggled(packageName, groups); - } - mToggledGroups = null; - } - } - - public static class SystemAppsFragment extends PermissionsFrameFragment implements Callback { - PermissionAppsFragment mOuterFragment; - - @Override - public void onCreate(Bundle savedInstanceState) { - mOuterFragment = (PermissionAppsFragment) getTargetFragment(); - setLoading(true /* loading */, false /* animate */); - super.onCreate(savedInstanceState); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - if (mOuterFragment.mExtraScreen != null) { - setPreferenceScreen(); - } else { - mOuterFragment.setOnPermissionsLoadedListener(this); - } - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); - PermissionApps permissionApps = new PermissionApps(getActivity(), groupName, null); - bindUi(this, permissionApps); - } - - @Override - public void onPermissionsLoaded(PermissionApps permissionApps) { - setPreferenceScreen(); - mOuterFragment.setOnPermissionsLoadedListener(null); - } - - private void setPreferenceScreen() { - setPreferenceScreen(mOuterFragment.mExtraScreen); - setLoading(false /* loading */, true /* animate */); - } - } -} diff --git a/src/com/android/packageinstaller/permission/ui/PreferenceImageView.java b/src/com/android/packageinstaller/permission/ui/PreferenceImageView.java new file mode 100644 index 00000000..c3f51674 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/PreferenceImageView.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 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.packageinstaller.permission.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * Extension of ImageView that correctly applies maxWidth and maxHeight. + */ +public class PreferenceImageView extends ImageView { + + public PreferenceImageView(Context context) { + this(context, null); + } + + public PreferenceImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) { + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + final int maxWidth = getMaxWidth(); + if (maxWidth != Integer.MAX_VALUE + && (maxWidth < widthSize || widthMode == MeasureSpec.UNSPECIFIED)) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST); + } + } + + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) { + final int heightSize = MeasureSpec.getSize(heightMeasureSpec); + final int maxHeight = getMaxHeight(); + if (maxHeight != Integer.MAX_VALUE + && (maxHeight < heightSize || heightMode == MeasureSpec.UNSPECIFIED)) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); + } + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java new file mode 100644 index 00000000..b3b0895c --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java @@ -0,0 +1,214 @@ +/* +* Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceCategory; +import android.preference.PreferenceGroup; +import android.provider.Settings; +import android.util.Log; +import android.view.MenuItem; +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public final class AllAppPermissionsFragment extends SettingsWithHeader { + + private static final String LOG_TAG = "AllAppPermissionsFragment"; + + private static final String KEY_OTHER = "other_perms"; + + public static AllAppPermissionsFragment newInstance(String packageName) { + AllAppPermissionsFragment instance = new AllAppPermissionsFragment(); + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); + instance.setArguments(arguments); + return instance; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setTitle(R.string.all_permissions); + ab.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public void onResume() { + super.onResume(); + updateUi(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: { + getFragmentManager().popBackStack(); + return true; + } + } + return super.onOptionsItemSelected(item); + } + + private void updateUi() { + if (getPreferenceScreen() != null) { + getPreferenceScreen().removeAll(); + } + addPreferencesFromResource(R.xml.all_permissions); + PreferenceGroup otherGroup = (PreferenceGroup) findPreference(KEY_OTHER); + ArrayList prefs = new ArrayList<>(); // Used for sorting. + prefs.add(otherGroup); + String pkg = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + otherGroup.removeAll(); + PackageManager pm = getContext().getPackageManager(); + + try { + PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_PERMISSIONS); + + ApplicationInfo appInfo = info.applicationInfo; + final Drawable icon = appInfo.loadIcon(pm); + final CharSequence label = appInfo.loadLabel(pm); + Intent infoIntent = null; + if (!getActivity().getIntent().getBooleanExtra( + AppPermissionsFragment.EXTRA_HIDE_INFO_BUTTON, false)) { + infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", pkg, null)); + } + setHeader(icon, label, infoIntent); + + if (info.requestedPermissions != null) { + for (int i = 0; i < info.requestedPermissions.length; i++) { + PermissionInfo perm; + try { + perm = pm.getPermissionInfo(info.requestedPermissions[i], 0); + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, + "Can't get permission info for " + info.requestedPermissions[i], e); + continue; + } + + if ((perm.flags & PermissionInfo.FLAG_INSTALLED) == 0 + || (perm.flags & PermissionInfo.FLAG_HIDDEN) != 0) { + continue; + } + + if (perm.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) { + PermissionGroupInfo group = getGroup(perm.group, pm); + PreferenceGroup pref = + findOrCreate(group != null ? group : perm, pm, prefs); + pref.addPreference(getPreference(perm, group, pm)); + } else if (perm.protectionLevel == PermissionInfo.PROTECTION_NORMAL) { + PermissionGroupInfo group = getGroup(perm.group, pm); + otherGroup.addPreference(getPreference(perm, group, pm)); + } + } + } + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, "Problem getting package info for " + pkg, e); + } + // Sort an ArrayList of the groups and then set the order from the sorting. + Collections.sort(prefs, new Comparator() { + @Override + public int compare(Preference lhs, Preference rhs) { + String lKey = lhs.getKey(); + String rKey = rhs.getKey(); + if (lKey.equals(KEY_OTHER)) { + return 1; + } else if (rKey.equals(KEY_OTHER)) { + return -1; + } else if (Utils.isModernPermissionGroup(lKey) + != Utils.isModernPermissionGroup(rKey)) { + return Utils.isModernPermissionGroup(lKey) ? -1 : 1; + } + return lhs.getTitle().toString().compareTo(rhs.getTitle().toString()); + } + }); + for (int i = 0; i < prefs.size(); i++) { + prefs.get(i).setOrder(i); + } + } + + private PermissionGroupInfo getGroup(String group, PackageManager pm) { + try { + return pm.getPermissionGroupInfo(group, 0); + } catch (NameNotFoundException e) { + return null; + } + } + + private PreferenceGroup findOrCreate(PackageItemInfo group, PackageManager pm, + ArrayList prefs) { + PreferenceGroup pref = (PreferenceGroup) findPreference(group.name); + if (pref == null) { + pref = new PreferenceCategory(getContext()); + pref.setKey(group.name); + pref.setTitle(group.loadLabel(pm)); + prefs.add(pref); + getPreferenceScreen().addPreference(pref); + } + return pref; + } + + private Preference getPreference(PermissionInfo perm, PermissionGroupInfo group, + PackageManager pm) { + Preference pref = new Preference(getContext()); + Drawable icon = null; + if (perm.icon != 0) { + icon = perm.loadIcon(pm); + } else if (group != null && group.icon != 0) { + icon = group.loadIcon(pm); + } else { + icon = getContext().getDrawable(R.drawable.ic_perm_device_info); + } + pref.setIcon(Utils.applyTint(getContext(), icon, android.R.attr.colorControlNormal)); + pref.setTitle(perm.loadLabel(pm)); + final CharSequence desc = perm.loadDescription(pm); + pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + new AlertDialog.Builder(getContext()) + .setMessage(desc) + .setPositiveButton(android.R.string.ok, null) + .show(); + return true; + } + }); + + return pref; + } +} \ No newline at end of file diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java new file mode 100644 index 00000000..f56cba70 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java @@ -0,0 +1,404 @@ +/* +* Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.annotation.Nullable; +import android.app.ActionBar; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; +import android.provider.Settings; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.AppPermissionGroup; +import com.android.packageinstaller.permission.model.AppPermissions; +import com.android.packageinstaller.permission.ui.OverlayTouchActivity; +import com.android.packageinstaller.permission.utils.LocationUtils; +import com.android.packageinstaller.permission.utils.SafetyNetLogger; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +public final class AppPermissionsFragment extends SettingsWithHeader + implements OnPreferenceChangeListener { + + private static final String LOG_TAG = "ManagePermsFragment"; + + static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton"; + + private static final int MENU_ALL_PERMS = 0; + + private List mToggledGroups; + private AppPermissions mAppPermissions; + private PreferenceScreen mExtraScreen; + + private boolean mHasConfirmedRevoke; + + public static AppPermissionsFragment newInstance(String packageName) { + return setPackageName(new AppPermissionsFragment(), packageName); + } + + private static T setPackageName(T fragment, String packageName) { + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); + fragment.setArguments(arguments); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + Activity activity = getActivity(); + PackageInfo packageInfo = getPackageInfo(activity, packageName); + if (packageInfo == null) { + Toast.makeText(activity, R.string.app_not_found_dlg_title, Toast.LENGTH_LONG).show(); + activity.finish(); + return; + } + + mAppPermissions = new AppPermissions(activity, packageInfo, null, true, new Runnable() { + @Override + public void run() { + getActivity().finish(); + } + }); + loadPreferences(); + } + + @Override + public void onResume() { + super.onResume(); + mAppPermissions.refresh(); + setPreferencesCheckedState(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: { + getActivity().finish(); + return true; + } + + case MENU_ALL_PERMS: { + Fragment frag = AllAppPermissionsFragment.newInstance( + getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("AllPerms") + .commit(); + return true; + } + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (mAppPermissions != null) { + bindUi(this, mAppPermissions.getPackageInfo()); + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + menu.add(Menu.NONE, MENU_ALL_PERMS, Menu.NONE, R.string.all_permissions); + } + + private static void bindUi(SettingsWithHeader fragment, PackageInfo packageInfo) { + Activity activity = fragment.getActivity(); + PackageManager pm = activity.getPackageManager(); + ApplicationInfo appInfo = packageInfo.applicationInfo; + Intent infoIntent = null; + if (!activity.getIntent().getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { + infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", packageInfo.packageName, null)); + } + + Drawable icon = appInfo.loadIcon(pm); + CharSequence label = appInfo.loadLabel(pm); + fragment.setHeader(icon, label, infoIntent); + + ActionBar ab = activity.getActionBar(); + if (ab != null) { + ab.setTitle(R.string.app_permissions); + } + + ViewGroup rootView = (ViewGroup) fragment.getView(); + ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + iconView.setImageDrawable(icon); + } + TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(R.string.app_permissions); + } + TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(label); + } + } + + private void loadPreferences() { + Context context = getActivity(); + if (context == null) { + return; + } + + PreferenceScreen screen = getPreferenceScreen(); + if (screen == null) { + screen = getPreferenceManager().createPreferenceScreen(getActivity()); + setPreferenceScreen(screen); + } + + screen.removeAll(); + + if (mExtraScreen != null) { + mExtraScreen.removeAll(); + } + + final Preference extraPerms = new Preference(context); + extraPerms.setIcon(R.drawable.ic_toc); + extraPerms.setTitle(R.string.additional_permissions); + + for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { + if (!Utils.shouldShowPermission(group, mAppPermissions.getPackageInfo().packageName)) { + continue; + } + + boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); + + SwitchPreference preference = new SwitchPreference(context); + preference.setOnPreferenceChangeListener(this); + preference.setKey(group.getName()); + Drawable icon = Utils.loadDrawable(context.getPackageManager(), + group.getIconPkg(), group.getIconResId()); + preference.setIcon(Utils.applyTint(getContext(), icon, + android.R.attr.colorControlNormal)); + preference.setTitle(group.getLabel()); + if (group.isPolicyFixed()) { + preference.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + } + preference.setPersistent(false); + preference.setEnabled(!group.isPolicyFixed()); + preference.setChecked(group.areRuntimePermissionsGranted()); + + if (isPlatform) { + screen.addPreference(preference); + } else { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(preference); + } + } + + if (mExtraScreen != null) { + extraPerms.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); + setPackageName(frag, getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); + frag.setTargetFragment(AppPermissionsFragment.this, 0); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack(null) + .commit(); + return true; + } + }); + int count = mExtraScreen.getPreferenceCount(); + extraPerms.setSummary(getResources().getQuantityString( + R.plurals.additional_permissions_more, count, count)); + screen.addPreference(extraPerms); + } + + setLoading(false /* loading */, true /* animate */); + } + + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + String groupName = preference.getKey(); + final AppPermissionGroup group = mAppPermissions.getPermissionGroup(groupName); + + if (group == null) { + return false; + } + + OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); + if (activity.isObscuredTouch()) { + activity.showOverlayDialog(); + return false; + } + + addToggledGroup(group); + + if (LocationUtils.isLocationGroupAndProvider(group.getName(), group.getApp().packageName)) { + LocationUtils.showLocationDialog(getContext(), mAppPermissions.getAppLabel()); + return false; + } + if (newValue == Boolean.TRUE) { + group.grantRuntimePermissions(false); + } else { + final boolean grantedByDefault = group.hasGrantedByDefaultPermission(); + if (grantedByDefault || (!group.hasRuntimePermission() && !mHasConfirmedRevoke)) { + new AlertDialog.Builder(getContext()) + .setMessage(grantedByDefault ? R.string.system_warning + : R.string.old_sdk_deny_warning) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.grant_dialog_button_deny, + new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ((SwitchPreference) preference).setChecked(false); + group.revokeRuntimePermissions(false); + if (!grantedByDefault) { + mHasConfirmedRevoke = true; + } + } + }) + .show(); + return false; + } else { + group.revokeRuntimePermissions(false); + } + } + + return true; + } + + @Override + public void onPause() { + super.onPause(); + logToggledGroups(); + } + + private void addToggledGroup(AppPermissionGroup group) { + if (mToggledGroups == null) { + mToggledGroups = new ArrayList<>(); + } + // Double toggle is back to initial state. + if (mToggledGroups.contains(group)) { + mToggledGroups.remove(group); + } else { + mToggledGroups.add(group); + } + } + + private void logToggledGroups() { + if (mToggledGroups != null) { + String packageName = mAppPermissions.getPackageInfo().packageName; + SafetyNetLogger.logPermissionsToggled(packageName, mToggledGroups); + mToggledGroups = null; + } + } + + private void setPreferencesCheckedState() { + setPreferencesCheckedState(getPreferenceScreen()); + if (mExtraScreen != null) { + setPreferencesCheckedState(mExtraScreen); + } + } + + private void setPreferencesCheckedState(PreferenceScreen screen) { + int preferenceCount = screen.getPreferenceCount(); + for (int i = 0; i < preferenceCount; i++) { + Preference preference = screen.getPreference(i); + if (preference instanceof SwitchPreference) { + SwitchPreference switchPref = (SwitchPreference) preference; + AppPermissionGroup group = mAppPermissions.getPermissionGroup(switchPref.getKey()); + if (group != null) { + switchPref.setChecked(group.areRuntimePermissionsGranted()); + } + } + } + } + + private static PackageInfo getPackageInfo(Activity activity, String packageName) { + try { + return activity.getPackageManager().getPackageInfo( + packageName, PackageManager.GET_PERMISSIONS); + } catch (PackageManager.NameNotFoundException e) { + Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); + return null; + } + } + + public static class AdditionalPermissionsFragment extends SettingsWithHeader { + AppPermissionsFragment mOuterFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (AppPermissionsFragment) getTargetFragment(); + super.onCreate(savedInstanceState); + setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent); + setHasOptionsMenu(true); + setPreferenceScreen(mOuterFragment.mExtraScreen); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + bindUi(this, getPackageInfo(getActivity(), packageName)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getFragmentManager().popBackStack(); + return true; + } + return super.onOptionsItemSelected(item); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java b/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java new file mode 100644 index 00000000..2d27f069 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java @@ -0,0 +1,462 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Icon; +import android.os.Bundle; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnLayoutChangeListener; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.ViewRootImpl; +import android.view.WindowManager.LayoutParams; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.ui.ButtonBarLayout; +import com.android.packageinstaller.permission.ui.GrantPermissionsViewHandler; +import com.android.packageinstaller.permission.ui.ManualLayoutFrame; + +import java.util.ArrayList; + +public final class GrantPermissionsViewHandlerImpl + implements GrantPermissionsViewHandler, OnClickListener { + + public static final String ARG_GROUP_NAME = "ARG_GROUP_NAME"; + public static final String ARG_GROUP_COUNT = "ARG_GROUP_COUNT"; + public static final String ARG_GROUP_INDEX = "ARG_GROUP_INDEX"; + public static final String ARG_GROUP_ICON = "ARG_GROUP_ICON"; + public static final String ARG_GROUP_MESSAGE = "ARG_GROUP_MESSAGE"; + public static final String ARG_GROUP_SHOW_DO_NOT_ASK = "ARG_GROUP_SHOW_DO_NOT_ASK"; + public static final String ARG_GROUP_DO_NOT_ASK_CHECKED = "ARG_GROUP_DO_NOT_ASK_CHECKED"; + + // Animation parameters. + private static final long SIZE_START_DELAY = 300; + private static final long SIZE_START_LENGTH = 233; + private static final long FADE_OUT_START_DELAY = 300; + private static final long FADE_OUT_START_LENGTH = 217; + private static final long TRANSLATE_START_DELAY = 367; + private static final long TRANSLATE_LENGTH = 317; + private static final long GROUP_UPDATE_DELAY = 400; + private static final long DO_NOT_ASK_CHECK_DELAY = 450; + + private final Context mContext; + + private ResultListener mResultListener; + + private String mGroupName; + private int mGroupCount; + private int mGroupIndex; + private Icon mGroupIcon; + private CharSequence mGroupMessage; + private boolean mShowDonNotAsk; + private boolean mDoNotAskChecked; + + private ImageView mIconView; + private TextView mCurrentGroupView; + private TextView mMessageView; + private CheckBox mDoNotAskCheckbox; + private Button mAllowButton; + + private ArrayList mHeightControllers; + private ManualLayoutFrame mRootView; + + // Needed for animation + private ViewGroup mDescContainer; + private ViewGroup mCurrentDesc; + private ViewGroup mNextDesc; + + private ViewGroup mDialogContainer; + + private final Runnable mUpdateGroup = new Runnable() { + @Override + public void run() { + updateGroup(); + } + }; + + public GrantPermissionsViewHandlerImpl(Context context) { + mContext = context; + } + + @Override + public GrantPermissionsViewHandlerImpl setResultListener(ResultListener listener) { + mResultListener = listener; + return this; + } + + @Override + public void saveInstanceState(Bundle arguments) { + arguments.putString(ARG_GROUP_NAME, mGroupName); + arguments.putInt(ARG_GROUP_COUNT, mGroupCount); + arguments.putInt(ARG_GROUP_INDEX, mGroupIndex); + arguments.putParcelable(ARG_GROUP_ICON, mGroupIcon); + arguments.putCharSequence(ARG_GROUP_MESSAGE, mGroupMessage); + arguments.putBoolean(ARG_GROUP_SHOW_DO_NOT_ASK, mShowDonNotAsk); + arguments.putBoolean(ARG_GROUP_DO_NOT_ASK_CHECKED, mDoNotAskCheckbox.isChecked()); + } + + @Override + public void loadInstanceState(Bundle savedInstanceState) { + mGroupName = savedInstanceState.getString(ARG_GROUP_NAME); + mGroupMessage = savedInstanceState.getCharSequence(ARG_GROUP_MESSAGE); + mGroupIcon = savedInstanceState.getParcelable(ARG_GROUP_ICON); + mGroupCount = savedInstanceState.getInt(ARG_GROUP_COUNT); + mGroupIndex = savedInstanceState.getInt(ARG_GROUP_INDEX); + mShowDonNotAsk = savedInstanceState.getBoolean(ARG_GROUP_SHOW_DO_NOT_ASK); + mDoNotAskChecked = savedInstanceState.getBoolean(ARG_GROUP_DO_NOT_ASK_CHECKED); + } + + @Override + public void updateUi(String groupName, int groupCount, int groupIndex, Icon icon, + CharSequence message, boolean showDonNotAsk) { + mGroupName = groupName; + mGroupCount = groupCount; + mGroupIndex = groupIndex; + mGroupIcon = icon; + mGroupMessage = message; + mShowDonNotAsk = showDonNotAsk; + mDoNotAskChecked = false; + // If this is a second (or later) permission and the views exist, then animate. + if (mIconView != null) { + if (mGroupIndex > 0) { + // The first message will be announced as the title of the activity, all others + // we need to announce ourselves. + mDescContainer.announceForAccessibility(message); + animateToPermission(); + } else { + updateDescription(); + updateGroup(); + updateDoNotAskCheckBox(); + } + } + } + + private void animateToPermission() { + if (mHeightControllers == null) { + // We need to manually control the height of any views heigher than the root that + // we inflate. Find all the views up to the root and create ViewHeightControllers for + // them. + mHeightControllers = new ArrayList<>(); + ViewRootImpl viewRoot = mRootView.getViewRootImpl(); + ViewParent v = mRootView.getParent(); + addHeightController(mDialogContainer); + addHeightController(mRootView); + while (v != viewRoot) { + addHeightController((View) v); + v = v.getParent(); + } + // On the heighest level view, we want to setTop rather than setBottom to control the + // height, this way the dialog will grow up rather than down. + ViewHeightController realRootView = + mHeightControllers.get(mHeightControllers.size() - 1); + realRootView.setControlTop(true); + } + + // Grab the current height/y positions, then wait for the layout to change, + // so we can get the end height/y positions. + final SparseArray startPositions = getViewPositions(); + final int startHeight = mRootView.getLayoutHeight(); + mRootView.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) { + mRootView.removeOnLayoutChangeListener(this); + SparseArray endPositions = getViewPositions(); + int endHeight = mRootView.getLayoutHeight(); + if (startPositions.get(R.id.do_not_ask_checkbox) == 0 + && endPositions.get(R.id.do_not_ask_checkbox) != 0) { + // If the checkbox didn't have a position before but has one now then set + // the start position to the end position because it just became visible. + startPositions.put(R.id.do_not_ask_checkbox, + endPositions.get(R.id.do_not_ask_checkbox)); + } + animateYPos(startPositions, endPositions, endHeight - startHeight); + } + }); + + // Fade out old description group and scale out the icon for it. + Interpolator interpolator = AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.fast_out_linear_in); + mIconView.animate() + .scaleX(0) + .scaleY(0) + .setStartDelay(FADE_OUT_START_DELAY) + .setDuration(FADE_OUT_START_LENGTH) + .setInterpolator(interpolator) + .start(); + mCurrentDesc.animate() + .alpha(0) + .setStartDelay(FADE_OUT_START_DELAY) + .setDuration(FADE_OUT_START_LENGTH) + .setInterpolator(interpolator) + .setListener(null) + .start(); + + // Update the index of the permission after the animations have started. + mCurrentGroupView.getHandler().postDelayed(mUpdateGroup, GROUP_UPDATE_DELAY); + + // Add the new description and translate it in. + mNextDesc = (ViewGroup) LayoutInflater.from(mContext).inflate( + R.layout.permission_description, mDescContainer, false); + + mMessageView = (TextView) mNextDesc.findViewById(R.id.permission_message); + mIconView = (ImageView) mNextDesc.findViewById(R.id.permission_icon); + updateDescription(); + + int width = mDescContainer.getRootView().getWidth(); + mDescContainer.addView(mNextDesc); + mNextDesc.setTranslationX(width); + + final View oldDesc = mCurrentDesc; + // Remove the old view from the description, so that we can shrink if necessary. + mDescContainer.removeView(oldDesc); + oldDesc.setPadding(mDescContainer.getLeft(), mDescContainer.getTop(), + mRootView.getRight() - mDescContainer.getRight(), 0); + mRootView.addView(oldDesc); + + mCurrentDesc = mNextDesc; + mNextDesc.animate() + .translationX(0) + .setStartDelay(TRANSLATE_START_DELAY) + .setDuration(TRANSLATE_LENGTH) + .setInterpolator(AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.linear_out_slow_in)) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + // This is the longest animation, when it finishes, we are done. + mRootView.removeView(oldDesc); + } + }) + .start(); + + boolean visibleBefore = mDoNotAskCheckbox.getVisibility() == View.VISIBLE; + updateDoNotAskCheckBox(); + boolean visibleAfter = mDoNotAskCheckbox.getVisibility() == View.VISIBLE; + if (visibleBefore != visibleAfter) { + Animation anim = AnimationUtils.loadAnimation(mContext, + visibleAfter ? android.R.anim.fade_in : android.R.anim.fade_out); + anim.setStartOffset(visibleAfter ? DO_NOT_ASK_CHECK_DELAY : 0); + mDoNotAskCheckbox.startAnimation(anim); + } + } + + private void addHeightController(View v) { + ViewHeightController heightController = new ViewHeightController(v); + heightController.setHeight(v.getHeight()); + mHeightControllers.add(heightController); + } + + private SparseArray getViewPositions() { + SparseArray locMap = new SparseArray<>(); + final int N = mDialogContainer.getChildCount(); + for (int i = 0; i < N; i++) { + View child = mDialogContainer.getChildAt(i); + if (child.getId() <= 0) { + // Only track views with ids. + continue; + } + locMap.put(child.getId(), child.getY()); + } + return locMap; + } + + private void animateYPos(SparseArray startPositions, SparseArray endPositions, + int heightDiff) { + final int N = startPositions.size(); + for (int i = 0; i < N; i++) { + int key = startPositions.keyAt(i); + float start = startPositions.get(key); + float end = endPositions.get(key); + if (start != end) { + final View child = mDialogContainer.findViewById(key); + child.setTranslationY(start - end); + child.animate() + .setStartDelay(SIZE_START_DELAY) + .setDuration(SIZE_START_LENGTH) + .translationY(0) + .start(); + } + } + for (int i = 0; i < mHeightControllers.size(); i++) { + mHeightControllers.get(i).animateAddHeight(heightDiff); + } + } + + @Override + public View createView() { + mRootView = (ManualLayoutFrame) LayoutInflater.from(mContext) + .inflate(R.layout.grant_permissions, null); + ((ButtonBarLayout) mRootView.findViewById(R.id.button_group)).setAllowStacking(true); + + mDialogContainer = (ViewGroup) mRootView.findViewById(R.id.dialog_container); + mMessageView = (TextView) mRootView.findViewById(R.id.permission_message); + mIconView = (ImageView) mRootView.findViewById(R.id.permission_icon); + mCurrentGroupView = (TextView) mRootView.findViewById(R.id.current_page_text); + mDoNotAskCheckbox = (CheckBox) mRootView.findViewById(R.id.do_not_ask_checkbox); + mAllowButton = (Button) mRootView.findViewById(R.id.permission_allow_button); + + mDescContainer = (ViewGroup) mRootView.findViewById(R.id.desc_container); + mCurrentDesc = (ViewGroup) mRootView.findViewById(R.id.perm_desc_root); + + mAllowButton.setOnClickListener(this); + mRootView.findViewById(R.id.permission_deny_button).setOnClickListener(this); + mDoNotAskCheckbox.setOnClickListener(this); + + if (mGroupName != null) { + updateDescription(); + updateGroup(); + updateDoNotAskCheckBox(); + } + + return mRootView; + } + + @Override + public void updateWindowAttributes(LayoutParams outLayoutParams) { + // No-op + } + + private void updateDescription() { + mIconView.setImageDrawable(mGroupIcon.loadDrawable(mContext)); + mMessageView.setText(mGroupMessage); + } + + private void updateGroup() { + if (mGroupCount > 1) { + mCurrentGroupView.setVisibility(View.VISIBLE); + mCurrentGroupView.setText(mContext.getString(R.string.current_permission_template, + mGroupIndex + 1, mGroupCount)); + } else { + mCurrentGroupView.setVisibility(View.INVISIBLE); + } + } + + private void updateDoNotAskCheckBox() { + if (mShowDonNotAsk) { + mDoNotAskCheckbox.setVisibility(View.VISIBLE); + mDoNotAskCheckbox.setOnClickListener(this); + mDoNotAskCheckbox.setChecked(mDoNotAskChecked); + } else { + mDoNotAskCheckbox.setVisibility(View.GONE); + mDoNotAskCheckbox.setOnClickListener(null); + } + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.permission_allow_button: + if (mResultListener != null) { + view.clearAccessibilityFocus(); + mResultListener.onPermissionGrantResult(mGroupName, true, false); + } + break; + case R.id.permission_deny_button: + mAllowButton.setEnabled(true); + if (mResultListener != null) { + view.clearAccessibilityFocus(); + mResultListener.onPermissionGrantResult(mGroupName, false, + mDoNotAskCheckbox.isChecked()); + } + break; + case R.id.do_not_ask_checkbox: + mAllowButton.setEnabled(!mDoNotAskCheckbox.isChecked()); + break; + } + } + + @Override + public void onBackPressed() { + if (mResultListener != null) { + final boolean doNotAskAgain = mDoNotAskCheckbox.isChecked(); + mResultListener.onPermissionGrantResult(mGroupName, false, doNotAskAgain); + } + } + + /** + * Manually controls the height of a view through getBottom/setTop. Also listens + * for layout changes and sets the height again to be sure it doesn't change. + */ + private static final class ViewHeightController implements OnLayoutChangeListener { + private final View mView; + private int mHeight; + private int mNextHeight; + private boolean mControlTop; + private ObjectAnimator mAnimator; + + public ViewHeightController(View view) { + mView = view; + mView.addOnLayoutChangeListener(this); + } + + public void setControlTop(boolean controlTop) { + mControlTop = controlTop; + } + + public void animateAddHeight(int heightDiff) { + if (heightDiff != 0) { + if (mNextHeight == 0) { + mNextHeight = mHeight; + } + mNextHeight += heightDiff; + if (mAnimator != null) { + mAnimator.cancel(); + } + mAnimator = ObjectAnimator.ofInt(this, "height", mHeight, mNextHeight); + mAnimator.setStartDelay(SIZE_START_DELAY); + mAnimator.setDuration(SIZE_START_LENGTH); + mAnimator.start(); + } + } + + public void setHeight(int height) { + mHeight = height; + updateHeight(); + } + + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) { + // Ensure that the height never changes. + updateHeight(); + } + + private void updateHeight() { + if (mControlTop) { + mView.setTop(mView.getBottom() - mHeight); + } else { + mView.setBottom(mView.getTop() + mHeight); + } + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java new file mode 100644 index 00000000..c53da879 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.annotation.Nullable; +import android.app.ActionBar; +import android.app.FragmentTransaction; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; +import android.util.ArraySet; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.PermissionApps; +import com.android.packageinstaller.permission.model.PermissionApps.PmCache; +import com.android.packageinstaller.permission.model.PermissionGroup; +import com.android.packageinstaller.permission.model.PermissionGroups; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.List; + +public final class ManagePermissionsFragment extends PermissionsFrameFragment + implements PermissionGroups.PermissionsGroupsChangeCallback, + Preference.OnPreferenceClickListener { + private static final String LOG_TAG = "ManagePermissionsFragment"; + + private static final String OS_PKG = "android"; + + private static final String EXTRA_PREFS_KEY = "extra_prefs_key"; + + private ArraySet mLauncherPkgs; + + private PermissionGroups mPermissions; + + private PreferenceScreen mExtraScreen; + + public static ManagePermissionsFragment newInstance() { + return new ManagePermissionsFragment(); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + mLauncherPkgs = Utils.getLauncherPackages(getContext()); + mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this); + } + + @Override + public void onResume() { + super.onResume(); + mPermissions.refresh(); + updatePermissionsUi(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + getActivity().finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + String key = preference.getKey(); + + PermissionGroup group = mPermissions.getGroup(key); + if (group == null) { + return false; + } + + Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) + .putExtra(Intent.EXTRA_PERMISSION_NAME, key); + try { + getActivity().startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.w(LOG_TAG, "No app to handle " + intent); + } + + return true; + } + + @Override + public void onPermissionGroupsChanged() { + updatePermissionsUi(); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindPermissionUi(getActivity(), getView()); + } + + private static void bindPermissionUi(@Nullable Context context, @Nullable View rootView) { + if (context == null || rootView == null) { + return; + } + + ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + // Set the icon as the background instead of the image because ImageView + // doesn't properly scale vector drawables beyond their intrinsic size + Drawable icon = context.getDrawable(R.drawable.ic_lock); + icon.setTint(context.getColor(R.color.off_white)); + iconView.setBackground(icon); + } + TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(R.string.app_permissions); + } + TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(R.string.app_permissions_breadcrumb); + } + } + + private void updatePermissionsUi() { + Context context = getActivity(); + if (context == null) { + return; + } + + List groups = mPermissions.getGroups(); + PreferenceScreen screen = getPreferenceScreen(); + if (screen == null) { + screen = getPreferenceManager().createPreferenceScreen(getActivity()); + setPreferenceScreen(screen); + } + + // Use this to speed up getting the info for all of the PermissionApps below. + // Create a new one for each refresh to make sure it has fresh data. + PmCache cache = new PmCache(getContext().getPackageManager()); + for (PermissionGroup group : groups) { + boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG); + + Preference preference = findPreference(group.getName()); + if (preference == null && mExtraScreen != null) { + preference = mExtraScreen.findPreference(group.getName()); + } + if (preference == null) { + preference = new Preference(context); + preference.setOnPreferenceClickListener(this); + preference.setKey(group.getName()); + preference.setIcon(Utils.applyTint(context, group.getIcon(), + android.R.attr.colorControlNormal)); + preference.setTitle(group.getLabel()); + // Set blank summary so that no resizing/jumping happens when the summary is loaded. + preference.setSummary(" "); + preference.setPersistent(false); + if (isSystemPermission) { + screen.addPreference(preference); + } else { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(preference); + } + } + final Preference finalPref = preference; + + new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() { + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + if (getActivity() == null) { + return; + } + int granted = permissionApps.getGrantedCount(mLauncherPkgs); + int total = permissionApps.getTotalCount(mLauncherPkgs); + finalPref.setSummary(getString(R.string.app_permissions_group_summary, + granted, total)); + } + }, cache).refresh(false); + } + + if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0 + && screen.findPreference(EXTRA_PREFS_KEY) == null) { + Preference extraScreenPreference = new Preference(context); + extraScreenPreference.setKey(EXTRA_PREFS_KEY); + extraScreenPreference.setIcon(Utils.applyTint(context, + R.drawable.ic_more_items, + android.R.attr.colorControlNormal)); + extraScreenPreference.setTitle(R.string.additional_permissions); + extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); + frag.setTargetFragment(ManagePermissionsFragment.this, 0); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(android.R.id.content, frag); + ft.addToBackStack(null); + ft.commit(); + return true; + } + }); + int count = mExtraScreen.getPreferenceCount(); + extraScreenPreference.setSummary(getResources().getQuantityString( + R.plurals.additional_permissions_more, count, count)); + screen.addPreference(extraScreenPreference); + } + if (screen.getPreferenceCount() != 0) { + setLoading(false /* loading */, true /* animate */); + } + } + + public static class AdditionalPermissionsFragment extends PermissionsFrameFragment { + @Override + public void onCreate(Bundle icicle) { + setLoading(true /* loading */, false /* animate */); + super.onCreate(icicle); + getActivity().setTitle(R.string.additional_permissions); + setHasOptionsMenu(true); + + setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen); + setLoading(false /* loading */, true /* animate */); + } + + @Override + public void onDestroy() { + getActivity().setTitle(R.string.app_permissions); + super.onDestroy(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getFragmentManager().popBackStack(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindPermissionUi(getActivity(), getView()); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java new file mode 100644 index 00000000..554830a7 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java @@ -0,0 +1,427 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.AppPermissionGroup; +import com.android.packageinstaller.permission.model.PermissionApps; +import com.android.packageinstaller.permission.model.PermissionApps.Callback; +import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; +import com.android.packageinstaller.permission.ui.OverlayTouchActivity; +import com.android.packageinstaller.permission.utils.LocationUtils; +import com.android.packageinstaller.permission.utils.SafetyNetLogger; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback, + Preference.OnPreferenceChangeListener { + + private static final int MENU_SHOW_SYSTEM = Menu.FIRST; + private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1; + private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem"; + + public static PermissionAppsFragment newInstance(String permissionName) { + return setPermissionName(new PermissionAppsFragment(), permissionName); + } + + private static T setPermissionName(T fragment, String permissionName) { + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName); + fragment.setArguments(arguments); + return fragment; + } + + private PermissionApps mPermissionApps; + + private PreferenceScreen mExtraScreen; + + private ArrayMap mToggledGroups; + private ArraySet mLauncherPkgs; + private boolean mHasConfirmedRevoke; + + private boolean mShowSystem; + private MenuItem mShowSystemMenu; + private MenuItem mHideSystemMenu; + + private Callback mOnPermissionsLoadedListener; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + mLauncherPkgs = Utils.getLauncherPackages(getContext()); + + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + mPermissionApps = new PermissionApps(getActivity(), groupName, this); + mPermissionApps.refresh(true); + } + + @Override + public void onResume() { + super.onResume(); + mPermissionApps.refresh(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE, + R.string.menu_show_system); + mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE, + R.string.menu_hide_system); + updateMenu(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getActivity().finish(); + return true; + case MENU_SHOW_SYSTEM: + case MENU_HIDE_SYSTEM: + mShowSystem = item.getItemId() == MENU_SHOW_SYSTEM; + if (mPermissionApps.getApps() != null) { + onPermissionsLoaded(mPermissionApps); + } + updateMenu(); + break; + } + return super.onOptionsItemSelected(item); + } + + private void updateMenu() { + mShowSystemMenu.setVisible(!mShowSystem); + mHideSystemMenu.setVisible(mShowSystem); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindUi(this, mPermissionApps); + } + + private static void bindUi(Fragment fragment, PermissionApps permissionApps) { + final Drawable icon = permissionApps.getIcon(); + final CharSequence label = permissionApps.getLabel(); + final ActionBar ab = fragment.getActivity().getActionBar(); + if (ab != null) { + ab.setTitle(fragment.getString(R.string.permission_title, label)); + } + + final ViewGroup rootView = (ViewGroup) fragment.getView(); + final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + // Set the icon as the background instead of the image because ImageView + // doesn't properly scale vector drawables beyond their intrinsic size + iconView.setBackground(icon); + } + final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(label); + } + final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(R.string.app_permissions); + } + } + + private void setOnPermissionsLoadedListener(Callback callback) { + mOnPermissionsLoadedListener = callback; + } + + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + Context context = getActivity(); + + if (context == null) { + return; + } + + boolean isTelevision = Utils.isTelevision(context); + PreferenceScreen screen = getPreferenceScreen(); + if (screen == null) { + screen = getPreferenceManager().createPreferenceScreen(getActivity()); + setPreferenceScreen(screen); + } + + ArraySet preferencesToRemove = new ArraySet<>(); + for (int i = 0, n = screen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(screen.getPreference(i).getKey()); + } + if (mExtraScreen != null) { + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(mExtraScreen.getPreference(i).getKey()); + } + } + + for (PermissionApp app : permissionApps.getApps()) { + if (!Utils.shouldShowPermission(app)) { + continue; + } + + String key = app.getKey(); + preferencesToRemove.remove(key); + Preference existingPref = screen.findPreference(key); + if (existingPref == null && mExtraScreen != null) { + existingPref = mExtraScreen.findPreference(key); + } + + boolean isSystemApp = Utils.isSystem(app, mLauncherPkgs); + if (isSystemApp && !isTelevision && !mShowSystem) { + if (existingPref != null) { + screen.removePreference(existingPref); + } + continue; + } + + if (existingPref != null) { + // If existing preference - only update its state. + if (app.isPolicyFixed()) { + existingPref.setSummary(getString( + R.string.permission_summary_enforced_by_policy)); + } + existingPref.setPersistent(false); + existingPref.setEnabled(!app.isPolicyFixed()); + if (existingPref instanceof SwitchPreference) { + ((SwitchPreference) existingPref) + .setChecked(app.areRuntimePermissionsGranted()); + } + continue; + } + + SwitchPreference pref = new SwitchPreference(context); + pref.setOnPreferenceChangeListener(this); + pref.setKey(app.getKey()); + pref.setIcon(app.getIcon()); + pref.setTitle(app.getLabel()); + if (app.isPolicyFixed()) { + pref.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + } + pref.setPersistent(false); + pref.setEnabled(!app.isPolicyFixed()); + pref.setChecked(app.areRuntimePermissionsGranted()); + + if (isSystemApp && isTelevision) { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(pref); + } else { + screen.addPreference(pref); + } + } + + if (mExtraScreen != null) { + preferencesToRemove.remove(KEY_SHOW_SYSTEM_PREFS); + Preference pref = screen.findPreference(KEY_SHOW_SYSTEM_PREFS); + + if (pref == null) { + pref = new Preference(context); + pref.setKey(KEY_SHOW_SYSTEM_PREFS); + pref.setIcon(Utils.applyTint(context, R.drawable.ic_toc, + android.R.attr.colorControlNormal)); + pref.setTitle(R.string.preference_show_system_apps); + pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + SystemAppsFragment frag = new SystemAppsFragment(); + setPermissionName(frag, getArguments().getString(Intent.EXTRA_PERMISSION_NAME)); + frag.setTargetFragment(PermissionAppsFragment.this, 0); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("SystemApps") + .commit(); + return true; + } + }); + screen.addPreference(pref); + } + + int grantedCount = 0; + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + if (((SwitchPreference) mExtraScreen.getPreference(i)).isChecked()) { + grantedCount++; + } + } + pref.setSummary(getString(R.string.app_permissions_group_summary, + grantedCount, mExtraScreen.getPreferenceCount())); + } + + for (String key : preferencesToRemove) { + Preference pref = screen.findPreference(key); + if (pref != null) { + screen.removePreference(pref); + } else if (mExtraScreen != null) { + pref = mExtraScreen.findPreference(key); + if (pref != null) { + mExtraScreen.removePreference(pref); + } + } + } + + setLoading(false /* loading */, true /* animate */); + + if (mOnPermissionsLoadedListener != null) { + mOnPermissionsLoadedListener.onPermissionsLoaded(permissionApps); + } + } + + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + String pkg = preference.getKey(); + final PermissionApp app = mPermissionApps.getApp(pkg); + + if (app == null) { + return false; + } + + OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); + if (activity.isObscuredTouch()) { + activity.showOverlayDialog(); + return false; + } + + addToggledGroup(app.getPackageName(), app.getPermissionGroup()); + + if (LocationUtils.isLocationGroupAndProvider(mPermissionApps.getGroupName(), + app.getPackageName())) { + LocationUtils.showLocationDialog(getContext(), app.getLabel()); + return false; + } + if (newValue == Boolean.TRUE) { + app.grantRuntimePermissions(); + } else { + final boolean grantedByDefault = app.hasGrantedByDefaultPermissions(); + if (grantedByDefault || (!app.hasRuntimePermissions() && !mHasConfirmedRevoke)) { + new AlertDialog.Builder(getContext()) + .setMessage(grantedByDefault ? R.string.system_warning + : R.string.old_sdk_deny_warning) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.grant_dialog_button_deny, + new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ((SwitchPreference) preference).setChecked(false); + app.revokeRuntimePermissions(); + if (!grantedByDefault) { + mHasConfirmedRevoke = true; + } + } + }) + .show(); + return false; + } else { + app.revokeRuntimePermissions(); + } + } + return true; + } + + @Override + public void onPause() { + super.onPause(); + logToggledGroups(); + } + + private void addToggledGroup(String packageName, AppPermissionGroup group) { + if (mToggledGroups == null) { + mToggledGroups = new ArrayMap<>(); + } + // Double toggle is back to initial state. + if (mToggledGroups.containsKey(packageName)) { + mToggledGroups.remove(packageName); + } else { + mToggledGroups.put(packageName, group); + } + } + + private void logToggledGroups() { + if (mToggledGroups != null) { + final int groupCount = mToggledGroups.size(); + for (int i = 0; i < groupCount; i++) { + String packageName = mToggledGroups.keyAt(i); + List groups = new ArrayList<>(); + groups.add(mToggledGroups.valueAt(i)); + SafetyNetLogger.logPermissionsToggled(packageName, groups); + } + mToggledGroups = null; + } + } + + public static class SystemAppsFragment extends PermissionsFrameFragment implements Callback { + PermissionAppsFragment mOuterFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (PermissionAppsFragment) getTargetFragment(); + setLoading(true /* loading */, false /* animate */); + super.onCreate(savedInstanceState); + if (mOuterFragment.mExtraScreen != null) { + setPreferenceScreen(); + } else { + mOuterFragment.setOnPermissionsLoadedListener(this); + } + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + PermissionApps permissionApps = new PermissionApps(getActivity(), groupName, null); + bindUi(this, permissionApps); + } + + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + setPreferenceScreen(); + mOuterFragment.setOnPermissionsLoadedListener(null); + } + + private void setPreferenceScreen() { + setPreferenceScreen(mOuterFragment.mExtraScreen); + setLoading(false /* loading */, true /* animate */); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionsFrameFragment.java new file mode 100644 index 00000000..e7f63b23 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionsFrameFragment.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.os.Bundle; +import android.preference.PreferenceFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; +import android.widget.ListView; +import android.widget.TextView; +import com.android.packageinstaller.R; + +public abstract class PermissionsFrameFragment extends PreferenceFragment { + private ViewGroup mPreferencesContainer; + + private View mLoadingView; + private ViewGroup mPrefsView; + private boolean mIsLoading; + + /** + * Returns the view group that holds the preferences objects. This will + * only be set after {@link #onCreateView} has been called. + */ + protected final ViewGroup getPreferencesContainer() { + return mPreferencesContainer; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container, + false); + mPrefsView = (ViewGroup) rootView.findViewById(R.id.prefs_container); + if (mPrefsView == null) { + mPrefsView = rootView; + } + mLoadingView = rootView.findViewById(R.id.loading_container); + mPreferencesContainer = (ViewGroup) super.onCreateView( + inflater, mPrefsView, savedInstanceState); + setLoading(mIsLoading, false, true /* force */); + mPrefsView.addView(mPreferencesContainer); + return rootView; + } + + protected void setLoading(boolean loading, boolean animate) { + setLoading(loading, animate, false); + } + + private void setLoading(boolean loading, boolean animate, boolean force) { + if (mIsLoading != loading || force) { + mIsLoading = loading; + if (getView() == null) { + // If there is no created view, there is no reason to animate. + animate = false; + } + if (mPrefsView != null) { + setViewShown(mPrefsView, !loading, animate); + } + if (mLoadingView != null) { + setViewShown(mLoadingView, loading, animate); + } + } + } + + @Override + public ListView getListView() { + ListView listView = super.getListView(); + if (listView.getEmptyView() == null) { + TextView emptyView = (TextView) getView().findViewById(R.id.no_permissions); + listView.setEmptyView(emptyView); + } + return listView; + } + + private void setViewShown(final View view, boolean shown, boolean animate) { + if (animate) { + Animation animation = AnimationUtils.loadAnimation(getContext(), + shown ? android.R.anim.fade_in : android.R.anim.fade_out); + if (shown) { + view.setVisibility(View.VISIBLE); + } else { + animation.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + view.setVisibility(View.INVISIBLE); + } + }); + } + view.startAnimation(animation); + } else { + view.clearAnimation(); + view.setVisibility(shown ? View.VISIBLE : View.INVISIBLE); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java new file mode 100644 index 00000000..acb3c61e --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.handheld; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; + +public abstract class SettingsWithHeader extends PermissionsFrameFragment + implements OnClickListener { + + private View mHeader; + protected Intent mInfoIntent; + protected Drawable mIcon; + protected CharSequence mLabel; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState); + + if (!Utils.isTelevision(getContext())) { + mHeader = inflater.inflate(R.layout.header, root, false); + getPreferencesContainer().addView(mHeader, 0); + updateHeader(); + } + + return root; + } + + public void setHeader(Drawable icon, CharSequence label, Intent infoIntent) { + mIcon = icon; + mLabel = label; + mInfoIntent = infoIntent; + updateHeader(); + } + + private void updateHeader() { + if (mHeader != null) { + final ImageView appIcon = (ImageView) mHeader.findViewById(R.id.icon); + appIcon.setImageDrawable(mIcon); + + final TextView appName = (TextView) mHeader.findViewById(R.id.name); + appName.setText(mLabel); + + final View info = mHeader.findViewById(R.id.info); + if (mInfoIntent == null) { + info.setVisibility(View.GONE); + } else { + info.setVisibility(View.VISIBLE); + info.setClickable(true); + info.setOnClickListener(this); + } + } + } + + @Override + public void onClick(View v) { + getActivity().startActivity(mInfoIntent); + } +} diff --git a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java new file mode 100644 index 00000000..d4910128 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java @@ -0,0 +1,217 @@ +/* +* Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.support.v7.preference.PreferenceCategory; +import android.support.v7.preference.PreferenceGroup; +import android.util.Log; +import android.view.MenuItem; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public final class AllAppPermissionsFragment extends SettingsWithHeader { + + private static final String LOG_TAG = "AllAppPermissionsFragment"; + + private static final String KEY_OTHER = "other_perms"; + + public static AllAppPermissionsFragment newInstance(String packageName) { + AllAppPermissionsFragment instance = new AllAppPermissionsFragment(); + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); + instance.setArguments(arguments); + return instance; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setTitle(R.string.all_permissions); + ab.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public void onResume() { + super.onResume(); + updateUi(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: { + getFragmentManager().popBackStack(); + return true; + } + } + return super.onOptionsItemSelected(item); + } + + private void updateUi() { + if (getPreferenceScreen() != null) { + getPreferenceScreen().removeAll(); + } + addPreferencesFromResource(R.xml.all_permissions); + PreferenceGroup otherGroup = (PreferenceGroup) findPreference(KEY_OTHER); + ArrayList prefs = new ArrayList<>(); // Used for sorting. + prefs.add(otherGroup); + String pkg = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + otherGroup.removeAll(); + PackageManager pm = getContext().getPackageManager(); + + try { + PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_PERMISSIONS); + + ApplicationInfo appInfo = info.applicationInfo; + final Drawable icon = appInfo.loadIcon(pm); + final CharSequence label = appInfo.loadLabel(pm); + Intent infoIntent = null; + if (!getActivity().getIntent().getBooleanExtra( + AppPermissionsFragment.EXTRA_HIDE_INFO_BUTTON, false)) { + infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", pkg, null)); + } + setHeader(icon, label, infoIntent); + + if (info.requestedPermissions != null) { + for (int i = 0; i < info.requestedPermissions.length; i++) { + PermissionInfo perm; + try { + perm = pm.getPermissionInfo(info.requestedPermissions[i], 0); + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, + "Can't get permission info for " + info.requestedPermissions[i], e); + continue; + } + + if ((perm.flags & PermissionInfo.FLAG_INSTALLED) == 0 + || (perm.flags & PermissionInfo.FLAG_HIDDEN) != 0) { + continue; + } + + if (perm.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) { + PermissionGroupInfo group = getGroup(perm.group, pm); + PreferenceGroup pref = + findOrCreate(group != null ? group : perm, pm, prefs); + pref.addPreference(getPreference(perm, group, pm)); + } else if (perm.protectionLevel == PermissionInfo.PROTECTION_NORMAL) { + PermissionGroupInfo group = getGroup(perm.group, pm); + otherGroup.addPreference(getPreference(perm, group, pm)); + } + } + } + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, "Problem getting package info for " + pkg, e); + } + // Sort an ArrayList of the groups and then set the order from the sorting. + Collections.sort(prefs, new Comparator() { + @Override + public int compare(Preference lhs, Preference rhs) { + String lKey = lhs.getKey(); + String rKey = rhs.getKey(); + if (lKey.equals(KEY_OTHER)) { + return 1; + } else if (rKey.equals(KEY_OTHER)) { + return -1; + } else if (Utils.isModernPermissionGroup(lKey) + != Utils.isModernPermissionGroup(rKey)) { + return Utils.isModernPermissionGroup(lKey) ? -1 : 1; + } + return lhs.getTitle().toString().compareTo(rhs.getTitle().toString()); + } + }); + for (int i = 0; i < prefs.size(); i++) { + prefs.get(i).setOrder(i); + } + } + + private PermissionGroupInfo getGroup(String group, PackageManager pm) { + try { + return pm.getPermissionGroupInfo(group, 0); + } catch (NameNotFoundException e) { + return null; + } + } + + private PreferenceGroup findOrCreate(PackageItemInfo group, PackageManager pm, + ArrayList prefs) { + PreferenceGroup pref = (PreferenceGroup) findPreference(group.name); + if (pref == null) { + pref = new PreferenceCategory(getContext()); + pref.setKey(group.name); + pref.setLayoutResource(R.layout.preference_category_material); + pref.setTitle(group.loadLabel(pm)); + prefs.add(pref); + getPreferenceScreen().addPreference(pref); + } + return pref; + } + + private Preference getPreference(PermissionInfo perm, PermissionGroupInfo group, + PackageManager pm) { + Preference pref = new Preference(getContext()); + pref.setLayoutResource(R.layout.preference_permissions); + Drawable icon = null; + if (perm.icon != 0) { + icon = perm.loadIcon(pm); + } else if (group != null && group.icon != 0) { + icon = group.loadIcon(pm); + } else { + icon = getContext().getDrawable(R.drawable.ic_perm_device_info); + } + pref.setIcon(Utils.applyTint(getContext(), icon, android.R.attr.colorControlNormal)); + pref.setTitle(perm.loadLabel(pm)); + final CharSequence desc = perm.loadDescription(pm); + pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + new AlertDialog.Builder(getContext()) + .setMessage(desc) + .setPositiveButton(android.R.string.ok, null) + .show(); + return true; + } + }); + + return pref; + } +} \ No newline at end of file diff --git a/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java new file mode 100644 index 00000000..42a2661c --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java @@ -0,0 +1,404 @@ +/* +* Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.annotation.Nullable; +import android.app.ActionBar; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceChangeListener; +import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.support.v7.preference.PreferenceScreen; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.AppPermissionGroup; +import com.android.packageinstaller.permission.model.AppPermissions; +import com.android.packageinstaller.permission.ui.OverlayTouchActivity; +import com.android.packageinstaller.permission.utils.LocationUtils; +import com.android.packageinstaller.permission.utils.SafetyNetLogger; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +public final class AppPermissionsFragment extends SettingsWithHeader + implements OnPreferenceChangeListener { + + private static final String LOG_TAG = "ManagePermsFragment"; + + static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton"; + + private static final int MENU_ALL_PERMS = 0; + + private List mToggledGroups; + private AppPermissions mAppPermissions; + private PreferenceScreen mExtraScreen; + + private boolean mHasConfirmedRevoke; + + public static AppPermissionsFragment newInstance(String packageName) { + return setPackageName(new AppPermissionsFragment(), packageName); + } + + private static T setPackageName(T fragment, String packageName) { + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); + fragment.setArguments(arguments); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + Activity activity = getActivity(); + PackageInfo packageInfo = getPackageInfo(activity, packageName); + if (packageInfo == null) { + Toast.makeText(activity, R.string.app_not_found_dlg_title, Toast.LENGTH_LONG).show(); + activity.finish(); + return; + } + + mAppPermissions = new AppPermissions(activity, packageInfo, null, true, new Runnable() { + @Override + public void run() { + getActivity().finish(); + } + }); + loadPreferences(); + } + + @Override + public void onResume() { + super.onResume(); + mAppPermissions.refresh(); + setPreferencesCheckedState(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: { + getActivity().finish(); + return true; + } + + case MENU_ALL_PERMS: { + Fragment frag = AllAppPermissionsFragment.newInstance( + getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("AllPerms") + .commit(); + return true; + } + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (mAppPermissions != null) { + bindUi(this, mAppPermissions.getPackageInfo()); + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + menu.add(Menu.NONE, MENU_ALL_PERMS, Menu.NONE, R.string.all_permissions); + } + + private static void bindUi(SettingsWithHeader fragment, PackageInfo packageInfo) { + Activity activity = fragment.getActivity(); + PackageManager pm = activity.getPackageManager(); + ApplicationInfo appInfo = packageInfo.applicationInfo; + Intent infoIntent = null; + if (!activity.getIntent().getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { + infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", packageInfo.packageName, null)); + } + + Drawable icon = appInfo.loadIcon(pm); + CharSequence label = appInfo.loadLabel(pm); + fragment.setHeader(icon, label, infoIntent); + + ActionBar ab = activity.getActionBar(); + if (ab != null) { + ab.setTitle(R.string.app_permissions); + } + + ViewGroup rootView = (ViewGroup) fragment.getView(); + ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + iconView.setImageDrawable(icon); + } + TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(R.string.app_permissions); + } + TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(label); + } + } + + private void loadPreferences() { + Context context = getPreferenceManager().getContext(); + if (context == null) { + return; + } + + PreferenceScreen screen = getPreferenceScreen(); + screen.removeAll(); + + if (mExtraScreen != null) { + mExtraScreen.removeAll(); + } + + final Preference extraPerms = new Preference(context); + extraPerms.setIcon(R.drawable.ic_toc); + extraPerms.setTitle(R.string.additional_permissions); + + for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { + if (!Utils.shouldShowPermission(group, mAppPermissions.getPackageInfo().packageName)) { + continue; + } + + boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); + + SwitchPreference preference = new SwitchPreference(context); + preference.setOnPreferenceChangeListener(this); + preference.setKey(group.getName()); + Drawable icon = Utils.loadDrawable(context.getPackageManager(), + group.getIconPkg(), group.getIconResId()); + preference.setIcon(Utils.applyTint(getContext(), icon, + android.R.attr.colorControlNormal)); + preference.setTitle(group.getLabel()); + if (group.isPolicyFixed()) { + preference.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + } + preference.setPersistent(false); + preference.setEnabled(!group.isPolicyFixed()); + preference.setChecked(group.areRuntimePermissionsGranted()); + + if (isPlatform) { + screen.addPreference(preference); + } else { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(preference); + } + } + + if (mExtraScreen != null) { + extraPerms.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); + setPackageName(frag, getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); + frag.setTargetFragment(AppPermissionsFragment.this, 0); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack(null) + .commit(); + return true; + } + }); + int count = mExtraScreen.getPreferenceCount(); + extraPerms.setSummary(getResources().getQuantityString( + R.plurals.additional_permissions_more, count, count)); + screen.addPreference(extraPerms); + } + + setLoading(false /* loading */, true /* animate */); + } + + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + String groupName = preference.getKey(); + final AppPermissionGroup group = mAppPermissions.getPermissionGroup(groupName); + + if (group == null) { + return false; + } + + OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); + if (activity.isObscuredTouch()) { + activity.showOverlayDialog(); + return false; + } + + addToggledGroup(group); + + if (LocationUtils.isLocationGroupAndProvider(group.getName(), group.getApp().packageName)) { + LocationUtils.showLocationDialog(getContext(), mAppPermissions.getAppLabel()); + return false; + } + if (newValue == Boolean.TRUE) { + group.grantRuntimePermissions(false); + } else { + final boolean grantedByDefault = group.hasGrantedByDefaultPermission(); + if (grantedByDefault || (!group.hasRuntimePermission() && !mHasConfirmedRevoke)) { + new AlertDialog.Builder(getContext()) + .setMessage(grantedByDefault ? R.string.system_warning + : R.string.old_sdk_deny_warning) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.grant_dialog_button_deny, + new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ((SwitchPreference) preference).setChecked(false); + group.revokeRuntimePermissions(false); + if (!grantedByDefault) { + mHasConfirmedRevoke = true; + } + } + }) + .show(); + return false; + } else { + group.revokeRuntimePermissions(false); + } + } + + return true; + } + + @Override + public void onPause() { + super.onPause(); + logToggledGroups(); + } + + private void addToggledGroup(AppPermissionGroup group) { + if (mToggledGroups == null) { + mToggledGroups = new ArrayList<>(); + } + // Double toggle is back to initial state. + if (mToggledGroups.contains(group)) { + mToggledGroups.remove(group); + } else { + mToggledGroups.add(group); + } + } + + private void logToggledGroups() { + if (mToggledGroups != null) { + String packageName = mAppPermissions.getPackageInfo().packageName; + SafetyNetLogger.logPermissionsToggled(packageName, mToggledGroups); + mToggledGroups = null; + } + } + + private void setPreferencesCheckedState() { + setPreferencesCheckedState(getPreferenceScreen()); + if (mExtraScreen != null) { + setPreferencesCheckedState(mExtraScreen); + } + } + + private void setPreferencesCheckedState(PreferenceScreen screen) { + int preferenceCount = screen.getPreferenceCount(); + for (int i = 0; i < preferenceCount; i++) { + Preference preference = screen.getPreference(i); + if (preference instanceof SwitchPreference) { + SwitchPreference switchPref = (SwitchPreference) preference; + AppPermissionGroup group = mAppPermissions.getPermissionGroup(switchPref.getKey()); + if (group != null) { + switchPref.setChecked(group.areRuntimePermissionsGranted()); + } + } + } + } + + private static PackageInfo getPackageInfo(Activity activity, String packageName) { + try { + return activity.getPackageManager().getPackageInfo( + packageName, PackageManager.GET_PERMISSIONS); + } catch (PackageManager.NameNotFoundException e) { + Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); + return null; + } + } + + public static class AdditionalPermissionsFragment extends SettingsWithHeader { + AppPermissionsFragment mOuterFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (AppPermissionsFragment) getTargetFragment(); + super.onCreate(savedInstanceState); + setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent); + setHasOptionsMenu(true); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferenceScreen(mOuterFragment.mExtraScreen); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + bindUi(this, getPackageInfo(getActivity(), packageName)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getFragmentManager().popBackStack(); + return true; + } + return super.onOptionsItemSelected(item); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/television/GrantPermissionsViewHandlerImpl.java b/src/com/android/packageinstaller/permission/ui/television/GrantPermissionsViewHandlerImpl.java new file mode 100644 index 00000000..a2538821 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/GrantPermissionsViewHandlerImpl.java @@ -0,0 +1,131 @@ +package com.android.packageinstaller.permission.ui.television; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.graphics.drawable.Icon; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.ui.GrantPermissionsViewHandler; + +/** + * TV-specific view handler for the grant permissions activity. + */ +public final class GrantPermissionsViewHandlerImpl implements GrantPermissionsViewHandler, OnClickListener { + + private static final String ARG_GROUP_NAME = "ARG_GROUP_NAME"; + + private final Context mContext; + + private ResultListener mResultListener; + + private String mGroupName; + + private LinearLayout mRootView; + private TextView mMessageView; + private ImageView mIconView; + private TextView mCurrentGroupView; + private Button mAllowButton; + private Button mSoftDenyButton; + private Button mHardDenyButton; + + public GrantPermissionsViewHandlerImpl(Context context) { + mContext = context; + } + + @Override + public GrantPermissionsViewHandlerImpl setResultListener(ResultListener listener) { + mResultListener = listener; + return this; + } + + @Override + public View createView() { + mRootView = (LinearLayout) LayoutInflater.from(mContext) + .inflate(R.layout.grant_permissions, null); + + mMessageView = (TextView) mRootView.findViewById(R.id.permission_message); + mIconView = (ImageView) mRootView.findViewById(R.id.permission_icon); + mCurrentGroupView = (TextView) mRootView.findViewById(R.id.current_page_text); + mAllowButton = (Button) mRootView.findViewById(R.id.permission_allow_button); + mSoftDenyButton = (Button) mRootView.findViewById(R.id.permission_deny_button); + mHardDenyButton = (Button) mRootView.findViewById( + R.id.permission_deny_dont_ask_again_button); + + mAllowButton.setOnClickListener(this); + mSoftDenyButton.setOnClickListener(this); + mHardDenyButton.setOnClickListener(this); + + return mRootView; + } + + @Override + public void updateWindowAttributes(WindowManager.LayoutParams outLayoutParams) { + outLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; + outLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + outLayoutParams.format = PixelFormat.OPAQUE; + outLayoutParams.gravity = Gravity.BOTTOM; + outLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; + outLayoutParams.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + } + + @Override + public void updateUi(String groupName, int groupCount, int groupIndex, Icon icon, + CharSequence message, boolean showDoNotAsk) { + mGroupName = groupName; + + mMessageView.setText(message); + mIconView.setImageIcon(icon); + mHardDenyButton.setVisibility(showDoNotAsk ? View.VISIBLE : View.GONE); + if (groupCount > 1) { + mCurrentGroupView.setVisibility(View.VISIBLE); + mCurrentGroupView.setText(mContext.getString(R.string.current_permission_template, + groupIndex + 1, groupCount)); + } else { + mCurrentGroupView.setVisibility(View.INVISIBLE); + } + } + + @Override + public void saveInstanceState(Bundle outState) { + outState.putString(ARG_GROUP_NAME, mGroupName); + } + + @Override + public void loadInstanceState(Bundle savedInstanceState) { + mGroupName = savedInstanceState.getString(ARG_GROUP_NAME); + } + + @Override + public void onClick(View view) { + boolean granted = false; + boolean doNotAskAgain = false; + switch (view.getId()) { + case R.id.permission_allow_button: + granted = true; + break; + case R.id.permission_deny_dont_ask_again_button: + doNotAskAgain = true; + break; + } + if (mResultListener != null) { + mResultListener.onPermissionGrantResult(mGroupName, granted, doNotAskAgain); + } + } + + @Override + public void onBackPressed() { + if (mResultListener != null) { + mResultListener.onPermissionGrantResult(mGroupName, false, false); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java new file mode 100644 index 00000000..47301f48 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.annotation.Nullable; +import android.app.ActionBar; +import android.app.FragmentTransaction; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.support.v7.preference.PreferenceScreen; +import android.util.ArraySet; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.PermissionApps; +import com.android.packageinstaller.permission.model.PermissionApps.PmCache; +import com.android.packageinstaller.permission.model.PermissionGroup; +import com.android.packageinstaller.permission.model.PermissionGroups; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.List; + +public final class ManagePermissionsFragment extends PermissionsFrameFragment + implements PermissionGroups.PermissionsGroupsChangeCallback, OnPreferenceClickListener { + private static final String LOG_TAG = "ManagePermissionsFragment"; + + private static final String OS_PKG = "android"; + + private static final String EXTRA_PREFS_KEY = "extra_prefs_key"; + + private ArraySet mLauncherPkgs; + + private PermissionGroups mPermissions; + + private PreferenceScreen mExtraScreen; + + public static ManagePermissionsFragment newInstance() { + return new ManagePermissionsFragment(); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + mLauncherPkgs = Utils.getLauncherPackages(getContext()); + mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this); + } + + @Override + public void onResume() { + super.onResume(); + mPermissions.refresh(); + updatePermissionsUi(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + getActivity().finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + String key = preference.getKey(); + + PermissionGroup group = mPermissions.getGroup(key); + if (group == null) { + return false; + } + + Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) + .putExtra(Intent.EXTRA_PERMISSION_NAME, key); + try { + getActivity().startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.w(LOG_TAG, "No app to handle " + intent); + } + + return true; + } + + @Override + public void onPermissionGroupsChanged() { + updatePermissionsUi(); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindPermissionUi(getActivity(), getView()); + } + + private static void bindPermissionUi(@Nullable Context context, @Nullable View rootView) { + if (context == null || rootView == null) { + return; + } + + ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + // Set the icon as the background instead of the image because ImageView + // doesn't properly scale vector drawables beyond their intrinsic size + Drawable icon = context.getDrawable(R.drawable.ic_lock); + icon.setTint(context.getColor(R.color.off_white)); + iconView.setBackground(icon); + } + TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(R.string.app_permissions); + } + TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(R.string.app_permissions_breadcrumb); + } + } + + private void updatePermissionsUi() { + Context context = getPreferenceManager().getContext(); + if (context == null) { + return; + } + + List groups = mPermissions.getGroups(); + PreferenceScreen screen = getPreferenceScreen(); + + // Use this to speed up getting the info for all of the PermissionApps below. + // Create a new one for each refresh to make sure it has fresh data. + PmCache cache = new PmCache(getContext().getPackageManager()); + for (PermissionGroup group : groups) { + boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG); + + Preference preference = findPreference(group.getName()); + if (preference == null && mExtraScreen != null) { + preference = mExtraScreen.findPreference(group.getName()); + } + if (preference == null) { + preference = new Preference(context); + preference.setOnPreferenceClickListener(this); + preference.setKey(group.getName()); + preference.setIcon(Utils.applyTint(context, group.getIcon(), + android.R.attr.colorControlNormal)); + preference.setTitle(group.getLabel()); + // Set blank summary so that no resizing/jumping happens when the summary is loaded. + preference.setSummary(" "); + preference.setPersistent(false); + if (isSystemPermission) { + screen.addPreference(preference); + } else { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(preference); + } + } + final Preference finalPref = preference; + + new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() { + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + if (getActivity() == null) { + return; + } + int granted = permissionApps.getGrantedCount(mLauncherPkgs); + int total = permissionApps.getTotalCount(mLauncherPkgs); + finalPref.setSummary(getString(R.string.app_permissions_group_summary, + granted, total)); + } + }, cache).refresh(false); + } + + if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0 + && screen.findPreference(EXTRA_PREFS_KEY) == null) { + Preference extraScreenPreference = new Preference(context); + extraScreenPreference.setKey(EXTRA_PREFS_KEY); + extraScreenPreference.setIcon(Utils.applyTint(context, + R.drawable.ic_more_items, + android.R.attr.colorControlNormal)); + extraScreenPreference.setTitle(R.string.additional_permissions); + extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); + frag.setTargetFragment(ManagePermissionsFragment.this, 0); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(android.R.id.content, frag); + ft.addToBackStack(null); + ft.commit(); + return true; + } + }); + int count = mExtraScreen.getPreferenceCount(); + extraScreenPreference.setSummary(getResources().getQuantityString( + R.plurals.additional_permissions_more, count, count)); + screen.addPreference(extraScreenPreference); + } + if (screen.getPreferenceCount() != 0) { + setLoading(false /* loading */, true /* animate */); + } + } + + public static class AdditionalPermissionsFragment extends PermissionsFrameFragment { + @Override + public void onCreate(Bundle icicle) { + setLoading(true /* loading */, false /* animate */); + super.onCreate(icicle); + getActivity().setTitle(R.string.additional_permissions); + setHasOptionsMenu(true); + } + + @Override + public void onDestroy() { + getActivity().setTitle(R.string.app_permissions); + super.onDestroy(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getFragmentManager().popBackStack(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindPermissionUi(getActivity(), getView()); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen); + setLoading(false /* loading */, true /* animate */); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java new file mode 100644 index 00000000..0f240bef --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java @@ -0,0 +1,435 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.v14.preference.SwitchPreference; +import android.support.v4.util.ArrayMap; +import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceChangeListener; +import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.support.v7.preference.PreferenceScreen; +import android.util.ArraySet; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.packageinstaller.DeviceUtils; +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.model.AppPermissionGroup; +import com.android.packageinstaller.permission.model.PermissionApps; +import com.android.packageinstaller.permission.model.PermissionApps.Callback; +import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; +import com.android.packageinstaller.permission.ui.OverlayTouchActivity; +import com.android.packageinstaller.permission.utils.LocationUtils; +import com.android.packageinstaller.permission.utils.SafetyNetLogger; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback, + OnPreferenceChangeListener { + + private static final int MENU_SHOW_SYSTEM = Menu.FIRST; + private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1; + private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem"; + + public static PermissionAppsFragment newInstance(String permissionName) { + return setPermissionName(new PermissionAppsFragment(), permissionName); + } + + private static T setPermissionName(T fragment, String permissionName) { + Bundle arguments = new Bundle(); + arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName); + fragment.setArguments(arguments); + return fragment; + } + + private PermissionApps mPermissionApps; + + private PreferenceScreen mExtraScreen; + + private ArrayMap mToggledGroups; + private ArraySet mLauncherPkgs; + private boolean mHasConfirmedRevoke; + + private boolean mShowSystem; + private MenuItem mShowSystemMenu; + private MenuItem mHideSystemMenu; + + private Callback mOnPermissionsLoadedListener; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setLoading(true /* loading */, false /* animate */); + setHasOptionsMenu(true); + final ActionBar ab = getActivity().getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + mLauncherPkgs = Utils.getLauncherPackages(getContext()); + + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + mPermissionApps = new PermissionApps(getActivity(), groupName, this); + mPermissionApps.refresh(true); + } + + @Override + public void onResume() { + super.onResume(); + mPermissionApps.refresh(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE, + R.string.menu_show_system); + mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE, + R.string.menu_hide_system); + updateMenu(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getActivity().finish(); + return true; + case MENU_SHOW_SYSTEM: + case MENU_HIDE_SYSTEM: + mShowSystem = item.getItemId() == MENU_SHOW_SYSTEM; + if (mPermissionApps.getApps() != null) { + onPermissionsLoaded(mPermissionApps); + } + updateMenu(); + break; + } + return super.onOptionsItemSelected(item); + } + + private void updateMenu() { + mShowSystemMenu.setVisible(!mShowSystem); + mHideSystemMenu.setVisible(mShowSystem); + } + + @Override + protected void onSetEmptyText(TextView textView) { + textView.setText(R.string.no_apps); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + bindUi(this, mPermissionApps); + } + + private static void bindUi(Fragment fragment, PermissionApps permissionApps) { + final Drawable icon = permissionApps.getIcon(); + final CharSequence label = permissionApps.getLabel(); + final ActionBar ab = fragment.getActivity().getActionBar(); + if (ab != null) { + ab.setTitle(fragment.getString(R.string.permission_title, label)); + } + + final ViewGroup rootView = (ViewGroup) fragment.getView(); + final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + if (iconView != null) { + // Set the icon as the background instead of the image because ImageView + // doesn't properly scale vector drawables beyond their intrinsic size + iconView.setBackground(icon); + } + final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + if (titleView != null) { + titleView.setText(label); + } + final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); + if (breadcrumbView != null) { + breadcrumbView.setText(R.string.app_permissions); + } + } + + private void setOnPermissionsLoadedListener(Callback callback) { + mOnPermissionsLoadedListener = callback; + } + + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + Context context = getPreferenceManager().getContext(); + + if (context == null) { + return; + } + + boolean isTelevision = DeviceUtils.isTelevision(context); + PreferenceScreen screen = getPreferenceScreen(); + + ArraySet preferencesToRemove = new ArraySet<>(); + for (int i = 0, n = screen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(screen.getPreference(i).getKey()); + } + if (mExtraScreen != null) { + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(mExtraScreen.getPreference(i).getKey()); + } + } + + for (PermissionApp app : permissionApps.getApps()) { + if (!Utils.shouldShowPermission(app)) { + continue; + } + + String key = app.getKey(); + preferencesToRemove.remove(key); + Preference existingPref = screen.findPreference(key); + if (existingPref == null && mExtraScreen != null) { + existingPref = mExtraScreen.findPreference(key); + } + + boolean isSystemApp = Utils.isSystem(app, mLauncherPkgs); + if (isSystemApp && !isTelevision && !mShowSystem) { + if (existingPref != null) { + screen.removePreference(existingPref); + } + continue; + } + + if (existingPref != null) { + // If existing preference - only update its state. + if (app.isPolicyFixed()) { + existingPref.setSummary(getString( + R.string.permission_summary_enforced_by_policy)); + } + existingPref.setPersistent(false); + existingPref.setEnabled(!app.isPolicyFixed()); + if (existingPref instanceof SwitchPreference) { + ((SwitchPreference) existingPref) + .setChecked(app.areRuntimePermissionsGranted()); + } + continue; + } + + SwitchPreference pref = new SwitchPreference(context); + pref.setOnPreferenceChangeListener(this); + pref.setKey(app.getKey()); + pref.setIcon(app.getIcon()); + pref.setTitle(app.getLabel()); + if (app.isPolicyFixed()) { + pref.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + } + pref.setPersistent(false); + pref.setEnabled(!app.isPolicyFixed()); + pref.setChecked(app.areRuntimePermissionsGranted()); + + if (isSystemApp && isTelevision) { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(pref); + } else { + screen.addPreference(pref); + } + } + + if (mExtraScreen != null) { + preferencesToRemove.remove(KEY_SHOW_SYSTEM_PREFS); + Preference pref = screen.findPreference(KEY_SHOW_SYSTEM_PREFS); + + if (pref == null) { + pref = new Preference(context); + pref.setKey(KEY_SHOW_SYSTEM_PREFS); + pref.setIcon(Utils.applyTint(context, R.drawable.ic_toc, + android.R.attr.colorControlNormal)); + pref.setTitle(R.string.preference_show_system_apps); + pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + SystemAppsFragment frag = new SystemAppsFragment(); + setPermissionName(frag, getArguments().getString(Intent.EXTRA_PERMISSION_NAME)); + frag.setTargetFragment(PermissionAppsFragment.this, 0); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("SystemApps") + .commit(); + return true; + } + }); + screen.addPreference(pref); + } + + int grantedCount = 0; + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + if (((SwitchPreference) mExtraScreen.getPreference(i)).isChecked()) { + grantedCount++; + } + } + pref.setSummary(getString(R.string.app_permissions_group_summary, + grantedCount, mExtraScreen.getPreferenceCount())); + } + + for (String key : preferencesToRemove) { + Preference pref = screen.findPreference(key); + if (pref != null) { + screen.removePreference(pref); + } else if (mExtraScreen != null) { + pref = mExtraScreen.findPreference(key); + if (pref != null) { + mExtraScreen.removePreference(pref); + } + } + } + + setLoading(false /* loading */, true /* animate */); + + if (mOnPermissionsLoadedListener != null) { + mOnPermissionsLoadedListener.onPermissionsLoaded(permissionApps); + } + } + + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + String pkg = preference.getKey(); + final PermissionApp app = mPermissionApps.getApp(pkg); + + if (app == null) { + return false; + } + + OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); + if (activity.isObscuredTouch()) { + activity.showOverlayDialog(); + return false; + } + + addToggledGroup(app.getPackageName(), app.getPermissionGroup()); + + if (LocationUtils.isLocationGroupAndProvider(mPermissionApps.getGroupName(), + app.getPackageName())) { + LocationUtils.showLocationDialog(getContext(), app.getLabel()); + return false; + } + if (newValue == Boolean.TRUE) { + app.grantRuntimePermissions(); + } else { + final boolean grantedByDefault = app.hasGrantedByDefaultPermissions(); + if (grantedByDefault || (!app.hasRuntimePermissions() && !mHasConfirmedRevoke)) { + new AlertDialog.Builder(getContext()) + .setMessage(grantedByDefault ? R.string.system_warning + : R.string.old_sdk_deny_warning) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.grant_dialog_button_deny, + new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ((SwitchPreference) preference).setChecked(false); + app.revokeRuntimePermissions(); + if (!grantedByDefault) { + mHasConfirmedRevoke = true; + } + } + }) + .show(); + return false; + } else { + app.revokeRuntimePermissions(); + } + } + return true; + } + + @Override + public void onPause() { + super.onPause(); + logToggledGroups(); + } + + private void addToggledGroup(String packageName, AppPermissionGroup group) { + if (mToggledGroups == null) { + mToggledGroups = new ArrayMap<>(); + } + // Double toggle is back to initial state. + if (mToggledGroups.containsKey(packageName)) { + mToggledGroups.remove(packageName); + } else { + mToggledGroups.put(packageName, group); + } + } + + private void logToggledGroups() { + if (mToggledGroups != null) { + final int groupCount = mToggledGroups.size(); + for (int i = 0; i < groupCount; i++) { + String packageName = mToggledGroups.keyAt(i); + List groups = new ArrayList<>(); + groups.add(mToggledGroups.valueAt(i)); + SafetyNetLogger.logPermissionsToggled(packageName, groups); + } + mToggledGroups = null; + } + } + + public static class SystemAppsFragment extends PermissionsFrameFragment implements Callback { + PermissionAppsFragment mOuterFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (PermissionAppsFragment) getTargetFragment(); + setLoading(true /* loading */, false /* animate */); + super.onCreate(savedInstanceState); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + if (mOuterFragment.mExtraScreen != null) { + setPreferenceScreen(); + } else { + mOuterFragment.setOnPermissionsLoadedListener(this); + } + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + PermissionApps permissionApps = new PermissionApps(getActivity(), groupName, null); + bindUi(this, permissionApps); + } + + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + setPreferenceScreen(); + mOuterFragment.setOnPermissionsLoadedListener(null); + } + + private void setPreferenceScreen() { + setPreferenceScreen(mOuterFragment.mExtraScreen); + setLoading(false /* loading */, true /* animate */); + } + } +} diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java new file mode 100644 index 00000000..bc0e8457 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.annotation.Nullable; +import android.os.Bundle; +import android.support.v14.preference.PreferenceFragment; +import android.support.v17.leanback.widget.VerticalGridView; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.RecyclerView.AdapterDataObserver; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; + +public abstract class PermissionsFrameFragment extends PreferenceFragment { + + private static final float WINDOW_ALIGNMENT_OFFSET_PERCENT = 50; + + private ViewGroup mPreferencesContainer; + + // TV-specific instance variables + @Nullable private VerticalGridView mGridView; + + private View mLoadingView; + private ViewGroup mPrefsView; + private boolean mIsLoading; + + /** + * Returns the view group that holds the preferences objects. This will + * only be set after {@link #onCreateView} has been called. + */ + protected final ViewGroup getPreferencesContainer() { + return mPreferencesContainer; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container, + false); + mPrefsView = (ViewGroup) rootView.findViewById(R.id.prefs_container); + if (mPrefsView == null) { + mPrefsView = rootView; + } + mLoadingView = rootView.findViewById(R.id.loading_container); + mPreferencesContainer = (ViewGroup) super.onCreateView( + inflater, mPrefsView, savedInstanceState); + setLoading(mIsLoading, false, true /* force */); + mPrefsView.addView(mPreferencesContainer); + return rootView; + } + + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { + PreferenceScreen preferences = getPreferenceScreen(); + if (preferences == null) { + preferences = getPreferenceManager().createPreferenceScreen(getActivity()); + setPreferenceScreen(preferences); + } + } + + protected void setLoading(boolean loading, boolean animate) { + setLoading(loading, animate, false); + } + + private void setLoading(boolean loading, boolean animate, boolean force) { + if (mIsLoading != loading || force) { + mIsLoading = loading; + if (getView() == null) { + // If there is no created view, there is no reason to animate. + animate = false; + } + if (mPrefsView != null) { + setViewShown(mPrefsView, !loading, animate); + } + if (mLoadingView != null) { + setViewShown(mLoadingView, loading, animate); + } + } + } + + private void setViewShown(final View view, boolean shown, boolean animate) { + if (animate) { + Animation animation = AnimationUtils.loadAnimation(getContext(), + shown ? android.R.anim.fade_in : android.R.anim.fade_out); + if (shown) { + view.setVisibility(View.VISIBLE); + } else { + animation.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + view.setVisibility(View.INVISIBLE); + } + }); + } + view.startAnimation(animation); + } else { + view.clearAnimation(); + view.setVisibility(shown ? View.VISIBLE : View.INVISIBLE); + } + } + + @Override + public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, + Bundle savedInstanceState) { + if (Utils.isTelevision(getContext())) { + mGridView = (VerticalGridView) inflater.inflate( + R.layout.leanback_preferences_list, parent, false); + mGridView.setWindowAlignmentOffset(0); + mGridView.setWindowAlignmentOffsetPercent(WINDOW_ALIGNMENT_OFFSET_PERCENT); + mGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); + mGridView.setFocusScrollStrategy(VerticalGridView.FOCUS_SCROLL_ALIGNED); + return mGridView; + } else { + return super.onCreateRecyclerView(inflater, parent, savedInstanceState); + } + } + + @Override + protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) { + final RecyclerView.Adapter adapter = super.onCreateAdapter(preferenceScreen); + + if (adapter != null) { + final TextView emptyView = (TextView) getView().findViewById(R.id.no_permissions); + onSetEmptyText(emptyView); + final RecyclerView recyclerView = getListView(); + adapter.registerAdapterDataObserver(new AdapterDataObserver() { + @Override + public void onChanged() { + checkEmpty(); + } + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + checkEmpty(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + checkEmpty(); + } + + private void checkEmpty() { + boolean isEmpty = adapter.getItemCount() == 0; + emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE); + recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE); + if (!isEmpty && mGridView != null) { + mGridView.requestFocus(); + } + } + }); + + boolean isEmpty = adapter.getItemCount() == 0; + emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE); + recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE); + if (!isEmpty && mGridView != null) { + mGridView.requestFocus(); + } + } + + return adapter; + } + + /** + * Hook for subclasses to change the default text of the empty view. + * Base implementation leaves the default empty view text. + * + * @param textView the empty text view + */ + protected void onSetEmptyText(TextView textView) { + } +} + diff --git a/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java new file mode 100644 index 00000000..c7f5cda3 --- /dev/null +++ b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2015 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.packageinstaller.permission.ui.television; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; + +public abstract class SettingsWithHeader extends PermissionsFrameFragment + implements OnClickListener { + + private View mHeader; + protected Intent mInfoIntent; + protected Drawable mIcon; + protected CharSequence mLabel; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState); + + if (!Utils.isTelevision(getContext())) { + mHeader = inflater.inflate(R.layout.header, root, false); + getPreferencesContainer().addView(mHeader, 0); + updateHeader(); + } + + return root; + } + + public void setHeader(Drawable icon, CharSequence label, Intent infoIntent) { + mIcon = icon; + mLabel = label; + mInfoIntent = infoIntent; + updateHeader(); + } + + private void updateHeader() { + if (mHeader != null) { + final ImageView appIcon = (ImageView) mHeader.findViewById(R.id.icon); + appIcon.setImageDrawable(mIcon); + + final TextView appName = (TextView) mHeader.findViewById(R.id.name); + appName.setText(mLabel); + + final View info = mHeader.findViewById(R.id.info); + if (mInfoIntent == null) { + info.setVisibility(View.GONE); + } else { + info.setVisibility(View.VISIBLE); + info.setClickable(true); + info.setOnClickListener(this); + } + } + } + + @Override + public void onClick(View v) { + getActivity().startActivity(mInfoIntent); + } + +} diff --git a/src/com/android/packageinstaller/permission/utils/LocationUtils.java b/src/com/android/packageinstaller/permission/utils/LocationUtils.java index 512fcf44..0296ae80 100644 --- a/src/com/android/packageinstaller/permission/utils/LocationUtils.java +++ b/src/com/android/packageinstaller/permission/utils/LocationUtils.java @@ -36,23 +36,9 @@ public class LocationUtils { public static final String LOCATION_PERMISSION = Manifest.permission_group.LOCATION; - public static ArrayList getLocationProviders() { - ArrayList providers = new ArrayList<>(); - Resources res = Resources.getSystem(); - providers.add(res.getString( - com.android.internal.R.string.config_networkLocationProviderPackageName)); - - for (String provider : - res.getStringArray(com.android.internal.R.array.config_locationProviderPackageNames)) { - providers.add(provider); - } - - return providers; - } - public static void showLocationDialog(final Context context, CharSequence label) { new AlertDialog.Builder(context) - .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material) + .setIcon(R.drawable.ic_dialog_alert_material) .setTitle(android.R.string.dialog_alert_title) .setMessage(context.getString(R.string.location_warning, label)) .setNegativeButton(R.string.ok, null) @@ -83,5 +69,4 @@ public class LocationUtils { return false; } } - } -- cgit v1.2.3 From 09370123353d8b925e644c05a9cf7434927e3ac9 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Fri, 20 Nov 2015 16:41:06 -0800 Subject: Fix build Change-Id: I2a3e235bb13f1920c14f6776ee3a1ef7285ea548 --- .../permission/ui/ManagePermissionsActivity.java | 10 +++------- .../permission/ui/handheld/PermissionAppsFragment.java | 3 ++- .../permission/ui/handheld/SettingsWithHeader.java | 3 ++- .../permission/ui/television/PermissionsFrameFragment.java | 3 ++- .../permission/ui/television/SettingsWithHeader.java | 3 ++- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java index a92b0ea4..38dbf8f5 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java @@ -20,13 +20,9 @@ import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.util.Log; -import com.android.packageinstaller.permission.utils.Utils; -<<<<<<< HEAD import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear; import com.android.packageinstaller.DeviceUtils; -======= ->>>>>>> c10abb25f3864e56b2a24ef3661511cd78921225 public final class ManagePermissionsActivity extends OverlayTouchActivity { private static final String LOG_TAG = "ManagePermissionsActivity"; @@ -44,7 +40,7 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { switch (action) { case Intent.ACTION_MANAGE_PERMISSIONS: { - if (Utils.isTelevision(this)) { + if (DeviceUtils.isTelevision(this)) { fragment = com.android.packageinstaller.permission.ui.television .ManagePermissionsFragment.newInstance(); } else { @@ -62,7 +58,7 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { } if (DeviceUtils.isWear(this)) { fragment = AppPermissionsFragmentWear.newInstance(packageName); - } else if (Utils.isTelevision(this)) { + } else if (DeviceUtils.isTelevision(this)) { fragment = com.android.packageinstaller.permission.ui.television .AppPermissionsFragment.newInstance(packageName); } else { @@ -78,7 +74,7 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity { finish(); return; } - if (Utils.isTelevision(this)) { + if (DeviceUtils.isTelevision(this)) { fragment = com.android.packageinstaller.permission.ui.television .PermissionAppsFragment.newInstance(permissionName); } else { diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java index 554830a7..eee2f716 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java @@ -37,6 +37,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.PermissionApps; @@ -179,7 +180,7 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple return; } - boolean isTelevision = Utils.isTelevision(context); + boolean isTelevision = DeviceUtils.isTelevision(context); PreferenceScreen screen = getPreferenceScreen(); if (screen == null) { screen = getPreferenceManager().createPreferenceScreen(getActivity()); diff --git a/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java index acb3c61e..c15a4287 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/SettingsWithHeader.java @@ -26,6 +26,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.utils.Utils; @@ -42,7 +43,7 @@ public abstract class SettingsWithHeader extends PermissionsFrameFragment Bundle savedInstanceState) { ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState); - if (!Utils.isTelevision(getContext())) { + if (!DeviceUtils.isTelevision(getContext())) { mHeader = inflater.inflate(R.layout.header, root, false); getPreferencesContainer().addView(mHeader, 0); updateHeader(); diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java index bc0e8457..e81aee86 100644 --- a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java @@ -31,6 +31,7 @@ import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.TextView; +import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.utils.Utils; @@ -133,7 +134,7 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { @Override public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { - if (Utils.isTelevision(getContext())) { + if (DeviceUtils.isTelevision(getContext())) { mGridView = (VerticalGridView) inflater.inflate( R.layout.leanback_preferences_list, parent, false); mGridView.setWindowAlignmentOffset(0); diff --git a/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java index c7f5cda3..4dae629c 100644 --- a/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java +++ b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java @@ -26,6 +26,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.utils.Utils; @@ -42,7 +43,7 @@ public abstract class SettingsWithHeader extends PermissionsFrameFragment Bundle savedInstanceState) { ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState); - if (!Utils.isTelevision(getContext())) { + if (!DeviceUtils.isTelevision(getContext())) { mHeader = inflater.inflate(R.layout.header, root, false); getPreferencesContainer().addView(mHeader, 0); updateHeader(); -- cgit v1.2.3 From 741ac03b4367c06d33190b80e2f6a6003a803517 Mon Sep 17 00:00:00 2001 From: Sharvil Nanavati Date: Sat, 21 Nov 2015 00:06:33 -0800 Subject: Fix build break. Bug: 25822682 Change-Id: Ib5b40f014a8b6d0fb756d7f4c4802c9e8dfa7a44 --- .../packageinstaller/permission/ui/ManagePermissionsActivity.java | 6 +----- src/com/android/packageinstaller/permission/utils/Utils.java | 4 ++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java index a92b0ea4..fad35e17 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java @@ -20,13 +20,9 @@ import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.util.Log; -import com.android.packageinstaller.permission.utils.Utils; -<<<<<<< HEAD - import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear; +import com.android.packageinstaller.permission.utils.Utils; import com.android.packageinstaller.DeviceUtils; -======= ->>>>>>> c10abb25f3864e56b2a24ef3661511cd78921225 public final class ManagePermissionsActivity extends OverlayTouchActivity { private static final String LOG_TAG = "ManagePermissionsActivity"; diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java index 21830378..b8a79d54 100644 --- a/src/com/android/packageinstaller/permission/utils/Utils.java +++ b/src/com/android/packageinstaller/permission/utils/Utils.java @@ -146,4 +146,8 @@ public class Utils { return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 && !launcherPkgs.contains(info.packageName); } + + public static boolean isTelevision(Object o) { + return false; + } } -- cgit v1.2.3 From cfc6b97c7d4dbaf7a50433a0f459ee4e25725e82 Mon Sep 17 00:00:00 2001 From: Anthony Hugh Date: Fri, 4 Dec 2015 13:30:49 -0800 Subject: Fix wake lock leak Wake lock was not being released when installation failed due to early bail out call. I wrapped the calls into a try/finally to ensure it gets released. Code was tested by tweaking the code to force a failure and test installing/uninstalling apps. BUG: 25814793 Change-Id: I2e81e5d76edcfb601ce734cf571705e979c51f32 --- .../wear/WearPackageInstallerService.java | 59 ++++++++++++---------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java index 6dc5aa70..229a3df6 100644 --- a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java +++ b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java @@ -586,31 +586,33 @@ public class WearPackageInstallerService extends Service { } public void packageInstalled(String packageName, int returnCode) { - // If installation failed, bail out and remove the ShowPermsStore entry - if (returnCode < 0) { - Log.e(TAG, "Package install failed " + mApplicationPackageName - + ", returnCode " + returnCode); - WearPackageUtil.removeFromPermStore(mContext, mApplicationPackageName); - return; - } + try { + // If installation failed, bail out and remove the ShowPermsStore entry + if (returnCode < 0) { + Log.e(TAG, "Package install failed " + mApplicationPackageName + + ", returnCode " + returnCode); + WearPackageUtil.removeFromPermStore(mContext, mApplicationPackageName); + return; + } - Log.i(TAG, "Package " + packageName + " was installed."); + Log.i(TAG, "Package " + packageName + " was installed."); - // Delete tempFile from the file system. - File tempFile = WearPackageUtil.getTemporaryFile(mContext, packageName); - if (tempFile != null) { - tempFile.delete(); - } + // Delete tempFile from the file system. + File tempFile = WearPackageUtil.getTemporaryFile(mContext, packageName); + if (tempFile != null) { + tempFile.delete(); + } - // Broadcast the "UPDATED" gmscore intent, normally sent by play store. - // TODO: Remove this broadcast if/when we get the play store to do this for us. - if (GMS_PACKAGE_NAME.equals(packageName)) { - Intent gmsInstalledIntent = new Intent(GMS_UPDATED_BROADCAST); - gmsInstalledIntent.setPackage(GMS_PACKAGE_NAME); - mContext.sendBroadcast(gmsInstalledIntent); + // Broadcast the "UPDATED" gmscore intent, normally sent by play store. + // TODO: Remove this broadcast if/when we get the play store to do this for us. + if (GMS_PACKAGE_NAME.equals(packageName)) { + Intent gmsInstalledIntent = new Intent(GMS_UPDATED_BROADCAST); + gmsInstalledIntent.setPackage(GMS_PACKAGE_NAME); + mContext.sendBroadcast(gmsInstalledIntent); + } + } finally { + finishService(mWakeLock, mStartId); } - - finishService(mWakeLock, mStartId); } } @@ -624,13 +626,16 @@ public class WearPackageInstallerService extends Service { } public void packageDeleted(String packageName, int returnCode) { - if (returnCode >= 0) { - Log.i(TAG, "Package " + packageName + " was uninstalled."); - } else { - Log.e(TAG, "Package uninstall failed " + packageName + ", returnCode " + - returnCode); + try { + if (returnCode >= 0) { + Log.i(TAG, "Package " + packageName + " was uninstalled."); + } else { + Log.e(TAG, "Package uninstall failed " + packageName + ", returnCode " + + returnCode); + } + } finally { + finishService(mWakeLock, mStartId); } - finishService(mWakeLock, mStartId); } } } -- cgit v1.2.3 From 42af15b6d9232ecf1f014ff69fbd86b8a0bc6b83 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Mon, 7 Dec 2015 17:33:53 -0800 Subject: Fix some UI glitches in PackageInstaller 1. Add missing tinting in ic_info.xml 2. Improve button stacking in the request permissions UI 3. Align text and icon in request permissions UI bug:26071925 Change-Id: I12f631e902203d3f31970b28e420e20b7b454812 --- res/drawable/ic_info.xml | 3 ++- res/layout/grant_permissions.xml | 37 ++++++++++++++++++++++------------- res/layout/permission_description.xml | 1 + 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/res/drawable/ic_info.xml b/res/drawable/ic_info.xml index f80a41cb..029ff1b5 100644 --- a/res/drawable/ic_info.xml +++ b/res/drawable/ic_info.xml @@ -17,7 +17,8 @@ Copyright (C) 2015 The Android Open Source Project android:width="24.0dp" android:height="24.0dp" android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:viewportHeight="24.0" + android:tint="?attr/colorControlNormal"> diff --git a/res/layout/grant_permissions.xml b/res/layout/grant_permissions.xml index 086a541a..463f0ccd 100644 --- a/res/layout/grant_permissions.xml +++ b/res/layout/grant_permissions.xml @@ -50,7 +50,7 @@ @@ -59,6 +59,7 @@ android:id="@+id/current_page_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="start|bottom" android:paddingTop="4dp" android:paddingBottom="4dp" android:paddingEnd="12dp" @@ -76,22 +77,30 @@ android:visibility="invisible" > - + android:layout_gravity="end" + android:orientation="horizontal" > - + + + + + diff --git a/res/layout/permission_description.xml b/res/layout/permission_description.xml index c9b60d64..2a00e9bf 100644 --- a/res/layout/permission_description.xml +++ b/res/layout/permission_description.xml @@ -34,6 +34,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/permission_icon" + android:layout_marginTop="3dp" android:paddingStart="16dip" android:paddingEnd="8dip" style="?android:attr/textAppearanceMedium"> -- cgit v1.2.3 From b3d46fff6958c7a74f1ab2082f932dd98c5cdc19 Mon Sep 17 00:00:00 2001 From: Vinod Krishnan Date: Wed, 2 Dec 2015 17:34:10 -0800 Subject: [PkgInstaller] Refactoring arguments of WearPackageInstaller - Creating a WearPackageArgs object Change-Id: I9616fe5e6621856e5d07da5cee205e7162dad451 --- .../packageinstaller/wear/WearPackageArgs.java | 92 ++++++++++++++++++++++ .../wear/WearPackageInstallerService.java | 91 ++++++--------------- 2 files changed, 118 insertions(+), 65 deletions(-) create mode 100644 src/com/android/packageinstaller/wear/WearPackageArgs.java diff --git a/src/com/android/packageinstaller/wear/WearPackageArgs.java b/src/com/android/packageinstaller/wear/WearPackageArgs.java new file mode 100644 index 00000000..67051da0 --- /dev/null +++ b/src/com/android/packageinstaller/wear/WearPackageArgs.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015 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.packageinstaller.wear; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; + +/** + * Installation Util that contains a list of parameters that are needed for + * installing/uninstalling. + */ +public class WearPackageArgs { + private static final String KEY_ASSET_URI = + "com.google.android.clockwork.EXTRA_ASSET_URI"; + private static final String KEY_START_ID = + "com.google.android.clockwork.EXTRA_START_ID"; + private static final String KEY_PERM_URI = + "com.google.android.clockwork.EXTRA_PERM_URI"; + private static final String KEY_CHECK_PERMS = + "com.google.android.clockwork.EXTRA_CHECK_PERMS"; + private static final String KEY_SKIP_IF_SAME_VERSION = + "com.google.android.clockwork.EXTRA_SKIP_IF_SAME_VERSION"; + private static final String KEY_COMPRESSION_ALG = + "com.google.android.clockwork.EXTRA_KEY_COMPRESSION_ALG"; + private static final String KEY_COMPANION_SDK_VERSION = + "com.google.android.clockwork.EXTRA_KEY_COMPANION_SDK_VERSION"; + private static final String KEY_COMPANION_DEVICE_VERSION = + "com.google.android.clockwork.EXTRA_KEY_COMPANION_DEVICE_VERSION"; + private static final String KEY_SHOULD_CHECK_GMS_DEPENDENCY = + "com.google.android.clockwork.EXTRA_KEY_SHOULD_CHECK_GMS_DEPENDENCY"; + + public static String getPackageName(Bundle b) { + return b.getString(Intent.EXTRA_INSTALLER_PACKAGE_NAME); + } + + public static Uri getAssetUri(Bundle b) { + return b.getParcelable(KEY_ASSET_URI); + } + + public static Bundle setAssetUri(Bundle b, Uri assetUri) { + b.putParcelable(KEY_ASSET_URI, assetUri); + return b; + } + + public static Uri getPermUri(Bundle b) { + return b.getParcelable(KEY_PERM_URI); + } + + public static boolean checkPerms(Bundle b) { + return b.getBoolean(KEY_CHECK_PERMS); + } + + public static boolean skipIfSameVersion(Bundle b) { + return b.getBoolean(KEY_SKIP_IF_SAME_VERSION); + } + + public static int getCompanionSdkVersion(Bundle b) { + return b.getInt(KEY_COMPANION_SDK_VERSION); + } + + public static int getCompanionDeviceVersion(Bundle b) { + return b.getInt(KEY_COMPANION_DEVICE_VERSION); + } + + public static String getCompressionAlg(Bundle b) { + return b.getString(KEY_COMPRESSION_ALG); + } + + public static int getStartId(Bundle b) { + return b.getInt(KEY_START_ID); + } + + public static Bundle setStartId(Bundle b, int startId) { + b.putInt(KEY_START_ID, startId); + return b; + } +} diff --git a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java index 229a3df6..3874c0a4 100644 --- a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java +++ b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java @@ -16,7 +16,6 @@ package com.android.packageinstaller.wear; -import android.annotation.Nullable; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -81,19 +80,6 @@ import java.util.Set; public class WearPackageInstallerService extends Service { private static final String TAG = "WearPkgInstallerService"; - private static final String KEY_PERM_URI = - "com.google.android.clockwork.EXTRA_PERM_URI"; - private static final String KEY_CHECK_PERMS = - "com.google.android.clockwork.EXTRA_CHECK_PERMS"; - private static final String KEY_SKIP_IF_SAME_VERSION = - "com.google.android.clockwork.EXTRA_SKIP_IF_SAME_VERSION"; - private static final String KEY_COMPRESSION_ALG = - "com.google.android.clockwork.EXTRA_KEY_COMPRESSION_ALG"; - private static final String KEY_COMPANION_SDK_VERSION = - "com.google.android.clockwork.EXTRA_KEY_COMPANION_SDK_VERSION"; - private static final String KEY_COMPANION_DEVICE_VERSION = - "com.google.android.clockwork.EXTRA_KEY_COMPANION_DEVICE_VERSION"; - private static final String KEY_PACKAGE_NAME = "com.google.android.clockwork.EXTRA_PACKAGE_NAME"; private static final String KEY_APP_LABEL = "com.google.android.clockwork.EXTRA_APP_LABEL"; @@ -107,16 +93,6 @@ public class WearPackageInstallerService extends Service { private static final String SHOW_PERMS_SERVICE_CLASS = "com.google.android.clockwork.packagemanager.ShowPermsService"; - private static final String ASSET_URI_ARG = "assetUri"; - private static final String PACKAGE_NAME_ARG = "packageName"; - private static final String PERM_URI_ARG = "permUri"; - private static final String START_ID_ARG = "startId"; - private static final String CHECK_PERMS_ARG = "checkPerms"; - private static final String SKIP_IF_SAME_VERSION_ARG = "skipIfSameVersion"; - private static final String COMPRESSION_ALG = "compressionAlg"; - private static final String COMPANION_SDK_VERSION = "companionSdkVersion"; - private static final String COMPANION_DEVICE_VERSION = "companionDeviceVersion"; - /** * Normally sent by the Play store (See http://go/playstore-gms_updated), we instead * broadcast, ourselves. http://b/17387718 @@ -135,19 +111,10 @@ public class WearPackageInstallerService extends Service { public void handleMessage(Message msg) { switch (msg.what) { case START_INSTALL: - installPackage(msg.getData().getString(PACKAGE_NAME_ARG), - (Uri) msg.getData().getParcelable(ASSET_URI_ARG), - (Uri) msg.getData().getParcelable(PERM_URI_ARG), - msg.getData().getInt(START_ID_ARG), - msg.getData().getBoolean(CHECK_PERMS_ARG), - msg.getData().getBoolean(SKIP_IF_SAME_VERSION_ARG), - msg.getData().getString(COMPRESSION_ALG), - msg.getData().getInt(COMPANION_SDK_VERSION), - msg.getData().getInt(COMPANION_DEVICE_VERSION)); + installPackage(msg.getData()); break; case START_UNINSTALL: - uninstallPackage(msg.getData().getString(PACKAGE_NAME_ARG), - msg.getData().getInt(START_ID_ARG)); + uninstallPackage(msg.getData()); break; } } @@ -185,45 +152,35 @@ public class WearPackageInstallerService extends Service { Log.d(TAG, "Got install/uninstall request " + intent); } if (intent != null) { + Bundle intentBundle = intent.getExtras(); + WearPackageArgs.setStartId(intentBundle, startId); if (Intent.ACTION_INSTALL_PACKAGE.equals(intent.getAction())) { final Message msg = mServiceHandler.obtainMessage(START_INSTALL); - final Bundle startInstallArgs = new Bundle(); - startInstallArgs.putParcelable(ASSET_URI_ARG, intent.getData()); - startInstallArgs.putString(PACKAGE_NAME_ARG, intent.getStringExtra( - Intent.EXTRA_INSTALLER_PACKAGE_NAME)); - startInstallArgs.putInt(START_ID_ARG, startId); - Uri permUri = intent.getParcelableExtra(KEY_PERM_URI); - startInstallArgs.putParcelable(PERM_URI_ARG, permUri); - startInstallArgs.putBoolean(CHECK_PERMS_ARG, - intent.getBooleanExtra(KEY_CHECK_PERMS, true)); - startInstallArgs.putBoolean(SKIP_IF_SAME_VERSION_ARG, - intent.getBooleanExtra(KEY_SKIP_IF_SAME_VERSION, false)); - startInstallArgs.putString(COMPRESSION_ALG, - intent.getStringExtra(KEY_COMPRESSION_ALG)); - startInstallArgs.putInt(COMPANION_SDK_VERSION, - intent.getIntExtra(KEY_COMPANION_SDK_VERSION, 0)); - startInstallArgs.putInt(COMPANION_DEVICE_VERSION, - intent.getIntExtra(KEY_COMPANION_DEVICE_VERSION, 0)); - msg.setData(startInstallArgs); + WearPackageArgs.setAssetUri(intentBundle, intent.getData()); + msg.setData(intentBundle); mServiceHandler.sendMessage(msg); } else if (Intent.ACTION_UNINSTALL_PACKAGE.equals(intent.getAction())) { Message msg = mServiceHandler.obtainMessage(START_UNINSTALL); - Bundle startUninstallArgs = new Bundle(); - startUninstallArgs.putString(PACKAGE_NAME_ARG, intent.getStringExtra( - Intent.EXTRA_INSTALLER_PACKAGE_NAME)); - startUninstallArgs.putInt(START_ID_ARG, startId); - msg.setData(startUninstallArgs); + msg.setData(intentBundle); mServiceHandler.sendMessage(msg); } } return START_NOT_STICKY; } - private void installPackage(String packageName, Uri packageUri, Uri permUri, int startId, - boolean checkPerms, boolean skipIfSameVersion, @Nullable String compressionAlg, - int companionSdkVersion, int companionDeviceVersion) { + private void installPackage(Bundle argsBundle) { + int startId = WearPackageArgs.getStartId(argsBundle); + final String packageName = WearPackageArgs.getPackageName(argsBundle); + final Uri assetUri = WearPackageArgs.getAssetUri(argsBundle); + final Uri permUri = WearPackageArgs.getPermUri(argsBundle); + boolean checkPerms = WearPackageArgs.checkPerms(argsBundle); + boolean skipIfSameVersion = WearPackageArgs.skipIfSameVersion(argsBundle); + int companionSdkVersion = WearPackageArgs.getCompanionSdkVersion(argsBundle); + int companionDeviceVersion = WearPackageArgs.getCompanionDeviceVersion(argsBundle); + String compressionAlg = WearPackageArgs.getCompressionAlg(argsBundle); + if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Installing package: " + packageName + ", packageUri: " + packageUri + + Log.d(TAG, "Installing package: " + packageName + ", assetUri: " + assetUri + ",permUri: " + permUri + ", startId: " + startId + ", checkPerms: " + checkPerms + ", skipIfSameVersion: " + skipIfSameVersion + ", compressionAlg: " + compressionAlg + ", companionSdkVersion: " + @@ -252,7 +209,7 @@ public class WearPackageInstallerService extends Service { } } ParcelFileDescriptor parcelFd = getContentResolver() - .openFileDescriptor(packageUri, "r"); + .openFileDescriptor(assetUri, "r"); tempFile = WearPackageUtil.getFileFromFd(WearPackageInstallerService.this, parcelFd, packageName, compressionAlg); if (tempFile == null) { @@ -339,10 +296,11 @@ public class WearPackageInstallerService extends Service { pm.installPackage(Uri.fromFile(tempFile), new PackageInstallObserver(this, lock, startId, packageName), installFlags, packageName); + messageSent = true; Log.i(TAG, "Sent installation request for " + packageName); } catch (FileNotFoundException e) { - Log.e(TAG, "Could not find the file with URI " + packageUri, e); + Log.e(TAG, "Could not find the file with URI " + assetUri, e); } finally { if (!messageSent) { // Some error happened. If the message has been sent, we can wait for the observer @@ -355,7 +313,10 @@ public class WearPackageInstallerService extends Service { } } - private void uninstallPackage(String packageName, int startId) { + private void uninstallPackage(Bundle argsBundle) { + int startId = WearPackageArgs.getStartId(argsBundle); + final String packageName = WearPackageArgs.getPackageName(argsBundle); + final PackageManager pm = getPackageManager(); PowerManager.WakeLock lock = getLock(this.getApplicationContext()); pm.deletePackage(packageName, new PackageDeleteObserver(lock, startId), -- cgit v1.2.3 From f62bc1f1a0614da86f0d00a7530ff3f1e9083a93 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Tue, 15 Dec 2015 21:42:02 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I8a150e048c7522053f9172ae5333eb29a9a85394 Auto-generated-cl: translation import --- res/values-da-television/strings.xml | 2 +- res/values-es-watch/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 2 +- res/values-ko/strings.xml | 2 +- res/values-nl/strings.xml | 6 +++--- res/values-pl-watch/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- res/values-pt-rBR/strings.xml | 2 +- res/values-pt/strings.xml | 2 +- res/values-ru/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/res/values-da-television/strings.xml b/res/values-da-television/strings.xml index 63b9de88..5e28b62f 100644 --- a/res/values-da-television/strings.xml +++ b/res/values-da-television/strings.xml @@ -17,7 +17,7 @@ "Afvis, og spørg ikke igen" - "Du kan ændre dette på et senere tidspunkt i Indstillinger og apps" + "Du kan altid ændre dette i Indstillinger > Apps" "%1$s/%2$s" "Vis systemapps" diff --git a/res/values-es-watch/strings.xml b/res/values-es-watch/strings.xml index 19b956ac..6d0c8af8 100644 --- a/res/values-es-watch/strings.xml +++ b/res/values-es-watch/strings.xml @@ -20,6 +20,6 @@ "%1$s/%2$s" "Mostrar aplicaciones del sistema" "No se puede cambiar" - "HABILITADA" + "HABILITADO" "INHABILITADA" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 5d3cb8c1..27c509bb 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -16,7 +16,7 @@ - "Programme d\'installation de la trousse" + "Programme installation trousse" "Suivante" "Installer" "Terminé" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 17310e3e..d4bd8cf9 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -100,7 +100,7 @@ %1$d개 더보기 %1$d개 더보기 - "이 앱은 Android 이전 버전에 맞게 설계되었습니다. 권한이 거부되면 정상적으로 작동하지 않을 수 있습니다." + "이 앱은 Android 이전 버전에 맞게 설계되었습니다. 권한을 거부하면 정상적으로 작동하지 않을 수 있습니다." "알 수 없는 작업 수행" "%1$d/%2$d개 앱 허용됨" "시스템 표시" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a284f7fa..c2c3fe4b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -16,7 +16,7 @@ - "Installatieprogramma van pakket" + "Pakket-installatie" "Volgende" "Installeren" "Gereed" @@ -88,7 +88,7 @@ "Voor deze update zijn geen nieuwe machtigingen vereist." "Wilt u de volgende machtigingen verlenen? Hiermee kan toegang worden verkregen tot:" "Toestaan" - "Afwijzen" + "Weigeren" "%1$s van %2$s" "Toestaan dat %1$s het volgende doet: %2$s?" "Apps" @@ -109,7 +109,7 @@ "Geen apps" "Locatie-instellingen" "%1$s is een leverancier van locatieservices voor dit apparaat. Locatietoegang kan worden aangepast via de locatie-instellingen." - "Als u deze toestemming weigert, functioneren basisfuncties van je apparaat mogelijk niet meer zoals bedoeld." + "Als je deze toestemming weigert, kan het zijn dat basisfuncties van je apparaat niet meer werken zoals bedoeld." "Afgedwongen door beleid" "Laden…" "Alle rechten" diff --git a/res/values-pl-watch/strings.xml b/res/values-pl-watch/strings.xml index d721141c..2bf7d356 100644 --- a/res/values-pl-watch/strings.xml +++ b/res/values-pl-watch/strings.xml @@ -20,6 +20,6 @@ "%1$s / %2$s" "Pokaż aplikacje systemowe" "Nie można zmienić" - "WŁĄCZONE" + "WŁ." "WYŁĄCZONE" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 51b5bdbd..be271263 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -102,7 +102,7 @@ Jeszcze %1$d Jeszcze %1$d - "Ta aplikacja jest przeznaczona na straszą wersję Androida. Odmówienie uprawnień może spowodować, że przestanie ona działać w zamierzony sposób." + "Ta aplikacja jest na straszą wersję Androida. Jeśli odmówisz uprawnień, aplikacja może nie działać prawidłowo." "wykonywanie nieznanych działań" "Dozwolone: %1$d z %2$d aplikacji" "Pokaż systemowe" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 0eb08587..ad029b0d 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -73,7 +73,7 @@ "Desinstalando..." "Desinstalação concluída." "Desinstalação malsucedida." - "Não é possível desinstalar, pois este pacote é um admin. de dispositivos ativo." + "Não é possível desinstalar um administrador de dispositivos ativo." "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 0eb08587..ad029b0d 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -73,7 +73,7 @@ "Desinstalando..." "Desinstalação concluída." "Desinstalação malsucedida." - "Não é possível desinstalar, pois este pacote é um admin. de dispositivos ativo." + "Não é possível desinstalar um administrador de dispositivos ativo." "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 05450928..9cad9cab 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -16,7 +16,7 @@ - "Программа установки пакета" + "Установщик пакетов" "Далее" "Установить" "Готово" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index d2cb7aa7..08c9134b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -92,7 +92,7 @@ "第 %1$s 项权限(共 %2$s 项)" "要允许%1$s%2$s吗?" "应用" - "应用所需权限" + "应用访问授权" "不再询问" "没有权限" "其他权限" -- cgit v1.2.3 From 58045ad49af12b202b08a4f054a54e2774ca48f1 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Tue, 24 Nov 2015 11:52:03 -0800 Subject: Always have an icon The permission icon can be an external icon and thus might not exist. So, ensure we always have an icon for the permissions UI. Bug: 25602523 Change-Id: Ibdb1f296ff8c5f3664fe8056c8637844b580cce9 --- .../android/packageinstaller/permission/model/PermissionGroups.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/com/android/packageinstaller/permission/model/PermissionGroups.java b/src/com/android/packageinstaller/permission/model/PermissionGroups.java index 59eba856..c496e898 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionGroups.java +++ b/src/com/android/packageinstaller/permission/model/PermissionGroups.java @@ -212,11 +212,12 @@ public final class PermissionGroups implements LoaderCallbacks 0) { icon = Utils.loadDrawable(getContext().getPackageManager(), itemInfo.packageName, itemInfo.icon); - } else { + } + if (icon == null) { icon = getContext().getDrawable(R.drawable.ic_perm_device_info); } return icon; -- cgit v1.2.3 From 929b6dee0bbe37c45e483560793645d1390119be Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Tue, 12 Jan 2016 07:16:02 -0800 Subject: Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 26072029 Change-Id: Ifb7360caf6769e233a6cabadd2db4d6a0b7ce146 --- res/values-af-television/strings.xml | 23 ++++++ res/values-af-watch/strings.xml | 25 +++++++ res/values-af/strings.xml | 30 +++++++- res/values-am-television/strings.xml | 23 ++++++ res/values-am-watch/strings.xml | 25 +++++++ res/values-am/strings.xml | 30 +++++++- res/values-ar-television/strings.xml | 23 ++++++ res/values-ar-watch/strings.xml | 25 +++++++ res/values-ar/strings.xml | 36 ++++++++- res/values-az-rAZ-television/strings.xml | 23 ++++++ res/values-az-rAZ-watch/strings.xml | 25 +++++++ res/values-az-rAZ/strings.xml | 41 +++++++++++ res/values-bg-television/strings.xml | 23 ++++++ res/values-bg-watch/strings.xml | 25 +++++++ res/values-bg/strings.xml | 28 ++++++- res/values-bn-rBD-television/strings.xml | 23 ++++++ res/values-bn-rBD-watch/strings.xml | 25 +++++++ res/values-bn-rBD/strings.xml | 30 +++++++- res/values-ca-television/strings.xml | 23 ++++++ res/values-ca-watch/strings.xml | 25 +++++++ res/values-ca/strings.xml | 32 +++++++- res/values-cs-television/strings.xml | 23 ++++++ res/values-cs-watch/strings.xml | 25 +++++++ res/values-cs/strings.xml | 32 +++++++- res/values-da-television/strings.xml | 23 ++++++ res/values-da-watch/strings.xml | 25 +++++++ res/values-da/strings.xml | 30 +++++++- res/values-de-television/strings.xml | 23 ++++++ res/values-de-watch/strings.xml | 25 +++++++ res/values-de/strings.xml | 32 +++++++- res/values-el-television/strings.xml | 23 ++++++ res/values-el-watch/strings.xml | 25 +++++++ res/values-el/strings.xml | 30 +++++++- res/values-en-rAU-television/strings.xml | 23 ++++++ res/values-en-rAU-watch/strings.xml | 25 +++++++ res/values-en-rAU/strings.xml | 28 ++++++- res/values-en-rGB-television/strings.xml | 23 ++++++ res/values-en-rGB-watch/strings.xml | 25 +++++++ res/values-en-rGB/strings.xml | 28 ++++++- res/values-en-rIN-television/strings.xml | 23 ++++++ res/values-en-rIN-watch/strings.xml | 25 +++++++ res/values-en-rIN/strings.xml | 28 ++++++- res/values-es-rUS-television/strings.xml | 23 ++++++ res/values-es-rUS-watch/strings.xml | 25 +++++++ res/values-es-rUS/strings.xml | 28 ++++++- res/values-es-television/strings.xml | 23 ++++++ res/values-es-watch/strings.xml | 25 +++++++ res/values-es/strings.xml | 30 +++++++- res/values-et-rEE-television/strings.xml | 23 ++++++ res/values-et-rEE-watch/strings.xml | 25 +++++++ res/values-et-rEE/strings.xml | 30 +++++++- res/values-eu-rES-television/strings.xml | 23 ++++++ res/values-eu-rES-watch/strings.xml | 25 +++++++ res/values-eu-rES/strings.xml | 30 +++++++- res/values-fa-television/strings.xml | 23 ++++++ res/values-fa-watch/strings.xml | 25 +++++++ res/values-fa/strings.xml | 40 ++++++++-- res/values-fi-television/strings.xml | 23 ++++++ res/values-fi-watch/strings.xml | 25 +++++++ res/values-fi/strings.xml | 30 +++++++- res/values-fr-rCA-television/strings.xml | 23 ++++++ res/values-fr-rCA-watch/strings.xml | 25 +++++++ res/values-fr-rCA/strings.xml | 32 +++++++- res/values-fr-television/strings.xml | 23 ++++++ res/values-fr-watch/strings.xml | 25 +++++++ res/values-fr/strings.xml | 32 +++++++- res/values-gl-rES-television/strings.xml | 23 ++++++ res/values-gl-rES-watch/strings.xml | 25 +++++++ res/values-gl-rES/strings.xml | 30 +++++++- res/values-gu-rIN-television/strings.xml | 23 ++++++ res/values-gu-rIN-watch/strings.xml | 25 +++++++ res/values-gu-rIN/strings.xml | 34 ++++++++- res/values-hi-television/strings.xml | 23 ++++++ res/values-hi-watch/strings.xml | 25 +++++++ res/values-hi/strings.xml | 28 ++++++- res/values-hr-television/strings.xml | 23 ++++++ res/values-hr-watch/strings.xml | 25 +++++++ res/values-hr/strings.xml | 31 +++++++- res/values-hu-television/strings.xml | 23 ++++++ res/values-hu-watch/strings.xml | 25 +++++++ res/values-hu/strings.xml | 28 ++++++- res/values-hy-rAM-television/strings.xml | 23 ++++++ res/values-hy-rAM-watch/strings.xml | 25 +++++++ res/values-hy-rAM/strings.xml | 28 ++++++- res/values-in-television/strings.xml | 23 ++++++ res/values-in-watch/strings.xml | 25 +++++++ res/values-in/strings.xml | 28 ++++++- res/values-is-rIS-television/strings.xml | 23 ++++++ res/values-is-rIS-watch/strings.xml | 25 +++++++ res/values-is-rIS/strings.xml | 28 ++++++- res/values-it-television/strings.xml | 23 ++++++ res/values-it-watch/strings.xml | 25 +++++++ res/values-it/strings.xml | 28 ++++++- res/values-iw-television/strings.xml | 23 ++++++ res/values-iw-watch/strings.xml | 25 +++++++ res/values-iw/strings.xml | 34 ++++++++- res/values-ja-television/strings.xml | 23 ++++++ res/values-ja-watch/strings.xml | 25 +++++++ res/values-ja/strings.xml | 30 +++++++- res/values-ka-rGE-television/strings.xml | 23 ++++++ res/values-ka-rGE-watch/strings.xml | 25 +++++++ res/values-ka-rGE/strings.xml | 28 ++++++- res/values-kk-rKZ-television/strings.xml | 23 ++++++ res/values-kk-rKZ-watch/strings.xml | 25 +++++++ res/values-kk-rKZ/strings.xml | 32 +++++++- res/values-km-rKH-television/strings.xml | 23 ++++++ res/values-km-rKH-watch/strings.xml | 25 +++++++ res/values-km-rKH/strings.xml | 28 ++++++- res/values-kn-rIN-television/strings.xml | 23 ++++++ res/values-kn-rIN-watch/strings.xml | 25 +++++++ res/values-kn-rIN/strings.xml | 38 ++++++++-- res/values-ko-television/strings.xml | 23 ++++++ res/values-ko-watch/strings.xml | 25 +++++++ res/values-ko/strings.xml | 30 +++++++- res/values-ky-rKG-television/strings.xml | 23 ++++++ res/values-ky-rKG-watch/strings.xml | 25 +++++++ res/values-ky-rKG/strings.xml | 84 +++++++++++---------- res/values-lo-rLA-television/strings.xml | 23 ++++++ res/values-lo-rLA-watch/strings.xml | 25 +++++++ res/values-lo-rLA/strings.xml | 28 ++++++- res/values-lt-television/strings.xml | 23 ++++++ res/values-lt-watch/strings.xml | 25 +++++++ res/values-lt/strings.xml | 30 +++++++- res/values-lv-television/strings.xml | 23 ++++++ res/values-lv-watch/strings.xml | 25 +++++++ res/values-lv/strings.xml | 29 +++++++- res/values-mk-rMK-television/strings.xml | 23 ++++++ res/values-mk-rMK-watch/strings.xml | 25 +++++++ res/values-mk-rMK/strings.xml | 30 +++++++- res/values-ml-rIN-television/strings.xml | 23 ++++++ res/values-ml-rIN-watch/strings.xml | 25 +++++++ res/values-ml-rIN/strings.xml | 32 +++++++- res/values-mn-rMN-television/strings.xml | 23 ++++++ res/values-mn-rMN-watch/strings.xml | 25 +++++++ res/values-mn-rMN/strings.xml | 28 ++++++- res/values-mr-rIN-television/strings.xml | 23 ++++++ res/values-mr-rIN-watch/strings.xml | 25 +++++++ res/values-mr-rIN/strings.xml | 28 ++++++- res/values-ms-rMY-television/strings.xml | 23 ++++++ res/values-ms-rMY-watch/strings.xml | 25 +++++++ res/values-ms-rMY/strings.xml | 28 ++++++- res/values-my-rMM-television/strings.xml | 23 ++++++ res/values-my-rMM-watch/strings.xml | 25 +++++++ res/values-my-rMM/strings.xml | 30 +++++++- res/values-nb-television/strings.xml | 23 ++++++ res/values-nb-watch/strings.xml | 25 +++++++ res/values-nb/strings.xml | 28 ++++++- res/values-ne-rNP-television/strings.xml | 23 ++++++ res/values-ne-rNP-watch/strings.xml | 25 +++++++ res/values-ne-rNP/strings.xml | 34 ++++++++- res/values-nl-television/strings.xml | 23 ++++++ res/values-nl-watch/strings.xml | 25 +++++++ res/values-nl/strings.xml | 68 +++++++++++------ res/values-pa-rIN-television/strings.xml | 23 ++++++ res/values-pa-rIN-watch/strings.xml | 25 +++++++ res/values-pa-rIN/strings.xml | 28 ++++++- res/values-pl-television/strings.xml | 23 ++++++ res/values-pl-watch/strings.xml | 25 +++++++ res/values-pl/strings.xml | 30 +++++++- res/values-pt-rBR-television/strings.xml | 23 ++++++ res/values-pt-rBR-watch/strings.xml | 25 +++++++ res/values-pt-rBR/strings.xml | 123 +++++++++++++++++++++++++++++++ res/values-pt-rPT-television/strings.xml | 23 ++++++ res/values-pt-rPT-watch/strings.xml | 25 +++++++ res/values-pt-rPT/strings.xml | 30 +++++++- res/values-pt-television/strings.xml | 23 ++++++ res/values-pt-watch/strings.xml | 25 +++++++ res/values-pt/strings.xml | 32 +++++++- res/values-ro-television/strings.xml | 23 ++++++ res/values-ro-watch/strings.xml | 25 +++++++ res/values-ro/strings.xml | 59 +++++++++++---- res/values-ru-television/strings.xml | 23 ++++++ res/values-ru-watch/strings.xml | 25 +++++++ res/values-ru/strings.xml | 36 ++++++++- res/values-si-rLK-television/strings.xml | 23 ++++++ res/values-si-rLK-watch/strings.xml | 25 +++++++ res/values-si-rLK/strings.xml | 30 +++++++- res/values-sk-television/strings.xml | 23 ++++++ res/values-sk-watch/strings.xml | 25 +++++++ res/values-sk/strings.xml | 32 +++++++- res/values-sl-television/strings.xml | 23 ++++++ res/values-sl-watch/strings.xml | 25 +++++++ res/values-sl/strings.xml | 32 +++++++- res/values-sq-rAL-television/strings.xml | 23 ++++++ res/values-sq-rAL-watch/strings.xml | 25 +++++++ res/values-sq-rAL/strings.xml | 36 +++++++-- res/values-sr-television/strings.xml | 23 ++++++ res/values-sr-watch/strings.xml | 25 +++++++ res/values-sr/strings.xml | 31 +++++++- res/values-sv-television/strings.xml | 23 ++++++ res/values-sv-watch/strings.xml | 25 +++++++ res/values-sv/strings.xml | 34 ++++++++- res/values-sw-television/strings.xml | 23 ++++++ res/values-sw-watch/strings.xml | 25 +++++++ res/values-sw/strings.xml | 30 +++++++- res/values-ta-rIN-television/strings.xml | 23 ++++++ res/values-ta-rIN-watch/strings.xml | 25 +++++++ res/values-ta-rIN/strings.xml | 28 ++++++- res/values-te-rIN-television/strings.xml | 23 ++++++ res/values-te-rIN-watch/strings.xml | 25 +++++++ res/values-te-rIN/strings.xml | 30 +++++++- res/values-th-television/strings.xml | 23 ++++++ res/values-th-watch/strings.xml | 25 +++++++ res/values-th/strings.xml | 28 ++++++- res/values-tl-television/strings.xml | 23 ++++++ res/values-tl-watch/strings.xml | 25 +++++++ res/values-tl/strings.xml | 28 ++++++- res/values-tr-television/strings.xml | 23 ++++++ res/values-tr-watch/strings.xml | 25 +++++++ res/values-tr/strings.xml | 28 ++++++- res/values-uk-television/strings.xml | 23 ++++++ res/values-uk-watch/strings.xml | 25 +++++++ res/values-uk/strings.xml | 32 +++++++- res/values-ur-rPK-television/strings.xml | 23 ++++++ res/values-ur-rPK-watch/strings.xml | 25 +++++++ res/values-ur-rPK/strings.xml | 30 +++++++- res/values-uz-rUZ-television/strings.xml | 23 ++++++ res/values-uz-rUZ-watch/strings.xml | 25 +++++++ res/values-uz-rUZ/strings.xml | 32 +++++++- res/values-vi-television/strings.xml | 23 ++++++ res/values-vi-watch/strings.xml | 25 +++++++ res/values-vi/strings.xml | 32 +++++++- res/values-zh-rCN-television/strings.xml | 23 ++++++ res/values-zh-rCN-watch/strings.xml | 25 +++++++ res/values-zh-rCN/strings.xml | 30 +++++++- res/values-zh-rHK-television/strings.xml | 23 ++++++ res/values-zh-rHK-watch/strings.xml | 25 +++++++ res/values-zh-rHK/strings.xml | 28 ++++++- res/values-zh-rTW-television/strings.xml | 23 ++++++ res/values-zh-rTW-watch/strings.xml | 25 +++++++ res/values-zh-rTW/strings.xml | 30 +++++++- res/values-zu-television/strings.xml | 23 ++++++ res/values-zu-watch/strings.xml | 25 +++++++ res/values-zu/strings.xml | 28 ++++++- 234 files changed, 6114 insertions(+), 224 deletions(-) create mode 100644 res/values-af-television/strings.xml create mode 100644 res/values-af-watch/strings.xml create mode 100644 res/values-am-television/strings.xml create mode 100644 res/values-am-watch/strings.xml create mode 100644 res/values-ar-television/strings.xml create mode 100644 res/values-ar-watch/strings.xml create mode 100644 res/values-az-rAZ-television/strings.xml create mode 100644 res/values-az-rAZ-watch/strings.xml create mode 100644 res/values-bg-television/strings.xml create mode 100644 res/values-bg-watch/strings.xml create mode 100644 res/values-bn-rBD-television/strings.xml create mode 100644 res/values-bn-rBD-watch/strings.xml create mode 100644 res/values-ca-television/strings.xml create mode 100644 res/values-ca-watch/strings.xml create mode 100644 res/values-cs-television/strings.xml create mode 100644 res/values-cs-watch/strings.xml create mode 100644 res/values-da-television/strings.xml create mode 100644 res/values-da-watch/strings.xml create mode 100644 res/values-de-television/strings.xml create mode 100644 res/values-de-watch/strings.xml create mode 100644 res/values-el-television/strings.xml create mode 100644 res/values-el-watch/strings.xml create mode 100644 res/values-en-rAU-television/strings.xml create mode 100644 res/values-en-rAU-watch/strings.xml create mode 100644 res/values-en-rGB-television/strings.xml create mode 100644 res/values-en-rGB-watch/strings.xml create mode 100644 res/values-en-rIN-television/strings.xml create mode 100644 res/values-en-rIN-watch/strings.xml create mode 100644 res/values-es-rUS-television/strings.xml create mode 100644 res/values-es-rUS-watch/strings.xml create mode 100644 res/values-es-television/strings.xml create mode 100644 res/values-es-watch/strings.xml create mode 100644 res/values-et-rEE-television/strings.xml create mode 100644 res/values-et-rEE-watch/strings.xml create mode 100644 res/values-eu-rES-television/strings.xml create mode 100644 res/values-eu-rES-watch/strings.xml create mode 100644 res/values-fa-television/strings.xml create mode 100644 res/values-fa-watch/strings.xml create mode 100644 res/values-fi-television/strings.xml create mode 100644 res/values-fi-watch/strings.xml create mode 100644 res/values-fr-rCA-television/strings.xml create mode 100644 res/values-fr-rCA-watch/strings.xml create mode 100644 res/values-fr-television/strings.xml create mode 100644 res/values-fr-watch/strings.xml create mode 100644 res/values-gl-rES-television/strings.xml create mode 100644 res/values-gl-rES-watch/strings.xml create mode 100644 res/values-gu-rIN-television/strings.xml create mode 100644 res/values-gu-rIN-watch/strings.xml create mode 100644 res/values-hi-television/strings.xml create mode 100644 res/values-hi-watch/strings.xml create mode 100644 res/values-hr-television/strings.xml create mode 100644 res/values-hr-watch/strings.xml create mode 100644 res/values-hu-television/strings.xml create mode 100644 res/values-hu-watch/strings.xml create mode 100644 res/values-hy-rAM-television/strings.xml create mode 100644 res/values-hy-rAM-watch/strings.xml create mode 100644 res/values-in-television/strings.xml create mode 100644 res/values-in-watch/strings.xml create mode 100644 res/values-is-rIS-television/strings.xml create mode 100644 res/values-is-rIS-watch/strings.xml create mode 100644 res/values-it-television/strings.xml create mode 100644 res/values-it-watch/strings.xml create mode 100644 res/values-iw-television/strings.xml create mode 100644 res/values-iw-watch/strings.xml create mode 100644 res/values-ja-television/strings.xml create mode 100644 res/values-ja-watch/strings.xml create mode 100644 res/values-ka-rGE-television/strings.xml create mode 100644 res/values-ka-rGE-watch/strings.xml create mode 100644 res/values-kk-rKZ-television/strings.xml create mode 100644 res/values-kk-rKZ-watch/strings.xml create mode 100644 res/values-km-rKH-television/strings.xml create mode 100644 res/values-km-rKH-watch/strings.xml create mode 100644 res/values-kn-rIN-television/strings.xml create mode 100644 res/values-kn-rIN-watch/strings.xml create mode 100644 res/values-ko-television/strings.xml create mode 100644 res/values-ko-watch/strings.xml create mode 100644 res/values-ky-rKG-television/strings.xml create mode 100644 res/values-ky-rKG-watch/strings.xml create mode 100644 res/values-lo-rLA-television/strings.xml create mode 100644 res/values-lo-rLA-watch/strings.xml create mode 100644 res/values-lt-television/strings.xml create mode 100644 res/values-lt-watch/strings.xml create mode 100644 res/values-lv-television/strings.xml create mode 100644 res/values-lv-watch/strings.xml create mode 100644 res/values-mk-rMK-television/strings.xml create mode 100644 res/values-mk-rMK-watch/strings.xml create mode 100644 res/values-ml-rIN-television/strings.xml create mode 100644 res/values-ml-rIN-watch/strings.xml create mode 100644 res/values-mn-rMN-television/strings.xml create mode 100644 res/values-mn-rMN-watch/strings.xml create mode 100644 res/values-mr-rIN-television/strings.xml create mode 100644 res/values-mr-rIN-watch/strings.xml create mode 100644 res/values-ms-rMY-television/strings.xml create mode 100644 res/values-ms-rMY-watch/strings.xml create mode 100644 res/values-my-rMM-television/strings.xml create mode 100644 res/values-my-rMM-watch/strings.xml create mode 100644 res/values-nb-television/strings.xml create mode 100644 res/values-nb-watch/strings.xml create mode 100644 res/values-ne-rNP-television/strings.xml create mode 100644 res/values-ne-rNP-watch/strings.xml create mode 100644 res/values-nl-television/strings.xml create mode 100644 res/values-nl-watch/strings.xml create mode 100644 res/values-pa-rIN-television/strings.xml create mode 100644 res/values-pa-rIN-watch/strings.xml create mode 100644 res/values-pl-television/strings.xml create mode 100644 res/values-pl-watch/strings.xml create mode 100644 res/values-pt-rBR-television/strings.xml create mode 100644 res/values-pt-rBR-watch/strings.xml create mode 100644 res/values-pt-rBR/strings.xml create mode 100644 res/values-pt-rPT-television/strings.xml create mode 100644 res/values-pt-rPT-watch/strings.xml create mode 100644 res/values-pt-television/strings.xml create mode 100644 res/values-pt-watch/strings.xml create mode 100644 res/values-ro-television/strings.xml create mode 100644 res/values-ro-watch/strings.xml create mode 100644 res/values-ru-television/strings.xml create mode 100644 res/values-ru-watch/strings.xml create mode 100644 res/values-si-rLK-television/strings.xml create mode 100644 res/values-si-rLK-watch/strings.xml create mode 100644 res/values-sk-television/strings.xml create mode 100644 res/values-sk-watch/strings.xml create mode 100644 res/values-sl-television/strings.xml create mode 100644 res/values-sl-watch/strings.xml create mode 100644 res/values-sq-rAL-television/strings.xml create mode 100644 res/values-sq-rAL-watch/strings.xml create mode 100644 res/values-sr-television/strings.xml create mode 100644 res/values-sr-watch/strings.xml create mode 100644 res/values-sv-television/strings.xml create mode 100644 res/values-sv-watch/strings.xml create mode 100644 res/values-sw-television/strings.xml create mode 100644 res/values-sw-watch/strings.xml create mode 100644 res/values-ta-rIN-television/strings.xml create mode 100644 res/values-ta-rIN-watch/strings.xml create mode 100644 res/values-te-rIN-television/strings.xml create mode 100644 res/values-te-rIN-watch/strings.xml create mode 100644 res/values-th-television/strings.xml create mode 100644 res/values-th-watch/strings.xml create mode 100644 res/values-tl-television/strings.xml create mode 100644 res/values-tl-watch/strings.xml create mode 100644 res/values-tr-television/strings.xml create mode 100644 res/values-tr-watch/strings.xml create mode 100644 res/values-uk-television/strings.xml create mode 100644 res/values-uk-watch/strings.xml create mode 100644 res/values-ur-rPK-television/strings.xml create mode 100644 res/values-ur-rPK-watch/strings.xml create mode 100644 res/values-uz-rUZ-television/strings.xml create mode 100644 res/values-uz-rUZ-watch/strings.xml create mode 100644 res/values-vi-television/strings.xml create mode 100644 res/values-vi-watch/strings.xml create mode 100644 res/values-zh-rCN-television/strings.xml create mode 100644 res/values-zh-rCN-watch/strings.xml create mode 100644 res/values-zh-rHK-television/strings.xml create mode 100644 res/values-zh-rHK-watch/strings.xml create mode 100644 res/values-zh-rTW-television/strings.xml create mode 100644 res/values-zh-rTW-watch/strings.xml create mode 100644 res/values-zu-television/strings.xml create mode 100644 res/values-zu-watch/strings.xml diff --git a/res/values-af-television/strings.xml b/res/values-af-television/strings.xml new file mode 100644 index 00000000..9b4b6238 --- /dev/null +++ b/res/values-af-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Weier en moenie weer vra nie" + "Jy kan dit later verander in Instellings > Programme" + "%1$s / %2$s" + "Wys stelselprogramme" + diff --git a/res/values-af-watch/strings.xml b/res/values-af-watch/strings.xml new file mode 100644 index 00000000..c32ca2b1 --- /dev/null +++ b/res/values-af-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Weier; moenie weer vra nie" + "%1$s / %2$s" + "Wys stelselprogramme" + "Onveranderbaar" + "GEAKTIVEER" + "GEDEAKTIVEER" + diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 50474600..635c28b3 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -75,7 +75,7 @@ "Deïnstallasie onsuksesvol." "Kan nie deïnstalleer nie omdat hierdie pakket \'n aktiewe toesteladministrateur is." "Kan nie deïnstalleer nie, omdat hierdie pakket \'n aktiewe toesteladministrateur vir die gebruiker %1$s is." - "Hierdie program is nodig vir jou %1$s-profiel en kan nie gedeïnstalleer word nie." + "Hierdie program is nodig vir jou werkprofiel en kan nie gedeïnstalleer word nie." "Jou toesteladministrateur vereis die program; dit kan nie deïnstalleer word nie." "Bestuur toesteladministrateurs" "%1$s kon nie deïnstalleer word nie." @@ -90,8 +90,34 @@ "Laat toe" "Weier" "%1$s van %2$s" - "Laat %1$s toe om te %2$s?" + "Laat %1$s toe om %2$s?" + "Programme" "Programtoestemmings" "Moet nooit weer vra nie" "Geen toestemmings nie" + "Bykomende toestemmings" + + Nog %1$d + Nog %1$d + + "Hierdie program is vir \'n ouer weergawe van Android ontwerp. As toestemming geweier word, kan dit veroorsaak dat dit nie meer soos beplan funksioneer nie." + "voer \'n onbekende handeling uit" + "%1$d uit %2$d programme toegelaat" + "Wys stelsel" + "Versteek stelsel" + "%1$s-toestemmings" + "Geen programme nie" + "Ligginginstellings" + "%1$s is \'n verskaffer van liggingdienste vir hierdie toestel. Liggingtoegang kan vanuit ligginginstellings verander word." + "As jy hierdie toestemming weier, sal basiese kenmerke van jou toestel dalk nie meer soos bedoel werk nie." + "Afgedwing deur beleid" + "Laai tans …" + "Alle toestemmings" + "Ander programvermoëns" + "Toestemmingsversoek" + "Skermoorlegger bespeur" + "Om hierdie toestemminginstelling te verander, moet jy eers die skermoorlegger by Instellings > Programme afskakel" + "Maak instellings oop" + "Android Wear" + "Installeer- en deïnstalleerhandelinge word nie in Wear gesteun nie." diff --git a/res/values-am-television/strings.xml b/res/values-am-television/strings.xml new file mode 100644 index 00000000..5beefbce --- /dev/null +++ b/res/values-am-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "አይቀበሉና እንደገና ይጠይቁ" + "ይሄንን በኋላ ላይ በቅንብሮችና መተግበሪያዎች ውስጥ ሊቀይሩት ይችላሉ" + "%1$s / %2$s" + "የስርዓት መተግበሪያዎችን አሳይ" + diff --git a/res/values-am-watch/strings.xml b/res/values-am-watch/strings.xml new file mode 100644 index 00000000..73397e34 --- /dev/null +++ b/res/values-am-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ከልክል፣ ዳግም አትጠይቅ" + "%1$s / %2$s" + "የስርዓት መተግበሪያዎችን አሳይ" + "ሊለወጥ አይችልም" + "ነቅቷል" + "ተሰናክሏል" + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3030b13f..0b0396fa 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -75,7 +75,7 @@ "ማራገፍ አልተሳካም፡፡" "ማራገፍ አልተቻለም፡ ይህ ፓኬጅ የገባሪ መሣሪያ አስተዳዳሪ ነው።" "ይህ ጥቅል የተጠቃሚ %1$s ገቢር መሣሪያ አስተዳዳሪ ስለሆነ ማራገፍ አይቻልም።" - "ይህ መተግበሪያ ለ%1$s መገለጫዎ የሚያስፈልግና ሊራገፍ የማይችል ነው።" + "ይህ መተግበሪያ ለስራ መገለጫዎ የሚያስፈልግ ሲሆን ሊራገፍ አይችልም።" "ይህ መተግበሪያ በመሣሪያዎ አስተዳዳሪ የሚፈለግ እና ሊራገፍ የማይችል ነው።" "የመሣሪያ አስተዳዳሪዎችን አደራጅ" "%1$sማራገፍ አልተቻለም" @@ -90,8 +90,34 @@ "ፍቀድ" "ከልክል" "%1$s%2$s" - "%1$s %2$s እንዲያደርግ ይፈቀድለት?" + "%1$s መተግበሪያ %2$s እንዲያደርግ ይፈቀድለት?" + "መተግበሪያዎች" "የመተግበሪያ ፈቃዶች" "ሁለተኛ እንዳትጠይቅ" "ምንም ፍቃዶች የሉም" + "ተጨማሪ ፈቃዶች" + + %1$d ተጨማሪ + %1$d ተጨማሪ + + "ይህ መተግበሪያ ለAndroid አሮጌ ስሪት የተነደፈ ነበር። ፈቃድ መከልከል እንደሚፈለገው ከእንግዲህ እንዳይሰራ ሊያደርገው ይችላል።" + "ያልታወቀ እርምጃ ያከናውናል" + "%1$d%2$d መተግበሪያዎች ተፈቅዶላቸዋል" + "ስርዓትን አሳይ" + "ስርዓትን ደብቅ" + "%1$s ፍቃዶች" + "ምንም መተግበሪያዎች የሉም" + "የአካባቢ ቅንብሮች" + "%1$s የዚህ መሳሪያ አካባቢ አገልግሎቶች አቅራቢ ነው። የአካባቢ መዳረሻ ከአካባቢ ቅንብሮች ሊሻሻል ይችላል።" + "ይህን ፍቃድ ከከለከሉ የመሳሪያዎ መሰረታዊ ባህሪያት ከዚህ በኋላ እንደተፈለገው ላይሰሩ ይችላሉ።" + "በመመሪያ ተፈጻሚ የሆነ" + "በመጫን ላይ…" + "ሁሉም ፍቃዶች" + "ሌሎች የመተግበሪያ ችሎታዎች" + "የፍቃድ ጥያቄ" + "የማያ ገጽ ተደራቢ ተገኝቷል" + "ይህን የፍቃድ ቅንብር ለመቀየር መጀመሪያ የማያ ገጽ ተደራቢውን ከቅንብሮች > መተግበሪያዎች ማጥፋት አለብዎ" + "ቅንብሮችን ክፈት" + "Android Wear" + "በWear ላይ የመጫን/ማራገፍ እርምጃዎች አይደገፉም።" diff --git a/res/values-ar-television/strings.xml b/res/values-ar-television/strings.xml new file mode 100644 index 00000000..98a9d8fa --- /dev/null +++ b/res/values-ar-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "رفض وعدم طرح السؤال مرة أخرى" + "‏يمكنك تغيير ذلك لاحقًا من خلال الإعدادات > التطبيقات" + "%1$s / %2$s" + "عرض تطبيقات النظام" + diff --git a/res/values-ar-watch/strings.xml b/res/values-ar-watch/strings.xml new file mode 100644 index 00000000..144f7868 --- /dev/null +++ b/res/values-ar-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "الرفض وعدم السؤال مرة أخرى" + "%1$s / %2$s" + "عرض تطبيقات النظام" + "لا يمكن التغيير" + "ممكّن" + "معطّل" + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 9a0a03bb..788cd44b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -63,7 +63,7 @@ "موافق" "لم يتم العثور على التطبيق" "لم يتم العثور على التطبيق في قائمة التطبيقات المثبتة." - "إزالة التطبيق" + "إلغاء تثبيت التطبيق" "إزالة التحديث" "%1$s هو جزء من التطبيق التالي:" "هل تريد إزالة هذا التطبيق؟" @@ -72,10 +72,10 @@ "هل تريد استبدال هذا التطبيق بإصدار المصنع؟" "جارٍ الإزالة..." "انتهت الإزالة." - "أخفقت الإزالة." + "أخفق إلغاء التثبيت." "تتعذر الإزالة نظرًا لأن هذه الحزمة تمثل مشرفًا نشطًا للجهاز." "لا يمكن الإزالة لأن هذه الحزمة تعد مشرف جهاز نشطًا للمستخدم %1$s." - "هذا التطبيق مطلوب لملفك الشخصي في %1$s ولا يمكن إزالته." + "هذا التطبيق مطلوب لملفك الشخصي للعمل ولا يمكن إزالته." "مشرف الجهاز يحتاج إلى هذا التطبيق ولا يمكن إزالته." "إدارة مشرفي الجهاز" "تعذرت إزالة %1$s." @@ -91,7 +91,37 @@ "رفض" "%1$s من %2$s" "هل تريد السماح لتطبيق %1$s بإجراء %2$s؟" + "التطبيقات" "أذونات التطبيق" "عدم السؤال مرة أخرى" "ليست هناك أذونات" + "أذونات إضافية" + + %1$dلا أذونات أخرى + إذنان آخران (%1$d) + %1$d أذونات أخرى + %1$d إذنًا آخر + %1$d من الأذونات الأخرى + %1$dإذن واحد آخر + + "‏تم تصميم هذا التطبيق لإصدار قديم من Android. وقد يؤدي رفض الإذن إلى عدم العمل على النحو المطلوب مرة أخرى." + "تنفيذ إجراء غير معروف" + "تم السماح لعدد %1$d من %2$d من التطبيقات" + "إظهار النظام" + "إخفاء النظام" + "أذونات %1$s" + "ليس هناك أي تطبيقات" + "إعدادات الموقع" + "يعد %1$s أحد مقدمي خدمات الموقع لهذا الجهاز. يمكن تعديل إمكانية الوصول إلى الموقع من إعدادات الموقع." + "إذا رفضت هذا الإذن، ربما لا تعمل ميزات أساسية في جهازك على النحو المنشود." + "فرضته إحدى السياسات" + "جارٍ التحميل..." + "كل الأذونات" + "إمكانات التطبيق الأخرى" + "طلب الإذن" + "تم اكتشاف طبقة متراكبة للشاشة" + "لتغيير إعداد هذا الإذن، يتعين عليك أولاً تعطيل الطبقة المتراكبة للشاشة من الإعدادات > التطبيقات" + "فتح الإعدادات" + "Android Wear" + "‏لا تتوافق إجراءات التثبيت/إلغاء التثبيت مع Wear." diff --git a/res/values-az-rAZ-television/strings.xml b/res/values-az-rAZ-television/strings.xml new file mode 100644 index 00000000..09bd6a9d --- /dev/null +++ b/res/values-az-rAZ-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Rədd edin və daha soruşmayın" + "Bunu sonra Ayarlar vəTətbiqlər bölməsindən dəyişə bilərsiniz" + "%1$s / %2$s" + "Sistem tətbiqlərini göstərin" + diff --git a/res/values-az-rAZ-watch/strings.xml b/res/values-az-rAZ-watch/strings.xml new file mode 100644 index 00000000..5d28398e --- /dev/null +++ b/res/values-az-rAZ-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Rədd edin, bir daha soruşmayın" + "%1$s / %2$s" + "Sistem tətbiqlərini göstərin" + "Dəyişdirilə bilməz" + "AKTİV" + "DEAKTİV" + diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index da15fb67..d1c9e238 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -36,16 +36,20 @@ "Ziddiyyətli imzaya malik eyni adlı cari paket artıq quraşdırılıb." "Bu paket yalnız yeni Android versiyasında işləyir." "Bu tətbiq planşetinizə uyğun deyil." + "Bu proqram TV-nizlə uyğun gəlmir." "Bu tətbiq telefonunuza uyğun deyil." "Göstərilən paket quraşdırılma tamamlanmadan silindi." "Paket yoxlamanı keçə bilmədi və quraşdırılmadı." "Paketi yoxlayarkən uzun fasilə oldu. Quraşdırmanı daha sonra bir daha yoxlayın." "%1$s planşetinizə yüklənə bilmədi." + "%1$s proqramını TV-nizdə quraşdırmaq mümkün olmadı." "%1$s telefonunuza quraşdırıla bilmədi." "Aç" "Quraşdırılma blok edilib" "Təhlükəsizlik məqsədilə planşetiniz naməlum mənbələrdən əldə edilmiş tətbiq quraşdırılmasının qarşısını alıb." + "Təhlükəsizlik üçün TV-niz naməlum mənbələrdən əldə olunan proqramların quraşdırılmasını bloklamağa təyin olunub." "Təhlükəsizlik məqsədilə telefonunuz naməlum mənbələrdən əldə edilmiş tətbiq quraşdırılmasının qarşısını alıb." + "Naməlum mənbələrdən əldə edilmiş tətbiqlərin quraşdırılmasına administrator icazə vermir." "OK" "Ayarlar" "Tətbiqlər üçün yeni mənbə" @@ -64,11 +68,15 @@ "%1$s bu tətbiqin hissəsidir:" "Bu tətbiqi aradan qaldırmaq istəyirsiniz mi?" "Bu tətbiqi ""bütün"" istifadəçilər üçün silmək istəyirsiz? Tətbiq və onun datası cihazdakı ""bütün"" istifadəçilər üçün silinəcək." + "%1$s adlı istifadəçi üçün bu tətbiqi sistemdən silmək istəyirsiniz?" "Bu tətbiqi zavod versiyası ilə dəyişdirmək istəyirsiniz?" "Silinir..." "Sistemdən silmə tamamlandı." "Aradan qaldırılma uğursuz oldu." "Bu paket aktiv cihaz administratoru olduğu üçün aradan qaldırıla bilməz." + "Quraşdırılmışı ləğv etmək mümkün deyil, çünki bu paket %1$s adlı istifadəçi üçün aktiv cihaz inzibatçısıdır." + "Bu app iş profil üçün tələb olunur və silindi bilməz." + "Bu tətbiq cihaz administratoru tərəfindən tələb olunur və sistemdən silinə bilməz." "Cihaz administratorlarını idarə edin" "%1$s sistemdən silinə bilməz." "Təhlil xətası" @@ -79,4 +87,37 @@ "Qurğu icazəsi" "Bu güncəlləmə heç bir yeni izn tələb etmir." "Aşağıdakı icazələri vermək istəyirsiz? Əldə ediləcək çıxışlar:" + "İcazə verin" + "Rədd edin" + "%2$s icazədən %1$s ədəd" + "%1$s tətbiqinə %2$s üçün icazə verilsin?" + "Tətbiqlər" + "Tətbiq icazələri" + "Bir daha soruşma" + "İcazə yoxdur" + "Əlavə icazələr" + + daha %1$d + daha %1$d + + "Bu tətbiq köhnə Android versiyası üçün nəzərdə tutulub. İcazəni rədd etmək onun lazımi şəkildə işləməməsinə səbəb ola bilər." + "naməlum əməliyyat etmək" + "%2$d tətbiqdən %1$d ədədinə icazə var" + "Sistemi göstərin" + "Sistemi gizlədin" + "%1$s icazələr" + "Tətbiq yoxdur" + "Məkan Ayarları" + "%1$s bu cihaz üçün məkan xidmətləri təminatçısıdır. Məkana giriş məkan ayarlarından dəyişdirilə bilər." + "Bu icazəni rədd etsəniz, cihazınızın əsas funksiyaları lazımi qaydada işləməyə bilər." + "Siyasət tərəfindən tətbiq olunur" + "Yüklənir…" + "Bütün icazələr" + "Digər tətbiq imkanları" + "İcazə sorğusu" + "Ekran örtüyü aşkarlandı" + "Bu icazə ayarını dəyişdirmək üçün əvvəldə Ayarlar və Tətbiqlər bölməsindən ekran örtüyünü söndürməlisiniz" + "Ayarları açın" + "Android Wear" + "Yükləmə/Silmə fəaliyyətləri Wear\'də dəstəklənmir." diff --git a/res/values-bg-television/strings.xml b/res/values-bg-television/strings.xml new file mode 100644 index 00000000..c69acb23 --- /dev/null +++ b/res/values-bg-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Отказване, без повторно запитване" + "Можете да промените това по-късно от „Настройки“ > „Приложения“" + "%1$s/%2$s" + "Показване на системните приложения" + diff --git a/res/values-bg-watch/strings.xml b/res/values-bg-watch/strings.xml new file mode 100644 index 00000000..af81f2a8 --- /dev/null +++ b/res/values-bg-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Отказ, без повторно запитване" + "%1$s/%2$s" + "Показване на системните приложения" + "Без промяна" + "АКТИВИРАНО" + "ДЕАКТИВИРАНО" + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 2cb1ccba..74d29a98 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -75,7 +75,7 @@ "Деинсталирането не бе успешно." "Не може да се деинсталира: Този пакет е активен администратор на устройството." "Не може да се деинст., защото пакетът е акт. мениджър на у-ва за потребителя %1$s." - "Приложението е необходимо за потр. ви профил %1$s и не може да се деинсталира." + "Приложението е нужно за служебния ви потр. профил и не може да се деинсталира." "Приложението се изисква от администратора на у-вото и не може да се деинсталира." "Управление на администраторите на устройства" "%1$s не можа да се деинсталира." @@ -91,7 +91,33 @@ "Отказване" "%1$s от %2$s" "Ще разрешите ли на %1$s да %2$s?" + "Приложения" "Разрешения за приложения" "Никога вече да не се извежда запитване" "Няма разрешения" + "Допълнителни разрешения" + + Още %1$d + Още %1$d + + "Това приложение е създадено за по-стара версия на Android. То може да спре да функционира нормално при отказване на разрешението." + "извършване на неизвестно действие" + "%1$d от %2$d приложения имат разрешение" + "Показване на системните" + "Скриване на системните" + "Разрешения за %1$s" + "Няма приложения" + "Настройки за местоположението" + "%1$s е доставчик на услуги за местоположението за това устройство. Достъпът до местоположението може да бъде променен от съответните настройки." + "Ако откажете това разрешение, основни функции на устройството ви може да спрат да работят както трябва." + "Наложено чрез правило" + "Зарежда се…" + "Всички разрешения" + "Други възможности на приложението" + "Заявка за разрешение" + "Открито е екранно наслагване" + "За да промените настройката за това разрешение, трябва първо да изключите екранното наслагване от „Настройки“ > „Приложения“" + "Отваряне на настройките" + "Android Wear" + "Действията инсталиране и деинсталиране не се поддържат на устройства с Wear." diff --git a/res/values-bn-rBD-television/strings.xml b/res/values-bn-rBD-television/strings.xml new file mode 100644 index 00000000..47b3e0ac --- /dev/null +++ b/res/values-bn-rBD-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "অস্বীকার করুন এবং আবার জিজ্ঞাসা করবেন না" + "আপনি সেটিংস > অ্যাপ্লিকেশান এ এটি পরে পরিবর্তন করতে পারেন" + "%1$s / %2$s" + "সিস্টেম অ্যাপ্লিকেশানগুলি দেখান" + diff --git a/res/values-bn-rBD-watch/strings.xml b/res/values-bn-rBD-watch/strings.xml new file mode 100644 index 00000000..d642be1c --- /dev/null +++ b/res/values-bn-rBD-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "অস্বীকার করুন, আবার জিজ্ঞাসা করবেন না" + "%1$s / %2$s" + "সিস্টেম অ্যাপ্লিকেশানগুলি দেখান" + "পরিবর্তন করা যাবে না" + "সক্ষম করা রয়েছে" + "অক্ষম করা রয়েছে" + diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 39e61c13..ce13ce54 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -75,7 +75,7 @@ "আনইনস্টল সফল হয়নি৷" "আনইনস্টল করা যায়নি কারণ এই প্যাকেজটি হল একটি সক্রিয় ডিভাইস প্রশাসক৷" "এই প্যাকেজটি আনইনস্টল করা যাবে না কারণ, এটি হল %1$s এর একটি সক্রিয় ডিভাইস প্রশাসক৷" - "আপনার %1$s প্রোফাইলের জন্য এই অ্যাপ্লিকেশানটি প্রয়োজন এবং এটি আনইনস্টল করা যাবে না।" + "আপনার প্রোফাইলের জন্য এই অ্যাপ্লিকেশানটি প্রয়োজন এবং এটি আনইনস্টল করা যাবে না৷" "আপনার ডিভাইস প্রশাসকের চাহিদা অনুযায়ী এই অ্যাপ্লিকেশানটি আবশ্যক এবং এটি আনইনস্টল করা যাবে না।" "ডিভাইস প্রশাসকদের পরিচালনা করুন" "%1$s আনইনস্টল করা যায়নি৷" @@ -90,8 +90,34 @@ "মঞ্জুরি দিন" "প্রত্যাখ্যান করুন" "%2$s এর %1$s" - "%1$sকে %2$s করার মঞ্জুরি দেবেন?" + "আপনি কি %1$s কে %2$s করার মঞ্জুরি দেবেন?" + "অ্যাপ্লিকেশানগুলি" "অ্যাপ্লিকেশানের অনুমতি" "পরে কখনই জিজ্ঞাসাই করবেন না" "কোনো অনুমতি নেই" + "অতিরিক্ত অনুমতিগুলি" + + আরো %1$dটি + আরো %1$dটি + + "একটি পুরোনো সংস্করণের Android এর জন্য এই অ্যাপ্লিকেশানটি ডিজাইন করা হয়েছিল৷ অনুমতি অস্বীকার করলে এটিকে যে কাজের উদ্দেশ্যে তৈরি করা হয়েছিল সেটি নাও করতে পারে৷" + "কোনো অজানা কার্য সঞ্চালন করুন" + "%2$dটির মধ্যে %1$dটি অ্যাপ্লিকেশান মঞ্জুরিপ্রাপ্ত" + "সিস্টেম দেখান" + "সিস্টেম লুকান" + "%1$s অনুমতিগুলি" + "কোনো অ্যাপ্লিকেশান নেই" + "অবস্থান সেটিংস" + "%1$s এই ডিভাইসের জন্য একটি অবস্থান পরিষেবাগুলি প্রদান করে। অবস্থান সেটিংস থেকে অবস্থানের অ্যাক্সেস পরিবর্তন করা যায়।" + "আপনি যদি এই অনুমতিটি অস্বীকার করেন, তবে আপনার ডিভাইসের প্রাথমিক বৈশিষ্ট্যগুলিকে যে কাজের উদ্দেশ্যে তৈরি করা হয়েছিল সেগুলি নাও করতে পারে৷" + "নীতি দ্বারা প্রয়োগ করা হয়েছে" + "লোড হচ্ছে..." + "সমস্ত অনুমতি" + "অন্যান্য অ্যাপ্লিকেশান ক্ষমতা" + "অনুমতির অনুরোধ" + "স্ক্রীন আচ্ছাদন সনাক্ত করা হয়েছে" + "এই অনুমতি সেটিংস পরিবর্তন করতে, আপনাকে প্রথমে সেটিংস > এ গিয়ে অ্যাপ্লিকেশানগুলি থেকে স্ক্রীন ওভারলে বন্ধ করতে হবে" + "সেটিংস খুলুন" + "Android Wear" + "Wearএ ইনস্টল/আনইনস্টল করার ক্রিয়াগুলি সমর্থিত নয়।" diff --git a/res/values-ca-television/strings.xml b/res/values-ca-television/strings.xml new file mode 100644 index 00000000..a49c608a --- /dev/null +++ b/res/values-ca-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Denega i no m\'ho tornis a preguntar" + "Pots canviar-ho més endavant a Configuració > Aplicacions" + "%1$s/%2$s" + "Mostra les aplicacions del sistema" + diff --git a/res/values-ca-watch/strings.xml b/res/values-ca-watch/strings.xml new file mode 100644 index 00000000..c4f9e3ff --- /dev/null +++ b/res/values-ca-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Denega i no m\'ho demanis més" + "%1$s/%2$s" + "Mostra les aplicacions del sistema" + "No es pot canviar" + "ACTIVAT" + "DESACTIVAT" + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 8c8f3df5..e6971748 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -75,7 +75,7 @@ "S\'ha produït un error en la desinstal·lació." "No es pot desinstal·lar perquè aquest paquet és administ. actiu d\'un dispositiu." "No es pot desinstal·lar perquè el paquet és un administrador de dispositius actius per a l’usuari %1$s." - "El perfil de l\'usuari %1$s necessita l\'aplicació i no la pots desinstal·lar." + "Aquesta aplicació es necessita per al perfil de Work i no es pot desinstal·lar." "L\'administrador del dispositiu necessita l\'aplicació i no la pots desinstal·lar." "Gestiona els administradors del dispositiu" "%1$s no s\'ha pogut desinstal·lar." @@ -90,8 +90,34 @@ "Permet" "Denega" "%1$s de %2$s" - "Vols permetre que %1$s %2$s?" - "Permisos de l\'aplicació" + "Permetre que %1$s pugui %2$s?" + "Aplicacions" + "Permisos d\'aplicacions" "No el tornis a demanar" "Sense permisos" + "Més permisos" + + %1$d més + %1$d més + + "Aquesta aplicació es va dissenyar per a una versió anterior d\'Android. És possible que no funcioni com està previst si li denegues el permís." + "dur a terme una acció desconeguda" + "%1$d de %2$d aplicacions permeses" + "Mostra el sistema" + "Amaga el sistema" + "Permisos de %1$s" + "Cap aplicació" + "Configuració d\'ubicació" + "%1$s és un proveïdor de serveis d\'ubicació per a aquest dispositiu. L\'accés a la ubicació es pot modificar des de la configuració d\'ubicació." + "Si no acceptes aquest permís, hi ha funcions bàsiques del dispositiu que poden deixar de funcionar com esperes." + "Aplicat en funció de la política" + "S\'està carregant..." + "Tots els permisos" + "Altres competències de l\'aplicació" + "Sol·licitud de permís" + "S\'ha detectat una superposició de pantalla" + "Per canviar la configuració de permisos, cal que desactivis la superposició de pantalla des de Configuració > Aplicacions" + "Obre Configuració" + "Android Wear" + "Les accions d\'instal·lar o desinstal·lar no s\'admeten a Wear." diff --git a/res/values-cs-television/strings.xml b/res/values-cs-television/strings.xml new file mode 100644 index 00000000..5d1b2a26 --- /dev/null +++ b/res/values-cs-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Odmítnout a již se neptat" + "Svoji volbu můžete později změnit v nabídce Nastavení > Aplikace." + "%1$s / %2$s" + "Zobrazit systémové aplikace" + diff --git a/res/values-cs-watch/strings.xml b/res/values-cs-watch/strings.xml new file mode 100644 index 00000000..ae6cfbcf --- /dev/null +++ b/res/values-cs-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Odmítnout a již se neptat" + "%1$s/%2$s" + "Zobrazit systémové aplikace" + "Nelze změnit" + "ZAPNUTO" + "VYPNUTO" + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 44c57c11..ecc9ce20 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -75,7 +75,7 @@ "Odinstalace se nezdařila." "Nelze odinstalovat, protože je tento balíček aktivním správcem zařízení." "Balíček nelze odinstalovat, protože je aktivním administrátorem zařízení pro uživatele %1$s." - "Tato aplikace je pro váš profil %1$s požadována a nelze ji odinstalovat." + "Tato aplikace je pro váš pracovní profil požadována a nelze ji odinstalovat." "Tato aplikace je administrátorem zařízení vyžadována a nelze ji odinstalovat." "Spravovat správce zařízení" "Aplikaci %1$s nelze odinstalovat." @@ -91,7 +91,35 @@ "Odmítnout" "%1$s z %2$s" "Povolit aplikaci %1$s %2$s?" - "Oprávnění aplikace" + "Aplikace" + "Oprávnění aplikací" "Již se znovu neptat" "Žádná oprávnění" + "Další oprávnění" + + Ještě %1$d + Ještě %1$d + Ještě %1$d + Ještě %1$d + + "Tato aplikace byla vytvořena pro starší verzi platformy Android. Pokud oprávnění neudělíte, může přestat fungovat podle původního záměru." + "provést neznámou akci" + "Povoleno u %1$d z %2$d aplikací" + "Zobrazit systémové aplikace" + "Skrýt systémové aplikace" + "%1$s – oprávnění" + "Žádné aplikace" + "Nastavení polohy" + "Služby určování polohy v tomto zařízení poskytuje aplikace %1$s. Přístup k poloze lze upravit v nastavení polohy." + "Pokud toto oprávnění zamítnete, základní funkce zařízení nemusejí fungovat správně." + "Vynuceno zásadami" + "Načítání…" + "Všechna oprávnění" + "Ostatní oprávnění aplikace" + "Žádost o oprávnění" + "Byla zjištěna překryvná vrstva obrazovky" + "Chcete-li změnit nastavení tohoto oprávnění, v Nastavení > Aplikace je třeba nejprve vypnout překryvnou vrstvu obrazovky" + "Otevřít nastavení" + "Android Wear" + "Akce instalace/odinstalace nejsou v zařízení Wear podporovány." diff --git a/res/values-da-television/strings.xml b/res/values-da-television/strings.xml new file mode 100644 index 00000000..5e28b62f --- /dev/null +++ b/res/values-da-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Afvis, og spørg ikke igen" + "Du kan altid ændre dette i Indstillinger > Apps" + "%1$s/%2$s" + "Vis systemapps" + diff --git a/res/values-da-watch/strings.xml b/res/values-da-watch/strings.xml new file mode 100644 index 00000000..2fd6279d --- /dev/null +++ b/res/values-da-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Afvis, og spørg ikke igen" + "%1$s/%2$s" + "Vis systemapps" + "Kan ikke ændres" + "AKTIVERET" + "DEAKTIVERET" + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 7ad141f1..b88dc3b6 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -75,7 +75,7 @@ "Afinstallationen mislykkedes." "Der kan ikke afinstalleres, fordi denne pakke er en aktiv enhedsadministrator." "Pakken kan ikke afinstalleres. Den er aktiv enhedsadministrator for brugeren %1$s." - "Denne app er nødvendig for din profil %1$s og kan ikke afinstalleres." + "Denne app er nødvendig for din arbejdsprofil og kan ikke afinstalleres." "Denne app er påkrævet af din enhedsadministrator og kan ikke afinstalleres." "Administrer enhedsadministratorer" "%1$s kunne ikke afinstalleres." @@ -90,8 +90,34 @@ "Tillad" "Afvis" "%1$s ud af %2$s" - "Vil du give %1$s lov til at %2$s?" + "Vil du give %1$s tilladelse til at %2$s?" + "Apps" "Apptilladelser" "Spørg ikke igen" "Ingen tilladelser" + "Flere tilladelser" + + %1$d mere + %1$d mere + + "Denne app er udviklet til en ældre version af Android. Hvis du ikke giver den tilladelse, vil den muligvis ikke længere virke efter hensigten." + "udføre en ukendt handling" + "%1$d ud af %2$d apps har tilladelse" + "Vis systemapps" + "Skjul systemapps" + "%1$s-tilladelser" + "Ingen apps" + "Placeringsindstillinger" + "%1$s udbyder placeringstjenester for denne enhed. Adgangen til din placering kan ændres i Placeringsindstillinger." + "Hvis du afviser denne tilladelse, vil grundlæggende funktioner på din enhed muligvis ikke længere fungere efter hensigten." + "Håndhæves af politik" + "Indlæser…" + "Alle tilladelser" + "Andre app-egenskaber" + "Anmodning om tilladelse" + "Der er registreret skærmoverlejring" + "Hvis du vil ændre denne indstilling for tilladelser, skal du først slå skærmoverlejringen fra i Indstillinger > Apps" + "Åbn indstillingerne" + "Android Wear" + "Det er ikke muligt at installere/afinstallere på Wear." diff --git a/res/values-de-television/strings.xml b/res/values-de-television/strings.xml new file mode 100644 index 00000000..cf52f8ca --- /dev/null +++ b/res/values-de-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Ablehnen und nicht mehr fragen" + "Sie können dies später unter \"Einstellungen > Apps\" ändern." + "%1$s/%2$s" + "System-Apps anzeigen" + diff --git a/res/values-de-watch/strings.xml b/res/values-de-watch/strings.xml new file mode 100644 index 00000000..be893682 --- /dev/null +++ b/res/values-de-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Ablehnen & nicht mehr fragen" + "%1$s/%2$s" + "System-Apps anzeigen" + "Keine Änderung möglich" + "Aktiviert" + "Deaktiviert" + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index fb46da62..eb06dbd3 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -75,7 +75,7 @@ "Deinstallation fehlgeschlagen" "Deinstallation nicht möglich: Dieses Paket ist ein aktiver Geräteadministrator." "Deinstallation nicht möglich, Paket ist ein aktiver Geräteadministrator für %1$s." - "Diese App wird für Ihr %1$s-Profil benötigt und kann nicht deinstalliert werden." + "Die App wird für Ihr Arbeitsprofil benötigt und kann nicht deinstalliert werden." "Die App wurde als obligatorisch festgelegt und kann nicht deinstalliert werden." "Geräteadministratoren verwalten" "%1$s konnte nicht deinstalliert werden." @@ -88,10 +88,36 @@ "Für dieses Update sind keine neuen Berechtigungen erforderlich." "Möchten Sie die folgenden Berechtigungen gewähren? Diese ermöglichen den Zugriff auf Folgendes:" "Zulassen" - "Verweigern" + "Ablehnen" "%1$s von %2$s" - "Zulassen, dass %1$s %2$s?" + "%1$s ermöglichen, %2$s?" + "Apps" "App-Berechtigungen" "Nicht mehr fragen" "Keine Berechtigungen" + "Zusätzliche Berechtigungen" + + Noch %1$d + Noch %1$d + + "Diese App wurde für eine ältere Version von Android konzipiert. Wenn Sie keine Berechtigung erteilen, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." + "Unbekannte Aktion durchführen" + "%1$d von %2$d Apps sind berechtigt." + "System anzeigen" + "System ausblenden" + "Berechtigungen für %1$s" + "Keine Apps" + "Standorteinstellungen" + "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf Ihren Standort können Sie in den Standorteinstellungen ändern." + "Wenn Sie diese Berechtigung deaktivieren, funktionieren grundlegende Funktionen Ihres Geräts möglicherweise nicht mehr ordnungsgemäß." + "Von Richtlinien durchgesetzt" + "Wird geladen…" + "Alle Berechtigungen" + "Andere App-Funktionen" + "Berechtigungsanfrage" + "Display-Overlay erkannt" + "Um diese Berechtigungseinstellung zu ändern, müssen Sie zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." + "Einstellungen öffnen" + "Android Wear" + "Von Android Wear nicht unterstützte Aktionen installieren/deinstallieren." diff --git a/res/values-el-television/strings.xml b/res/values-el-television/strings.xml new file mode 100644 index 00000000..d50b1bd3 --- /dev/null +++ b/res/values-el-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Απόρριψη και να μην ερωτηθώ ξανά" + "Μπορείτε να το αλλάξετε αυτό αργότερα από το μενού Ρυθμίσεις > Εφαρμογές" + "%1$s / %2$s" + "Εμφάνιση εφαρμογών συστήματος" + diff --git a/res/values-el-watch/strings.xml b/res/values-el-watch/strings.xml new file mode 100644 index 00000000..2aa34551 --- /dev/null +++ b/res/values-el-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Απόρριψη και να μην ερωτηθώ ξανά" + "%1$s / %2$s" + "Εμφάνιση εφαρμογών συστήματος" + "Δεν είναι δυνατή η αλλαγή" + "ΕΝΕΡΓΟ" + "ΑΝΕΝΕΡΓΟ" + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a85c3783..a4094cd5 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -75,7 +75,7 @@ "Μη επιτυχής κατάργηση εγκατάστασης." "Αδύνατη η κατάργηση της εγκατάστασης: το πακέτο είναι ενεργός διαχειρ. συσκευής." "Αδύνατη απεγκατάσταση, επειδή το πακέτο αποτελεί ενεργό διαχειριστή συσκευής για %1$s." - "Η εφαρμογή απαιτείται για το προφίλ σας %1$s και δεν είναι δυνατή η απεγκτατάσταση." + "Αυτή η εφαρμογή απαιτείται για το προφίλ εργασίας και δεν είναι δυνατή η απεγκατάστασή της." "Η εφαρμογή απαιτείται από το διαχειριστή και δεν είναι δυνατή η απεγκατάσταση." "Διαχείριση διαχειριστών συσκευής" "Δεν ήταν δυνατή η κατάργηση της εγκατάστασης της εφαρμογής %1$s." @@ -91,7 +91,33 @@ "Απόρριψη" "%1$s από %2$s" "Να επιτρέπεται στην εφαρμογή %1$s να %2$s;" - "Δικαιώματα εφαρμογών" + "Εφαρμογές" + "Δικαιώματα εφ/γών" "Να μην γίνει ποτέ ξανά ερώτηση" "Χωρίς δικαιώματα" + "Πρόσθετα δικαιώματα" + + Ακόμα %1$d + Ακόμα %1$d + + "Αυτή η εφαρμογή σχεδιάστηκε για παλαιότερη έκδοση του Android. Η άρνηση άδειας μπορεί να έχει ως αποτέλεσμα να διακοπεί η κανονική λειτουργία της." + "εκτέλεση άγνωστης ενέργειας" + "Επιτρέπονται %1$d από %2$d εφαρμογές" + "Εμφάνιση συστήματος" + "Απόκρυψη συστήματος" + "Δικαιώματα %1$s" + "Δεν υπάρχουν εφαρμογές" + "Ρυθμίσεις τοποθεσίας" + "Η εφαρμογή %1$s είναι ο πάροχος των υπηρεσιών τοποθεσίας για τη συγκεκριμένη συσκευή. Μπορείτε να τροποποιήσετε την πρόσβαση τοποθεσίας από τις ρυθμίσεις τοποθεσίας." + "Εάν αρνηθείτε να παραχωρήσετε αυτήν την άδεια, η λειτουργία ορισμένων βασικών δυνατοτήτων ενδέχεται να μην είναι η αναμενόμενη." + "Επιβάλλεται από την πολιτική" + "Γίνεται φόρτωση…" + "Όλα τα δικαιώματα" + "Άλλες δυνατότητες εφαρμογής" + "Αίτημα άδειας" + "Εντοπίστηκε επικάλυψη οθόνης" + "Για να αλλάξετε αυτή τη ρύθμιση άδειας, θα πρέπει πρώτα να απενεργοποιήσετε την επικάλυψη οθόνης από τις Ρυθμίσεις > Εφαρμογές" + "Άνοιγμα ρυθμίσεων" + "Android Wear" + "Οι ενέργειες εγκατάστασης/απεγκατάστασης δεν υποστηρίζονται στο Wear." diff --git a/res/values-en-rAU-television/strings.xml b/res/values-en-rAU-television/strings.xml new file mode 100644 index 00000000..c081905a --- /dev/null +++ b/res/values-en-rAU-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Deny and don\'t ask again" + "You can change this later in Settings > Apps" + "%1$s / %2$s" + "Show system apps" + diff --git a/res/values-en-rAU-watch/strings.xml b/res/values-en-rAU-watch/strings.xml new file mode 100644 index 00000000..755d64f0 --- /dev/null +++ b/res/values-en-rAU-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Deny, don\'t ask again" + "%1$s / %2$s" + "Show system apps" + "Can\'t be changed" + "ENABLED" + "DISABLED" + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 323b5d33..939ce47a 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -75,7 +75,7 @@ "Uninstall unsuccessful." "Can\'t uninstall because this package is an active device administrator." "Can\'t uninstall because this package is an active device administrator for the user %1$s." - "This app is needed for your %1$s profile and can\'t be uninstalled." + "This app is needed for your work profile and can\'t be uninstalled." "This app is required by your device administrator and can\'t be uninstalled." "Manage device administrators" "%1$s couldn\'t be uninstalled." @@ -91,7 +91,33 @@ "Deny" "%1$s of %2$s" "Allow %1$s to %2$s?" + "Apps" "App permissions" "Never ask again" "No permissions" + "Additional permissions" + + %1$d more + %1$d more + + "This app was designed for an older version of Android. Denying permission may cause it to no longer function as intended." + "perform an unknown action" + "%1$d of %2$d apps allowed" + "Show system" + "Hide system" + "%1$s permissions" + "No apps" + "Location Settings" + "%1$s is a provider of location services for this device. Location access can be modified from location settings." + "If you deny this permission, basic features of your device may no longer function as intended." + "Enforced by policy" + "Loading…" + "All permissions" + "Other app capabilities" + "Permission request" + "Screen overlay detected" + "To change this permission setting, you first have to turn off the screen overlay from Settings > Apps" + "Open settings" + "Android Wear" + "Install/Uninstall actions not supported on Wear." diff --git a/res/values-en-rGB-television/strings.xml b/res/values-en-rGB-television/strings.xml new file mode 100644 index 00000000..c081905a --- /dev/null +++ b/res/values-en-rGB-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Deny and don\'t ask again" + "You can change this later in Settings > Apps" + "%1$s / %2$s" + "Show system apps" + diff --git a/res/values-en-rGB-watch/strings.xml b/res/values-en-rGB-watch/strings.xml new file mode 100644 index 00000000..755d64f0 --- /dev/null +++ b/res/values-en-rGB-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Deny, don\'t ask again" + "%1$s / %2$s" + "Show system apps" + "Can\'t be changed" + "ENABLED" + "DISABLED" + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 323b5d33..939ce47a 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -75,7 +75,7 @@ "Uninstall unsuccessful." "Can\'t uninstall because this package is an active device administrator." "Can\'t uninstall because this package is an active device administrator for the user %1$s." - "This app is needed for your %1$s profile and can\'t be uninstalled." + "This app is needed for your work profile and can\'t be uninstalled." "This app is required by your device administrator and can\'t be uninstalled." "Manage device administrators" "%1$s couldn\'t be uninstalled." @@ -91,7 +91,33 @@ "Deny" "%1$s of %2$s" "Allow %1$s to %2$s?" + "Apps" "App permissions" "Never ask again" "No permissions" + "Additional permissions" + + %1$d more + %1$d more + + "This app was designed for an older version of Android. Denying permission may cause it to no longer function as intended." + "perform an unknown action" + "%1$d of %2$d apps allowed" + "Show system" + "Hide system" + "%1$s permissions" + "No apps" + "Location Settings" + "%1$s is a provider of location services for this device. Location access can be modified from location settings." + "If you deny this permission, basic features of your device may no longer function as intended." + "Enforced by policy" + "Loading…" + "All permissions" + "Other app capabilities" + "Permission request" + "Screen overlay detected" + "To change this permission setting, you first have to turn off the screen overlay from Settings > Apps" + "Open settings" + "Android Wear" + "Install/Uninstall actions not supported on Wear." diff --git a/res/values-en-rIN-television/strings.xml b/res/values-en-rIN-television/strings.xml new file mode 100644 index 00000000..c081905a --- /dev/null +++ b/res/values-en-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Deny and don\'t ask again" + "You can change this later in Settings > Apps" + "%1$s / %2$s" + "Show system apps" + diff --git a/res/values-en-rIN-watch/strings.xml b/res/values-en-rIN-watch/strings.xml new file mode 100644 index 00000000..755d64f0 --- /dev/null +++ b/res/values-en-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Deny, don\'t ask again" + "%1$s / %2$s" + "Show system apps" + "Can\'t be changed" + "ENABLED" + "DISABLED" + diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 323b5d33..939ce47a 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -75,7 +75,7 @@ "Uninstall unsuccessful." "Can\'t uninstall because this package is an active device administrator." "Can\'t uninstall because this package is an active device administrator for the user %1$s." - "This app is needed for your %1$s profile and can\'t be uninstalled." + "This app is needed for your work profile and can\'t be uninstalled." "This app is required by your device administrator and can\'t be uninstalled." "Manage device administrators" "%1$s couldn\'t be uninstalled." @@ -91,7 +91,33 @@ "Deny" "%1$s of %2$s" "Allow %1$s to %2$s?" + "Apps" "App permissions" "Never ask again" "No permissions" + "Additional permissions" + + %1$d more + %1$d more + + "This app was designed for an older version of Android. Denying permission may cause it to no longer function as intended." + "perform an unknown action" + "%1$d of %2$d apps allowed" + "Show system" + "Hide system" + "%1$s permissions" + "No apps" + "Location Settings" + "%1$s is a provider of location services for this device. Location access can be modified from location settings." + "If you deny this permission, basic features of your device may no longer function as intended." + "Enforced by policy" + "Loading…" + "All permissions" + "Other app capabilities" + "Permission request" + "Screen overlay detected" + "To change this permission setting, you first have to turn off the screen overlay from Settings > Apps" + "Open settings" + "Android Wear" + "Install/Uninstall actions not supported on Wear." diff --git a/res/values-es-rUS-television/strings.xml b/res/values-es-rUS-television/strings.xml new file mode 100644 index 00000000..04aed2a0 --- /dev/null +++ b/res/values-es-rUS-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Denegar el permiso y no volver a preguntar" + "Puedes cambiar esta opción más tarde en Configuración > Aplicaciones" + "%1$s/%2$s" + "Mostrar aplicaciones del sistema" + diff --git a/res/values-es-rUS-watch/strings.xml b/res/values-es-rUS-watch/strings.xml new file mode 100644 index 00000000..120b19bd --- /dev/null +++ b/res/values-es-rUS-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Denegar y no preguntar más" + "%1$s/%2$s" + "Mostrar aplicaciones del sistema" + "Inalterable" + "HABILITADA" + "INHABILITADA" + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 2e50eeb4..2c3165ae 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -75,7 +75,7 @@ "Desinstalación incorrecta" "No se puede desinstalar este paquete porque es un admin. de dispositivos activo." "No se puede desinstalar este paquete porque es un admin. de disp. activo para %1$s." - "El perfil de %1$s necesita esta aplicación y no se puede desinstalar." + "El perfil de trabajo necesita esta aplicación, y no se puede desinstalar." "El admin. del dispositivo necesita esta aplicación y no se puede desinstalar." "Administrar los administradores de dispositivos" "No se pudo desinstalar %1$s." @@ -91,7 +91,33 @@ "Rechazar" "%1$s de %2$s" "¿Permitir a %1$s %2$s?" + "Aplicaciones" "Permisos de aplicaciones" "No volver a preguntar" "Sin permisos" + "Permisos adicionales" + + %1$d más + %1$d más + + "Esta aplicación se diseñó para una versión de Android anterior. Si deniegas el permiso, es posible que deje de funcionar de la forma prevista." + "realizar una acción desconocida" + "El permiso se otorgó a %1$d de %2$d aplicaciones." + "Mostrar sistema" + "Ocultar sistema" + "Permisos de %1$s" + "Ninguna aplicación" + "Configuración de la ubicación" + "La aplicación %1$s provee servicios de ubicación a este dispositivo. El acceso a la ubicación puede modificarse desde la configuración de la ubicación." + "Si no concedes este permiso, es posible que algunas funciones básicas del dispositivo dejen de funcionar correctamente." + "Se aplica en función de la política" + "Cargando…" + "Todos los permisos" + "Otras funciones de la aplicación" + "Solicitud de permiso" + "Se detectó una superposición de pantalla" + "Para cambiar esta configuración de permisos, primero debes desactivar la superposición de pantalla en Configuración > Aplicaciones" + "Abrir configuración" + "Android Wear" + "No se admiten las acciones de instalación y desinstalación en Wear." diff --git a/res/values-es-television/strings.xml b/res/values-es-television/strings.xml new file mode 100644 index 00000000..27074063 --- /dev/null +++ b/res/values-es-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Denegar y no volver a preguntar" + "Puedes cambiar esta opción más tarde en Ajustes > Aplicaciones" + "%1$s/%2$s" + "Mostrar aplicaciones del sistema" + diff --git a/res/values-es-watch/strings.xml b/res/values-es-watch/strings.xml new file mode 100644 index 00000000..6d0c8af8 --- /dev/null +++ b/res/values-es-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Denegar y no preguntar más" + "%1$s/%2$s" + "Mostrar aplicaciones del sistema" + "No se puede cambiar" + "HABILITADO" + "INHABILITADA" + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1e06d742..d5e3059b 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -75,7 +75,7 @@ "Desinstalación correcta" "No se puede desinstalar porque este paquete es un administrador de dispositivos activo." "No se puede instalar porque este paquete es un administrador de dispositivos activos para el usuario %1$s." - "Esta aplicación es necesaria para el perfil de %1$s y no se puede desinstalar." + "Esta aplicación es necesaria para tu perfil de trabajo y no se puede desinstalar." "Esta aplicación es necesaria para el administrador de tu dispositivo y no se puede desinstalar." "Gestionar administradores de dispositivos" "No se ha podido desinstalar %1$s." @@ -90,8 +90,34 @@ "Permitir" "Rechazar" "%1$s de %2$s" - "¿Permitir que %1$s %2$s?" + "¿Permitir que %1$s pueda %2$s?" + "Aplicaciones" "Permisos de aplicaciones" "No volver a preguntar" "Sin permisos" + "Permisos adicionales" + + %1$d más + %1$d más + + "Esta aplicación está diseñada para una versión anterior de Android. Si se le deniega el permiso, puede dejar de funcionar de la forma prevista." + "realizar una acción desconocida" + "%1$d de %2$d aplicaciones permitidas" + "Mostrar aplicaciones del sistema" + "Ocultar aplicaciones del sistema" + "Permisos: %1$s" + "No hay aplicaciones" + "Ajustes de ubicación" + "%1$s es un proveedor de servicios de ubicación de este dispositivo. El acceso a la ubicación se puede modificar en los ajustes de ubicación." + "Si deniegas este permiso, es posible que algunas funciones básicas de tu dispositivo dejen de funcionar correctamente." + "Aplicado por política" + "Cargando..." + "Todos los permisos" + "Otras funciones de la aplicación" + "Solicitud de permiso" + "Superposición de pantalla detectada" + "Para cambiar la configuración de este permiso, desactiva la superposición de pantalla en Ajustes > Aplicaciones" + "Abrir ajustes" + "Android Wear" + "No puedes instalar ni desinstalar aplicaciones en Wear." diff --git a/res/values-et-rEE-television/strings.xml b/res/values-et-rEE-television/strings.xml new file mode 100644 index 00000000..8a66c249 --- /dev/null +++ b/res/values-et-rEE-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Keela ja ära enam küsi" + "Saate seda hiljem muuta jaotises Seaded > Rakendused" + "%1$s/%2$s" + "Kuva süsteemirakendused" + diff --git a/res/values-et-rEE-watch/strings.xml b/res/values-et-rEE-watch/strings.xml new file mode 100644 index 00000000..947809d9 --- /dev/null +++ b/res/values-et-rEE-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Keela, ära enam küsi" + "%1$s/%2$s" + "Kuva süsteemirakendused" + "Ei saa muuta" + "LUBATUD" + "KEELATUD" + diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 78d11775..e600f68a 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -75,7 +75,7 @@ "Desinstallimine ebaõnnestus." "Ei saa desinstallida, sest pakett on aktiivse seadme administraator." "Desinstallida ei saa, sest pakett on kasutaja %1$s aktiivne seadme administraator." - "Seda rakendust on vaja kasutaja %1$s profiili jaoks ja seda ei saa desinstallida." + "Seda rakendust on vaja teie tööprofiili jaoks ja seda ei saa desinstallida." "Seadme administraator vajab seda rakendust ja seda ei saa desinstallida." "Halda seadme ülemaid" "Rakendust %1$s ei saanud desinstallida." @@ -90,8 +90,34 @@ "Lubamine" "Keelamine" "%1$s/%2$s-st" - "Kas lubada rakendusele %1$s toiming %2$s?" + "Kas lubada rakendusel %1$s %2$s?" + "Rakendused" "Rakenduse load" "Ära enam küsi" "Lube ei ole" + "Täiendavad load" + + Veel %1$d + Veel %1$d + + "Rakendus on mõeldud Androidi vanemale versioonile. Kui keeldute loa andmisest, ei pruugi see ootuspäraselt töötada." + "tundmatu toiming" + "%1$d rakendust %2$d-st on lubatud" + "Süsteemi kuvamine" + "Süsteemi peitmine" + "Üksuse %1$s load" + "Rakendusi pole" + "Asukohaseaded" + "Rakendus %1$s on selle seadme asukohateenuste pakkuja. Asukoha juurdepääsu saab muuta asukohaseadetes." + "Kui keelate loa, ei pruugi seadme põhifunktsioonid enam ootuspäraselt töötada." + "Eeskirjadega jõustatud" + "Laadimine ..." + "Kõik load" + "Rakenduse muud funktsioonid" + "Loa taotlus" + "Tuvastati ekraani ülekate" + "Selle loa seade muutmiseks peate esmalt välja lülitama ekraani ülekatte menüüs Seaded > Rakendused" + "Ava seaded" + "Android Wear" + "Wear ei toeta installimist/desinstallimist." diff --git a/res/values-eu-rES-television/strings.xml b/res/values-eu-rES-television/strings.xml new file mode 100644 index 00000000..8442ad7a --- /dev/null +++ b/res/values-eu-rES-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Baztertu eta ez galdetu berriro" + "Hori geroago alda dezakezu Ezarpenak > Aplikazioak atalean" + "%1$s/%2$s" + "Erakutsi sistema-aplikazioak" + diff --git a/res/values-eu-rES-watch/strings.xml b/res/values-eu-rES-watch/strings.xml new file mode 100644 index 00000000..25e2429e --- /dev/null +++ b/res/values-eu-rES-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Ukatu; ez galdetu berriro" + "%1$s/%2$s" + "Erakutsi sistema-aplikazioak" + "Ezin da aldatu" + "GAITUTA" + "DESGAITUTA" + diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 5477564b..d358c1fd 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -75,7 +75,7 @@ "Ezin izan da desinstalatu." "Ezin izan da desinstalatu paketea gailu-administratzaile aktiboa delako." "Ezin da desinstalatu, pakete hau %1$s erabiltzailearen gailu-administratzaile aktiboa delako." - "Aplikazioa %1$s erabiltzailearen profilerako behar da eta ezin da desinstalatu." + "Aplikazioa laneko profilerako behar da eta ezin da desinstalatu." "Gailuaren administratzaileak aplikazio hori behar du eta ezin da desinstalatu." "Kudeatu gailu-administratzaileak" "Ezin izan da %1$s desinstalatu." @@ -90,8 +90,34 @@ "Baimendu" "Eragotzi" "%1$s/%2$s" - "%1$s aplikazioari \"%2$s\" ekintza egitea baimendu nahi diozu?" + "%1$s aplikazioari \"%2$s\" baimena eman nahi diozu?" + "Aplikazioak" "Aplikaziorako baimenak" "Ez galdetu berriro" "Ez dago baimenik" + "Baimen gehigarriak" + + %1$d gehiago + %1$d gehiago + + "Aplikazio hau Android-en bertsio zaharrago baterako diseinatuta dago. Baimena ukatzen baduzu, agian aurrerantzean ez du behar bezain ondo funtzionatuko." + "Gauzatu ekintza ezezagunak" + "%1$d/%2$d aplikaziok dute baimena" + "Erakutsi sistema" + "Ezkutatu sistema" + "%1$s erabiltzeko baimenak" + "Ez dago aplikaziorik" + "Kokapen-ezarpenak" + "%1$s gailu honen kokapen-zerbitzuen hornitzailea da. Kokapenerako sarbidea kokapen-ezarpenetatik alda daiteke." + "Baimena ematen ez baduzu, baliteke gailuaren oinarrizko eginbide batzuek behar bezala ez funtzionatzea." + "Gidalerroen bidez aplikatzen da" + "Kargatzen…" + "Baimen guztiak" + "Aplikazioaren beste gaitasun batzuk" + "Baimen-eskaera" + "Pantailaren gainjartzea detektatu da" + "Baimen-ezarpen hau aldatzeko, pantailaren gainjartzea desaktibatu behar duzu Ezarpenak > Aplikazioak atalean" + "Ireki ezarpenak" + "Android Wear" + "Instalatzeko eta desinstalatzeko ekintzak ezin dira gauzatu Wear gailuetan." diff --git a/res/values-fa-television/strings.xml b/res/values-fa-television/strings.xml new file mode 100644 index 00000000..a98545dc --- /dev/null +++ b/res/values-fa-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "اجازه ندارد و دیگر سؤال نشود" + "‏می‌توانید بعداً آن را در تنظیمات > برنامه‌ها تغییر دهید" + "%1$s / %2$s" + "نمایش‌ برنامه‌های سیستم" + diff --git a/res/values-fa-watch/strings.xml b/res/values-fa-watch/strings.xml new file mode 100644 index 00000000..15029959 --- /dev/null +++ b/res/values-fa-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "رد شود، دیگر سؤال نشود" + "%1$s / %2$s" + "نمایش‌ برنامه‌های سیستم" + "نمی‌تواند تغییر کند" + "فعال شد" + "غیرفعال شد" + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index b757ed54..09e20092 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -19,8 +19,8 @@ "نصب کننده بسته" "بعدی" "نصب" - "انجام شد" - "به این برنامه اجازه داده شود که:" + "تمام" + "این برنامه مجاز است که:" "لغو" "ناشناس" "در حال نصب…" @@ -46,9 +46,9 @@ "%1$s در تلفن شما نصب نشد." "باز کردن" "نصب مسدود شد" - "به دلایل امنیتی، رایانهٔ لوحی شما طوری تنظیم شده است که نصب برنامه‌های دریافت شده از منابع ناشناخته را مسدود کند." + "برای امنیت، رایانه لوحی‌تان تنظیم شده تا نصب برنامه‌های دریافت شده از منابع ناشناس را مسدود کند." "برای امنیت، تلویزیون شما طوری تنظیم شده است که نصب برنامه‌های به دست آمده از منابع ناشناس را مسدود کند." - "به دلایل امنیتی، تلقن شما طوری تنظیم شده است که نصب برنامه‌های دریافت شده از منابع ناشناخته را مسدود کند." + "برای امنیت، تلقنتان تنظیم شده تا نصب برنامه‌های دریافت شده از منابع ناشناس را مسدود کند." "سرپرست شما اجازه نمی‌دهد برنامه‌های دریافت شده از منابع ناشناس نصب شوند." "تأیید" "تنظیمات" @@ -75,7 +75,7 @@ "حذف نصب انجام نشد." "حذف نصب ممکن نیست، زیرا این بسته یک سرپرست دستگاه فعال است." "حذف نصب ممکن نیست چون این بسته یک سرپرست دستگاه فعال برای کاربر %1$s است." - "این برنامه برای نمایه %1$s شما مورد نیاز است و نمی‌تواند حذف نصب شود." + "این برنامه برای نمایه کاری شما لازم است و نمی‌توان آن را حذف نصب کرد." "سرپرست دستگاه شما این برنامه را لازم کرده است و نمی‌تواند حذف نصب شود." "مدیریت سرپرستان دستگاه" "%1$s حذف نصب نشد." @@ -87,11 +87,37 @@ "دسترسی به دستگاه" "این به‌روزرسانی به مجوز جدیدی نیاز ندارد." "آیا می‌خواهید مجوزهای زیر را اعطا کنید؟ این مجوزها دسترسی به این موارد را بوجود می‌آورند:" - "مجاز" - "رد کردن" + "مجاز است" + "اجازه ندارد" "%1$s از %2$s" "به %1$s برای %2$s اجازه می‌دهید؟" + "برنامه‌ها" "مجوزهای برنامه" "دیگر هرگز سؤال نشود" "مجوزی موجود نیست" + "مجوزهای بیشتر" + + %1$d مورد دیگر + %1$d مورد دیگر + + "‏این برنامه برای یک نسخه قدیمی‌تر از Android طراحی شده بود. نپذیرفتن اجازه ممکن است باعث شود که برنامه دیگر به صورتی که مورد نظر است کار نکند." + "انجام یک اقدام ناشناخته" + "%1$d برنامه از %2$d برنامه مجاز است" + "نمایش سیستم" + "پنهان کردن سیستم" + "مجوزهای %1$s" + "برنامه‌ای موجود نیست" + "تنظیمات مکان" + "%1$s یکی از ارائه‌دهندگان سرویس‌های مکان برای این دستگاه است. با رفتن به تنظیمات مکان می‌توانید دسترسی به موقعیت مکانی را تغییر دهید." + "اگر این اجازه را رد کنید، ممکن است قابلیت‌های اصلی دستگاهتان دیگر عملکرد موردانتظار را نداشته باشند." + "اجرا توسط خط‌مشی" + "درحال بارگیری…" + "همه مجوزها" + "سایر قابلیت‌های برنامه" + "درخواست مجوز" + "هم‌پوشانی صفحه شناسایی شد" + "‏برای تغییر این تنظیم مجوز، ابتدا باید هم‌پوشانی صفحه را از «تنظیمات > برنامه‌ها» خاموش کنید" + "باز کردن تنظیمات" + "Android Wear" + "‏نصب/حذف نصب عملکردها در Wear پشتیبانی نمی‌شود." diff --git a/res/values-fi-television/strings.xml b/res/values-fi-television/strings.xml new file mode 100644 index 00000000..c17ae794 --- /dev/null +++ b/res/values-fi-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Hylkää äläkä kysy uudelleen" + "Voit muuttaa tätä myöhemmin valitsemalla Asetukset > Sovellukset." + "%1$s/%2$s" + "Näytä järjestelmäsovellukset" + diff --git a/res/values-fi-watch/strings.xml b/res/values-fi-watch/strings.xml new file mode 100644 index 00000000..5305299c --- /dev/null +++ b/res/values-fi-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Hylkää, äläkä kysy uudelleen" + "%1$s/%2$s" + "Näytä järjestelmäsovellukset" + "Ei muutettavissa" + "KÄYTÖSSÄ" + "POIS KÄYTÖSTÄ" + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index e61dd374..e7999d36 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -75,7 +75,7 @@ "Poisto epäonnistui." "Pakettia ei voi poistaa, koska se on aktiivinen laitteen ylläpitäjä." "Ei voi poistaa – paketti on käyttäjän %1$s aktiivinen laitteen järjestelmänvalvoja." - "Käyttäjäprofiili %1$s tarvitsee tätä sovellusta eikä sitä voi poistaa." + "Työprofiilisi käyttö edellyttää tätä sovellusta. Sovellusta ei voi poistaa." "Laitteen järjestelmänvalvoja tarvitsee tätä sovellusta eikä sitä voi poistaa." "Hallinnoi laitteen ylläpitäjiä" "Sovelluksen %1$s poistaminen epäonnistui" @@ -90,8 +90,34 @@ "Salli" "Estä" "%1$s/%2$s" - "Onko sovelluksella %1$s lupa %2$s?" + "Saako %1$s %2$s?" + "Sovellukset" "Sovelluksen käyttöoikeudet" "Älä kysy enää koskaan" "Ei käyttöoikeuksia" + "Lisäkäyttöoikeudet" + + %1$d lisää + %1$d lisää + + "Tämä sovellus on suunniteltu vanhemmalle Android-versiolle. Se ei välttämättä toimi oikein, jos käyttöoikeuksia ei sallita." + "suorita tuntematon toiminto" + "Sallitut sovellukset: %1$d/%2$d" + "Näytä järjestelmä" + "Piilota järjestelmä" + "Kohteen %1$s käyttöluvat" + "Ei sovelluksia" + "Sijaintiasetukset" + "%1$s on tämän laitteen sijaintipalveluiden tarjoaja. Sijainnin käyttöoikeutta voi muokata sijaintiasetuksissa." + "Jos peruutat tämän käyttöoikeuden, laitteesi perustoiminnot eivät välttämättä enää toimi oikein." + "Käytännön vahvistama" + "Ladataan…" + "Kaikki käyttöoikeudet" + "Muut sovellusluvat" + "Lupapyyntö" + "Näytön peittokuva havaittiin" + "Ennen kuin voit muokata tätä käyttöoikeusasetusta, sinun täytyy poistaa näytön peittokuva käytöstä Asetukset-valikon Sovellukset-kohdasta." + "Avaa Asetukset" + "Android Wear" + "Wear ei tue asennus- ja poistotoimintoja." diff --git a/res/values-fr-rCA-television/strings.xml b/res/values-fr-rCA-television/strings.xml new file mode 100644 index 00000000..31293c9f --- /dev/null +++ b/res/values-fr-rCA-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Refuser et ne plus demander" + "Vous pourrez modifier ce choix plus tard dans le menu Paramètres > Applications" + "%1$s/%2$s" + "Afficher les applications système" + diff --git a/res/values-fr-rCA-watch/strings.xml b/res/values-fr-rCA-watch/strings.xml new file mode 100644 index 00000000..cb176c27 --- /dev/null +++ b/res/values-fr-rCA-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Refuser et ne plus demander" + "%1$s / %2$s" + "Afficher les applications système" + "Inchangeable" + "ACTIVÉ" + "DÉSACTIVÉ" + diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 3cff8d9b..27c509bb 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -16,7 +16,7 @@ - "Programme d\'installation de la trousse" + "Programme installation trousse" "Suivante" "Installer" "Terminé" @@ -75,7 +75,7 @@ "Échec de la désinstallation." "Impossible de désinstaller ce paquet, car il s\'agit d\'un administrateur actif." "Désinst. imposs., car ce paquet est un administrateur d\'appareil actif pour %1$s." - "Impossible de désinstaller l\'application : nécessaire pour votre profil « %1$s »." + "Impossible de désinstaller l\'appli, car nécessaire pour profil professionnel." "Impossible de désinstaller l\'application : requise par administrateur appareil." "Gérer les administrateurs de l\'appareil" "Impossible de désinstaller %1$s." @@ -90,8 +90,34 @@ "Autoriser" "Refuser" "%1$s de %2$s" - "Autoriser %1$s à effectuer l\'action suivante : %2$s?" + "Autoriser %1$s à %2$s?" + "Applications" "Autorisations de l\'application" "Ne plus demander" "Aucune autorisation" + "Autorisations supplémentaires" + + %1$d autre + %1$d autres + + "Cette application a été conçue pour une version antérieure d\'Android. Si vous n\'accordez pas l\'autorisation, il se peut qu\'elle ne fonctionne plus correctement." + "effectuer une action inconnue" + "%1$d application(s) autorisée(s) sur %2$d" + "Afficher le système" + "Masquer le système" + "%1$s autorisations" + "Aucune application" + "Paramètres de localisation" + "%1$s est un fournisseur de services de localisation pour cet appareil. L\'accès à la position peut être modifié dans le menu des paramètres de localisation." + "Si vous rejetez cette autorisation, il est possible que cela touche certaines fonctionnalités de base de votre appareil." + "Activé conformément à la politique" + "Chargement en cours…" + "Toutes les autorisations" + "Autres autorisations de l\'application" + "Demande d\'autorisation" + "La superposition d\'écran a été détectée" + "Pour modifier ce paramètre d\'autorisation, vous devez tout d\'abord désactiver la superposition d\'écran en accédant à Paramètres > Applications." + "Ouvrir les paramètres" + "Android Wear" + "Les actions d\'installation et de désinstallation ne sont pas prises en charge par Android Wear." diff --git a/res/values-fr-television/strings.xml b/res/values-fr-television/strings.xml new file mode 100644 index 00000000..68c673c1 --- /dev/null +++ b/res/values-fr-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Refuser et ne plus demander" + "Vous pourrez modifier ce paramètre plus tard sous Paramètres > Applications." + "%1$s/%2$s" + "Afficher les applications système" + diff --git a/res/values-fr-watch/strings.xml b/res/values-fr-watch/strings.xml new file mode 100644 index 00000000..c567d03b --- /dev/null +++ b/res/values-fr-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Refuser et ne plus demander" + "%1$s/%2$s" + "Afficher les applications système" + "Non modifiable" + "ACTIVÉ" + "DÉSACTIVÉ" + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 8ef8ce2c..a7ff6998 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -75,7 +75,7 @@ "Échec de la désinstallation." "Impossible de désinstaller ce package, car il s\'agit d\'un administrateur actif." "Désinstallation imposs., car ce package est administrateur appareil actif pour %1$s." - "Impossible de désinstaller appli, car elle est nécessaire pour votre profil \"%1$s\"." + "Impossible de désinstaller appli, car nécessaire pour profil professionnel." "Impossible désinstaller appli, car elle est requise par administrateur appareil." "Gérer les administrateurs de l\'appareil" "Impossible de désinstaller %1$s." @@ -90,8 +90,34 @@ "Autoriser" "Refuser" "%1$s sur %2$s" - "Autoriser %1$s à effectuer l\'action suivante : %2$s ?" - "Autorisations des applications" + "Autoriser %1$s à %2$s ?" + "Applications" + "Autoris. des applis" "Ne plus jamais demander" "Aucune autorisation" + "Autorisations supplémentaires" + + %1$d autre + %1$d autres + + "Cette application a été conçue pour une ancienne version d\'Android. Si vous désactivez les autorisations, l\'application risque de ne plus fonctionner comme prévu." + "effectuer une action inconnue" + "%1$d application(s) autorisée(s) sur %2$d" + "Afficher les processus système" + "Masquer les processus système" + "Autorisations d\'accès aux données \"%1$s\"" + "Aucune application" + "Paramètres de géolocalisation" + "Les services de localisation pour cet appareil sont fournis via %1$s. Vous pouvez modifier l\'accès aux données de localisation dans les paramètres de localisation." + "Si vous rejetez cette autorisation, il est possible que cela affecte certaines fonctionnalités de base de votre appareil." + "Activé conformément aux règles" + "Chargement en cours…" + "Toutes les autorisations" + "Autres autorisations de l\'application" + "Demande d\'autorisation" + "Superposition d\'écran détectée" + "Pour modifier ce paramètre d\'autorisation, vous devez tout d\'abord désactiver la superposition d\'écran en accédant à Paramètres > Applications." + "Ouvrir les paramètres" + "Android Wear" + "Opérations d\'installation et de désinstallation impossibles sur Android Wear" diff --git a/res/values-gl-rES-television/strings.xml b/res/values-gl-rES-television/strings.xml new file mode 100644 index 00000000..3d80f96c --- /dev/null +++ b/res/values-gl-rES-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Denegar e non volver preguntar" + "Podes cambiar esta opción máis tarde en Configuración e aplicacións" + "%1$s/%2$s" + "Mostrar aplicacións do sistema" + diff --git a/res/values-gl-rES-watch/strings.xml b/res/values-gl-rES-watch/strings.xml new file mode 100644 index 00000000..38e4e6cb --- /dev/null +++ b/res/values-gl-rES-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Denegar, non volver preguntar" + "%1$s / %2$s" + "Mostrar aplicacións do sistema" + "Cambio imposible" + "ACTIVADO" + "DESACTIVADO" + diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 12f33296..477169ea 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -75,7 +75,7 @@ "Desinstalación incorrecta" "Non se pode desinstalar porque o paquete é administrador de dispositivo activo." "Non se pode desinstalar porque este paquete actúa como un administrador de dispositivo activo para o usuario %1$s." - "O teu perfil %1$s necesita esta aplicación e non se pode desinstalar." + "O teu perfil de traballo necesita esta aplicación e non se pode desinstalar." "O administrador do teu dispositivo necesita esta aplicación e non se pode desinstalar." "Xestionar administradores do dispositivo" "Non se puido desinstalar %1$s." @@ -90,8 +90,34 @@ "Permitir" "Denegar" "%1$s de %2$s" - "Queres permitir a %1$s %2$s?" + "Queres permitir que %1$s poida %2$s?" + "Aplicacións" "Permisos de aplicacións" "Non volver preguntar" "Sen permisos" + "Permisos adicionais" + + %1$d permisos máis + %1$d permiso máis + + "Esta aplicación deseñouse para unha versión anterior de Android. Denegar o permiso pode provocar que non funcione como está previsto." + "realiza unha acción descoñecida" + "%1$d de %2$d aplicacións con permiso" + "Mostrar sistema" + "Ocultar sistema" + "Permisos de %1$s" + "Ningunha aplicación" + "Configuración da localización" + "%1$s é un fornecedor de servizos de localización para este dispositivo. O acceso de localización pode modificarse desde a configuración de localización." + "Se denegas este permiso, é posible que as funcións básicas do teu dispositivo deixen de funcionar segundo o previsto." + "Aplicado pola política" + "Cargando…" + "Todos os permisos" + "Outras funcionalidades da aplicación" + "Solicitude de permiso" + "Detectouse a superposición da pantalla" + "Para cambiar a configuración deste permiso, primeiro tes que desactivar a superposición da pantalla en Configuración > Aplicacións" + "Abrir configuración" + "Android Wear" + "As accións de instalar e desinstalar non son compatibles con Wear." diff --git a/res/values-gu-rIN-television/strings.xml b/res/values-gu-rIN-television/strings.xml new file mode 100644 index 00000000..cd0dd3c6 --- /dev/null +++ b/res/values-gu-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "નકારો અને ફરીથી પૂછશો નહીં" + "તમે પછીથી આને સેટિંગ્સ > એપ્લિકેશન્સમાં બદલી શકો છો" + "%1$s / %2$s" + "સિસ્ટમ એપ્લિકેશનો બતાવો" + diff --git a/res/values-gu-rIN-watch/strings.xml b/res/values-gu-rIN-watch/strings.xml new file mode 100644 index 00000000..3530b6a9 --- /dev/null +++ b/res/values-gu-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "નકારો, ફરીથી પૂછશો નહીં" + "%1$s / %2$s" + "સિસ્ટમ એપ્લિકેશનો બતાવો" + "બદલી શકતાં નથી" + "સક્ષમ કરેલ" + "અક્ષમ કરેલ" + diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index c2b9b107..40951dd2 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -52,8 +52,8 @@ "તમારા વ્યવસ્થાપક અજાણ સ્રોતોથી મેળવેલ એપ્લિકેશન્સના ઇન્સ્ટોલેશનની મંજૂરી આપતાં નથી." "ઑકે" "સેટિંગ્સ" - "એપ્લિકેશન્સ માટે નવો સ્રોત" - "%1$s અન્ય એપ્લિકેશન્સ ઇન્સ્ટોલ કરવા માંગે છે.\n\nઆને હમણાં અને ભવિષ્યમાં મંજૂરી આપીએ?" + "એપ્લિકેશનો માટે નવો સ્રોત" + "%1$s અન્ય એપ્લિકેશનો ઇન્સ્ટોલ કરવા માંગે છે.\n\nઆને હમણાં અને ભવિષ્યમાં મંજૂરી આપીએ?" "એપ્લિકેશન્સનું સંચાલન કરો" "એપ્લિકેશન બદલીએ?" "તમે ઇન્સ્ટોલ કરી રહ્યાં છો તે એપ્લિકેશન બીજી એપ્લિકેશનનું સ્થાન લેશે.\n\nતમારો અગાઉનો તમામ ડેટા સાચવવામાં આવશે." @@ -75,7 +75,7 @@ "અનઇન્સ્ટોલ કરવું અસફળ રહ્યું." "અનઇન્સ્ટોલ કરી શકાતું નથી કારણ કે આ પૅકેજ એક સક્રિય ઉપકરણ વ્યવસ્થાપક છે." "અનઇન્સ્ટોલ કરી શકાતું નથી કારણ કે આ પૅકેજ વપરાશકર્તા %1$s માટે એક સક્રિય ઉપકરણ વ્યવસ્થાપક છે." - "તમારી %1$s પ્રોફાઇલ માટે આ એપ્લિકેશન જરૂરી છે અને અનઇન્સ્ટોલ કરી શકાશે નહીં." + "તમારી કાર્ય પ્રોફાઇલ માટે આ એપ્લિકેશન જરૂરી છે અને અનઇન્સ્ટોલ કરી શકાતી નથી." "આ એપ્લિકેશન તમારા ઉપકરણ વ્યવસ્થાપક માટે આવશ્યક છે અને તે અનઇન્સ્ટોલ કરી શકાતી નથી." "ઉપકરણ વ્યવસ્થાપકોને સંચાલિત કરો" "%1$s અનઇન્સ્ટોલ કરી શકાઈ નથી." @@ -90,8 +90,34 @@ "મંજૂરી આપો" "નકારો" "%2$s માંથી %1$s" - "%1$s ને %2$s ની મંજૂરી આપીએ?" + "%1$s ને %2$s મંજૂરી આપીએ?" + "એપ્લિકેશનો" "એપ્લિકેશન પરવાનગીઓ" "ફરી ક્યારેય પૂછશો નહીં" "કોઈ પરવાનગીઓ નથી" + "વધારાની પરવાનગીઓ" + + %1$d વધુ + %1$d વધુ + + "આ એપ્લિકેશન Android ના જુના સંસ્કરણ માટે તૈયાર કરવામાં આવી હતી. પરવાનગી નકારવાથી તે ધાર્યા પ્રમાણે બિલકુલ કાર્ય કરશે નહી." + "એક અજાણી ક્રિયા કરો" + "%2$d માંથી %1$d એપ્લિકેશન્સને મંજૂરી છે" + "સિસ્ટમ બતાવો" + "સિસ્ટમ છુપાવો" + "%1$s પરવાનગીઓ" + "કોઇ એપ્લિકેશનો નથી" + "સ્થાન સેટિંગ્સ" + "%1$s એ આ ઉપકરણ માટે સ્થાન સેવાઓના પ્રદાતા છે. સ્થાન સેટિંગ્સમાંથી સ્થાન ઍક્સેસ સંશોધિત કરી શકાય છે." + "જો તમે આ પરવાનગી નકારો છો, તો તમારા ઉપકરણની મૂળભૂત સુવિધાઓ અપેક્ષા પ્રમાણે કાર્ય કરી શકશે નહીં." + "નીતિ દ્વારા લાગુ" + "લોડ કરી રહ્યું છે..." + "બધી પરવાનગીઓ" + "અન્ય એપ્લિકેશન ક્ષમતાઓ" + "પરવાનગીની વિનંતી" + "સ્ક્રીન ઓવરલે મળ્યું" + "આ પરવાનગી સેટિંગ બદલવા માટે, તમારે પહેલા સેટિંગ્સ > Apps માંથી સ્ક્રીન ઓવરલે બંધ કરવું પડશે" + "સેટિંગ્સ ખોલો" + "Android Wear" + "Wear પર ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ ક્રિયાઓ સમર્થિત નથી." diff --git a/res/values-hi-television/strings.xml b/res/values-hi-television/strings.xml new file mode 100644 index 00000000..42010e11 --- /dev/null +++ b/res/values-hi-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "मना करें और फिर से ना पूछें" + "आप इसे बाद में सेटिंग > ऐप्‍स में बदल सकते हैं" + "%1$s / %2$s" + "सिस्टम ऐप्स दिखाएं" + diff --git a/res/values-hi-watch/strings.xml b/res/values-hi-watch/strings.xml new file mode 100644 index 00000000..39c93948 --- /dev/null +++ b/res/values-hi-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "मना करें, फिर से ना पूछें" + "%1$s / %2$s" + "सिस्टम ऐप्स दिखाएं" + "बदला नहीं जा सकता" + "सक्षम" + "अक्षम" + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 9bf2de97..0f353d30 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -75,7 +75,7 @@ "अनइंस्‍टॉल करना विफल." "अनइंस्‍टॉल नहीं किया जा सकता क्‍योंकि यह पैकेज कोई सक्रिय डिवाइस नियंत्रक है." "अनइंस्टॉल संभव नहीं क्योंकि यह पैकेज %1$s का सक्रिय डिवाइस नियंत्रक है." - "यह ऐप्स आपकी %1$s प्रोफ़ाइल के लिए आवश्यक है और इसे अनइंस्टॉल नहीं किया जा सकता." + "आपकी कार्य प्रोफ़ाइल के लिए यह ऐप आवश्‍यक है और इसे अनइंस्‍टॉल नहीं किया जा सकता." "आपके डिवाइस व्यवस्थापक के लिए यह ऐप्स जरूरी है व इसे अनइंस्टॉल नहीं किया जा सकता." "डिवाइस व्‍यवस्‍थापकों को प्रबंधित करें" "%1$s को अनइंस्‍टॉल नहीं किया जा सका." @@ -91,7 +91,33 @@ "अस्वीकार करें" "%2$s में से %1$s" "%1$s को %2$s की अनुमति दें?" + "ऐप्स" "ऐप अनुमतियां" "फिर कभी ना पूछें" "कोई अनुमति नहीं" + "अतिरिक्त अनुमतियां" + + %1$d और + %1$d और + + "इस ऐप को Android के पुराने वर्शन के लिए डिज़ाइन किया गया था. अनुमति अस्वीकार करने पर हो सकता है कि फ़ंक्शन लक्षित रूप से काम नहीं करे." + "कोई अज्ञात कार्रवाई करें" + "%2$d में से %1$d ऐप्स को अनुमति है" + "सिस्टम दिखाएं" + "सिस्टम छिपाएं" + "%1$s अनुमतियां" + "कोई ऐप्स नहीं" + "स्थान सेटिंग" + "%1$s इस डिवाइस के लिए स्‍थान सेवाएं उपलब्‍ध कराने वाला प्रदाता है. स्‍थान ऐक्‍सेस को स्‍थान सेटिंग से बदला जा सकता है." + "यदि आप इस अनुमति को अस्वीकार करते हैं, तो हो सकता है कि आपके डिवाइस की मूलभूत सुविधाएं लक्षित कार्य ना कर पाएं." + "नीति द्वारा लागू" + "लोड हो रहा है…" + "सभी अनुमतियां" + "अन्‍य ऐप कार्यक्षमताएं" + "अनुमति का अनुरोध" + "स्क्रीन ओवरले को पहचाना गया" + "इस अनुमति सेटिंग को बदलने के लिए, आपको पहले सेटिंग > ऐप्स से स्क्रीन ओवरले को बंद करना होगा" + "सेटिंग खोलें" + "Android Wear" + "इंस्टॉल/अनइंस्टॉल किए जाने की कार्रवाइयां Wear पर समर्थित नहीं हैं." diff --git a/res/values-hr-television/strings.xml b/res/values-hr-television/strings.xml new file mode 100644 index 00000000..151afe81 --- /dev/null +++ b/res/values-hr-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Odbij i više ne pitaj" + "To možete kasnije promijenili u odjeljku Postavke > Aplikacije" + "%1$s/%2$s" + "Prikaži aplikacije sustava" + diff --git a/res/values-hr-watch/strings.xml b/res/values-hr-watch/strings.xml new file mode 100644 index 00000000..37658e5e --- /dev/null +++ b/res/values-hr-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Ne, više ne pitaj" + "%1$s/%2$s" + "Prikaži aplikacije sustava" + "Promjena nemoguća" + "OMOGUĆENO" + "ONEMOGUĆENO" + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 055c0dbd..8cead087 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -75,7 +75,7 @@ "Deinstalacija nije uspjela." "Deinstalacija nije moguća jer je ovaj paket aktivni administrator uređaja." "Paket nije moguće deinst. jer je administrator aktivnog uređaja za korisnika %1$s." - "Ta je aplikacija neophodna za profil %1$s i nije ju moguće deinstalirati." + "Ta je aplikacija potrebna za vaš poslovni profil i ne može se deinstalirati." "Ta je aplikacija neophodna administratoru uređaja i nije ju moguće deinstalirati." "Upravljanje administratorima uređaja" "Aplikaciju %1$s nije moguće instalirati." @@ -90,8 +90,35 @@ "Dopusti" "Odbij" "%1$s od %2$s" - "Želite li dopustiti aplikaciji %1$s izvršavanje radnje %2$s?" + "Dopuštate li aplikaciji %1$s da može %2$s?" + "Aplikacije" "Dopuštenja aplikacije" "Nikad više ne traži" "Nema dopuštenja" + "Dodatna dopuštenja" + + Još %1$d + Još %1$d + Još %1$d + + "Ova je aplikacija napravljena za stariju verziju Androida. Ako ne dobije dopuštenje, možda više neće funkcionirati kako treba." + "izvršiti nepoznatu radnju" + "Broj aplikacija s dopuštenjem: %1$d od %2$d" + "Prikaži sustav" + "Sakrij sustav" + "Dopuštenja – %1$s" + "Nema aplikacija" + "Postavke lokacije" + "%1$s pruža usluge lokacije za ovaj uređaj. Pristup lokaciji može se izmijeniti u postavkama lokacije." + "Ako ne odobrite ovo dopuštenje, osnovne značajke vašeg uređaja možda više neće funkcionirati pravilno." + "Provoditi se na temelju pravila" + "Učitavanje…" + "Sva dopuštenja" + "Ostale mogućnosti aplikacije" + "Zahtijevanje dopuštenja" + "Otkriveno je preklapanje na zaslonu" + "Da biste promijenili tu postavku dopuštenja, prvo morate isključiti preklapanje na zaslonu u Postavkama > Aplikacije" + "Otvori postavke" + "Android Wear" + "Radnje instaliranja i deinstaliranja nisu podržane na Wearu." diff --git a/res/values-hu-television/strings.xml b/res/values-hu-television/strings.xml new file mode 100644 index 00000000..cb780971 --- /dev/null +++ b/res/values-hu-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Megtagadás, és ne jelenjen meg többé" + "Ezt később módosíthatja a Beállítások > Alkalmazások pontnál" + "%1$s/%2$s" + "Rendszeralkalmazások megjelenítése" + diff --git a/res/values-hu-watch/strings.xml b/res/values-hu-watch/strings.xml new file mode 100644 index 00000000..8a116dff --- /dev/null +++ b/res/values-hu-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Megtagadás, ne jelenjen meg" + "%2$s/%1$s" + "Rendszeralkalmazások megjelenítése" + "Nem változtatható" + "ENGEDÉLYEZVE" + "LETILTVA" + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 737f8055..84aab320 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -75,7 +75,7 @@ "Az eltávolítás sikertelen." "Nem lehet eltávolítani: a csomag aktív eszközkezelő." "Nem lehet eltávolítani, mert a csomag %1$s aktív eszközadminisztrátora." - "Ez az alkalmazás szükséges %1$s profiljához, és nem távolítható el." + "Ez az alkalmazás szükséges munkaprofiljához, és nem távolítható el." "Az alkalmazásra szüksége van az eszköz adminisztrátorának, és nem távolítható el." "Eszközadminisztrátorok kezelése" "Nem sikerült a(z) %1$s eltávolítása" @@ -91,7 +91,33 @@ "Elutasítás" "%2$s/%1$s" "Felhatalmazza a(z) %1$s szolgáltatást a következőre: %2$s?" + "Alkalmazások" "Alkalmazásengedélyek" "Ne kérdezzen rá többet" "Nincs engedély" + "További engedélyek" + + %1$d további + %1$d további + + "Ez az alkalmazás az Android egy korábbi verziójához készült. Az engedély megtagadása esetén előfordulhat, hogy a továbbiakban nem fog megfelelően működni." + "végrehajt egy ismeretlen műveletet" + "%2$d/%1$d alkalmazás engedélyezve" + "Rendszerfolyamatok megjelenítése" + "Rendszerfolyamatok elrejtése" + "A(z) %1$s jogosultságai" + "Nincsenek alkalmazások" + "Helybeállítások" + "A(z) %1$s helyszolgáltatásokat biztosít ennek az eszköznek. A helyhozzáférést a helybeállításokban lehet módosítani." + "Ha ezt nem engedélyezi, akkor előfordulhat, hogy az eszköz egyes alapfunkciói nem megfelelően fognak működni." + "Irányelv által kényszerítve" + "Betöltés…" + "Az összes engedély" + "Egyéb alkalmazáslehetőségek" + "Engedélykérés" + "Képernyőfedvény észlelve" + "Ennek az engedélynek a módosításához először ki kell kapcsolnia a képernyőfedvényt a Beállítások > Alkalmazások menüben" + "Beállítások megnyitása" + "Android Wear" + "A Wear nem támogatja a telepítés/eltávolítás műveletet." diff --git a/res/values-hy-rAM-television/strings.xml b/res/values-hy-rAM-television/strings.xml new file mode 100644 index 00000000..b23a74d8 --- /dev/null +++ b/res/values-hy-rAM-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Մերժել և այլևս չհարցնել" + "Կարող եք փոխել սա ավելի ուշ Կարգավորումներում և Հավելվածներում" + "%1$s / %2$s" + "Ցուցադրել համակարգի հավելվածները" + diff --git a/res/values-hy-rAM-watch/strings.xml b/res/values-hy-rAM-watch/strings.xml new file mode 100644 index 00000000..08786c11 --- /dev/null +++ b/res/values-hy-rAM-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Մերժել, այլևս չհարցնել" + "%1$s / %2$s" + "Ցուցադրել համակարգի հավելվածները" + "Հնարավոր չէ փոխել" + "ՄԻԱՑՎԱԾ" + "ԱՆՋԱՏՎԱԾ" + diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 976d8b55..00a4e301 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -75,7 +75,7 @@ "Ապատեղադրումն անհաջող է:" "Հնարավոր չէ ապատեղադրել, քանի որ այս փաթեթն ակտիվ սարքի ադմինիստրատոր է:" "Հնարավոր չէ ապատեղադրել, քանի որ այս փաթեթը ակտիվ սարքի ադմինիստրատոր է %1$s օգտվողի համար:" - "Այս ծրագիրն անհրաժեշտ է ձեր %1$s պրոֆիլի համար և չի կարող հեռացվել:" + "Այս հավելվածը հարկավոր է ձեր աշխատանքային պրոֆիլի համար: Չեք կարող հեռացնել այն:" "Ծրագիրը ձեր սարքի ադմինիստրատորի կողմից նշվել է որպես պարտադիր և չի կարող հեռացվել:" "Կառավարել սարքի ադմինիստրատորներին" "%1$s-ը չհաջողվեց ապատեղադրել:" @@ -91,7 +91,33 @@ "Մերժել" "%1$s%2$s-ից" "Թույլատրե՞լ %1$s-ին %2$s:" + "Հավելվածներ" "Հավելվածների թույլտվությունները" "Այլևս երբեք չհարցնել" "Թույլտվություններ չկան" + "Լրացուցիչ թույլտվություններ" + + Եվս %1$d + Եվս %1$d + + "Այս հավելվածը նախատեսված է Android-ի ավելի հին տարբերակի համար: Եթե մերժեք թույլտվությունը, այն կարող է չաշխատել ինչպես հարկն է:" + "թույլատրել անհայտ գործողություն" + "Թույլատրված է %1$d հավելվածի՝ %2$d-ից" + "Ցուցադրել համակարգայինները" + "Թաքցնել համակարգայինները" + "%1$s թույլտվություններ" + "Հավելվածներ չկան" + "Տեղադրության կարգավորումներ" + "Այս սարքի տեղադրության ծառայությունները տրամադրում է %1$s հավելվածը: Տեղադրության ցուցադրման կարգավորումները կարող եք փոխել տեղադրության կարգավորումներից:" + "Եթե չտրամադրեք այս թույլտվությունը, ձեր սարքի հիմնական գործառույթները հնարավոր է սխալ աշխատեն:" + "Սահմանված է կանոններով" + "Բեռնում…" + "Բոլոր թույլտվությունները" + "Այլ հավելվածների հնարավորությունները" + "Թույլտվության հարցում" + "Հայտնաբերվել է էկրանի վերադրում" + "Այս թույլտվության կարգավորումները փոխելու համար նախ անհրաժեշտ է անջատել էկրանի վերադրումը՝ անցնելով Կարգավորումներ > Հավելվածներ" + "Բացել կարգավորումները" + "Android Wear" + "Տեղադրման/հեռացման գործողությունները Android Wear-ում չեն աջակցվում:" diff --git a/res/values-in-television/strings.xml b/res/values-in-television/strings.xml new file mode 100644 index 00000000..9ab3b192 --- /dev/null +++ b/res/values-in-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Tolak dan jangan tanya lagi" + "Anda dapat mengubah ini nanti di Setelan > Aplikasi" + "%1$s / %2$s" + "Tampilkan aplikasi sistem" + diff --git a/res/values-in-watch/strings.xml b/res/values-in-watch/strings.xml new file mode 100644 index 00000000..38ad48b9 --- /dev/null +++ b/res/values-in-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Tolak, jangan tanya lagi" + "%1$s / %2$s" + "Tampilkan aplikasi sistem" + "Tidak dapat diubah" + "DIAKTIFKAN" + "DINONAKTIFKAN" + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 4a21f9b6..c20e0b6e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -75,7 +75,7 @@ "Pencopotan pemasangan tidak berhasil." "Tdk dpt mencopot pemasangan krn paket ini adlh administrator perangkat yg aktif." "Tidak dapat mencopot pemasangan karena paket ini adalah administrator perangkat aktif untuk pengguna %1$s." - "Aplikasi diperlukan untuk profil %1$s Anda dan pemasangannya tidak bisa dicopot." + "Aplikasi ini diperlukan untuk profil kerja & pemasangannya tidak bisa dicopot." "Aplikasi diwajibkan administrator perangkat & pemasangannya tidak bisa dicopot." "Kelola administrator perangkat" "%1$s tidak dapat dicopot pemasangannya." @@ -91,7 +91,33 @@ "Tolak" "%1$s dari %2$s" "Izinkan %1$s untuk %2$s?" + "Aplikasi" "Izin aplikasi" "Jangan tanya lagi" "Tidak ada izin" + "Izin tambahan" + + %1$d lainnya + %1$d lainnya + + "Aplikasi ini dirancang untuk versi lama Android. Menolak izin dapat menyebabkan aplikasi tidak berfungsi lagi sesuai harapan." + "melakukan tindakan yang tidak dikenal" + "%1$d dari %2$d aplikasi diizinkan" + "Tampilkan sistem" + "Sembunyikan sistem" + "%1$s izin" + "Tidak ada aplikasi" + "Setelan Lokasi" + "%1$s adalah penyedia layanan lokasi untuk perangkat ini. Akses lokasi dapat diubah dari setelan lokasi." + "Jika Anda menolak izin ini, fitur dasar perangkat mungkin tidak berfungsi lagi sesuai harapan." + "Diterapkan menurut kebijakan" + "Memuat…" + "Semua izin" + "Kemampuan aplikasi lainnya" + "Permintaan izin" + "Hamparan layar terdeteksi" + "Untuk mengubah setelan izin ini, terlebih dahulu Anda harus menonaktifkan hamparan layar dari Setelan > Aplikasi" + "Buka setelan" + "Android Wear" + "Tindakan Pasang/Copot Pemasangan tidak didukung di Wear." diff --git a/res/values-is-rIS-television/strings.xml b/res/values-is-rIS-television/strings.xml new file mode 100644 index 00000000..5e780185 --- /dev/null +++ b/res/values-is-rIS-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Hafna og ekki spyrja aftur" + "Þú getur breytt þessu seinna undir Stillingar og forrit" + "%1$s / %2$s" + "Sýna kerfisforrit" + diff --git a/res/values-is-rIS-watch/strings.xml b/res/values-is-rIS-watch/strings.xml new file mode 100644 index 00000000..c8f92448 --- /dev/null +++ b/res/values-is-rIS-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Hafna, ekki spyrja aftur" + "%1$s / %2$s" + "Sýna kerfisforrit" + "Má ekki breyta" + "VIRKT" + "ÓVIRKT" + diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 0990df72..7a5a39c9 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -75,7 +75,7 @@ "Ekki tókst að fjarlægja forritið." "Ekki er hægt að fjarlægja forritið því að pakkinn er virkur stjórnandi tækis." "Ekki hægt að fjarlægja vegna þess að þessi pakki er virkur tækisstjórnandi fyrir %1$s." - "Sniðið þitt, %1$s, krefst þessa forrits og ekki er hægt að fjarlægja það." + "Vinnusniðið þitt krefst þessa forrits og ekki er hægt að fjarlægja það." "Stjórnandi tækisins krefst þessa forrits og ekki er hægt að fjarlægja það." "Hafa umsjón með stjórnendum tækis" "Ekki tókst að fjarlægja %1$s." @@ -91,7 +91,33 @@ "Hafna" "%1$s af %2$s" "Leyfa %1$s%2$s?" + "Forrit" "Heimildir forrits" "Ekki spyrja aftur" "Engar heimildir" + "Viðbótarheimildir" + + %1$d í viðbót + %1$d í viðbót + + "Þetta forrit var hannað fyrir eldri útgáfu af Android. Ef því er ekki veitt heimild er hugsanlegt að það virki ekki rétt." + "framkvæma óþekkta aðgerð" + "%1$d forrit af %2$d leyfð" + "Sýna kerfisforrit" + "Fela kerfisforrit" + "%1$s heimildir" + "Engin forrit" + "Staðsetningarstillingar" + "%1$s býður upp á staðsetningarþjónustu fyrir þetta tæki. Hægt er að breyta aðgangi að staðsetningu í stillingum staðsetningar." + "Ef þú veitir ekki þessa heimild getur verið að grunneiginleikar tækisins virki ekki lengur sem skyldi." + "Stjórnað af reglu" + "Hleður…" + "Allar heimildir" + "Aðrir forritseiginleikar" + "Beiðni um heimild" + "Skjáyfirlögn greindist" + "Til að breyta þessari heimildarstillingu þarftu fyrst að slökkva á skjáyfirlögn undir Stillingar > Forrit" + "Opna stillingar" + "Android Wear" + "Uppsetningar-/fjarlægingaraðgerðir eru ekki studdar í Wear." diff --git a/res/values-it-television/strings.xml b/res/values-it-television/strings.xml new file mode 100644 index 00000000..8ccd29c5 --- /dev/null +++ b/res/values-it-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Nega e non chiedermelo più" + "Puoi modificare questa scelta in seguito in Impostazioni > App" + "%1$s/%2$s" + "Mostra app di sistema" + diff --git a/res/values-it-watch/strings.xml b/res/values-it-watch/strings.xml new file mode 100644 index 00000000..4a44dca9 --- /dev/null +++ b/res/values-it-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Nega e non chiedermelo più" + "%1$s/%2$s" + "Mostra app di sistema" + "Imposs modif" + "ATTIVATO" + "DISATTIVATO" + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 43ee028d..442d78ca 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -75,7 +75,7 @@ "Disinstallazione non riuscita." "Impossibile disinstallare: il pacchetto è un amministratore dispositivo attivo." "Impossibile disinstallare. Il pacchetto è amministr. dispos. attivo di utente %1$s." - "Questa app è necessaria per il tuo profilo %1$s e non può essere disinstallata." + "Questa app è necessaria per il tuo profilo di lavoro e non può essere disinstallata." "App richiesta dall\'amministratore del dispositivo. Non può essere disinstallata." "Gestisci amministratori dispositivo" "Impossibile disinstallare %1$s." @@ -91,7 +91,33 @@ "Nega" "%1$s di %2$s" "Consentire a %1$s di %2$s?" + "App" "Autorizzazioni app" "Non chiedere più" "Nessuna autorizzazione" + "Altre autorizzazioni" + + Altre %1$d + %1$d altra + + "Questa app è stata sviluppata per una versione precedente di Android. Se l\'autorizzazione viene negata, l\'app potrebbe non funzionare più come previsto." + "esegue un\'azione sconosciuta" + "Sono consentite %1$d app su %2$d" + "Mostra app di sistema" + "Nascondi app di sistema" + "Autorizzazioni %1$s" + "Nessuna app" + "Impostazioni posizione" + "%1$s è un fornitore di servizi di localizzazione per questo dispositivo. È possibile modificare l\'accesso alla posizione dalle impostazioni sulla posizione." + "Se neghi questa autorizzazione, le funzionalità di base del dispositivo potrebbero non funzionare più come previsto." + "Applicata in base alle norme" + "Caricamento…" + "Tutte le autorizzazioni" + "Altre funzionalità dell\'app" + "Richiesta di autorizzazione" + "Overlay schermo rilevato" + "Per modificare questa impostazione di autorizzazione, devi innanzitutto disattivare l\'overlay schermo da Impostazioni > App" + "Apri impostazioni" + "Android Wear" + "Le azioni di installazione/disinstallazione non sono supportate su Wear." diff --git a/res/values-iw-television/strings.xml b/res/values-iw-television/strings.xml new file mode 100644 index 00000000..102e8dd7 --- /dev/null +++ b/res/values-iw-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "דחה ואל תשאל שוב" + "‏תוכל לשנות זאת מאוחר יותר ב\'הגדרות\' > \'אפליקציות\'" + "%1$s / %2$s" + "הצג אפליקציות מערכת" + diff --git a/res/values-iw-watch/strings.xml b/res/values-iw-watch/strings.xml new file mode 100644 index 00000000..d27e2d7d --- /dev/null +++ b/res/values-iw-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "דחה ואל תשאל שוב" + "%1$s / %2$s" + "הצג אפליקציות מערכת" + "לא ניתן לשנות" + "מופעל" + "מושבת" + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 1eb49397..fc22c872 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -66,16 +66,16 @@ "הסר את התקנת האפליקציה" "הסר את התקנת העדכון" "%1$s הוא חלק מהאפליקציה הבאה:" - "האם אתה רוצה להסיר את ההתקנה של אפליקציה זו?" + "האם ברצונך להסיר את ההתקנה של אפליקציה זו?" "האם אתה רוצה להסיר את האפליקציה הזו עבור ""כל"" המשתמשים? האפליקציה והנתונים שלה יוסרו מ""כל"" המשתמשים במכשיר." "האם ברצונך להסיר את התקנתה של אפליקציה זו עבור המשתמש %1$s?" - "האם אתה רוצה להחליף אפליקציה זו בגרסת היצרן?" + "האם ברצונך להחליף אפליקציה זו בגרסת היצרן?" "מסיר התקנה..." "הסרת ההתקנה הסתיימה." "הסרת התקנה נכשלה." "לא ניתן להסיר את ההתקנה מפני שחבילה זו היא מנהל מכשיר פעיל." "לא ניתן להסיר את ההתקנה מפני שהחבילה הזו מוגדרת כעת לניהול המכשיר עבור המשתמש %1$s." - "אפליקציה זו נדרשת עבור פרופיל %1$s שלך ולא ניתן להסירה." + "האפליקציה הזו נחוצה לפרופיל העבודה שלך ולא ניתן להסיר את ההתקנה שלה." "מנהל המכשיר שלך מחייב את קיומה של אפליקציה זו, ולא ניתן להסירה." "נהל מנהלי מכשירים" "לא ניתן להסיר את ההתקנה של %1$s." @@ -91,7 +91,35 @@ "דחה" "%1$s מתוך %2$s" "האם להתיר ל-%1$s %2$s?" + "אפליקציות" "הרשאות לאפליקציות" "לעולם אל תבקש שוב" "אין הרשאות" + "הרשאות נוספות" + + עוד %1$d + עוד %1$d + עוד %1$d + עוד %1$d + + "‏האפליקציה הזו עוצבה בשביל גרסה ישנה יותר של Android. דחיית ההרשאה עשויה לגרום לה לתפקד בצורה לקויה." + "ביצוע פעולה לא ידועה" + "%1$d מתוך %2$d אפליקציות קיבלו הרשאה" + "הצג מערכת" + "הסתר מערכת" + "הרשאות %1$s" + "אין אפליקציות" + "הגדרות מיקום" + "%1$s הוא ספק של שירותי מיקום בשביל המכשיר הזה. אפשר לשנות את גישת המיקום בהגדרות המיקום." + "אם תדחה את ההרשאה הזו, ייתכן שתכונות בסיסיות במכשיר לא יפעלו כצפוי." + "נאכף באמצעות מדיניות" + "טוען..." + "כל ההרשאות" + "הרשאות אחרות של האפליקציה" + "בקשת הרשאה" + "זוהתה שכבת על במסך" + "‏כדי לשנות את הגדרת ההרשאה הזו, ראשית עליך לכבות את שכבת העל במסך ב\'הגדרות\' > \'אפליקציות\'" + "פתח הגדרות" + "Android Wear" + "‏פעולות התקנה/הסרת התקנה אינן נתמכות ב-Wear." diff --git a/res/values-ja-television/strings.xml b/res/values-ja-television/strings.xml new file mode 100644 index 00000000..304f322b --- /dev/null +++ b/res/values-ja-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "許可しない(次回から表示しない)" + "これは後から[設定]>[アプリ]で変更できます" + "%1$s/%2$s" + "システムアプリの表示" + diff --git a/res/values-ja-watch/strings.xml b/res/values-ja-watch/strings.xml new file mode 100644 index 00000000..f3e83c84 --- /dev/null +++ b/res/values-ja-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "許可しない(今後表示しない)" + "%1$s/%2$s" + "システムアプリの表示" + "変更不可" + "有効" + "無効" + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index fcc78305..dc32fc37 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -75,7 +75,7 @@ "アンインストールできませんでした。" "このパッケージは現在デバイスを管理しているため、アンインストールできません。" "このパッケージは、現在%1$sさんの端末を管理しているため、アンインストールできません。" - "このアプリは%1$sさんのプロフィールに必要なため、アンインストールできません。" + "このアプリは仕事用プロファイルに必要なため、アンインストールできません。" "このアプリは端末管理者が必要としているため、アンインストールできません。" "デバイス管理者を管理" "%1$sをアンインストールできませんでした。" @@ -90,8 +90,34 @@ "許可" "許可しない" "%1$s/%2$s" - "「%1$s」に「%2$s」の許可を付与しますか?" + "%1$s%2$sを許可しますか?" + "アプリ" "アプリの権限" "今後は確認しない" "権限がありません" + "その他の権限" + + %1$d + %1$d + + "このアプリはAndroidの以前のバージョンを対象としています。権限を許可しないと、意図されたとおりに動作しなくなる可能性があります。" + "不明な操作の実行" + "%1$d/%2$d個のアプリを許可" + "システムを表示" + "システムを表示しない" + "%1$sの権限" + "アプリなし" + "位置情報の設定" + "%1$sはこの端末の位置情報サービスのプロバイダです。位置情報アクセスは位置情報の設定から変更できます。" + "この権限を許可しないと、お使いの端末の基本的な機能が意図されたとおりに動作しなくなる可能性があります。" + "ポリシーにより適用" + "読み込んでいます…" + "すべての権限" + "その他のアプリ機能" + "権限のリクエスト" + "画面オーバーレイを検出" + "この権限設定を変更するには、まず[設定]>[アプリ]から画面オーバーレイをOFFにします" + "設定を開く" + "Android Wear" + "Wearでのインストールおよびアンインストール操作はサポートされていません。" diff --git a/res/values-ka-rGE-television/strings.xml b/res/values-ka-rGE-television/strings.xml new file mode 100644 index 00000000..6d6f8063 --- /dev/null +++ b/res/values-ka-rGE-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "უარყავი და აღარ მკითხო" + "ამის შეცვლა მოგვიანებით შეგიძლიათ სექციაში პარამეტრები > აპები" + "%1$s / %2$s" + "სისტემის აპების ჩვენება" + diff --git a/res/values-ka-rGE-watch/strings.xml b/res/values-ka-rGE-watch/strings.xml new file mode 100644 index 00000000..6498a4dc --- /dev/null +++ b/res/values-ka-rGE-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "უარყავი და აღარ მკითხო" + "%1$s / %2$s" + "სისტემის აპების ჩვენება" + "ვერ შეიცვლება" + "ჩართულია" + "გამორთულია" + diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index f5498e52..f365a6cf 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -76,7 +76,7 @@ "დეინსტალაცია წარუმატებელია." "დეინსტალაცია ვერ ხერხდება, რადგან ეს პაკეტი არის მოწყობილობის აქტიური ადმინისტრატორი." "დეინსტალაცია ვერ ხორციელდება, რადგან ეს პაკეტი არის აქტიური მოწყობილობის ადმინისტრატორის მომხმარებლისათვის %1$s ." - "ეს აპი საჭიროა თქვენი %1$s პროფილისათვის და მისი დეინსტალაცია ვერ მოხერხდება." + "ეს აპი საჭიროა თქვენი სამუშაო პროფილისთვის და მისი დეინსტალაცია ვერ მოხდება." "ეს აპი საჭიროა თქვენი მოწყ. ადმინისტრატორისათვის და დეინსტალაცია ვერ გამოვა." "მოწყობილობის ადმინისტრატორების მართვა" "%1$s -ის დეინსტალაცია ვერ მოხერხდა." @@ -92,7 +92,33 @@ "უარყოფა" "%1$s სულ %2$s-დან" "აძლევთ ნებას აპს %1$s შეასრულოს %2$s?" + "აპები" "აპის უფლებები" "აღარასოდეს შემეკითხოს" "ნებართვები არ არის" + "დამატებითი ნებართვები" + + %1$d კიდევ + %1$d კიდევ + + "ეს აპი Android-ის ძველი ვერსიისთვის შეიქმნა. ნებართვის უარყოფამ შესაძლოა მისი არასათანადო ფუნქციონირება გამოიწვიოს." + "უცნობი ქმედების შესრულება" + "%1$d/%2$d დაშვებული აპიდან" + "სისტემის ჩვენება" + "სისტემური პროცესების დამალვა" + "%1$s-ის ნებართვები" + "აპები არ არის" + "მდებარეობის პარამეტრები" + "%1$s არის მდებარეობის სერვისების მომწოდებელი ამ მოწყობილობისთვის. მდებარეობაზე წვდომის შეცვლა შესაძლებელია მდებარეობის პარამეტრებიდან." + "ამ ნებართვის უარყოფის შემთხვევაში, თქვენი მოწყობილობის ძირითადმა ფუნქციებმა შესაძლოა სათანადოდ აღარ იმუშაოს." + "შეესაბამება წესს" + "იტვირთება..." + "ყველა ნებართვა" + "აპის სხვა შესაძლებლობები" + "ნებართვის მოთხოვნა" + "ეკრანის გადაფარვა გამოვლინდა" + "ამ ნებართვის პარამეტრის შესაცვლელად, ჯერ უნდა გამორთოთ ეკრანის გადაფარვა პარამეტრებიდან > აპებიდან" + "პარამეტრების გახსნა" + "Android Wear" + "ინსტალაციის/დეინსტალაციის მოქმედებები არ არის მხარდაჭერილი Wear-ზე." diff --git a/res/values-kk-rKZ-television/strings.xml b/res/values-kk-rKZ-television/strings.xml new file mode 100644 index 00000000..6dc02cbe --- /dev/null +++ b/res/values-kk-rKZ-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Тыйым салу және қайтадан сұрамау" + "Мұны кейінірек \"Параметрлер\" және \"Қолданбалар\" ішінен өзгертуге болады" + "%1$s / %2$s" + "Жүйелік қолданбаларды көрсету" + diff --git a/res/values-kk-rKZ-watch/strings.xml b/res/values-kk-rKZ-watch/strings.xml new file mode 100644 index 00000000..dfff10bf --- /dev/null +++ b/res/values-kk-rKZ-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Тыйым салу, қайтадан сұрамау" + "%1$s / %2$s" + "Жүйелік қолданбаларды көрсету" + "Өзгерту мүмкін емес" + "ҚОСЫЛҒАН" + "ӨШІРІЛГЕН" + diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 0c308563..c450d48b 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -16,10 +16,10 @@ - "Жинақ орнатқыш" + "Бума орнатқыш" "Келесі" "Орнату" - "Орындалды" + "Дайын" "Бұл қолданбаға келесі нәрселереге рұқсат беріңіз:" "Бас тарту" "Белгісіз" @@ -75,7 +75,7 @@ "Алып тастау сәтсіздікке ұшырады." "Алып тастау мүмкін емес, себебі бұл жинақ құрылғының қосылып тұрған әкімшісі." "Жою мүмкін емес, өйткені бұл бума %1$s пайдаланушысының белсенді құрылғы әкімшісі болып табылады." - "Бұл қолданба %1$s профиліңіз үшін қажет және оны жою мүмкін емес." + "Бұл қолданба жұмыс профиліңіз үшін қажет және оны жою мүмкін емес." "Әкімші осы қолданбаны талап етеді және оны жою мүмкін емес." "Құрылғы әкімшілерін басқару" "%1$s қолданбасын алып тастау мүмкін емес." @@ -91,7 +91,33 @@ "Қабылдамау" "%2$s/%1$s" "%1$s қолданбасына %2$s рұқсатын бересіз бе?" + "Қолданбалар" "Қолданба рұқсаттары" "Қайтадан сұрамау" "Рұқсат жоқ" + "Қосымша рұқсаттар" + + Тағы %1$d + Тағы %1$d + + "Бұл қолданба Android жүйесінің ескі нұсқасына арналған. Рұқсаттан бас тартсаңыз, бұдан былай тиісінше жұмыс істемеуі мүмкін." + "белгісіз әрекетті орындау" + "%1$d/%2$d қолданбаға рұқсат етілген" + "Жүйені көрсету" + "Жүйені жасыру" + "%1$s рұқсаттары" + "Қолданбалар жоқ" + "Орынды анықтау параметрлері" + "%1$s — осы құрылғыға орынды анықтау қызметтерін көрсететін қолданба. Орынды пайдалану мүмкіндігін орынды анықтау параметрлерінде өзгертуге болады." + "Бұл рұқсатты бермесеңіз, құрылғының негізгі функциялары енді көзделгендей жұмыс істемеуі мүмкін." + "Саясат арқылы қолданылған" + "Жүктелуде…" + "Барлық рұқсаттар" + "Басқа қолданба мүмкіндіктері" + "Рұқсат сұрау" + "Экранды қабаттастыру анықталды" + "Бұл рұқсат параметрін өзгерту үшін алдымен «Параметрлер» > «Қолданбалар» тармағында экранды қабаттастыруды өшіру керек" + "Параметрлерді ашу" + "Android Wear" + "Wear құрылғысында \"Орнату\"/\"Жою\" әрекеттеріне қолдау көрсетілмейді." diff --git a/res/values-km-rKH-television/strings.xml b/res/values-km-rKH-television/strings.xml new file mode 100644 index 00000000..a4e80094 --- /dev/null +++ b/res/values-km-rKH-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "បដិសេធ ហើយកុំសួរម្តងទៀត" + "អ្នកអាចប្តូរវាពេលក្រោយនៅក្នុងការកំណត់ > កម្មវិធី" + "%1$s / %2$s" + "បង្ហាញកម្មវិធីប្រព័ន្ធ" + diff --git a/res/values-km-rKH-watch/strings.xml b/res/values-km-rKH-watch/strings.xml new file mode 100644 index 00000000..1beebfdb --- /dev/null +++ b/res/values-km-rKH-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "បដិសេធ សូមកុំសួរម្តងទៀត" + "%1$s / %2$s" + "បង្ហាញកម្មវិធីប្រព័ន្ធ" + "មិនអាចប្តូរបានទេ" + "បានបើកដំណើរការ" + "បានបិទដំណើរការ" + diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 1ac33e37..f8958c0a 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -75,7 +75,7 @@ "ការ​លុប​បរាជ័យ។" "មិន​អាច​លុប​ព្រោះ​កញ្ចប់​នេះ​ជា​ឧបករណ៍​សកម្ម។" "មិនអាចលុបការដំឡើងទេ ពីព្រោះកញ្ចប់នេះគឺជាកម្មវិធីគ្រប់គ្រងឧបករណ៍សកម្មសម្រាប់អ្នកប្រើ %1$s។" - "កម្មវិធី​នេះ​​​ចាំបាច់​សម្រាប់​ប្រវត្តិរូប %1$s របស់​អ្នក ហើយ​មិន​អាច​លុប​បាន​ទេ។" + "កម្មវិធីនេះចាំបាច់សម្រាប់ប្រវតិ្តការងាររបស់អ្នក ហើយវាមិនអាចលុបការដំឡើងបានទេ។" "កម្មវិធីនេះត្រូវបានទាមទារដោយអ្នកគ្រប់គ្រងឧបករណ៍របស់អ្នក ហើយមិនអាចលុប​ចេញបាន​ទេ។" "គ្រប់គ្រង​អ្នក​គ្រប់គ្រង​ឧបករណ៍" "មិន​អាច​លុប %1$s ។" @@ -91,7 +91,33 @@ "បដិសេធ" "%1$s នៃ %2$s" "អនុញ្ញាតឲ្យ %1$s %2$s?" + "កម្មវិធី" "សិទ្ធិ​កម្មវិធី" "កុំសួរទៀត" "គ្មានសិទ្ធិអនុញ្ញាត" + "សិទ្ធិអនុញ្ញាតបន្ថែម" + + %1$d ទៀត + %1$d ទៀត + + "កម្មវិធីនេះត្រូវបានរចនាឡើងសម្រាប់កំណែចាស់របស់ Android។ ការបដិសេធសិទ្ធិអនុញ្ញាតអាចបណ្តាលឲ្យវាបំពេញមុខងារមិនដូចអ្វីដែលគេរំពឹងទុកតទៅទៀតទេ។" + "ប្រតិបត្តិការសកម្មភាពមិនស្គាល់" + "បានអនុញ្ញាតកម្មវិធី %1$d នៃ %2$d" + "បង្ហាញប្រព័ន្ធ" + "លាក់ប្រព័ន្ធ" + "សិទ្ធិអនុញ្ញាត %1$s" + "គ្មានកម្មវិធី" + "ការកំណត់ទីតាំង" + "%1$s គឺជាអ្នកផ្តល់សេវាកម្មទីតាំងសម្រាប់ឧបករណ៍នេះ។ ការចូលដំណើរការទីតាំងអាចកែសម្រួលបានចេញពីការកំណត់ទីតាំង។" + "ប្រសិនបើអ្នកបដិសេធសិទ្ធិអនុញ្ញាតនេះ លក្ខណៈពិសេសគោលនៃឧបករណ៍របស់អ្នកអាចមិនដំណើរការដូចដែលអ្នកចង់បានតទៅទៀតទេ។" + "អនុវត្តតាមគោលការណ៍" + "កំពុងដំណើរការ..." + "សិទ្ធិអនុញ្ញាតទាំងអស់" + "សមត្ថភាពកម្មវិធីផ្សេងទៀត" + "សំណើសុំសិទ្ធិអនុញ្ញាត" + "បានរកឃើញអេក្រង់ត្រួតគ្នា" + "ដើម្បីប្តូរការកំណត់សិទ្ធិអនុញ្ញាតនេះ ជាដំបូងអ្នកត្រូវបិទអេក្រង់ត្រួតគ្នានៅក្នុង ការកំណត់ > កម្មវិធី" + "បើកការកំណត់" + "Android Wear" + "សកម្មភាពដំឡើង/លុបការដំឡើងមិនគាំទ្រនៅលើ Wear ទេ" diff --git a/res/values-kn-rIN-television/strings.xml b/res/values-kn-rIN-television/strings.xml new file mode 100644 index 00000000..5244bdc5 --- /dev/null +++ b/res/values-kn-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ನಿರಾಕರಿಸು ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಕೇಳಬೇಡ" + "ನೀವು ಇದನ್ನು ನಂತರದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳು > ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು" + "%1$s / %2$s" + "ಸಿಸ್ಟಂ ಅಪ್ಲಿಕೇಶನ್‌‌ಗಳನ್ನು ತೋರಿಸು" + diff --git a/res/values-kn-rIN-watch/strings.xml b/res/values-kn-rIN-watch/strings.xml new file mode 100644 index 00000000..6ed8b36f --- /dev/null +++ b/res/values-kn-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ನಿರಾಕರಿಸಿ, ಮತ್ತೆ ಕೇಳಬೇಡಿ" + "%1$s / %2$s" + "ಸಿಸ್ಟಂ ಅಪ್ಲಿಕೇಶನ್‌‌ಗಳನ್ನು ತೋರಿಸು" + "ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + "ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index c3ae1fa0..298b7cfd 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -27,10 +27,10 @@ "ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲಾಗಿದೆ." "ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಇದು ಇಲ್ಲಿಗೆ ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ:" "ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ." - "ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್‍ನ ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಇಲ್ಲಿಗೆ ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ:" - "ನೀವು ಈ ಬಿಲ್ಟ್-ಇನ್-ಅಪ್ಲಿಕೇಶನ್‌ನ ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಇಲ್ಲಿಗೆ ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ:" - "ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್‍ನ ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ." - "ನೀವು ಈ ಬಿಲ್ಟ್-ಇನ್-ಅಪ್ಲಿಕೇಶನ್‌ನ ನವೀಕೃತ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ." + "ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್‍ನ ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಇಲ್ಲಿಗೆ ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ:" + "ನೀವು ಈ ಬಿಲ್ಟ್-ಇನ್-ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಇಲ್ಲಿಗೆ ಪ್ರವೇಶ ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ:" + "ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್‍ನ ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ." + "ನೀವು ಈ ಬಿಲ್ಟ್-ಇನ್-ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಪ್‌ಡೇಟ್‌‌ ಆದ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ." "ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ." "ಪ್ಯಾಕೇಜ್ ಹಾನಿಗೀಡಾಗಿರುವಂತೆ ತೋರುತ್ತಿದೆ." "ಸಂಘರ್ಷನೀಯ ಸಹಿಯನ್ನು ಹೊಂದಿರುವ ಮತ್ತದೇ ಹೆಸರಿನ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಈಗಾಗಲೇ ಸ್ಥಾಪಿಸಲಾಗಿದೆ." @@ -75,7 +75,7 @@ "ಅಸ್ಥಾಪನೆ ವಿಫಲವಾಗಿದೆ." "ಈ ಪ್ಯಾಕೇಜ್ ಸಕ್ರಿಯ ಸಾಧನ ನಿರ್ವಾಹಕವಾಗಿರುವ ಕಾರಣ ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ." "ಈ ಪ್ಯಾಕೇಜ್ %1$s ಬಳಕೆದಾರರಿಗೆ ಸಕ್ರಿಯವಾದ ಸಾಧನ ನಿರ್ವಾಹಕವಾಗಿರುವ ಕಾರಣ ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." - "ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ನಿಮ್ಮ %1$s ಪ್ರೊಫೈಲ್‌‌ನ ಅಗತ್ಯವಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." + "ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌‌ನ ಅಗತ್ಯವಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸಾಧನ ನಿರ್ವಾಹಕರಿಗೆ ಅಗತ್ಯವಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಸಾಧನದ ನಿರ್ವಾಹಕರನ್ನು ನಿರ್ವಹಿಸು" "%1$s ಅನ್ನು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." @@ -90,8 +90,34 @@ "ಅನುಮತಿಸು" "ನಿರಾಕರಿಸು" "%2$s ರಲ್ಲಿ %1$s" - "%1$s ಅಪ್ಲಿಕೇಶನ್‌ಗೆ %2$s ಕ್ರಮ ಅನುಮತಿಸುವುದೇ?" + "%2$s %1$s ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುವುದೇ?" + "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" "ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಗಳು" "ಎಂದಿಗೂ ಮತ್ತೊಮ್ಮೆ ಕೇಳಬೇಡಿ" "ಯಾವುದೇ ಅನುಮತಿಗಳಿಲ್ಲ" + "ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು" + + %1$d ಇನ್ನಷ್ಟು + %1$d ಇನ್ನಷ್ಟು + + "ಈ ಅಪ್ಲಿಕೇಶನ್ Android ನ ಹಳೆಯ ಆವೃತ್ತಿಗೆ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿತ್ತು. ಅನುಮತಿ ನಿರಾಕರಿಸುವಿಕೆ ಇನ್ನು ಮುಂದೆ ಉದ್ದೇಶಿಸಲ್ಪಟ್ಟಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸದೆ ಇರುವುದಕ್ಕೆ ಇದು ಕಾರಣವಾಗಬಹುದು." + "ಅಜ್ಞಾತ ಕ್ರಿಯೆಯನ್ನು ಮಾಡಿ" + "%2$d ನಲ್ಲಿ %1$d ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ" + "ಸಿಸ್ಟಂ ತೋರಿಸು" + "ಸಿಸ್ಟಮ್ ಮರೆಮಾಡು" + "%1$s ಅನುಮತಿಗಳು" + "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಇಲ್ಲ" + "ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" + "%1$s ಅಪ್ಲಿಕೇಶನ್ ಈ ಸಾಧನಕ್ಕೆ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಮಾರ್ಪಡಿಸಬಹುದು." + "ನೀವು ಈ ಅನುಮತಿಯನ್ನು ನಿರಾಕರಿಸಿದರೆ, ಇನ್ನು ಮುಂದೆ ನಿಮ್ಮ ಸಾಧನದ ಮೂಲ ವೈಶಿಷ್ಟ್ಯಗಳು ಉದ್ದೇಶಿದಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು." + "ನೀತಿಯ ಮೂಲಕ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ" + "ಲೋಡ್ ಆಗುತ್ತಿದೆ..." + "ಎಲ್ಲ ಅನುಮತಿಗಳು" + "ಇತರ ಅಪ್ಲಿಕೇಶನ್ ಸಾಮರ್ಥ್ಯಗಳು" + "ಅನುಮತಿ ವಿನಂತಿ" + "ಪರದೆ ಆವರಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ" + "ಈ ಅನುಮತಿ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು, ನೀವು ಮೊದಲು ಸೆಟ್ಟಿಂಗ್‌ಗಳು > ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಂದ ಪರದೆ ಆವರಿಸಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಬೇಕು" + "ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ತೆರೆಯಿರಿ" + "Android Wear" + "ಸ್ಥಾಪಿಸುವಿಕೆ/ಅಸ್ಥಾಪಿಸುವಿಕೆ ಕ್ರಿಯೆಗಳು Wear ನಲ್ಲಿ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." diff --git a/res/values-ko-television/strings.xml b/res/values-ko-television/strings.xml new file mode 100644 index 00000000..cc85a89a --- /dev/null +++ b/res/values-ko-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "거부 및 다시 묻지 않음" + "설정 > 앱에서 나중에 변경할 수 있습니다." + "%2$s개 중 %1$s" + "시스템 앱 보기" + diff --git a/res/values-ko-watch/strings.xml b/res/values-ko-watch/strings.xml new file mode 100644 index 00000000..0bdafac3 --- /dev/null +++ b/res/values-ko-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "거부 및 다시 묻지 않음" + "%1$s/%2$s" + "시스템 앱 보기" + "변경할 수 없음" + "사용" + "사용 안함" + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index b3a510c5..d4bd8cf9 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -75,7 +75,7 @@ "제거하지 못했습니다." "이 패키지는 사용 중인 기기 관리자이기 때문에 제거할 수 없습니다." "이 패키지는 %1$s님이 사용 중인 기기 관리자이기 때문에 제거할 수 없습니다." - "이 앱은 %1$s님의 프로필에 필요하므로 제거할 수 없습니다." + "이 앱은 직장 프로필에 필요하므로 삭제할 수 없습니다." "이 앱은 기기 관리자에게 필요하므로 제거할 수 없습니다." "기기 관리자 관리" "%1$s 앱을 제거할 수 없습니다." @@ -90,8 +90,34 @@ "허용" "거부" "%1$s/%2$s" - "%1$s%2$s 작업 수행을 허용하시겠습니까?" + "%1$s의 다음 작업을 허용하시겠습니까? %2$s" + "앱" "앱 권한" "다시 묻지 않기" "권한이 없음" + "추가 권한" + + %1$d개 더보기 + %1$d개 더보기 + + "이 앱은 Android 이전 버전에 맞게 설계되었습니다. 권한을 거부하면 정상적으로 작동하지 않을 수 있습니다." + "알 수 없는 작업 수행" + "%1$d/%2$d개 앱 허용됨" + "시스템 표시" + "시스템 숨기기" + "%1$s 권한" + "앱 없음" + "위치 설정" + "이 기기의 위치 서비스 제공업체는 %1$s입니다. 위치 정보 액세스는 위치 설정에서 수정할 수 있습니다." + "이 권한을 거부하는 경우 기기의 기본 기능이 제대로 작동하지 않을 수 있습니다." + "정책에 의해 시행됨" + "로드 중..." + "모든 권한" + "다른 앱 기능" + "권한 요청" + "화면 오버레이 감지됨" + "이 권한 설정을 변경하려면 먼저 설정 > 앱에서 화면 오버레이를 사용하지 않도록 설정해야 합니다." + "설정 열기" + "Android Wear" + "Wear에서 지원하지 않는 설치/제거 작업입니다." diff --git a/res/values-ky-rKG-television/strings.xml b/res/values-ky-rKG-television/strings.xml new file mode 100644 index 00000000..8ff2a828 --- /dev/null +++ b/res/values-ky-rKG-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Баш тартам жана экинчи суралбасын" + "Муну кийин Жөндөөлөр > Колдонмолордон өзгөртө аласыз" + "%1$s / %2$s" + "Тутум колдонмолорун көрсөтүү" + diff --git a/res/values-ky-rKG-watch/strings.xml b/res/values-ky-rKG-watch/strings.xml new file mode 100644 index 00000000..74a3b8b3 --- /dev/null +++ b/res/values-ky-rKG-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Баш тарам, экинчи суралбасын" + "%1$s / %2$s" + "Тутум колдонмолорун көрсөтүү" + "Өзгөртүүгө болбойт" + "ИШТЕТИЛГЕН" + "ӨЧҮРҮЛГӨН" + diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 36531533..c1ebdde4 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -16,20 +16,14 @@ - - + "Топтом орноткуч" "Кийинки" - - - - + "Орнотуу" + "Даяр" "Бул колдонмого кийинки уруксаттар берилсин:" - - - - - - + "Жокко чыгаруу" + "Белгисиз" + "Орнотулууда…" "Колдонмо орнотулду." "Бул колдонмону орнотоюн дегениңиз аныкпы? Ал кийинкилерге жетки алат:" "Бул колдонмону орнотоюн дегениңиз аныкпы? Ал эч бир атайын жетки уруксаттарын талап кылбайт." @@ -38,12 +32,9 @@ "Учурда иштпе турган бул колдонмого жаңыртуу орнотоюн дегениңиз аныкпы? Сиздин сакталган берилиштериңиз өчүрүлбөйт. Ал эч бир атайын жетки уруксаттарын талап кылбайт." "Бул камтылган колдонмого жаңыртуу орнотоюн дегениңиз аныкпы? Сиздин сакталган берилиштериңиз өчүрүлбөйт. Ал эч бир атайын жетки уруксаттарын талап кылбайт." "Колдонмо орнотулган жок." - - - - - - + "Топтом бузулган окшойт." + "Аталышы окшош, бирок колтамгасы дал келбеген топтом мурунтан эле орнотулган." + "Топтом жаңыраак Android версияларында гана иштейт." "Бул колдонмо планшетиңизге шайкеш эмес." "Бул колдонмо сыналгыңызга шайкеш келбейт." "Бул колдонмо телефонуңузга шайкеш эмес." @@ -53,29 +44,23 @@ "%1$s колдонмосун планшетиңизге орнотуу мүмкүн эмес." "%1$s сыналгыңызга орнотулбай койду." "%1$s колдонмосун телефонуңузга орнотуу мүмкүн эмес." - - - - + "Ачуу" + "Орнотуу бөгөттөлгөн" "Коопсуздукту камсыздоо үчүн, планшетиңизде белгисиз булактардан келген колдонмолорду орнотуу бөгөттөлгөн." "Коопсуздукту камсыз кылуу үчн, сыналгыңызда белгисз булактардн алынгн колдонмлрду орнтуу бөгөттөлгн." "Коопсуздукту камсыздоо үчүн, телефонуңузда белгисиз булактардан келген колдонмолорду орнотуу бөгөттөлгөн." "Администраторуңуз белгисиз булактардан алынган колдонмолордун орнотулушуна жол бербейт." - - - - + "Жарайт" + "Жөндөөлөр" "Колдонмолордун жаңы булагы" "%1$s башка колдонмо орноткусу келет.\n\nАзыр жана кийин буга уруксат берилсинби?" "Колдонмолорду башкаруу" "Колдонмо алмаштырылсынбы?" "Сиз орнотуп жаткан колдонмо башка колдонмону жок кылат.\n\nМурунку колдонуучу берилиштериңиздин бардыгы сакталат." "Бул системалык колдонмо.\n\nМурунку колдонуучу берилиштериңиздин бардыгы сакталат." - - + "Бош орун жок" "%1$s колдонмосун телефонуңузга орнотуу мүмкүн эмес. Орун бошотуп, кайталап орнотуп көрүңүз." - - + "Жарайт" "Колдонмо табылган жок" "Колдонмо орнотулган колдонмолор тизмегинен табылган жок." "Колдонмону чечип салуу" @@ -85,19 +70,16 @@ "Бул колдонмо ""бардык"" колдонуучулардан алынып салынсынбы? Бул колдонмо жана анын берилиштери бул түзмөктүн ""бардык"" колдонуучуларынан алынат." "Бул колдонмону %1$s колдонуучусу үчүн орнотуудан чыгаргыңыз келеби?" "Бул колдонмону абалкы орнотулган версиясы менен алмаштырасызбы?" - - + "Чыгарылып салынууда…" "Чечилип бүттү." "Чечүү ийгиликсиз болду." "Чечүү кыйрады, анткени бул таңгак түзмөктүн учурдагы администратору." "Орнотуудан чыгара албайт, анткени бул таңгак %1$s колдонуучусунун активдүү түзмөк администратору." - "Бул түзмөк %1$s профилиңизге керек жана орнотуудан чыгаруу мүмкүн эмес." + "Бул колдонмо жумуш профилиңизге талап кылынат жана аны орнотуудан чыгаруу мүмкүн эмес." "Бул колдонмо түзмөк администраторуңузга керектелет жана орнотуудан чыгаруу мүмкүн эмес." - - + "Түзмөктүн администраторлорун башкаруу" "%1$s колдонмосун чечип салуу мүмкүн эмес." - - + "Талдоо катасы" "Таңгакты окууда маселе пайда болду." "Жаңы" "Бардыгы" @@ -108,8 +90,34 @@ "Уруксат берүү" "Жок" "%2$s ичинен %1$s" - "%1$s үчүн %2$s уруксатпы?" + "%1$s колдонмосуна %2$s уруксат берилсинби?" + "Колдонмолор" "Колдонмо уруксаттары" "Экинчи сураба" "Уруксаттар жок" + "Кошумча уруксаттар" + + Дагы %1$d + Дагы %1$d + + "Бул колдонмо эски Android версиясы үчүн түзүлгөн. Уруксат берилбесе, ал туура эмес иштеп калышы мүмкүн." + "белгисиз аракеттерди жасайт" + "%2$d ичинен %1$d колдонмого уруксат берилген" + "Тутумду көрсөтүү" + "Тутумду жашыруу" + "%1$s уруксат" + "Эч бир колдонмо жок" + "Жайгашкан жерди анктоо жөндлрү" + "%1$s - бул түзмөктөгү жайгашкан жерди аныктоо кызматынын камсыздоочусу. Жайгашкан жерди көрүү мүмкүнчүлүгүн жайгашкан жерди аныктоо жөндөөлөрүнөн өзгөртсө болот." + "Эгер бул уруксатты четке каксаңыз, түзмөгүңүздүн негизги функциялары талаптагыдай иштебей калышы мүмкүн." + "Саясат тарабынан күчүнө киргизилген" + "Жүктөлүүдө…" + "Бардык уруксаттар" + "Колдонмонун башка жөндөмдөрү" + "Уруксат суроо" + "Экран кабатталышы аныкталды" + "Бул уруксаттын жөндөөсүн өзгөртүү үчүн, адегенде Жөндөөлөр > Колдонмолордон экрандын кабатталышын өчүрүңүз" + "Жөндөөлөрдү ачуу" + "Android Тагынма" + "Орнотуу/чыгарып салуу аракеттери Тагынмада колдоого алынбайт." diff --git a/res/values-lo-rLA-television/strings.xml b/res/values-lo-rLA-television/strings.xml new file mode 100644 index 00000000..a49a8f2b --- /dev/null +++ b/res/values-lo-rLA-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ປະຕິເສດ ແລະຢ່າຖາມອີກ" + "ທ່ານສາມາດປ່ຽນແປງສິ່ງນີ້ໃນພາຍຫຼັງໄດ້ໃນການຕັ້ງຄ່າ > ແອັບ" + "%1$s / %2$s" + "ສະ​ແດງ​ແອັບ​ລະ​ບົບ" + diff --git a/res/values-lo-rLA-watch/strings.xml b/res/values-lo-rLA-watch/strings.xml new file mode 100644 index 00000000..e362c39f --- /dev/null +++ b/res/values-lo-rLA-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ປະ​ຕິ​ເສດ, ຢ່າ​ຖາມ​ອີກ" + "%1$s / %2$s" + "ສະ​ແດງ​ແອັບ​ລະ​ບົບ" + "ບໍ່​ສາ​ມາດ​ປ່ຽນ​ແປງ​ໄດ້" + "ເປີດໃຊ້ງານ​ແລ້ວ" + "ປິດໃຊ້ງານແລ້ວ" + diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 280e61bb..7c67c2ce 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -75,7 +75,7 @@ "ການຖອນການຕິດຕັ້ງບໍ່ສຳເລັດ." "ບໍ່ສາມາດຖອດການຕິດຕັ້ງໄດ້ ເນື່ອງຈາກແພັກເກດນີ້ເປັນຂອງຜູ່ເບິ່ງແຍງລະບົບອຸປະກອນ." "ບໍ່​ສາ​ມາດ​ຖອນ​ຕິດ​ຕັ້ງ​ໄດ້ ເພາະ​ວ່າ​ແພັກ​ເກດ​ນີ້​ແມ່ນ​ຜູ້​ຄວບ​ຄຸມ​ອຸ​ປະ​ກອນ​ທີ່​ເປີດ​ຢູ່​ສຳ​ລັບ​ຜູ້​ໃຊ້ %1$s." - "ແອັບຯ​ນີ້​ຕ້ອງ​ໃຊ້​ໂດຍ​ໂປຣ​ໄຟລ໌ %1$s ຂອງ​ທ່ານ​ແລະ​ບໍ່​ສາ​ມາດ​ຖອນ​ການ​ຕິດ​ຕັ້ງ​ໄດ້." + "ແອັບຯ​ນີ້​ຕ້ອງ​ໃຊ້​ໂດຍ​ໂປຣ​ໄຟລ໌ວຽກຂອງ​ທ່ານ ​ແລະ​ບໍ່​ສາ​ມາດ​ຖອນ​ການ​ຕິດ​ຕັ້ງ​ໄດ້." "​ແອັບຯ​ນີ້​ຕ້ອງ​ໃຊ້​ໂດຍ​ຜູ່​ເບິ່ງ​ແຍງ​ລະ​ບົບ​ຂອງ​ທ່ານ ແລະ​ບໍ່​ສາ​ມາດ​ຖອນ​ການ​ຕິດ​ຕັ້ງ​ໄດ້." "ຈັດການຜູ່ເບິ່ງແຍງລະບົບອຸປະກອນ" "%1$s ບໍ່ສາມາດຖອນອອກໄດ້." @@ -91,7 +91,33 @@ "ປະຕິເສດ" "%1$s ໃນ %2$s" "ອະ​ນຸ​ຍາດ​ໃຫ້ %1$sເພື່ອ​ %2$s ບໍ?" + "ແອັບ" "ການ​ອະ​ນຸ​ຍາດ​ແອັບ" "ຢ່າ​ຖາມ​ອີກ" "​ບໍ່​ມີການ​ອະ​ນຸ​ຍາດ​" + "ການ​ອະ​ນຸ​ຍາດ​​ເພີ່ມ​ເຕີມ" + + %1$d ເພີ່ມ​ເຕີມ + %1$d ເພີ່ມ​ເຕີມ + + "ແອັບ​ນີ້​ຖືກ​ອອກ​ແບບ​ມາ​ສຳ​ລັບ Android ເວີ​ຊັນ​ເກົ່າ. ການ​ປະ​ຕິ​ເສດ​ການ​ອະ​ນຸ​ຍາດ​ອາດ​ຈະ​ເຮັດ​ໃຫ້​ມັນ​ບໍ່​ເຮັດ​ວຽກ​ຕາມ​ຕ້ອງ​ການ​ໄດ້​ອີກ." + "ເຮັດ​ການ​ດຳ​ເນີນ​ການ​ທີ່​ບໍ່​ຮູ້​ຈັກ" + "%1$d ໃນ %2$d ແອັບ​ໄດ້​ຮັບ​ອະ​ນຸ​ຍາດ​ແລ້ວ" + "ສະແດງລະບົບ" + "ເຊື່ອງ​ລະ​ບົບ" + "%1$s ການອະນຸຍາດ" + "ບໍ່ມີແອັບ" + "ການຕັ້ງຄ່າ​ທີ່​ຕັ້ງ" + "%1$s ແມ່ນ​ຜູ້​ໃຫ້​ບໍ​ລິ​ການ​ເລື່ອງ​ການ​ບໍ​ລິ​ການ​ທີ່​ຕັ້ງ​ສຳ​ລັບ​ອຸ​ປະ​ກອນ​ນີ້. ການ​ເຂົ້າ​ເຖິງ​ທີ່​ຕັ້ງ​ແມ່ນ​ສາ​ມາດ​ດັດ​ແປງ​ໄດ້​ຈາກ​ການ​ຕັ້ງ​ຄ່າ​ທີ່​ຕັ້ງ." + "ຖ້າ​ທ່ານ​ປະ​ຕິ​ເສດ​ການ​ອະ​ນຸ​ຍາດ​ນີ້, ຄຸນສົມບັດໃຊ້ງານ​ພື້ນ​ຖານ​ຂອງ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ອາດ​ຈະ​ບໍ່​ເຮັດ​ໜ້າ​ທີ່​ຕາມທີ່ກຳນົດໄວ້." + "ບັງ​ຄັບ​ໃຊ້​ຕາມ​ນະ​ໂຍ​ບາຍ​ແລ້ວ" + "ກຳລັງ​ໂຫລດ..." + "ທຸກ​ການ​ອະ​ນຸ​ຍາດ" + "ຄວາມ​​ສາ​ມາດ​​ອື່ນຂອງແອັບ" + "ການຮ້ອງຂໍການອະນຸຍາດ" + "ກວດ​ພົບ​ການ​ວາງ​ຊ້ອນ​ໜ້າ​ຈໍ​ແລ້ວ" + "ເພື່ອ​ປ່ຽນ​ແປງ​ການ​ຕັ້ງ​ຄ່າ​ການ​ອະ​ນຸ​ຍາດ​ນີ້, ກ່ອນ​ອື່ນ​ໝົດ​ທ່ານ​ຕ້ອງ​ປິດ​ການ​ວາງ​ຊ້ອນ​ໜ້າ​ຈໍ​ຈາກ​ແອັບ​ການ​ຕັ້ງ​ຄ່າ" + "ເປີດການຕັ້ງຄ່າ" + "Android Wear" + "ຕິດ​ຕັ້ງ/ຖອນ​ຕິດ​ຕັ້ງ​ການ​ກະ​ທຳ​ທີ່​ບໍ່​ຮອງ​ຮັບ​ຢູ່​ໃນ Wear." diff --git a/res/values-lt-television/strings.xml b/res/values-lt-television/strings.xml new file mode 100644 index 00000000..a1c02a16 --- /dev/null +++ b/res/values-lt-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Atmesti ir daugiau neklausti" + "Tai vėliau galėsite pakeisti skiltyje „Nustatymai > Programos“" + "%1$s / %2$s" + "Rodyti sistemos programas" + diff --git a/res/values-lt-watch/strings.xml b/res/values-lt-watch/strings.xml new file mode 100644 index 00000000..c10c5e8f --- /dev/null +++ b/res/values-lt-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Atmesti, daugiau neklausti" + "%1$s / %2$s" + "Rodyti sistemos programas" + "Negalima pakeisti" + "ĮGALINTAS" + "IŠJUNGTAS" + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 45afde91..2ce9c3a2 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -75,7 +75,7 @@ "Nepavyko pašalinti." "Negalima pašalinti, nes šis paketas yra aktyvus įrenginio administratorius." "Nepavyksta pašalinti, nes šis paketas yra aktyvus naudotojo %1$s įreng. administr." - "Ši programa reikalinga jūsų %1$s profiliui ir jos negalima pašalinti." + "Šios programos reikia darbo profiliui; jos negalima pašalinti." "Ši programa reikalinga jūsų įrenginio administratoriui ir jos negalima pašalinti." "Valdyti įrenginio administratorius" "Nepavyko pašalinti „%1$s“." @@ -91,7 +91,35 @@ "Atmesti" "%1$s%2$s" "Leisti „%1$s%2$s?" + "Programos" "Programos leidimai" "Daugiau niekada neklausti" "Nėra jokių leidimų" + "Papildomi leidimai" + + Dar %1$d + Dar %1$d + Dar %1$d + Dar %1$d + + "Ši programa skirta senesnės versijos „Android“. Uždraudus leidimą ji gali nebeveikti kaip numatyta." + "atlieka nežinomą veiksmą" + "Leidžiama programų: %1$d%2$d" + "Rodyti sistemą" + "Slėpti sistemą" + "Leidimai: %1$s" + "Nėra jokių programų" + "Vietovės nustatymai" + "„%1$s“ yra šio įrenginio vietovės paslaugų teikėjas. Vietovės pasiekiamumą galima keisti vietovės nustatymuose." + "Jei uždrausite šį leidimą, pagrindinės įrenginio funkcijos gali nebeveikti, kaip numatyta." + "Reikalaujama pagal politikos nuostatas" + "Įkeliama..." + "Visi leidimai" + "Kitos programos galimybės" + "Leidimo užklausa" + "Aptikta ekrano perdanga" + "Jei norite pakeisti šį leidimo nustatymą, pirmiausia turite išjungti ekrano perdangą skiltyje „Nustatymai > Programos“" + "Atidaryti nustatymus" + "Android Wear" + "Diegimo / pašalinimo veiksmai nepalaikomi sistemoje „Wear“." diff --git a/res/values-lv-television/strings.xml b/res/values-lv-television/strings.xml new file mode 100644 index 00000000..d42eebe4 --- /dev/null +++ b/res/values-lv-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Noraidīt un vairs nejautāt" + "Vēlāk varat veikt izmaiņas sadaļā Iestatījumi > Lietotnes." + "%1$s. no %2$s" + "Rādīt sistēmas lietotnes" + diff --git a/res/values-lv-watch/strings.xml b/res/values-lv-watch/strings.xml new file mode 100644 index 00000000..aeb3c045 --- /dev/null +++ b/res/values-lv-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Neatļaut un vairs nejautāt" + "%1$s. no %2$s" + "Rādīt sistēmas lietotnes" + "Nevar mainīt" + "IESPĒJOTS" + "ATSPĒJOTS" + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 83bddc38..718c5a5f 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -75,7 +75,7 @@ "Atinstalēšana neizdevās." "Nevar atinstalēt, jo ar šo pakotni tiek veikta ierīces administrēšana." "Nevar atinstalēt, jo pakotne ietver aktīvu ierīces administratoru lietotājam %1$s." - "Šī lietotne ir nepieciešama jūsu %1$s profilam, un to nevar atinstalēt." + "Šī lietotne ir nepieciešama jūsu darba profilam, tāpēc to nevar atinstalēt." "Ierīces administrators ir noteicis, ka lietotne ir obligāta un to nevar atinstalēt." "Pārvaldīt ierīces administratorus" "Lietotni %1$s nevarēja atinstalēt." @@ -91,7 +91,34 @@ "Neatļaut" "%1$s. no %2$s" "Vai atļaut lietotnei %1$s %2$s?" + "Lietotnes" "Lietotnes atļaujas" "Vairs nejautāt" "Nav atļauju" + "Papildu atļaujas" + + Vēl %1$d + Vēl %1$d + Vēl %1$d + + "Šī lietotne ir paredzēta vecākai Android versijai. Ja noraidīsiet atļauju, iespējams, netiks nodrošināta paredzētā lietotnes darbība." + "veikt nezināmu darbību" + "Atļautas %1$d lietotnes no %2$d" + "Rādīt sistēmas lietotnes" + "Slēpt sistēmas lietotnes" + "Lietotnes %1$s atļaujas" + "Nav lietotņu" + "Atrašanās vietas iestatījumi" + "%1$s nodrošina šai ierīcei atrašanās vietu pakalpojumus. Piekļuves iestatījumus atrašanās vietas datiem var mainīt atrašanās vietas iestatījumos." + "Ja nepiešķirsiet šo atļauju, ierīces pamatfunkcijas, iespējams, vairs nedarbosies, kā paredzēts." + "Īstenota saskaņā ar politiku" + "Notiek ielāde..." + "Visas atļaujas" + "Citas lietotnes atļaujas" + "Atļaujas pieprasījums" + "Konstatēts ekrāna pārklājums" + "Lai mainītu šo atļaujas iestatījumu, vispirms sadaļā “Iestatījumi un lietotnes” izslēdziet ekrāna pārklājumu." + "Atvērt iestatījumus" + "Android Wear" + "Wear ierīcē netiek atbalstīta instalēšana/atinstalēšana." diff --git a/res/values-mk-rMK-television/strings.xml b/res/values-mk-rMK-television/strings.xml new file mode 100644 index 00000000..74425713 --- /dev/null +++ b/res/values-mk-rMK-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Одбиј и не прашувај повторно" + "Може да го промените ова подоцна во Поставки > Апликации" + "%1$s/%2$s" + "Прикажи ги системските апликации" + diff --git a/res/values-mk-rMK-watch/strings.xml b/res/values-mk-rMK-watch/strings.xml new file mode 100644 index 00000000..d23ce70d --- /dev/null +++ b/res/values-mk-rMK-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Одбиј, не прашувај повторно" + "%1$s/%2$s" + "Прикажи ги системските апликации" + "Не може да се смени" + "ОВОЗМОЖЕНО" + "ОНЕВОЗМОЖЕНО" + diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index fba8f899..c7cac3f8 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -51,7 +51,7 @@ "За безбедност, вашиот телефон е подесен да блокира инсталирање апликации добиени од непознати извори." "Вашиот администратор не дозволува инсталација на апликации добиени од непознати извори." "Во ред" - "Подесувања" + "Поставки" "Нов извор за апликации" "%1$s сака да инсталира други апликации.\n\nДозволи го ова сега и во иднина?" "Управувај со апликации" @@ -75,7 +75,7 @@ "Деинсталирањето е неуспешно." "Не може да се деинсталира зашто овој пакет е активен администратор на уред." "Не може да се деинсталира бидејќи пакетот е активен администратор на уред за корисникот %1$s." - "Апликацијата е потребна за вашиот профил %1$s и не може да се деинсталира." + "Оваа апликација е потребна за вашиот работен профил и не може да се деинсталира." "Апликацијата ја бара администраторот на вашиот уред и не може да се деинсталира." "Управувај со администратори на уредот" "%1$s не може да се деинсталира." @@ -91,7 +91,33 @@ "Одбиј" "%1$s од %2$s" "Дозволете %1$s да %2$s?" + "Апликации" "Дозволи за апликацијата" "Никогаш не прашувај повторно" "Нема дозволи" + "Дополнителни дозволи" + + Уште %1$d + Уште %1$d + + "Оваа апликација е дизајнирана за постара верзија на Android. Одбивањето на дозволата може да предизвика веќе да не функционира како што треба." + "изврши непознато дејство" + "Дозволени се %1$d од %2$d апликации" + "Прикажи систем" + "Сокриј систем" + "%1$s дозволи" + "Нема апликации" + "Поставки за локација" + "%1$s е давател на услуги според локација за овој уред. Пристапот до локацијата може да се смени од Поставките за локација." + "Ако ја одбиете оваа дозвола, основните функции на вашиот уред можеби веќе нема да функционираат како што треба." + "Наложено од политиката" + "Се вчитува..." + "Сите дозволи" + "Други можности на апликацијата" + "Барање дозвола" + "Откривме преклопување на екранот" + "За да ја измените оваа поставка за дозвола, прво мора да го исклучите преклопувањето на екранот од Поставки > Апликации" + "Отвори поставки" + "Android Wear" + "Дејствата инсталирај/деинсталирај не се поддржани на Wear." diff --git a/res/values-ml-rIN-television/strings.xml b/res/values-ml-rIN-television/strings.xml new file mode 100644 index 00000000..284fe16d --- /dev/null +++ b/res/values-ml-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "നിരസിക്കുക, വീണ്ടും ആവശ്യപ്പെടരുത്" + "പിന്നീട് നിങ്ങൾക്കിത് ക്രമീകരണവും ആപ്സും എന്നതിൽ മാറ്റാനാകും" + "%1$s / %2$s" + "സിസ്റ്റം ആപ്‌സ് കാണിക്കുക" + diff --git a/res/values-ml-rIN-watch/strings.xml b/res/values-ml-rIN-watch/strings.xml new file mode 100644 index 00000000..b5056315 --- /dev/null +++ b/res/values-ml-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "നിരസിക്കുക, വീണ്ടും ആവശ്യപ്പെടരുത്" + "%1$s / %2$s" + "സിസ്റ്റം ആപ്‌സ് കാണിക്കുക" + "മാറ്റാനാവില്ല" + "പ്രവർത്തനക്ഷമമാക്കി" + "പ്രവർത്തനരഹിതമാക്കി" + diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 910aba16..7436447b 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -75,7 +75,7 @@ "അൺഇൻസ്റ്റാളുചെയ്തു." "ഈ പാക്കേജ് ഒരു സജീവ ഉപകരണ അഡ്‌മിനിസ്‌ട്രേറ്റർ ആയതിനാൽ അൺഇൻസ്റ്റാളുചെയ്യാനായില്ല." "%1$s എന്ന ഉപയോക്താവിനുള്ള ഒരു സജീവ ഉപകരണ അഡ്‌മിനിസ്‌ട്രേറ്ററായതിനാൽ ഈ പാക്കേജ് അൺഇൻസ്‌റ്റാളുചെയ്യാനാകില്ല." - "നിങ്ങളുടെ %1$s പ്രൊഫൈലിന് ഈ അപ്ലിക്കേഷൻ ആവശ്യമുള്ളതിനാൽ ഇത് അൺഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല." + "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിന് ഈ അപ്ലിക്കേഷൻ ആവശ്യമുള്ളതിനാൽ അത് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല." "നിങ്ങളുടെ ഉപകരണ അഡ്മിനിസ്ട്രേറ്ററിന് ഈ അപ്ലിക്കേഷൻ ആവശ്യമുള്ളതിനാൽ ഇത് അൺഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല." "ഉപകരണ അഡ്മിനിസ്ട്രേറ്റർമാരെ നിയന്ത്രിക്കുക" "%1$s അൺഇൻസ്റ്റാളുചെയ്യാനായില്ല." @@ -90,8 +90,34 @@ "അനുവദിക്കുക" "നിരസിക്കുക" "%1$s / %2$s" - "%1$s എന്നതിനെ %2$s ചെയ്യാൻ അനുവദിക്കണോ?" - "അപ്ലിക്കേഷൻ അനുമതികൾ" + "%1$s ആപ്പിനെ %2$s എന്നതിന് അനുവദിക്കണോ?" + "ആപ്സ്" + "ആപ്പ് അനുമതികൾ" "വീണ്ടും ചോദിക്കരുത്" "അനുമതികൾ ഇല്ല" + "അധിക അനുമതികൾ" + + %1$d എണ്ണം കൂടി + %1$d എണ്ണം കൂടി + + "ഈ ആപ്പ് Android-ന്റെ പഴയ പതിപ്പിനായാണ് രൂപകൽപ്പന ചെയ്‌തിരിക്കുന്നത്. അനുമതി നിരസിക്കുന്നത് തുടർന്ന് ഉദ്ദേശിച്ചവിധം പ്രവർത്തിക്കാതിരിക്കാനിടയാക്കുന്നു." + "ഒരു അജ്ഞാതപ്രവർത്തനം നടത്തുക" + "%1$d / %2$d ആപ്പ്‌സ് അനുവദനീയം" + "സിസ്റ്റം കാണിക്കുക" + "സിസ്റ്റം മറയ്‌ക്കുക" + "%1$s അനുമതികൾ" + "ആപ്സ് ഒന്നുമില്ല" + "ലൊക്കേഷൻ ക്രമീകരണം" + "ഈ ഉപകരണത്തിനായുള്ള ലൊക്കേഷൻ സേവനങ്ങളുടെ ദാതാവ് %1$s ആണ്. ലൊക്കേഷൻ ക്രമീകരണത്തിൽ നിന്ന് ലൊക്കേഷൻ ആക്സസ് പരിഷ്കരിക്കാവുന്നതാണ്." + "നിങ്ങൾ ഈ അനുമതി നിഷേധിക്കുന്നുവെങ്കിൽ, നിങ്ങളുടെ ഉപകരണത്തിന്റെ അടിസ്ഥാന ഫീച്ചറുകൾ ഉദ്ദേശിച്ചത് പോലെ തുടർന്ന് പ്രവർത്തിച്ചേക്കില്ല." + "നയം മുഖേനെ നടപ്പിലാക്കിയത്" + "ലോഡുചെയ്യുന്നു..." + "എല്ലാ അനുമതികളും" + "മറ്റ് ആപ്പ് ശേഷികൾ" + "അനുമതി അഭ്യർത്ഥന" + "സ്ക്രീൻ ഓവർലേ കണ്ടെത്തി" + "ഈ അനുമതി ക്രമീകരണം മാറ്റുന്നതിന്, ക്രമീകരണം > ആപ്സ് എന്നതിൽ നിന്ന് നിങ്ങളാദ്യം സ്ക്രീൻ ഓവർലേ ഓഫാക്കേണ്ടതാണ്" + "ക്രമീകരണം തുറക്കുക" + "Android Wear" + "ഇൻസ്റ്റാളോ അൺഇൻസ്റ്റാളോ ചെയ്യുന്നതിന് Wear-ൽ പിന്തുണയില്ല." diff --git a/res/values-mn-rMN-television/strings.xml b/res/values-mn-rMN-television/strings.xml new file mode 100644 index 00000000..f97debf8 --- /dev/null +++ b/res/values-mn-rMN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Taтгалзаад дахин бүү асуугаарай" + "Та дараа үүнийг Toхиргоо & Апп дотроос солих боломжтой" + "%1$s / %2$s" + "Системийн апп-ыг харуулах" + diff --git a/res/values-mn-rMN-watch/strings.xml b/res/values-mn-rMN-watch/strings.xml new file mode 100644 index 00000000..38c8c9a2 --- /dev/null +++ b/res/values-mn-rMN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Татгалзах, дахин бүү асуугаарай" + "%1$s / %2$s" + "Системийн апп-ыг харуулах" + "Өөрчлөх боломжгүй" + "ИДЭВХЖҮҮЛСЭН" + "ИДЭВХГҮЙ БОЛГОСОН" + diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index c9a4ba55..c7d5431e 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -75,7 +75,7 @@ "Устгалт амжилтгүй болов." "Энэ багц нь идэвхтэй төхөөрөмжийн админ тул устгаж болохгүй." "Энэ багц бол %1$s хэрэглэгчийн хувьд төхөөрөмжийн идэвхтэй администратор нь учраас устгах боломжгүй байна." - "Энэ апп таны %1$s профайлд шаардлагатай бөгөөд устгах боломжгүй." + "Энэ апп таны профайлд шаардлагатай бөгөөд устгах боломжгүй." "Энэ апп нь таны төхөөрөмжийн админд шаардлагатай бөгөөд устгах боломжгүй." "Төхөөрөмжийн админуудыг удирдах" "%1$s-г устгаж чадсангүй." @@ -91,7 +91,33 @@ "Татгалзах" "%2$s-ийн %1$s" "%1$s%2$s-ийг зөвшөөрөх үү?" + "Апп" "Апп зөвшөөрөл" "Дахиад хэзээ ч битгий асуу" "Зөвшөөрөлгүй байна" + "Нэмэлт зөвшөөрөл" + + %1$d бусад + %1$d бусад + + "Энэхүү аппыг нь Android-ын хуучин хувилбарт зориулсан. Зөвшөөрлийг үгүйсгэх нь цаашид ажиллахгүй болгож болно." + "Танигдаагүй үйлдлийг гүйцэтгэх" + "%2$d-аас %1$d апп-ыг зөвшөөрдөг" + "Системийг харуулах" + "Системийг нуух" + "%1$s зөвшөөрөл" + "Апп байхгүй" + "Байршлын тохиргоо" + "%1$s нь энэ төхөөрөмжийн байршлын үйлчилгээ үзүүлэгч юм. Байршилд хандалтыг байршлын тохиргоо хэсгээс өөрчилж болно." + "Хэрэв та энэ зөвшөөрөлд татгалзсан тохиолдолд таны төхөөрөмжийн үндсэн функц нь алдаатай ажиллаж магадгүй." + "Бодлогын дагуу хэрэгжсэн" + "Ачаалж байна..." + "Бүх зөвшөөрөл" + "Бусад апп-ын боломж" + "Зөвшөөрлийн хүсэлт" + "Дэлгэцийн давхарга илрүүллээ" + "Зөвшөөрлийн тохиргоог өөрчлөхийн тулд, эхлээд Тохиргоо ба Апп хэсгээс дэлгэцийн давхаргыг унтраана уу." + "Тохиргоог нээх" + "Android Wear" + "Суулгах/Устгах үйлдлийг Wear дэмжээгүй." diff --git a/res/values-mr-rIN-television/strings.xml b/res/values-mr-rIN-television/strings.xml new file mode 100644 index 00000000..a4b37b02 --- /dev/null +++ b/res/values-mr-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "नकार द्या आणि पुन्हा विचारू नका" + "आपण हे नंतर सेटिंग्ज आणि अॅप्स मध्ये बदलू शकता" + "%1$s / %2$s" + "सिस्टीम अॅप्स दर्शवा" + diff --git a/res/values-mr-rIN-watch/strings.xml b/res/values-mr-rIN-watch/strings.xml new file mode 100644 index 00000000..55b6dd33 --- /dev/null +++ b/res/values-mr-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "नकार द्या, पुन्हा विचारू नका" + "%1$s / %2$s" + "सिस्टीम अॅप्स दर्शवा" + "बदलू शकत नाही" + "सक्षम केले" + "अक्षम केले" + diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 86387518..33329489 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -75,7 +75,7 @@ "विस्थापित करणे अयशस्वी." "हे पॅकेज सक्रिय डिव्हाइस प्रशासक असल्यामुळे विस्थापित करू शकत नाही." "हे पॅकेज %1$s वापरकर्त्यासाठी सक्रिय डिव्‍हाइस प्रशासक असल्‍याने विस्‍थापित करू शकत नाही." - "आपल्‍या %1$s प्रोफाईलसाठी हा अ‍ॅप आवश्‍यक आहे आणि विस्‍थापित केला जाऊ शकत नाही." + "आपल्‍या कार्य प्रोफाईलसाठी हा अ‍ॅप आवश्‍यक आहे आणि विस्थापित केला जाऊ शकत नाही." "आपल्‍या डिव्‍हाइस प्रशासकाद्वारे हा अ‍ॅप आवश्यक आहे आणि तो विस्‍थापित केला जाऊ शकत नाही." "डिव्‍हाइस प्रशासकांना व्‍यवस्‍थापित करा" "%1$s विस्थापित केला जाऊ शकला नाही." @@ -91,7 +91,33 @@ "नकार द्या" "%2$s पैकी %1$s" "%1$s ला %2$s करण्‍याची अनुमती द्यायची?" + "अॅप्स" "अॅप परवानग्या" "पुन्हा कधीही विचारू नका" "परवानग्या नाहीत" + "अतिरिक्त परवानग्या" + + आणखी %1$d + आणखी %1$d + + "हा अॅप Android च्या जुन्या आवृत्तीसाठी डिझाइन करण्यात आला होता. परवानगी नाकारल्यामुळे तो यापुढे उद्देशाप्रमाणे कार्य करणार नाही." + "अज्ञात क्रिया करा" + "%2$d पैकी %1$d अ‍ॅप्सना अनुमती दिली" + "सिस्टम दर्शवा" + "सिस्‍टीम लपवा" + "%1$s परवानग्या" + "कोणतेही अॅप्स नाहीत" + "स्थान सेटिंग्ज" + "या डिव्‍हाइससाठी %1$s स्थान सेवांचा प्रदाता आहे. स्थान प्रवेश स्थान सेटिंग्ज वरून सुधारित केला जाऊ शकतो." + "आपण ही परवानगी नाकारल्यास, आपल्‍या डिव्‍हाइसची मुलभूत वैशिष्ट्ये अपेक्षित असल्याप्रमाणे कदाचित कार्य करू शकणार नाहीत." + "धोरणाद्वारे सक्ती केली" + "लोड करत आहे..." + "सर्व परवानग्या" + "अन्य अॅप क्षमता" + "परवानगीची विनंती" + "स्क्रीन आच्छादन आढळले" + "हे परवानगी सेटिंग बदलण्‍यासाठी, आपल्‍याला सेटिंग्ज > Apps मधून स्क्रीन आच्छादन बंद करावे लागेल" + "सेटिंग्ज उघडा" + "Android Wear" + "स्थापित करा/विस्थापित करा क्रिया Wear वर समर्थित नाहीत." diff --git a/res/values-ms-rMY-television/strings.xml b/res/values-ms-rMY-television/strings.xml new file mode 100644 index 00000000..0ea0cde4 --- /dev/null +++ b/res/values-ms-rMY-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Tolak dan jangan tanya lagi" + "Anda boleh menukar ini nanti dalam Tetapan > Apl" + "%1$s / %2$s" + "Tunjukkan apl sistem" + diff --git a/res/values-ms-rMY-watch/strings.xml b/res/values-ms-rMY-watch/strings.xml new file mode 100644 index 00000000..b69b711d --- /dev/null +++ b/res/values-ms-rMY-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Tolak, jangan tanya lagi" + "%1$s / %2$s" + "Tunjukkan apl sistem" + "Tidak dpt diubah" + "DIDAYAKAN" + "DILUMPUHKAN" + diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index e62c7842..c524a9af 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -75,7 +75,7 @@ "Nyahpasang tidak berjaya." "Tidak boleh menyahpasang kerana pakej ini adalah pentadbir peranti yang aktif." "Tidak boleh menyahpasang kerana pakej ini adalah pentadbir peranti yang aktif untuk pengguna %1$s." - "Apl ini diperlukan untuk profil %1$s anda dan tidak boleh dinyahpasang." + "Apl ini diperlukan untuk profil kerja anda dan tidak boleh dinyahpasang." "Apl ini diperlukan oleh pentadbir peranti anda dan tidak boleh dinyahpasang." "Urus pentadbir peranti" "%1$s tidak dapat dinyahpasang." @@ -91,7 +91,33 @@ "Tolak" "%1$s daripada %2$s" "Benarkan %1$s untuk %2$s?" + "Apl" "Kebenaran apl" "Jangan tanya lagi" "Tiada kebenaran" + "Kebenaran tambahan" + + %1$d lagi + %1$d lagi + + "Apl ini direka bentuk untuk versi Android yang lebih lama. Tindakan menafikan kebenaran boleh menyebabkannya tidak berfungsi seperti yang dimaksudkan lagi." + "laksanakan tindakan yang tidak diketahui" + "%1$d daripada %2$d apl dibenarkan" + "Tunjukkan sistem" + "Sembunyikan sistem" + "Kebenaran %1$s" + "Tiada apl" + "Tetapan Lokasi" + "%1$s ialah pembekal perkhidmatan lokasi untuk peranti ini. Akses lokasi boleh diubah suai daripada tetapan lokasi." + "Jika anda tolak kebenaran ini, ciri asas peranti anda mungkin tidak berfungsi seperti yang dimaksudkan lagi." + "Dikuatkuasakan oleh dasar" + "Memuatkan…" + "Semua kebenaran" + "Keupayaan apl yang lain" + "Permintaan kebenaran" + "Tindanan skrin dikesan" + "Untuk menukar tetapan kebenaran ini, anda perlu mematikan tindanan skrin daripada Tetapan > Apl terlebih dahulu" + "Buka tetapan" + "Android Wear" + "Tindakan Pasang/Nyahpasang tidak disokong pada Wear." diff --git a/res/values-my-rMM-television/strings.xml b/res/values-my-rMM-television/strings.xml new file mode 100644 index 00000000..a950b7ea --- /dev/null +++ b/res/values-my-rMM-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ငြင်းဆိုပြီး ထပ်မံ မမေးပါနှင့်" + "နောင်တွင် ဤသည်အား ဆက်တင်များ > App များတွင် ပြင်နိုင်၏" + "%1$s / %2$s" + "စနစ်အပ်ဖ်များ ပြသရန်" + diff --git a/res/values-my-rMM-watch/strings.xml b/res/values-my-rMM-watch/strings.xml new file mode 100644 index 00000000..1babba21 --- /dev/null +++ b/res/values-my-rMM-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ငြင်းပယ်သည်၊ ထပ်မမေးပါနှင့်" + "%1$s / %2$s" + "စနစ်အပ်ဖ်များ ပြသရန်" + "ပြောင်းလဲ မရနိုင်ပါ" + "ဖွင့်ထား" + "ပိတ်ထား" + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 127ef149..818d349b 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -75,7 +75,7 @@ "ဖယ်ရှားမှု မအောင်မြင်ပါ" "ဤ အချက်အလက်အစုသည်လက်ရှိ စက်၏ အက်ဒ်မင် ဖြစ်နေသောကြောင့် ဖယ်ရှားလို့ မရပါ" "ဒီအထုပ်မှာ အသုံးပြုသူ%1$sအတွက် လုပ်ကိုင်နေသည့် စီမံအုပ်ချုပ်သူဖြစ်၍ ဖြုတ်မရနိုင်ပါ။" - "ဒီappမှာ သင်၏ %1$s ပရိုဖိုင် အတွက် လိုအပ်သောကြောင့် ဖြုတ်၍ မရနိုင်ပါ။" + "ဤအပ်ဖ်သည် သင့်အလုပ်ကိုယ်ရေးအချက်အလက်အတွက်လိုအပ်ပြီး ဖြုတ်၍မရနိုင်ပါ။" "ဒီappမှာ သင်၏ ကိရိယာ စီမံအုပ်ချုပ်သူက လိုအပ်သောကြောင့် ဖြုတ်၍ မရနိုင်ပါ။" "စက်ပစ္စည်းထိန်းချုပ်မှုအား စီမံရန်" "%1$s ကို ဖယ်ရှားလို့ မရပါ" @@ -90,8 +90,34 @@ "ခွင့်ပြုသည်" "ငြင်းပယ်သည်" "%1$s / %2$s" - "%1$s အား %2$s လုပ်ခွင့်ပြုသလား?" + "%1$s အား %2$s ခွင့်ပြုသလား။" + "Appများ" "App ခွင့်ပြုချက်များ" "ထပ်မမေးရန်" "ခွင့်ပြုချက်မရှိ" + "ထပ်တိုး ခွင့်ပြုချက်များ" + + နောက်ထပ် %1$d + နောက်ထပ် %1$d + + "ဤapp အား Android ၏ ဗားရှင်းဟောင်းအတွက် ပုံဆွဲရေးဆွဲထား၏။ ခွင့်ပြုချက်ပေးရန် ငြင်းဆိုပါက ရည်ရွယ်ထားသကဲ့သို့ ဆောင်ရွက်လိမ့်မည် မဟုတ်ပါ။" + "အမျိုးအမည်မသိ ဆောင်ရွက်ချက်တစ်ခု လုပ်ရန်" + "%1$d / %2$d app များ ခွင့်ပြုခဲ့၏" + "စနစ်ကိုပြသရန်" + "စနစ်ကို ဖျောက်မည်" + "%1$s ခွင့်ပြုချက်များ" + "အပ်ဖ်များမရှိ" + "တည်နေရာ ဆက်တင်များ" + "%1$s သည် ဤစက်ပစ္စည်းအတွက် တည်နေရာ ဝန်ဆောင်မှုများ ထုတ်ပေးသူဖြစ်သည်။ တည်နေရာ အသုံးပြုမှုကို တည်နေရာချိန်ညှိမှုများတွင် ပြုပြင်နိုင်သည်။" + "ဤခွင့်ပြုချက်အား သင် ငြင်းဆိုပါက၊ သင့်စက်ကိရိယာ၏ အခြေခံလုပ်ဆောင်ချက်များသည် ရည်ရွယ်ထားသကဲ့သို့ အလုပ်လုပ်မည် မဟုတ်ပါ။" + "မူဝါဒအားဖြင့်ပြဌာန်းရန်" + "တင်နေ…" + "ခွင့်ပြုချက်များ အားလုံး" + "အခြားအပ်ဖ်၏ စွမ်းရည်များ" + "ခွင့်ပြုချက် တောင်းခံမှု" + "မျက်နှာပြင် ထပ်ပေးမှုကို ရှာတွေ့ခဲ့" + "ဒီခွင့်ပြုချက် ဆက်တင်ကို ပြောင်းရန်၊ သင်ဟာ ဦးစွာ ဆက်တင်များ > Appများ ထဲတွင် မျက်နှာပြင် ထပ်ပေးမှုကို ပိတ်လိုက်ရန် လိုမယ်" + "ဆက်တင်းများ ဖွင့်ရန်" + "Android ဆောင်စရာ" + "Wear ပေါ်တွင် ထည့်သွင်းခြင်း/ဖြုတ်ခြင်း လုပ်ဆောင်ချက်များကို မပံ့ပိုးထားပါ။" diff --git a/res/values-nb-television/strings.xml b/res/values-nb-television/strings.xml new file mode 100644 index 00000000..df32fa97 --- /dev/null +++ b/res/values-nb-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Avvis, og ikke spør igjen" + "Du kan endre dette senere i Innstillinger > Apper" + "%1$s/%2$s" + "Vis systemapper" + diff --git a/res/values-nb-watch/strings.xml b/res/values-nb-watch/strings.xml new file mode 100644 index 00000000..d2c99f3f --- /dev/null +++ b/res/values-nb-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Avvis, ikke spør igjen" + "%1$s/%2$s" + "Vis systemapper" + "Kan ikke endres" + "SLÅTT PÅ" + "SLÅTT AV" + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 1e799c90..8d74eb1a 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -75,7 +75,7 @@ "Avinstalleringen mislyktes." "Kan ikke avinstallere fordi denne pakken er en aktiv enhetsadministrator." "Kan ikke avinstallere fordi denne pakken er en aktiv enhetsadministrator for brukeren %1$s." - "Denne appen er nødvendig for %1$s-profilen din og kan ikke avinstalleres." + "Denne appen er nødvendig for Work-profilen din og kan ikke avinstalleres." "Denne appen kreves av enhetsadministratoren din og kan ikke avinstalleres." "Administrer enhetsadministratorer" "%1$s kunne ikke installeres." @@ -91,7 +91,33 @@ "Ikke tillat" "%1$s av %2$s" "Vil du tillate %1$s å %2$s?" + "Apper" "Apptillatelser" "Spør aldri igjen" "Ingen tillatelser" + "Flere tillatelser" + + %1$d til + %1$d til + + "Denne appen er designet for en eldre versjon av Android. Hvis du nekter å gi tillatelse, kan det føre til at den ikke lenger fungerer etter hensikten." + "utfør en ukjent handling" + "%1$d av %2$d apper er tillatt" + "Vis systemet" + "Skjul systemet" + "%1$s tillatelser" + "Ingen apper" + "Posisjonsinnstillinger" + "%1$s er en leverandør av posisjonstjenester for denne enheten. Tilgang til posisjon kan endres fra posisjonsinnstillingene." + "Hvis du ikke gir denne tillatelsen, kan grunnleggende funksjoner på enheten slutte å fungere som de skal." + "Påkrevd ifølge retningslinjene" + "Laster inn …" + "Alle tillatelser" + "Andre appfunksjoner" + "Forespørsel om tillatelse" + "Skjermoverlegg oppdaget" + "For å endre denne tillatelsesinnstilingen må du først slå av skjermoverlegget fra Innstillinger > Apper" + "Åpne innstillingene" + "Android Wear" + "Handlingene for å installere og avinstallere er ikke støttet på Wear." diff --git a/res/values-ne-rNP-television/strings.xml b/res/values-ne-rNP-television/strings.xml new file mode 100644 index 00000000..f6c9f6b5 --- /dev/null +++ b/res/values-ne-rNP-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "अस्वीकृत गर्नुहोस् र फेरि नसोध्नुहोस्" + "तपाईँ यसलाई पछि सेटिङ > अनुप्रयोगमा बदल्न सक्नु हुन्छ" + "%1$s / %2$s" + "प्रणाली अनुप्रयोगहरू देखाउनुहोस्" + diff --git a/res/values-ne-rNP-watch/strings.xml b/res/values-ne-rNP-watch/strings.xml new file mode 100644 index 00000000..89e48dd4 --- /dev/null +++ b/res/values-ne-rNP-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "अस्वीकार गर्नुहोस्, फेरि नसोध्नुहोस्" + "%1$s / %2$s" + "प्रणाली अनुप्रयोगहरू देखाउनुहोस्" + "परिवर्तन गर्न सकिँदैन" + "सक्षम गरियो" + "असक्षम गरियो" + diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 78296397..8e0c4243 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -28,7 +28,7 @@ "के तपाईँ यो अनुप्रयोग स्थापन गर्न चाहनु हुन्छ? यसले पहुँच प्राप्त गर्ने छ:" "के तपाईँ यस अनुप्रयोगलाई जडान गर्न चाहनु हुन्छ? यसको लागि कुनै विशेष पहुँचको आवश्यकता पर्दैन।" "के तपाईँसँग अहिले भईरहेको अनुप्रयोगको एक अपडेट लाई स्थापित गर्न चाहानुहुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। अपडेट भएको अनुप्रयोग पहुँच पाउनेछ मा:" - "के तपाईं यस पूर्व-निर्मित अनुप्रयोगमा अपडेट स्थापित गर्न चाहनु हुन्छ? तपाईंको रहेको डेटा हराउने छैन। अपडेट गरिएको अनुप्रयोगले पहुँच पाउने छ:" + "के तपाईँ यस पूर्व-निर्मित अनुप्रयोगमा अपडेट स्थापित गर्न चाहनु हुन्छ? तपाईँको रहेको डेटा हराउने छैन। अपडेट गरिएको अनुप्रयोगले पहुँच पाउने छ:" "के तपाईँसँग अहिले भइरहेको अनुप्रयोगको एउटा अपडेटलाई स्थापित गर्न चाहनु हुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। यसलाई कुनै विशेष पहुँचको आवश्यकता छैन।" "के तपाईँ यस जोडिएको अनुप्रयोगको एउटा अपडेटलाई स्थापित गर्न चाहनुहुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। यसलाई कुनै विशेष पहुँचको आवश्यकता छैन।" "अनुप्रयोग स्थापना भएन।" @@ -67,7 +67,7 @@ "परिस्कारहरू अस्थापना गर्नुहोस्" "%1$s निम्न अनुप्रयोगको अंश हो:" "के तपाईँ यो अनुप्रयोग अस्थापना गर्न चाहनु हुन्छ?" - "के तपाईं यो अनुप्रयोग ""सबै"" प्रयोगकर्ताहरूको लागि स्थापना रद्द गर्न चाहनु हुन्छ? अनुप्रयोग र यसको डेटा ""सबै"" प्रयोगकर्ताहरूबाट उपकरणमा हटाइने छ।" + "के तपाईँ यो अनुप्रयोग ""सबै"" प्रयोगकर्ताहरूको लागि स्थापना रद्द गर्न चाहनु हुन्छ? अनुप्रयोग र यसको डेटा ""सबै"" प्रयोगकर्ताहरूबाट उपकरणमा हटाइने छ।" "के तपाईँ प्रयोगकर्ता %1$s को लागि यो अनुप्रयोग स्थापना रद्द गर्न चाहनुहुन्छ?" "के तपाईँ यस अनुप्रयोगलाई मूल संस्करणसँग फेर्न चाहनु हुन्छ?" "अस्थापना गर्दै..." @@ -75,7 +75,7 @@ "अस्थापना गर्न असफल" "अस्थापना गर्न सकिँदैन किनभने यो प्याकेज एउटा सक्रिय उपकरण प्रशासक हो।" "रद्द गर्न सकिदैन किनभने प्रयोगकर्ता %1$s को लागि यो प्याकेज सक्रिय यन्त्र प्रशासक हो।" - "यो अनुप्रयोग आफ्नो %1$s प्रोफाइलको लागि आवश्यक छ र स्थापना रद्द गर्न सकिँदैन।" + "यो अनुप्रयोग तपाईँको कार्य प्रोफाइलको लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।" "यो अनुप्रयोग तपाईँको उपकरण प्रशासकलाई आवश्यक छ र स्थापना रद्द गर्न सकिँदैन।" "उपकरण प्रशासकहरूको प्रबन्ध गर्नुहोस्" "%1$s स्थापना रद्द गर्न सकिँदैन।" @@ -86,12 +86,38 @@ "गोपनीयता" "उपकरण पहुँच" "यस अपडेटलाई नयाँ अनुमति आवश्यक पर्दैन।" - "के तपाईं निम्न अनुमति प्रदान गर्न चाहनु हुन्छ? यसले पहुँच पाउने छ:" + "के तपाईँ निम्न अनुमति प्रदान गर्न चाहनु हुन्छ? यसले पहुँच पाउने छ:" "अनुमति दिनुहोस्" "अस्वीकार गर्नुहोस्" "%2$s को %1$s" "%1$s लाई %2$s गर्न अनुमति दिने हो?" + "अनुप्रयोगहरू" "अनुप्रयोग अनुमतिहरू" "फेरि कहिल्यै नसोध्नुहोस्" "कुनै अनुमतिहरू छैनन्" + "अतिरिक्त अनुमतिहरू" + + %1$d थप + %1$d थप + + "यो अनुप्रयोग Android को पुरानो संस्करणका लागि डिजाइन गरिएको थियो। अनुमति अस्वीकृत गर्नाले यसले चाहिएको जस्तो कार्य नगर्न सक्छ।" + "एउटा अज्ञात कार्य गर्नुहोस्" + "%2$d को %1$d अनुप्रयोगहरूलाई अनुमति छ" + "प्रणाली देखाउनुहोस्" + "प्रणाली लुकाउनुहोस्" + "%1$s अनुमतिहरु" + "कुनै अनुप्रयोगहरू छैनन्।" + "स्थान सेटिङहरू" + "%1$s यो यन्त्रका लागि स्थान सेवाहरूको एउटा प्रदायक हो। स्थान पहुँच स्थान सेटिङहरूबाट परिमार्जन गर्न सकिन्छ।" + "तपाईँले यो अनुमति अस्वीकार गर्नुभयो भने तपाईँको यन्त्रका मूल विशेषताहरू अब चाहेअनुसार कार्य नगर्न सक्छ।" + "नीतिद्वारा लागू गरियो" + "लोड हुँदैछ..." + "सबै अनुमतिहरू" + "अन्य अनुप्रयोग क्षमताहरू" + "अनुमति अनुरोध" + "स्क्रिन ओभरले पत्ता लाग्यो" + "यो अनुमति सेटिङ परिवर्तन गर्न, तपाईँले पहिला सेटिङ अनुप्रयोगबाट स्क्रिन ओभरले बन्द गर्नु पर्दछ।" + "सेटिङहरू खोल्नुहोस्" + "Android Wear" + "Wear मा स्थापना/स्थापना रद्द गर्ने कार्यहरू समर्थित छैनन्।" diff --git a/res/values-nl-television/strings.xml b/res/values-nl-television/strings.xml new file mode 100644 index 00000000..671d58e3 --- /dev/null +++ b/res/values-nl-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Weigeren en niet meer vragen" + "U kunt dit later wijzigen in \'Instellingen\' > \'Apps\'" + "%1$s/%2$s" + "Systeem-apps weergeven" + diff --git a/res/values-nl-watch/strings.xml b/res/values-nl-watch/strings.xml new file mode 100644 index 00000000..820875e3 --- /dev/null +++ b/res/values-nl-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Weigeren, niet meer vragen" + "%1$s/%2$s" + "Systeem-apps weergeven" + "Niet aanpasbaar" + "INGESCHAKELD" + "UITGESCHAKELD" + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index d7f282f3..c2c3fe4b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -16,7 +16,7 @@ - "Installatieprogramma van pakket" + "Pakket-installatie" "Volgende" "Installeren" "Gereed" @@ -27,37 +27,37 @@ "App geïnstalleerd." "Wilt u deze app installeren? Deze krijgt toegang tot:" "Wilt u deze app installeren? Hiervoor is geen speciale toegang vereist." - "Wilt u een update voor deze bestaande app installeren? Uw huidige gegevens gaan niet verloren. De bijgewerkte app krijgt toegang tot:" - "Wilt u een update van deze ingebouwde app installeren? Uw huidige gegevens gaan niet verloren. De bijgewerkte app krijgt toegang tot:" - "Wilt u een update voor deze bestaande app installeren? Uw huidige gegevens gaan niet verloren. Hiervoor is geen speciale toegang vereist." - "Wilt u een update voor deze ingebouwde app installeren? Uw huidige gegevens gaan niet verloren. Hiervoor is geen speciale toegang vereist." + "Wilt u een update voor deze bestaande app installeren? Je huidige gegevens gaan niet verloren. De bijgewerkte app krijgt toegang tot:" + "Wilt u een update van deze ingebouwde app installeren? Je huidige gegevens gaan niet verloren. De bijgewerkte app krijgt toegang tot:" + "Wilt u een update voor deze bestaande app installeren? Je huidige gegevens gaan niet verloren. Hiervoor is geen speciale toegang vereist." + "Wilt u een update voor deze ingebouwde app installeren? Je huidige gegevens gaan niet verloren. Hiervoor is geen speciale toegang vereist." "App niet geïnstalleerd." "Het pakket lijkt beschadigd." "Een bestaand pakket met dezelfde naam en een conflicterende handtekening is al geïnstalleerd." "Het pakket werkt alleen met nieuwe versies van Android." - "Deze app is niet compatibel met uw tablet." - "Deze app is niet compatibel met uw tv." - "Deze app is niet compatibel met uw telefoon." + "Deze app is niet compatibel met je tablet." + "Deze app is niet compatibel met je tv." + "Deze app is niet compatibel met je telefoon." "Het opgegeven pakket is verwijderd voordat de installatie was voltooid." "De verificatie van het pakket is niet voltooid. Het pakket kan niet worden geïnstalleerd." "Tijdens het verifiëren van dit pakket is een time-out opgetreden. Installeer het pakket later." - "%1$s kan niet worden geïnstalleerd op uw tablet." - "%1$s kan niet worden geïnstalleerd op uw tv." - "%1$s kan niet worden geïnstalleerd op uw telefoon." + "%1$s kan niet worden geïnstalleerd op je tablet." + "%1$s kan niet worden geïnstalleerd op je tv." + "%1$s kan niet worden geïnstalleerd op je telefoon." "Openen" "De installatie is geblokkeerd" - "Voor de veiligheid blokkeert uw tablet de installatie van apps uit onbekende bronnen." - "Om veiligheidsredenen is uw tv ingesteld om de installatie te blokkeren van apps die zijn verkregen van onbekende bronnen." - "Voor de veiligheid blokkeert uw telefoon de installatie van apps uit onbekende bronnen." - "Uw beheerder staat de installatie van apps afkomstig van onbekende bronnen niet toe." + "Voor de veiligheid blokkeert je tablet de installatie van apps uit onbekende bronnen." + "Om veiligheidsredenen is je tv ingesteld om de installatie te blokkeren van apps die zijn verkregen van onbekende bronnen." + "Voor de veiligheid blokkeert je telefoon de installatie van apps uit onbekende bronnen." + "Je beheerder staat de installatie van apps afkomstig van onbekende bronnen niet toe." "OK" "Instellingen" "Nieuwe bron voor apps" "%1$s wil andere apps installeren.\n\nWilt u dit nu en in de toekomst toestaan?" "Apps beheren" "App vervangen?" - "De app die u installeert, vervangt een andere app.\n\nAl uw eerdere gebruikersgegevens worden opgeslagen." - "Dit is een systeemapp.\n\nAl uw eerdere gebruikersgegevens worden opgeslagen." + "De app die u installeert, vervangt een andere app.\n\nAl je eerdere gebruikersgegevens worden opgeslagen." + "Dit is een systeemapp.\n\nAl je eerdere gebruikersgegevens worden opgeslagen." "Geen ruimte beschikbaar" "%1$s kan niet worden geïnstalleerd. Maak ruimte vrij en probeer het opnieuw." "OK" @@ -75,8 +75,8 @@ "Verwijdering mislukt." "Kan niet verwijderen omdat dit pakket een actieve apparaatbeheerder is." "Kan dit pakket niet verwijderen omdat het een actieve apparaatbeheerder is voor de gebruiker %1$s." - "Deze app is vereist voor uw profiel %1$s en kan niet worden verwijderd." - "Deze app is vereist door uw apparaatbeheerder en kan niet worden verwijderd." + "Deze app is vereist voor je werkprofiel en kan niet worden verwijderd." + "Deze app is vereist door je apparaatbeheerder en kan niet worden verwijderd." "Apparaatbeheerders beheren" "%1$s kan niet worden verwijderd." "Parseerfout" @@ -88,10 +88,36 @@ "Voor deze update zijn geen nieuwe machtigingen vereist." "Wilt u de volgende machtigingen verlenen? Hiermee kan toegang worden verkregen tot:" "Toestaan" - "Afwijzen" + "Weigeren" "%1$s van %2$s" "Toestaan dat %1$s het volgende doet: %2$s?" - "App-rechten" + "Apps" + "App-machtigingen" "Niet meer vragen" "Geen rechten" + "Aanvullende rechten" + + Nog %1$d + Nog %1$d + + "Deze app is ontworpen voor een oudere versie van Android. Als u geen toestemming geeft, kan de app mogelijk niet functioneren zoals is bedoeld." + "een onbekende actie uitvoeren" + "Verleend aan %1$d van %2$d apps" + "Systeem-apps weergeven" + "Systeem-apps verbergen" + "%1$s rechten" + "Geen apps" + "Locatie-instellingen" + "%1$s is een leverancier van locatieservices voor dit apparaat. Locatietoegang kan worden aangepast via de locatie-instellingen." + "Als je deze toestemming weigert, kan het zijn dat basisfuncties van je apparaat niet meer werken zoals bedoeld." + "Afgedwongen door beleid" + "Laden…" + "Alle rechten" + "Andere app-mogelijkheden" + "Toestemmingsverzoek" + "Schermoverlay gedetecteerd" + "Als u deze instelling voor rechten wilt wijzigen, moet u eerst de schermoverlay uitschakelen via \'Instellingen\' > \'Apps\'" + "Instellingen openen" + "Android Wear" + "Acties voor installeren/verwijderen niet ondersteund op Wear" diff --git a/res/values-pa-rIN-television/strings.xml b/res/values-pa-rIN-television/strings.xml new file mode 100644 index 00000000..cebc66fe --- /dev/null +++ b/res/values-pa-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ਅਸਵੀਕਾਰ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ" + "ਤੁਸੀਂ ਇਸਨੂੰ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ > ਐਪਸ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ" + "%1$s / %2$s" + "ਸਿਸਟਮ ਐਪਸ ਦਿਖਾਓ" + diff --git a/res/values-pa-rIN-watch/strings.xml b/res/values-pa-rIN-watch/strings.xml new file mode 100644 index 00000000..d6cfe6c8 --- /dev/null +++ b/res/values-pa-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ਅਸਵੀਕਾਰ ਕਰੋ, ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ" + "%1$s / %2$s" + "ਸਿਸਟਮ ਐਪਸ ਦਿਖਾਓ" + "ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + "ਸਮਰਥਿਤ ਕੀਤਾ ਗਿਆ" + "ਅਸਮਰਥਿਤ ਕੀਤਾ ਗਿਆ" + diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 3537fc23..ec19acb5 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -75,7 +75,7 @@ "ਅਣਇੰਸਟੌਲ ਅਸਫਲ।" "ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਇਹ ਪੈਕੇਜ ਇੱਕ ਸਕਿਰਿਆ ਡਿਵਾਈਸ ਪ੍ਰਬੰਧਕ ਹੈ।" "ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਇਹ ਪੈਕੇਜ ਉਪਭੋਗਤਾ %1$s ਲਈ ਇੱਕ ਸਕਿਰਿਆ ਡਿਵਾਈਸ ਪ੍ਰਬੰਧਕ ਹੈ।" - "ਇਹ ਐਪ ਤੁਹਾਡੀ %1$s ਪ੍ਰੋਫਾਈਲ ਲਈ ਲੁੜੀਂਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" + "ਇਹ ਐਪ ਤੁਹਾਡੀ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਈ ਲੋੜੀਂਦੀ ਹੈ ਅਤੇ ਇਸਦੀ ਸਥਾਪਨਾ ਰੱਦ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।" "ਇਹ ਐਪ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਲੁੜੀਂਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" "ਡਿਵਾਈਸ ਪ੍ਰਬੰਧਕਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ" "%1$s ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।" @@ -91,7 +91,33 @@ "ਅਸਵੀਕਾਰ ਕਰੋ" "%2$s ਦਾ %1$s" "ਕੀ %1$s ਨੂੰ %2$s ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?" + "ਐਪਸ" "ਐਪ ਅਨੁਮਤੀਆਂ" "ਦੁਬਾਰਾ ਕਦੇ ਨਾ ਪੁੱਛਣਾ" "ਕੋਈ ਅਨੁਮਤੀਆਂ ਨਹੀਂ ਹਨ" + "ਅਤਿਰਿਕਤ ਅਨੁਮਤੀਆਂ" + + %1$d ਹੋਰ + %1$d ਹੋਰ + + "ਇਹ ਐਪ Android ਦੇ ਕਿਸੇ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਲਈ ਬਣਾਈ ਗਈ ਸੀ। ਅਨੁਮਤੀ ਨੂੰ ਇਨਕਾਰ ਕਰਨਾ ਇਸਦੇ ਉਦੇਸ਼ਿਤ ਫੰਕਸ਼ਨ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦਾ ਹੈ।" + "ਕੋਈ ਅਗਿਆਤ ਕਾਰਵਾਈ ਕਰੋ" + "%2$d ਦੇ %1$d ਐਪਸ ਦੀ ਆਗਿਆ ਦਿੱਤੀ" + "ਸਿਸਟਮ ਦਿਖਾਓ" + "ਸਿਸਟਮ ਲੁਕਾਓ" + "%1$s ਅਨੁਮਤੀਆਂ" + "ਕੋਈ ਐਪਸ ਨਹੀਂ" + "ਸਥਿਤੀ ਸੈਟਿੰਗਾਂ" + "%1$s ਇਸ ਡਿਵਾਈਸ ਲਈ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸੇਵਾਵਾਂ ਦਾ ਇੱਕ ਪ੍ਰਦਾਤਾ ਹੈ। ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਪਹੁੰਚ ਨੂੰ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸੈਟਿੰਗਾਂ ਤੋਂ ਸੰਸ਼ੋਧਿਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।" + "ਜੇਕਰ ਤੁਸੀਂ ਇਸ ਅਨੁਮਤੀ ਨੂੰ ਅਸਵੀਕਾਰ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀਆਂ ਮੂੂਲ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਆਪਣੇ ਫੰਕਸ਼ਨ ਮੁਤਾਬਕ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੀਆਂ।" + "ਨੀਤੀ ਮੁਤਾਬਕ ਲਾਗੂ ਕੀਤਾ" + "ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…" + "ਸਾਰੀਆਂ ਅਨੁਮਤੀਆਂ" + "ਹੋਰ ਐਪ ਸਮਰੱਥਤਾਵਾਂ" + "ਅਨੁਮਤੀ ਬੇਨਤੀ" + "ਸਕਰੀਨ ਓਵਰਲੇਅ ਲੱਭ ਗਿਆ" + "ਇਸ ਇਜ਼ਾਜਤ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣ ਲਈ; ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਸੈਟਿੰਗਜ਼ ਅਤੇ ਐਪਸ ਤੋਂ ਸਕ੍ਰੀਨ ਓਵਰਲੇਅ ਬੰਦ ਕਰਨਾ ਪਵੇਗਾ" + "ਸੈਟਿੰਗਜ਼ ਖੋਲ੍ਹੋ" + "Android ਵੀਅਰ" + "ਵੀਅਰ \'ਤੇ ਸਥਾਪਿਤ ਕਰੋ/ਸਥਾਪਨਾ ਰੱਦ ਕਰੋ ਕਾਰਵਾਈਆਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।" diff --git a/res/values-pl-television/strings.xml b/res/values-pl-television/strings.xml new file mode 100644 index 00000000..035832fc --- /dev/null +++ b/res/values-pl-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Odmów i nie pytaj ponownie" + "Możesz to później zmienić, wybierając Ustawienia > Aplikacje" + "%1$s/%2$s" + "Pokaż aplikacje systemowe" + diff --git a/res/values-pl-watch/strings.xml b/res/values-pl-watch/strings.xml new file mode 100644 index 00000000..2bf7d356 --- /dev/null +++ b/res/values-pl-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Odmów i nie pytaj ponownie" + "%1$s / %2$s" + "Pokaż aplikacje systemowe" + "Nie można zmienić" + "WŁ." + "WYŁĄCZONE" + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 6e2deeac..be271263 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -75,7 +75,7 @@ "Nie udało się odinstalować." "Nie można odinstalować pakietu, który jest aktywnym administratorem urządzenia." "Nie można odinstalować. Ten pakiet jest aktywnym administratorem urządzenia dla: %1$s." - "Ta aplikacja jest potrzebna w profilu %1$s i nie można jej odinstalować." + "Ta aplikacja jest potrzebna w profilu do pracy i nie można jej odinstalować." "Administrator urządzenia wymaga tej aplikacji i nie można jej odinstalować." "Zarządzaj administratorami urządzenia" "Nie można odinstalować aplikacji %1$s." @@ -91,7 +91,35 @@ "Odmów" "%1$s z %2$s" "Zezwolić aplikacji %1$s na %2$s?" + "Aplikacje" "Uprawnienia aplikacji" "Nie pytaj ponownie" "Brak uprawnień" + "Dodatkowe uprawnienia" + + Jeszcze %1$d + Jeszcze %1$d + Jeszcze %1$d + Jeszcze %1$d + + "Ta aplikacja jest na straszą wersję Androida. Jeśli odmówisz uprawnień, aplikacja może nie działać prawidłowo." + "wykonywanie nieznanych działań" + "Dozwolone: %1$d z %2$d aplikacji" + "Pokaż systemowe" + "Ukryj systemowe" + "%1$s – uprawnienia" + "Brak aplikacji" + "Ustawienia lokalizacji" + "%1$s jest dostawcą usług lokalizacyjnych dla tego urządzenia. Dostęp do danych lokalizacji można zmienić w ustawieniach lokalizacji." + "Jeśli odmówisz tych uprawnień, podstawowe funkcje urządzenia mogą nie działać prawidłowo." + "Narzucone przez zasady" + "Ładuję…" + "Wszystkie uprawnienia" + "Inne funkcje aplikacji" + "Prośba o pozwolenie" + "Wykryto nakładkę ekranową" + "Aby zmodyfikować te uprawnienia, musisz najpierw wyłączyć nakładkę ekranową, klikając Ustawienia > Aplikacje" + "Otwórz ustawienia" + "Android Wear" + "Wear nie obsługuje instalowania ani odinstalowywania." diff --git a/res/values-pt-rBR-television/strings.xml b/res/values-pt-rBR-television/strings.xml new file mode 100644 index 00000000..4c29ba52 --- /dev/null +++ b/res/values-pt-rBR-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Negar e não perguntar novamente" + "É possível alterar isso mais tarde em \"Config.\" > \"Apps\"" + "%1$s / %2$s" + "Mostrar apps do sistema" + diff --git a/res/values-pt-rBR-watch/strings.xml b/res/values-pt-rBR-watch/strings.xml new file mode 100644 index 00000000..cb228f9d --- /dev/null +++ b/res/values-pt-rBR-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Negar e não perguntar de novo" + "%1$s / %2$s" + "Mostrar apps do sistema" + "Impossível alterar" + "ATIVADA" + "DESATIVADA" + diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..ad029b0d --- /dev/null +++ b/res/values-pt-rBR/strings.xml @@ -0,0 +1,123 @@ + + + + + "Instalador do pacote" + "Próximo" + "Instalar" + "Concluído" + "Permitir que este app:" + "Cancelar" + "Desconhecido" + "Instalando..." + "App instalado." + "Deseja instalar este app? Ele terá acesso a:" + "Deseja instalar este app? Não requer acesso especial." + "Deseja instalar uma atualização para este app? Os dados existentes não serão perdidos. O app atualizado terá acesso a:" + "Deseja instalar uma atualização para este app integrado? Os dados existentes não serão perdidos. O app atualizado terá acesso a:" + "Deseja instalar uma atualização para este app existente? Seus dados existentes não serão perdidos. A atualização não requer qualquer acesso especial." + "Deseja instalar uma atualização para este app integrado? Seus dados existentes não serão perdidos. A atualização não requer qualquer acesso especial." + "O app não foi instalado." + "Parece que o pacote está corrompido." + "Um pacote existente com o mesmo nome e uma assinatura conflitante já foi instalado." + "O pacote funciona somente em versões mais recentes do Android." + "Este app não é compatível com seu tablet." + "Este app não é compatível com sua TV." + "Este app não é compatível com seu telefone." + "O pacote especificado foi excluído antes da instalação ser concluída." + "O pacote não passou pela verificação e não pôde ser instalado." + "O tempo limite foi atingido ao tentar verificar este pacote. Tente instalá-lo novamente mais tarde." + "Não foi possível instalar %1$s em seu tablet." + "Não foi possível instalar %1$s na sua TV." + "Não foi possível instalar %1$s em seu telefone." + "Abrir" + "Instalação bloqueada" + "Por segurança, o tablet está config. p/ bloquear a instalação de aplicat. de fontes desconhecidas." + "Por segurança, sua TV está configurada para bloquear a instalação de apps de fontes desconhecidas." + "Por segurança, o telefone está config. p/ bloquear a instalação de aplicat. de fontes desconhecidas." + "Seu administrador não permite a instalação de apps baixados de fontes desconhecidas." + "OK" + "Configurações" + "Nova fonte para apps" + "%1$s deseja instalar outros apps.\n\nPermitir isso agora e no futuro?" + "Gerenciar apps" + "Substituir app?" + "O app que você está instalando substituirá outro app.\n\nTodos os seus dados de usuário anteriores serão salvos." + "Este é um app do sistema.\n\nTodos os seus dados de usuário anteriores serão salvos." + "Sem espaço" + "Não foi possível instalar %1$s. Libere um pouco de espaço e tente novamente." + "OK" + "App não encontrado" + "O app não foi encontrado na lista de apps instalados." + "Desinstalar app" + "Desinstalar atualização" + "%1$s é parte do seguinte app:" + "Deseja desinstalar este app?" + "Deseja desinstalar este app para ""todos"" os usuários? O app e seus dados serão removidos para ""todos"" os usuários do dispositivo." + "Deseja desinstalar este app para o usuário %1$s?" + "Deseja substituir este app pela versão de fábrica?" + "Desinstalando..." + "Desinstalação concluída." + "Desinstalação malsucedida." + "Não é possível desinstalar um administrador de dispositivos ativo." + "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." + "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." + "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." + "Gerenciar os administradores do dispositivo" + "Não foi possível desinstalar %1$s." + "Erro de análise" + "Ocorreu um problema ao analisar o pacote." + "Novas" + "Todas" + "Privacidade" + "Acesso ao dispositivo" + "Esta atualização não requer novas permissões." + "Deseja conceder as permissões a seguir? Será concedido acesso para:" + "Permitir" + "Negar" + "%1$s de %2$s" + "Permitir que o app %1$s %2$s?" + "Apps" + "Permissões do app" + "Não perguntar novamente" + "Sem permissão" + "Permissões adicionais" + + Mais %1$d + Mais %1$d + + "Este app foi projetado para uma versão anterior do Android. Negar a permissão pode fazer com que ele deixe de funcionar conforme esperado." + "executar uma ação desconhecida" + "%1$d de %2$d apps permitidos" + "Mostrar sistema" + "Ocultar sistema" + "Permissões para %1$s" + "Nenhum app" + "Configurações de localização" + "%1$s é um provedor de serviços de localização para este dispositivo. O acesso local pode ser modificado nas configurações de localização." + "Se você negar essa permissão, recursos básicos do seu dispositivo poderão não funcionar mais como deveriam." + "Aplicável por política" + "Carregando…" + "Todas as permissões" + "Outros recursos do app" + "Solicitação de permissão" + "Sobreposição de tela detectada" + "Para alterar a configuração dessa permissão, você deve primeiro desativar a sobreposição de tela em \"Config.\" > \"Apps\"" + "Abrir configurações" + "Android Wear" + "As ações de instalar/desinstalar não são compatíveis com o Android Wear." + diff --git a/res/values-pt-rPT-television/strings.xml b/res/values-pt-rPT-television/strings.xml new file mode 100644 index 00000000..306e0661 --- /dev/null +++ b/res/values-pt-rPT-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Recusar e não perguntar novamente" + "Pode depois alterar esta definição mais tarde em Definições > Aplicações" + "%1$s/%2$s" + "Mostrar aplicações do sistema" + diff --git a/res/values-pt-rPT-watch/strings.xml b/res/values-pt-rPT-watch/strings.xml new file mode 100644 index 00000000..e8d1bda4 --- /dev/null +++ b/res/values-pt-rPT-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Recusar e não perguntar nov." + "%1$s/%2$s" + "Mostrar aplicações do sistema" + "Não pode ser alterado" + "ATIVADO" + "DESATIVADO" + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 54fe3179..5d6931b9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -75,7 +75,7 @@ "Desinstalação sem êxito." "Não é possível desinstalar porque este pacote é um admin. de aparelho ativo." "Não é poss. desinst. porque este pacote é um admin. de disp. ativos para o utiliz. %1$s." - "Esta aplicação é necessária para o seu perfil %1$s e não pode ser desinstalada." + "O perfil de trabalho necessita desta aplicação e não é possível desinstalá-la." "Esta aplic. é exigida pelo administrador do disp. e não pode ser desinstalada." "Gerir administradores de aparelhos" "Não foi possível desinstalar %1$s." @@ -91,7 +91,33 @@ "Recusar" "%1$s de %2$s" "Pretende permitir que o %1$s %2$s?" - "Autorizações da aplicação" + "Aplicações" + "Permissões da aplicação" "Nunca perguntar novamente" "Sem autorizações" + "Autorizações adicionais" + + Mais %1$d + Mais %1$d + + "Esta aplicação foi concebida para uma versão mais antiga do Android. Negar autorização pode fazer com que deixe de funcionar como pretendido." + "executar uma ação desconhecida" + "%1$d de %2$d aplicações autorizadas" + "Mostrar sistema" + "Ocultar sistema" + "Autorizações de %1$s" + "Sem aplicações" + "Definições de localização" + "O %1$s é um fornecedor de serviços de localização para este dispositivo. É possível modificar o acesso à localização a partir das definições de localização." + "Se negar esta autorização, as funcionalidades básicas do seu dispositivo podem deixar de funcionar corretamente." + "Imposta pela política" + "A carregar…" + "Todas as autorizações" + "Outras capacidades de aplicações" + "Pedido de autorização" + "Sobreposição de ecrã detetada" + "Para alterar esta definição de autorização, primeiro tem de desativar a sobreposição do ecrã em Definições > Aplicações" + "Abrir definições" + "Android Wear" + "As ações de instalar/desinstalar não são compatíveis com o Android Wear." diff --git a/res/values-pt-television/strings.xml b/res/values-pt-television/strings.xml new file mode 100644 index 00000000..4c29ba52 --- /dev/null +++ b/res/values-pt-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Negar e não perguntar novamente" + "É possível alterar isso mais tarde em \"Config.\" > \"Apps\"" + "%1$s / %2$s" + "Mostrar apps do sistema" + diff --git a/res/values-pt-watch/strings.xml b/res/values-pt-watch/strings.xml new file mode 100644 index 00000000..cb228f9d --- /dev/null +++ b/res/values-pt-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Negar e não perguntar de novo" + "%1$s / %2$s" + "Mostrar apps do sistema" + "Impossível alterar" + "ATIVADA" + "DESATIVADA" + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index f132e00a..ad029b0d 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -73,9 +73,9 @@ "Desinstalando..." "Desinstalação concluída." "Desinstalação malsucedida." - "Não é possível desinstalar, pois este pacote é um admin. de dispositivos ativo." + "Não é possível desinstalar um administrador de dispositivos ativo." "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." - "O app é necessário para seu perfil %1$s e não pode ser desinstalado." + "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." "Gerenciar os administradores do dispositivo" "Não foi possível desinstalar %1$s." @@ -90,8 +90,34 @@ "Permitir" "Negar" "%1$s de %2$s" - "Permitir que %1$s %2$s?" + "Permitir que o app %1$s %2$s?" + "Apps" "Permissões do app" "Não perguntar novamente" "Sem permissão" + "Permissões adicionais" + + Mais %1$d + Mais %1$d + + "Este app foi projetado para uma versão anterior do Android. Negar a permissão pode fazer com que ele deixe de funcionar conforme esperado." + "executar uma ação desconhecida" + "%1$d de %2$d apps permitidos" + "Mostrar sistema" + "Ocultar sistema" + "Permissões para %1$s" + "Nenhum app" + "Configurações de localização" + "%1$s é um provedor de serviços de localização para este dispositivo. O acesso local pode ser modificado nas configurações de localização." + "Se você negar essa permissão, recursos básicos do seu dispositivo poderão não funcionar mais como deveriam." + "Aplicável por política" + "Carregando…" + "Todas as permissões" + "Outros recursos do app" + "Solicitação de permissão" + "Sobreposição de tela detectada" + "Para alterar a configuração dessa permissão, você deve primeiro desativar a sobreposição de tela em \"Config.\" > \"Apps\"" + "Abrir configurações" + "Android Wear" + "As ações de instalar/desinstalar não são compatíveis com o Android Wear." diff --git a/res/values-ro-television/strings.xml b/res/values-ro-television/strings.xml new file mode 100644 index 00000000..67514279 --- /dev/null +++ b/res/values-ro-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Respingeți și nu se mai întreabă" + "Puteți modifica permisiunile ulterior din Setări > Aplicații" + "%1$s/%2$s" + "Afișează aplicațiile de sistem" + diff --git a/res/values-ro-watch/strings.xml b/res/values-ro-watch/strings.xml new file mode 100644 index 00000000..5ff2575b --- /dev/null +++ b/res/values-ro-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Respingeți; nu se mai întreabă" + "%1$s/%2$s" + "Afișează aplicațiile de sistem" + "Nu se poate modifica" + "ACTIVATĂ" + "DEZACTIVATĂ" + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index b5f60201..1f963c70 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -20,17 +20,17 @@ "Înainte" "Instalaţi" "Terminat" - "Permiteţi acestei aplicații să:" + "Permiteți acestei aplicații să:" "Anulați" "Necunoscut" "În curs de instalare..." "Aplicaţie instalată." - "Doriţi să instalaţi această aplicație? Aceasta va avea acces la:" - "Doriţi să instalaţi această aplicație? Aplicaţia nu solicită un acces special." - "Doriţi să instalaţi o actualizare pentru această aplicație existentă? Datele existente nu vor fi pierdute. Aplicaţia actualizată va avea acces la:" - "Doriţi să instalaţi o actualizare pentru această aplicație încorporată? Datele existente nu vor fi pierdute. Aplicaţia actualizată va avea acces la:" - "Doriţi să instalaţi o actualizare pentru această aplicație existentă? Datele existente nu vor fi pierdute. Actualizarea nu are nevoie de acces special." - "Doriţi să instalaţi o actualizare pentru această aplicație încorporată? Datele existente nu vor fi pierdute. Actualizarea nu are nevoie de acces special." + "Doriți să instalaţi această aplicație? Aceasta va avea acces la:" + "Doriți să instalaţi această aplicație? Aplicaţia nu solicită un acces special." + "Doriți să instalaţi o actualizare pentru această aplicație existentă? Datele existente nu vor fi pierdute. Aplicaţia actualizată va avea acces la:" + "Doriți să instalaţi o actualizare pentru această aplicație încorporată? Datele existente nu vor fi pierdute. Aplicaţia actualizată va avea acces la:" + "Doriți să instalaţi o actualizare pentru această aplicație existentă? Datele existente nu vor fi pierdute. Actualizarea nu are nevoie de acces special." + "Doriți să instalaţi o actualizare pentru această aplicație încorporată? Datele existente nu vor fi pierdute. Actualizarea nu are nevoie de acces special." "Aplicaţia nu este instalată." "Pachetul pare a fi deteriorat." "Un pachet cu același nume și cu o semnătură conflictuală este deja instalat." @@ -38,9 +38,9 @@ "Această aplicație nu este compatibilă cu tableta dvs." "Aplicația nu este compatibilă cu televizorul." "Această aplicație nu este compatibilă cu telefonul dvs." - "Pachetul specificat a fost şters înainte ca instalarea să poată fi finalizată." + "Pachetul specificat a fost șters înainte ca instalarea să poată fi finalizată." "Pachetul nu a trecut de verificare și nu pot fi instalat." - "La verificarea pachetului timpul limită a expirat. Încercaţi să instalaţi din nou ulterior." + "La verificarea pachetului timpul limită a expirat. Încercați să instalaţi din nou ulterior." "%1$s nu a putut fi instalată pe tableta dvs." "Aplicația %1$s nu a putut fi instalată pe televizor." "%1$s nu a putut fi instalată pe telefonul dvs." @@ -53,8 +53,8 @@ "OK" "Setări" "Sursă nouă pentru aplicații" - "%1$s doreşte să instaleze alte aplicații.\n\nPermiteţi acest lucru acum și pe viitor?" - "Gestionaţi aplicații" + "%1$s doreşte să instaleze alte aplicații.\n\nPermiteți acest lucru acum și pe viitor?" + "Gestionați aplicații" "Înlocuiţi aplicația?" "Aplicaţia pe care o instalaţi va înlocui o altă aplicație.\n \nToate datele dvs. anterioare de utilizator vor fi salvate." "Aceasta este o aplicație de sistem.\n \nToate datele dvs. anterioare de utilizator vor fi salvate." @@ -66,18 +66,18 @@ "Dezinstalaţi aplicația" "Dezinstalaţi actualizarea" " %1$s face parte din următoarea aplicație:" - "Doriţi să dezinstalaţi această aplicație?" - "Doriţi să dezinstalaţi această aplicație pentru ""toţi"" utilizatorii? Aplicaţia și datele acesteia vor fi eliminate de la ""toţi"" utilizatorii de pe acest dispozitiv." + "Doriți să dezinstalaţi această aplicație?" + "Doriți să dezinstalaţi această aplicație pentru ""toţi"" utilizatorii? Aplicaţia și datele acesteia vor fi eliminate de la ""toţi"" utilizatorii de pe acest dispozitiv." "Dezinstalați această aplicație pentru utilizatorul %1$s?" - "Doriţi să înlocuiţi această aplicație cu versiunea din fabrică?" + "Doriți să înlocuiţi această aplicație cu versiunea din fabrică?" "În curs de dezinstalare..." "Dezinstalare finalizată." "Dezinstalare nefinalizată." "Nu se poate dezinstala, acest pachet este un administrator de dispozitive activ." "Nu se poate dezinstala, pachetul este administrator de dispozitive activ pt. %1$s." - "Aplicație necesară pentru profilul dvs. %1$s. Nu poate fi dezinstalată." + "Aplicația este necesară pentru profilul de serviciu și nu poate fi dezinstalată." "Aplicație necesară administratorului dispozitivului. Nu poate fi dezinstalată." - "Gestionaţi administratori de dispozitive" + "Gestionați administratori de dispozitive" "%1$s nu a putut fi dezinstalată." "Erori de analizare" "A apărut o problemă la analizarea pachetului." @@ -91,7 +91,34 @@ "Refuzați" "%1$s din %2$s" "Permiteți ca %1$s%2$s?" + "Aplicații" "Permisiuni pentru aplicație" "Nu mai întreba niciodată" "Fără permisiuni" + "Permisiuni suplimentare" + + Încă %1$d + Încă %1$d + Încă %1$d + + "Această aplicație a fost creată pentru o versiune Android mai veche. Dacă nu acordați permisiunea, este posibil ca aceasta să nu mai funcționeze corespunzător." + "efectuează o acțiune necunoscută" + "%1$d din %2$d (de) aplicații au această permisiune" + "Afișați aplicațiile de sistem" + "Ascundeți aplicațiile de sistem" + "Permisiuni pentru %1$s" + "Nicio aplicație" + "Setări privind locația" + "%1$s este un furnizor de servicii de localizare pentru acest dispozitiv. Accesul la locație poate fi modificat din setările privind locația." + "Dacă refuzați această permisiune, este posibil ca funcțiile de bază ale dispozitivului să nu mai funcționeze corespunzător." + "Aplicată conform politicii" + "Se încarcă..." + "Toate permisiunile" + "Alte funcții ale aplicației" + "Solicitare de permisiune" + "S-a detectat suprapunerea pe ecran" + "Ca să schimbați această setare pentru permisiuni, mai întâi trebuie să dezactivați suprapunerea pe ecran din Setări > Aplicații" + "Deschideți setările" + "Android Wear" + "Acțiunile Instalați/Dezinstalați nu sunt acceptate pe Wear." diff --git a/res/values-ru-television/strings.xml b/res/values-ru-television/strings.xml new file mode 100644 index 00000000..ef77002f --- /dev/null +++ b/res/values-ru-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Запретить и больше не спрашивать" + "Чтобы изменить разрешения, откройте \"Настройки\" и выберите \"Приложения\"." + "%1$s/%2$s" + "Показать системные приложения" + diff --git a/res/values-ru-watch/strings.xml b/res/values-ru-watch/strings.xml new file mode 100644 index 00000000..309dc244 --- /dev/null +++ b/res/values-ru-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Запретить и не спрашивать" + "%1$s/%2$s" + "Показать системные приложения" + "Нельзя изменить" + "ВКЛЮЧЕНО" + "ОТКЛЮЧЕНО" + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 78f44760..9cad9cab 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -16,7 +16,7 @@ - "Программа установки пакета" + "Установщик пакетов" "Далее" "Установить" "Готово" @@ -75,7 +75,7 @@ "Ошибка при удалении." "Невозможно удалить пакет, т. к. он выбран для администрирования устройства." "Невозможно удалить этот пакет: он выбран для администрирования устройства в аккаунте %1$s" - "Это приложение необходимо для вашего профиля %1$s. Его нельзя удалить." + "Это приложение необходимо для работы и потому не может быть удалено." "Это приложение указано администратором как обязательное. Его нельзя удалить." "Настройки администрирования" "Не удалось удалить приложение \"%1$s\"." @@ -87,11 +87,39 @@ "Доступ к устройству" "Установка этого обновления не требует новых разрешений." "Предоставить следующие разрешения? Вот к чему будет получен доступ:" - "Принять" + "Разрешить" "Отклонить" "%1$s из %2$s" "Разрешить приложению \"%1$s\" %2$s?" - "Разрешения для приложений" + "Приложения" + "Разрешения приложений" "Больше не запрашивать" "Разрешения не требуются" + "Ещё разрешения" + + Ещё %1$d + Ещё %1$d + Ещё %1$d + Ещё %1$d + + "Это приложение было разработано для более ранней версии Android. Отзыв разрешения может вызвать неполадки в работе." + "выполняет неизвестные действия" + "Приложения с разрешением: %1$d из %2$d" + "Показать системные процессы" + "Скрыть системные процессы" + "Разрешения (%1$s)" + "Нет приложений" + "Настройки геоданных" + "%1$s является поставщиком услуг геолокации для этого устройства. Вы можете изменить параметры доступа в настройках геоданных." + "Если вы не предоставите это разрешение, основные функции устройства могут работать неправильно." + "В соответствии с политикой" + "Загрузка…" + "Все разрешения" + "Что ещё может приложение" + "Запрос разрешений" + "Обнаружены наложения" + "Чтобы предоставить или отменить разрешение, сначала отключите наложения. Для этого нажмите \"Настройки > Приложения\"." + "Открыть настройки" + "Android Wear" + "Android Wear не поддерживает установку и удаление." diff --git a/res/values-si-rLK-television/strings.xml b/res/values-si-rLK-television/strings.xml new file mode 100644 index 00000000..9f058ed2 --- /dev/null +++ b/res/values-si-rLK-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ප්‍රතික්ෂේප කරන්න, නැවත අසන්න එපා" + "ඔබට මෙය පසුව සැකසීම් > යෙදුම් තුළ වෙනස් කළ හැකිය" + "%1$s / %2$s" + "පද්ධති යෙදුම් පෙන්වන්න" + diff --git a/res/values-si-rLK-watch/strings.xml b/res/values-si-rLK-watch/strings.xml new file mode 100644 index 00000000..b2559567 --- /dev/null +++ b/res/values-si-rLK-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ප්‍රතික්ෂේප කරන්න, නැවත අසන්න එපා" + "%1$s / %2$s" + "පද්ධති යෙදුම් පෙන්වන්න" + "වෙනස් කළ නොහැකිය" + "සබලයි" + "අබලයි" + diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index f8a2b7b2..d381abcb 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -75,7 +75,7 @@ "අස්ථාපිත විම අසාර්ථකයි." "මෙම පැකේජය ක්‍රියාකාරී උපාංග පරිපාලකයෙක් බැවින් අස්ථාපනය කළ නොහැක." "පැකේජය %1$s පරිශීලකයා හට සක්‍රිය උපාංග කලමනාකරුවෙකු වන නිසා, මෙය ස්ථාපිත කිරීම ඉවත් කළ නොහැක." - "ඔබගේ %1$s පැතිකඩ සඳහා මෙම යෙදුම අවශ්‍ය වේ එම නිසා අස්ථාපනය කළ නොහැක." + "ඔබේ කාර්ය පැතිකඩ සඳහා මෙම යෙදුම අවශ්‍ය වන අතර අස්ථාපනය කළ නොහැකිය." "ඔබගේ උපාංගයේ පාලකයාට මෙම යෙදුම අවශ්‍ය වේ එම නිසා අස්ථාපනය කළ නොහැක." "උපාංග පරිපාලකයන් කළමනාකරණය කරන්න" "%1$s අස්ථාපනය කල නොහැක." @@ -90,8 +90,34 @@ "ඉඩ දෙන්න" "ප්‍රතික්ෂේප කරන්න" "%2$s න් %1$s" - "%1$s හට %2$s ට ඉඩ දෙන්නද?" + "%2$s කිරීමට %1$s ට ඉඩ දෙන්නද?" + "යෙදුම්" "යෙදුම් අවසර" "නැවත කිසිදා නොඅසන්න" "අවසර නොමැත" + "අතිරේක අවසර" + + .තව %1$d + .තව %1$d + + "මෙම යෙදුම නිර්මාණය කර ඇත්තේ Android වල පැරණි අනුවාදයකට වේ. අවසර නොදීම මඟින් එය බලාපොරොත්තු වන ආකාරයට වැඩ නොකිරීමට හැක." + "නොදන්නා ක්‍රියාවක් සිදු කරන්න" + "යෙදුම් %2$d න් %1$d කට ඉඩ දෙන ලදි" + "පද්ධතිය පෙන්වන්න" + "පද්ධතිය සඟවන්න" + "%1$s අවසර" + "යෙදුම් නොමැත" + "ස්ථාන සැකසීම්" + "%1$s මෙම උපාංගය සඳහා ස්ථාන සේවාවන් සපයන්නෙකු වේ. ස්ථාන ප්‍රවේශය ස්ථාන සැකසීම් වෙතින් වෙනස් කළ හැක." + "ඔබ මෙම අවසරය ප්‍රතික්ෂේප කරන්නේ නම්, සමහර යෙදුම් බලාපොරොත්තු පරිදි ක්‍රියා නොකරනු ඇත." + "ප්‍රතිපත්තිය මඟින් බලාත්මක කරයි" + "පූරණය කරමින්…" + "සියලු අවසර" + "වෙනත් යෙදුම් හැකියාවන්" + "අවසර ඉල්ලීම" + "තිර උඩැතිරියක් අනාවරණය කරන ලදි" + "මෙම අවසර සැකසීම වෙනස් කිරීම සඳහා, ඔබට මුලින්ම සැකසීම් > යෙදුම් වෙතින් තිර උඩැතිරිය අක්‍රිය කර යුතුයි" + "සැකසීම් විවෘත කරන්න" + "Android Wear" + "Wear මත ස්ථාපන/අස්ථාපනය ක්‍රියා වෙත සහය දක්වන්නේ නැත." diff --git a/res/values-sk-television/strings.xml b/res/values-sk-television/strings.xml new file mode 100644 index 00000000..7326f155 --- /dev/null +++ b/res/values-sk-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Zamietnuť a nabudúce sa nepýtať" + "Neskôr to môžete zmeniť v časti Nastavenia > Aplikácie" + "%1$s / %2$s" + "Zobraziť systémové aplikácie" + diff --git a/res/values-sk-watch/strings.xml b/res/values-sk-watch/strings.xml new file mode 100644 index 00000000..9b17f9ba --- /dev/null +++ b/res/values-sk-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Zamietnuť a už sa nepýtať" + "%1$s / %2$s" + "Zobraziť systémové aplikácie" + "Nedá sa zmeniť" + "POVOLENÉ" + "ZAKÁZANÉ" + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 7992cce6..213e4481 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -75,7 +75,7 @@ "Odinštalovanie bolo neúspešné." "Nie je možné odinštalovať, pretože tento balík je aktívnym správcom zariadenia." "Balíček nie je možné odinštalovať, pretože je aktívnym správcom zariadenia pre používateľa %1$s." - "Táto aplikácia sa vyžaduje pre váš profil %1$s a nie je ju možné odinštalovať." + "Táto aplikácia sa vyžaduje pre váš pracovný profil a nemôžete ju odinštalovať." "Túto aplikáciu vyžaduje správca vášho zariadenia a nie je ju možné odinštalovať." "Spravovať správcov zariadenia" "Aplikáciu %1$s sa nepodarilo odinštalovať." @@ -91,7 +91,35 @@ "Odmietnuť" "%1$s z %2$s" "Povoliť aplikácii %1$s %2$s?" - "Povolenia aplikácie" + "Aplikácie" + "Povolenia aplikácií" "Túto otázku už nezobrazovať" "Žiadne povolenia" + "Ďalšie povolenia" + + %1$d ďalšie + %1$d ďalšieho + %1$d ďalších + %1$d ďalšie + + "Táto aplikácia bola navrhnutá pre staršiu verziu systému Android. Odmietnutie povolenia môže spôsobiť, že nebude optimálne fungovať." + "umožňuje vykonať neznámu akciu" + "Povolené: %1$d%2$d aplikácií" + "Zobraziť systémové aplikácie" + "Skryť systémové aplikácie" + "Povolenia %1$s" + "Žiadne aplikácie" + "Nastavenia polohy" + "Aplikácia %1$s je poskytovateľ služieb určovania polohy tohto zariadenia. Prístup k polohe môžete upraviť v nastaveniach polohy." + "Ak toto povolenie zamietnete, základné funkcie vášho zariadenia nemusia pracovať podľa očakávaní." + "Vynútené pravidlom" + "Načítava sa…" + "Všetky povolenia" + "Ďalšie možnosti aplikácie" + "Žiadosť o povolenie" + "Bolo zistené prekrytie obrazovky" + "Ak chcete zmeniť nastavenie tohto povolenia, musíte najprv v časti Nastavenia > Aplikácie vypnúť prekrytie obrazovky" + "Otvoriť nastavenia" + "Android Wear" + "Systém Wear nepodporuje akciu inštalácie/odinštalovania" diff --git a/res/values-sl-television/strings.xml b/res/values-sl-television/strings.xml new file mode 100644 index 00000000..d5ca8680 --- /dev/null +++ b/res/values-sl-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Zavrni in ne sprašuj več" + "To lahko pozneje spremenite v »Nastavitve > Aplikacije«" + "%1$s/%2$s" + "Prikaz sistemskih aplikacij" + diff --git a/res/values-sl-watch/strings.xml b/res/values-sl-watch/strings.xml new file mode 100644 index 00000000..cd71f48c --- /dev/null +++ b/res/values-sl-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Zavrni, ne sprašuj več" + "%1$s/%2$s" + "Prikaz sistemskih aplikacij" + "Ni mogoče sprem." + "OMOGOČENO" + "ONEMOGOČENO" + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index e3d82ea4..362693c6 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -75,7 +75,7 @@ "Odstranitev ni uspela." "Odstranitev ni mogoča, ker je ta paket aktivni skrbnik naprave." "Tega paketa ni mogoče odstraniti, ker je aktivni skrbnik naprav za uporabnika %1$s." - "Ta aplikacija je potrebna za profil %1$s in je ni mogoče odstraniti." + "Ta aplikacija je potrebna za delovni profil in je ni mogoče odstraniti." "To aplikacijo zahteva skrbnik naprave in je ni mogoče odstraniti." "Upravljanje skrbnikov naprav" "Aplikacije %1$s ni bilo mogoče odstraniti." @@ -90,8 +90,36 @@ "Dovoli" "Zavrni" "%1$s od %2$s" - "Dovolite aplikaciji %1$s to dejanje: %2$s?" + "Dovolite aplikaciji %1$s izvesti to dejanje: %2$s?" + "Aplikacije" "Dovoljenja za aplikacije" "Ne vprašaj nikoli več" "Ni dovoljenj" + "Dodatna dovoljenja" + + Še %1$d + Še %1$d + Še %1$d + Še %1$d + + "Ta aplikacija je bila zasnovana za starejšo različico sistema Android. Če dovoljenje zavrnete, lahko preneha delovati, kot bi morala." + "izvedba neznanega dejanja" + "Dovoljene aplikacije: %1$d od %2$d" + "Prikaz sistemskih aplikacij" + "Skrivanje sistemskih aplikacij" + "Dovoljenja za: %1$s" + "Ni aplikacij" + "Nastavitve lokacije" + "%1$s je ponudnik lokacijskih storitev za to napravo. Dostop do lokacije je mogoče spremeniti v nastavitvah lokacije." + "Če zavrnete to dovoljenje, osnovne funkcije naprave morda ne bodo več delovale, kot bi morale." + "Uveljavlja pravilnik" + "Nalaganje …" + "Vsa dovoljenja" + "Druge zmožnosti aplikacije" + "Zahteva za dovoljenje" + "Zaznano prekrivanje zaslona" + "Če želite spremeniti nastavitev tega dovoljenja, morate najprej izklopiti prekrivanje zaslona v »Nastavitve > Aplikacije«" + "Odpri nastavitve" + "Android Wear" + "Dejanja namestitve in odstranitve v sistemu Android Wear niso podprta." diff --git a/res/values-sq-rAL-television/strings.xml b/res/values-sq-rAL-television/strings.xml new file mode 100644 index 00000000..68122461 --- /dev/null +++ b/res/values-sq-rAL-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Refuzo dhe mos pyet përsëri" + "Këtë mund ta ndryshosh më vonë te Cilësimet > Aplikacionet" + "%1$s / %2$s" + "Shfaq aplikacionet e sistemit" + diff --git a/res/values-sq-rAL-watch/strings.xml b/res/values-sq-rAL-watch/strings.xml new file mode 100644 index 00000000..213ce5a4 --- /dev/null +++ b/res/values-sq-rAL-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Refuzoje, mos pyet sërish" + "%1$s / %2$s" + "Shfaq aplikacionet e sistemit" + "Nuk mund të ndryshohet" + "AKTIVIZUAR" + "ÇAKTIVIZUAR" + diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index fb795312..319d6e26 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -17,7 +17,7 @@ "Instaluesi i paketës" - "Tjetër" + "Përpara" "Instalo" "U krye!" "Lejoje këtë aplikacion të:" @@ -50,7 +50,7 @@ "Për arsye sigurie, televizori yt është caktuar t\'i bllokojë instalimet e aplikacioneve nga burime të panjohura." "Për arsye sigurie, telefoni yt është caktuar t\'i bllokojë instalimet e aplikacioneve nga burime të panjohura." "Administratori yt nuk lejon instalimin e aplikacioneve nga burime të panjohura." - "Në rregull!" + "Në rregull" "Cilësimet" "Burim i ri për aplikacione" "%1$s dëshiron të instalojë aplikacione të tjera.\n\nDo e lejosh tani dhe në të ardhmen?" @@ -60,7 +60,7 @@ "Ky është aplikacion sistemi.\n\nTë gjitha të dhënat e tua të mëparshme si përdorues, do të ruhen." "Nuk ka hapësirë" "%1$s nuk mund të instalohej. Liro pak hapësirë dhe provo përsëri." - "Në rregull!" + "Në rregull" "Aplikacioni nuk u gjet" "Aplikacioni nuk u gjet në listën e aplikacioneve të instaluara." "Çinstalo aplikacionin" @@ -75,7 +75,7 @@ "Çinstalimi nuk pati sukses." "Nuk mund të çinstalohet sepse kjo paketë është administratore aktive e pajisjes." "Nuk mund të çinstalohet sepse kjo paketë është administratore aktive e pajisjes për përdoruesin %1$s." - "Ky aplikacion nevojitet për profilin tënd %1$s dhe nuk mund të çinstalohet." + "Ky aplikacion nevojitet për profilin tënd të punës dhe nuk mund të çinstalohet." "Ky aplikacion kërkohet nga administratori i pajisjes dhe nuk mund të çinstalohet." "Menaxho administratorët e pajisjes" "%1$s nuk mundi të çinstalohej." @@ -90,8 +90,34 @@ "Lejo" "Refuzo" "%1$s nga %2$s" - "Të lejohet %1$s%2$s?" + "Të lejohet apl. \"%1$s\" të realizojë \"%2$s\"?" + "Aplikacionet" "Lejet e aplikacionit" "Mos pyet më asnjëherë" "Nuk ka leje" + "Lejet shtesë" + + %1$d të tjera + %1$d të tjera + + "Ky aplikacion është projektuar për një version më të vjetër të Android. Refuzimi i lejeve mund të shkaktojë që ai të mos funksionojë më siç duhet." + "kryej një veprim të panjohur" + "%1$d aplikacione nga %2$d të tilla u lejuan" + "Shfaq sistemin" + "Fshih sistemin" + "Lejet për %1$s" + "Asnjë aplikacion" + "Cilësimet e vendndodhjeve" + "%1$s është një ofrues i shërbimeve të vendndodhjes për këtë pajisje. Qasja e vendndodhjes mund të modifikohet nga cilësimet e vendndodhjes." + "Nëse e refuzon këtë leje, funksionet bazë të pajisjes tënde mund të mos funksionojnë më siç pritet." + "Zbatuar nga politika" + "Po ngarkon..." + "Të gjitha lejet" + "Kapacitete të tjera të aplikacionit" + "Kërkesa e lejes" + "Mbivendosja e ekranit u zbulua" + "Për të ndryshuar këtë cilësim të lejes, në fillim duhet të çaktivizosh mbivendosjen e ekranit nga Cilësimet > Aplikacionet" + "Hap cilësimet" + "Teknologjia \"Android\" që vishet" + "Instalo/çinstalo veprimet që nuk mbështeten në teknologjinë që vishet." diff --git a/res/values-sr-television/strings.xml b/res/values-sr-television/strings.xml new file mode 100644 index 00000000..01d4b9f1 --- /dev/null +++ b/res/values-sr-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Одбиј и не питај поново" + "Ово можете да промените касније у Подешавањима > Апликације" + "%1$s/%2$s" + "Прикажи системске апликације" + diff --git a/res/values-sr-watch/strings.xml b/res/values-sr-watch/strings.xml new file mode 100644 index 00000000..e51b35a4 --- /dev/null +++ b/res/values-sr-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Одбиј и не питај поново" + "%1$s/%2$s" + "Прикажи системске апликације" + "Не може да се промени" + "ОМОГУЋЕНО" + "ОНЕМОГУЋЕНО" + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 9d8dc9e3..67548d0b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -75,7 +75,7 @@ "Деинсталирање није успело." "Није могуће деинсталирати зато што је овај пакет активан администратор уређаја." "Није могуће деинст. јер је пакет активни администратор уређаја за корисника %1$s." - "Ова апликација је потребна за профил %1$s и не може да се деинсталира." + "Ова апликација је потребна за профил за Work и не може да се деинсталира." "Ова апликација је потребна администратору уређаја и не може да се деинсталира." "Управљај администраторима уређаја" "Није могуће деинсталирати апликацију %1$s." @@ -90,8 +90,35 @@ "Дозволи" "Одбиј" "%1$s. од %2$s" - "Желите ли да дозволите да %1$s обави радњу %2$s?" + "Желите ли да дозволите да услуга %1$s %2$s?" + "Апликације" "Дозволе за апликације" "Никада више не тражи" "Нема дозвола" + "Додатне дозволе" + + још %1$d + још %1$d + још %1$d + + "Ова апликација је дизајнирана за старију верзију Android-а. Ако одбијете дозволу, она можда више неће правилно да функционише." + "обавља непознату радњу" + "Апликације са дозволом (%1$d од %2$d)" + "Прикажи системске" + "Сакриј системске" + "Дозволе за апликацију %1$s" + "Нема апликација" + "Подешавања локације" + "%1$s пружа услуге локације за овај уређај. Приступ локацији можете да измените у подешавањима локације." + "Ако одбијете ову дозволу, основне функције уређаја можда неће више функционисати исправно." + "Примењује се у складу са смерницама" + "Учитава се…" + "Све дозволе" + "Остале могућности апликације" + "Захтев за дозволу" + "Откривен је елемент који прекрива садржај екрана" + "Да бисте променили подешавање ове дозволе, прво треба да искључите елемент који прекрива садржај екрана у одељку Подешавања > Апликације" + "Отвори подешавања" + "Android Wear" + "Радње Инсталирај/Деинсталирај нису подржане у Wear-у." diff --git a/res/values-sv-television/strings.xml b/res/values-sv-television/strings.xml new file mode 100644 index 00000000..178a011c --- /dev/null +++ b/res/values-sv-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Neka och fråga inte igen" + "Du kan ändra detta senare i Inställningar > Appar" + "%1$s/%2$s" + "Visa systemappar" + diff --git a/res/values-sv-watch/strings.xml b/res/values-sv-watch/strings.xml new file mode 100644 index 00000000..66465f4d --- /dev/null +++ b/res/values-sv-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Avvisa och fråga inte igen" + "%1$s/%2$s" + "Visa systemappar" + "Kan inte ändras" + "AKTIVERAD" + "INAKTIVERAD" + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 1014cacc..faef032f 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -36,18 +36,18 @@ "Det finns redan ett paket med samma namn och en signatur som är i konflikt." "Paketet fungerar bara med nyare versioner av Android." "Appen är inte kompatibel med din surfplatta." - "Appen är inte kompatibel med din tv." + "Appen är inte kompatibel med din TV." "Appen är inte kompatibel med din mobil." "Paketet som angavs togs bort innan installationen var slutförd." "Paketet klarade inte verifieringen och får inte installeras." "En timeout inträffade när paketet skulle verifieras. Prova att installera paketet senare." "Det gick inte att installera %1$s på surfplattan." - "%1$s kunde inte installeras på tv:n." + "%1$s kunde inte installeras på TV:n." "Det gick inte att installera %1$s på mobilen." "Öppna" "Installation blockerad" "Av säkerhetsskäl går det inte att installera appar från okända källor på din surfplatta." - "Tv:n är av säkerhetsskäl inställd på att blockera installationer av appar från okända källor." + "TV:n är av säkerhetsskäl inställd på att blockera installationer av appar från okända källor." "Av säkerhetsskäl går det inte att installera appar från okända källor på din mobil." "Administratören tillåter inte installation av appar från okända källor." "OK" @@ -75,7 +75,7 @@ "Det gick inte att avinstallera." "Det går inte att avinstallera eftersom paketet är en aktiv enhetsadministratör." "Paketet kan inte avinstalleras. Det används för att administrera enheten för %1$s." - "Appen behövs i profilen för %1$s och kan inte avinstalleras." + "Appen behövs för jobbprofilen och det går inte att avinstallera den." "Appen krävs av enhetsadministratören och kan därför inte avinstalleras." "Hantera enhetsadministratörer" "Det gick inte att avinstallera %1$s." @@ -91,7 +91,33 @@ "Neka" "%1$s av %2$s" "Vill du tillåta %1$s att %2$s?" + "Appar" "Appens behörigheter" "Fråga aldrig igen" "Inga behörigheter" + "Ytterligare behörigheter" + + %1$d till + %1$d till + + "Den här appen utformades för en äldre version av Android. Om du nekar appen behörighet kan det hända att den inte längre fungerar som den ska." + "utför en okänd åtgärd" + "%1$d av %2$d appar tillåts" + "Visa systemet" + "Dölj systemet" + "%1$s behörigheter" + "Inga appar" + "Platsinställningar" + "%1$s är en platstjänstleverantör för enheten. Platsåtkomsten kan redigeras i platsinställningarna." + "Om du nekar appen behörighet kan det hända att grundläggande funktioner på enheten inte fungerar som de ska." + "Enligt policyn" + "Läser in …" + "Alla behörigheter" + "Andra appbehörigheter" + "Begäran om behörighet" + "Skärmöverlagring har upptäckts" + "Innan du kan ändra den här behörighetsinställningen måste du inaktivera skärmöverlagring under Inställningar > Appar" + "Öppna inställningarna" + "Android Wear" + "Åtgärder för att installera/avinstallera stöds inte på Wear." diff --git a/res/values-sw-television/strings.xml b/res/values-sw-television/strings.xml new file mode 100644 index 00000000..fb169fc0 --- /dev/null +++ b/res/values-sw-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Kataa na usiulize tena" + "Unaweza kubadilisha hatua hii baadaye kwenye Mipangilio na Programu" + "%1$s / %2$s" + "Onyesha programu za mfumo" + diff --git a/res/values-sw-watch/strings.xml b/res/values-sw-watch/strings.xml new file mode 100644 index 00000000..b4adaca4 --- /dev/null +++ b/res/values-sw-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Kataa, usiulize tena" + "%1$s / %2$s" + "Onyesha programu za mfumo" + "Haiwezi kubadilishwa" + "IMEWASHWA" + "IMEZIMWA" + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 188539b8..d6f775e5 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -75,7 +75,7 @@ "Kusanidua hakukufaulu." "Furushi hili haliwezi kusaniduliwa kwa sababu ni kidhibiti kinachosimamia kifaa." "Haiwezi kuondoa kwa sababu kifurushi hiki ni kisimamizi cha kifaa kinachotumika kwa ajili ya mtumiaji %1$s." - "Programu hii inahitajika kwa ajili ya wasifu wako %1$s na haiwezi kuondolewa." + "Programu hii inahitajika kwa wasifu wako wa kazi kwa hivyo haiwezi kuondolewa." "Programu hii inahitajika na msimamizi wako wa kifaa na haiwezi kuondolewa." "Simamia vidhibiti vya kifaa" "%1$s haingeweza kusaniduliwa." @@ -90,8 +90,34 @@ "Ruhusu" "Kataa" "%1$s kati ya %2$s" - "Je, ungependa kuruhusu %1$s ifanye %2$s?" + "Je, ungependa kuruhusu %1$s %2$s?" + "Programu" "Ruhusa za programu" "Usiulize tena" "Hakuna ruhusa" + "Ruhusa za ziada" + + %1$d zaidi + %1$d zaidi + + "Programu hii iliundwa kwa ajili ya toleo la zamani la Android. Kuinyima ruhusa kunaweza kusababisha iache kutenda kazi kama ilivyokusudiwa." + "kutekeleza kitendo kisichojulikana" + "Inaruhusu programu %1$d kati ya %2$d" + "Onyesha mfumo" + "Ficha mfumo" + "Ruhusa %1$s" + "Hakuna programu" + "Mipangilio ya Mahali" + "%1$s hutoa huduma za mahali kwenye kifaa hiki. Idhini ya kufikia mahali inaweza kurekebishwa katika mipangilio ya mahali." + "Usipokubali ruhusa hii, huenda vipengele vya msingi vya kifaa chako havitafanya kazi kama ilivyokusudiwa." + "Hutekelezwa na sera" + "Inapakia…" + "Ruhusa zote" + "Uwezo mwingine wa programu" + "Ombi la idhini" + "Imetambua tangazo lililowekelewa juu ya skrini" + "Ili kubadilisha mpangilio huu wa ruhusa, ni lazima kwanza uzime tangazo lililowekelewa juu ya skrini kwenye Mipangilio na Programu" + "Fungua mipangilio" + "Android Wear" + "Vitendo vya Kusakinisha/Kuondoa haviwezi kutumika kwenye Android Wear." diff --git a/res/values-ta-rIN-television/strings.xml b/res/values-ta-rIN-television/strings.xml new file mode 100644 index 00000000..31973a5f --- /dev/null +++ b/res/values-ta-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "நிராகரி, மீண்டும் கேட்காதே" + "அமைப்புகள் > பயன்பாடுகள் என்பதில் பிறகு மாற்றலாம்" + "%1$s / %2$s" + "முறைமைப் பயன்பாடுகளைக் காட்டு" + diff --git a/res/values-ta-rIN-watch/strings.xml b/res/values-ta-rIN-watch/strings.xml new file mode 100644 index 00000000..54c61e7c --- /dev/null +++ b/res/values-ta-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "நிராகரி, மீண்டும் கேட்காதே" + "%1$s / %2$s" + "முறைமைப் பயன்பாடுகளைக் காட்டு" + "மாற்ற முடியாது" + "இயக்கப்பட்டது" + "முடக்கப்பட்டது" + diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 84c17b57..860e671e 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -75,7 +75,7 @@ "நிறுவல் நீக்குவதில் தோல்வி." "இந்தத் தொகுப்பு, செயலில் உள்ள சாதன நிர்வாகி என்பதால் நிறுவல் நீக்க முடியாது." "இந்தத் தொகுப்பு %1$s பயனருக்கான செயலில் உள்ள சாதன நிர்வாகியாக இருப்பதால், நிறுவல் நீக்க முடியாது." - "உங்கள் %1$s சுயவிவரத்திற்கு இந்தப் பயன்பாடு தேவைப்படுவதால், நிறுவல்நீக்க முடியாது." + "உங்கள் பணி சுயவிவரத்திற்கு இந்தப் பயன்பாடு தேவைப்படுவதால், அதை நிறுவல்நீக்க முடியாது." "சாதன நிர்வாகிக்கு இந்தப் பயன்பாடு தேவைப்படுவதால், நிறுவல்நீக்க முடியாது." "சாதன நிர்வாகிகளை நிர்வகி" "%1$s பயன்பாட்டை நிறுவல் நீக்க முடியாது." @@ -91,7 +91,33 @@ "நிராகரி" "%1$s / %2$s" "%2$s செயலுக்கு %1$sஐ அனுமதிக்கவா?" + "பயன்பாடுகள்" "பயன்பாட்டு அனுமதிகள்" "மீண்டும் கேட்காதே" "அனுமதிகள் இல்லை" + "கூடுதல் அனுமதிகள்" + + மேலும் %1$d + மேலும் %1$d + + "இந்தப் பயன்பாடு Android இன் பழைய பதிப்புக்காக வடிவமைக்கப்பட்டது. அனுமதியை மறுத்தால் அது சரியாக செயல்படாமல் போகலாம்." + "அறியாத செயலைச் செயல்படுத்தும்" + "அனுமதிக்கப்படும் பயன்பாடுகள்: %1$d/%2$d" + "அமைப்பைக் காட்டு" + "முறைமையை மறை" + "%1$s அனுமதிகள்" + "பயன்பாடுகள் இல்லை" + "இருப்பிட அமைப்புகள்" + "இந்தச் சாதனத்திற்கான இருப்பிடச் சேவைகளின் வழங்குநர் %1$s ஆகும். இருப்பிட அமைப்புகளிலிருந்து இருப்பிட அணுகலை மாற்றலாம்." + "இந்த அனுமதியை நிராகரித்தால், உங்கள் சாதனத்தின் அடிப்படை அம்சங்கள் சரியாகச் செயல்படாமல் போகலாம்." + "கொள்கையின் படி செயல்படுத்தப்பட்டது" + "ஏற்றுகிறது..." + "எல்லா அனுமதிகளும்" + "பயன்பாட்டின் பிற திறன்கள்" + "அனுமதி கோரிக்கை" + "திரையின் மேலே செயல்படும் பயன்பாடுகள் கண்டறியப்பட்டன" + "இந்த அனுமதியை மாற்ற, அமைப்புகள் > பயன்பாடுகள் என்பதற்குச் சென்று, திரையின் மேலே செயல்படும் பயன்பாடுகளை முதலில் முடக்கவும்" + "அமைப்புகளைத் திற" + "Android Wear" + "Wear இல் நிறுவுதல்/நிறுவல் நீக்குதலுக்கு ஆதரவில்லை." diff --git a/res/values-te-rIN-television/strings.xml b/res/values-te-rIN-television/strings.xml new file mode 100644 index 00000000..5fc27106 --- /dev/null +++ b/res/values-te-rIN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "నిరాకరిస్తున్నాను, మళ్లీ అడగవద్దు" + "మీరు దీన్ని తర్వాత సెట్టింగ్‌లు > అనువర్తనాల్లో మార్చవచ్చు" + "%1$s / %2$s" + "సిస్టమ్ అనువర్తనాలను చూపు" + diff --git a/res/values-te-rIN-watch/strings.xml b/res/values-te-rIN-watch/strings.xml new file mode 100644 index 00000000..e13ba44e --- /dev/null +++ b/res/values-te-rIN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "నిరాకరిస్తున్నాను,ఇక అడగవద్దు" + "%1$s / %2$s" + "సిస్టమ్ అనువర్తనాలను చూపు" + "మార్చడం సాధ్యపడదు" + "ప్రారంభించబడింది" + "నిలిపివేయబడింది" + diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 6b93fe6d..ddcfcc50 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -75,7 +75,7 @@ "అన్‌ఇన్‌స్టాల్ చేయడం విజయవంతం కాలేదు." "ఈ ప్యాకేజీ సక్రియ పరికర నిర్వాహికి అయినందున అన్‌ఇన్‌స్టాల్ చేయడం సాధ్యపడదు." "ఈ ప్యాకేజీ %1$s వినియోగదారుకి సక్రియ పరికర నిర్వాహికి అయినందున దీన్ని అన్ఇ. చేయలేరు." - "మీ %1$s ప్రొఫైల్ కోసం ఈ అనువర్తనం అవసరం, అందువల్ల దీన్ని అన్‌ఇన్‌స్టాల్ చేయడం కుదరదు." + "మీ కార్యాలయ ప్రొఫైల్ కోసం ఈ అనువర్తనం అవసరం, కనుక దీన్ని అన్ఇన్‌స్టాల్ చేయలేరు." "మీ పరికర నిర్వాహకుడికి ఈ అనువర్తనం అవసరం, అందువల్ల దీన్ని అన్‌ఇన్‌స్టాల్ చేయడం కుదరదు." "పరికర నిర్వాహకులను నిర్వహించండి" "%1$sని అన్‌ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు." @@ -90,8 +90,34 @@ "అనుమతించు" "తిరస్కరించు" "%2$sలో %1$s" - "%2$s కోసం %1$sని అనుమతించాలా?" + "%2$s %1$sని అనుమతించాలా?" + "అనువర్తనాలు" "అనువర్తన అనుమతులు" "మళ్లీ ఎప్పుడూ అడగవద్దు" "అనుమతులు లేవు" + "అదనపు అనుమతులు" + + మరో %1$d + మరో %1$d + + "ఈ అనువర్తనం పాత Android సంస్కరణ కోసం రూపొందించబడింది. అనుమతిని నిరాకరించినట్లయితే ఇది ఇకపై ఉద్దేశించిన రీతిలో పని చేయకపోవచ్చు." + "తెలియని చర్యను చేస్తుంది" + "%2$dలో %1$d అనువర్తనాలు అనుమతించబడ్డాయి" + "సిస్టమ్‌ను చూపు" + "సిస్టమ్‌ను దాచు" + "%1$s అనుమతులు" + "అనువర్తనాలు లేవు" + "స్థాన సెట్టింగ్‌లు" + "ఈ పరికరం కోసం స్థాన సేవల ప్రదాత %1$s. స్థాన సెట్టింగ్‌ల నుండి స్థాన ప్రాప్యతను సవరించవచ్చు." + "మీరు ఈ అనుమతిని నిరాకరిస్తే, మీ పరికర ప్రాథమిక లక్షణాలు ఇకపై ఉద్దేశించిన రీతిలో పని చేయకపోవచ్చు." + "విధానం ద్వారా అమలు చేయబడింది" + "లోడ్ అవుతోంది..." + "అన్ని అనుమతులు" + "ఇతర అనువర్తన సామర్థ్యాలు" + "అనుమతి అభ్యర్థన" + "స్క్రీన్ అతివ్యాప్తి గుర్తించబడింది" + "ఈ అనుమతి సెట్టింగ్‌ను మార్చడానికి, మీరు ముందుగా సెట్టింగ్‌లు > అనువర్తనాల నుండి స్క్రీన్ అతివ్యాప్తిని ఆఫ్ చేయాలి" + "సెట్టింగ్‌లను తెరువు" + "Android వేర్" + "వేర్‌లో ఇన్‌స్టాల్/అన్ఇన్‌స్టాల్ చర్యలకు మద్దతు లేదు" diff --git a/res/values-th-television/strings.xml b/res/values-th-television/strings.xml new file mode 100644 index 00000000..eba9c53e --- /dev/null +++ b/res/values-th-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "ปฏิเสธและไม่ต้องถามอีก" + "คุณสามารถเปลี่ยนได้ภายหลังในการตั้งค่า > แอป" + "%1$s/%2$s" + "แสดงแอประบบ" + diff --git a/res/values-th-watch/strings.xml b/res/values-th-watch/strings.xml new file mode 100644 index 00000000..ba86f12c --- /dev/null +++ b/res/values-th-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "ปฏิเสธ ไม่ต้องถามอีก" + "%1$s / %2$s" + "แสดงแอประบบ" + "ไม่สามารถเปลี่ยน" + "เปิดใช้อยู่" + "ปิดใช้อยู่" + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index e4bfc349..8ca2486d 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -75,7 +75,7 @@ "ถอนการติดตั้งไม่สำเร็จ" "ไม่สามารถถอนการติดตั้งเนื่องจากแพ็กเกจนี้เป็นโปรแกรมควบคุมอุปกรณ์ที่ใช้งานอยู่" "ไม่สามารถถอนการติดตั้ง เนื่องจากปัจจุบันแพ็กเกจนี้ดูแลระบบอุปกรณ์สำหรับผู้ใช้ %1$s" - "ต้องใช้แอปนี้สำหรับโปรไฟล์ %1$s ของคุณและไม่สามารถถอนการติดตั้งได้" + "จำเป็นต้องใช้แอปนี้สำหรับโปรไฟล์งานและไม่สามารถถอนการติดตั้งได้" "ผู้ดูแลระบบอุปกรณ์กำหนดให้ใช้แอปนี้ และไม่สามารถถอนการติดตั้งได้" "จัดการโปรแกรมควบคุมอุปกรณ์" "ไม่สามารถถอดการติดตั้ง %1$s" @@ -91,7 +91,33 @@ "ปฏิเสธ" "%1$s จาก %2$s รายการ" "อนุญาตให้ %1$s %2$s ไหม" + "แอป" "สิทธิ์ของแอป" "ไม่ต้องถามอีก" "ไม่มีสิทธิ์" + "สิทธิ์เพิ่มเติม" + + อีก %1$d รายการ + อีก %1$d รายการ + + "แอปนี้ออกแบบมาเพื่อ Android เวอร์ชันเก่า การปฏิเสธสิทธิ์อาจทำให้แอปไม่ทำงานตามที่ต้องการอีกต่อไป" + "ดำเนินการทำงานที่ไม่รู้จัก" + "อนุญาตแล้ว %1$d จาก %2$d แอป" + "แสดงระบบ" + "ซ่อนระบบ" + "สิทธิ์ในการใช้%1$s" + "ไม่มีแอป" + "การตั้งค่าตำแหน่ง" + "%1$s เป็นผู้ให้บริการตำแหน่งสำหรับอุปกรณ์นี้ คุณสามารถแก้ไขสิทธิ์เข้าถึงตำแหน่งได้จากการตั้งค่าตำแหน่ง" + "หากคุณปฏิเสธสิทธิ์นี้ คุณลักษณะพื้นฐานของอุปกรณ์อาจไม่ทำงานตามที่ควรจะเป็นอีกต่อไป" + "บังคับใช้โดยนโยบาย" + "กำลังโหลด…" + "สิทธิ์ทั้งหมด" + "ความสามารถอื่นๆ ของแอป" + "คำขอสิทธิ์" + "ตรวจพบการวางซ้อนหน้าจอ" + "ในการเปลี่ยนแปลงการตั้งค่าสิทธิ์นี้ ก่อนอื่น คุณต้องปิดการวางซ้อนหน้าจอที่การตั้งค่า > แอป" + "เปิดการตั้งค่า" + "Android Wear" + "ไม่สามารถติดตั้ง/ถอนการติดตั้งบน Wear" diff --git a/res/values-tl-television/strings.xml b/res/values-tl-television/strings.xml new file mode 100644 index 00000000..074886db --- /dev/null +++ b/res/values-tl-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Tanggihan at huwag nang tatanunging muli" + "Mababago mo ito sa ibang pagkakataon sa Mga Setting > Mga App" + "%1$s / %2$s" + "Ipakita ang mga app ng system" + diff --git a/res/values-tl-watch/strings.xml b/res/values-tl-watch/strings.xml new file mode 100644 index 00000000..8885a84f --- /dev/null +++ b/res/values-tl-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Tanggihan, huwag nang tatanunging muli" + "%1$s / %2$s" + "Ipakita ang mga app ng system" + "Hindi mababago" + "NAKA-ENABLE" + "NAKA-DISABLE" + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index d03841e5..f8eead24 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -75,7 +75,7 @@ "Di-matagumpay ang pag-uninstall." "Hindi ma-uninstall dahil aktibong administrator ng device ang package na ito." "Aktibong administrator ng device para sa user %1$s itong package, hindi ma-uninstall." - "Kinakailangan ang app na ito para sa %1$s profile mo at hindi maaaring i-uninstall." + "Kinakailangan ang app na ito sa iyong profile sa trabaho at hindi maaaring i-install." "Kinakailangan app na ito ng administrator ng device mo at di maaari i-uninstall." "Pamahalaan ang mga administrator ng device" "Hindi ma-install ang %1$s." @@ -91,7 +91,33 @@ "Tanggihan" "%1$s ng %2$s" "Payagan ang %1$s na %2$s?" + "Mga App" "Mga pahintulot sa app" "Huwag kailanman itanong muli" "Walang mga pahintulot" + "Mga karagdagang pahintulot" + + %1$d pa + %1$d pa + + "Ang app na ito ay idinisenyo para sa mas lumang bersyon ng Android. Kapag tinanggihan ang pahintulot, maaaring hindi na ito gumana ayon sa inaasahan." + "gumawa ng hindi kilalang pagkilos" + "Pinapayagan ang %1$d sa %2$d (na) app" + "Ipakita ang system" + "Itago ang system" + "Mga pahintulot sa %1$s" + "Walang mga app" + "Mga Setting ng Lokasyon" + "Ang %1$s ay isang provider ng mga serbisyo sa lokasyon para sa device na ito. Mababago ang access sa lokasyon mula sa mga setting ng lokasyon." + "Kung tatanggihan mo ang pahintulot na ito, maaaring hindi na gumana ang mga pangunahing feature ng iyong device gaya ng inaasahan." + "Ipinapatupad sa pamamagitan ng patakaran" + "Naglo-load..." + "Lahat ng pahintulot" + "Iba pang mga kakayahan ng app" + "Kahilingan sa pagpapahintulot" + "Natukoy ang overlay ng screen" + "Upang baguhin ang setting ng pahintulot na ito, kailangan mo munang i-off ang overlay ng screen mula sa Mga Setting > Mga App" + "Buksan ang mga setting" + "Android Wear" + "I-install/I-uninstall ang mga pagkilos na hindi sinusuportahan sa Wear." diff --git a/res/values-tr-television/strings.xml b/res/values-tr-television/strings.xml new file mode 100644 index 00000000..ab51750e --- /dev/null +++ b/res/values-tr-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Reddet ve bir daha sorma" + "Bu ayarı daha sonra Ayarlar > Uygulamalar\'dan değiştirebilirsiniz" + "%1$s / %2$s" + "Sistem uygulamalarını göster" + diff --git a/res/values-tr-watch/strings.xml b/res/values-tr-watch/strings.xml new file mode 100644 index 00000000..c7eddced --- /dev/null +++ b/res/values-tr-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Reddet, bir daha sorma" + "%1$s / %2$s" + "Sistem uygulamalarını göster" + "Değiştirilemez" + "ETKİN" + "DEVRE DIŞI" + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index d5bcb773..e41aa52d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -75,7 +75,7 @@ "Yükleme kaldırılamadı." "Bu paket, etkin bir cihaz yöneticisi olduğundan yüklemesi kaldırılamıyor." "Bu paket %1$s adlı kullanıcı için aktif bir cihaz yöneticisi olduğundan yüklemesi kaldırılamıyor." - "Bu uygulama, %1$s profiliniz için gereklidir ve yüklemesi kaldırılamaz." + "Çalışma profiliniz için bu uygulama gerekli ve yüklemesi kaldırılamaz." "Bu uygulama, cihazınızın yöneticisi için gereklidir ve yüklemesi kaldırılamaz." "Cihaz yöneticilerini yönet" "%1$s kaldırılamadı." @@ -91,7 +91,33 @@ "Reddet" "%1$s / %2$s" "%1$s uygulamasına %2$s izni verilsin mi?" + "Uygulamalar" "Uygulama izinleri" "Bir daha sorma" "İzin yok" + "Ek izinler" + + %1$d tane daha + %1$d tane daha + + "Bu uygulama, Android\'in daha eski bir sürümü için tasarlandı. İznin reddedilmesi, uygulamanın bundan sonra amaçlandığı gibi çalışmamasına neden olabilir." + "bilinmeyen bir işlem gerçekleştirme" + "%1$d / %2$d uygulamaya izin veriliyor" + "Sistemi göster" + "Sistemi gizle" + "%1$s izinleri" + "Uygulama yok" + "Konum Ayarları" + "%1$s, bu cihaz için konum hizmetlerinin bir sağlayıcısıdır. Konum erişimi, konum ayarlarından değiştirilebilir." + "Bu izni reddederseniz cihazınızın temel özellikleri artık beklendiği gibi çalışmayabilir." + "Politika tarafından zorunlu tutuldu" + "Yükleniyor..." + "Tüm izinler" + "Diğer uygulama özellikleri" + "İzin isteği" + "Ekran yer paylaşımı tespit edildi" + "Bu izin ayarını değiştirmek için ilk olarak Ayarlar > Uygulamalar\'dan ekran yer paylaşımını kapatmanız gerekir" + "Ayarları aç" + "Android Wear" + "Yükleme/Yüklemeyi Kaldırma işlemleri Wear\'da desteklenmiyor." diff --git a/res/values-uk-television/strings.xml b/res/values-uk-television/strings.xml new file mode 100644 index 00000000..1db8e422 --- /dev/null +++ b/res/values-uk-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Відмовити й більше не запитувати" + "Можна змінити згодом у меню \"Налаштування\" > \"Додатки\"" + "%1$s з %2$s" + "Показати системні додатки" + diff --git a/res/values-uk-watch/strings.xml b/res/values-uk-watch/strings.xml new file mode 100644 index 00000000..aac71cbe --- /dev/null +++ b/res/values-uk-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Відхилити й більше не запитувати" + "%1$s з %2$s" + "Показати системні додатки" + "Не можна змінити" + "УВІМКНЕНО" + "ВИМКНЕНО" + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 335ae467..a78d828e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -44,7 +44,7 @@ "Програму %1$s неможливо встановити у вашому планшетному ПК." "Не вдалося встановити додаток %1$s на ваш телевізор." "Програму %1$s неможливо встановити у вашому телефоні." - "Відкр." + "Відкрити" "Встановл. заблок." "Задля безпеки на вашому планшеті заблоковане встановлення додатків із невідомих джерел." "З міркувань безпеки налаштування телевізора блокують встановлення додатків із невідомих джерел." @@ -75,7 +75,7 @@ "Видалення не здійснено." "Неможливо видалити. Цей пакет є активним адміністратором пристрою." "Не вдається видалити, оскільки цей пакет керує пристроєм користувача %1$s." - "Цей додаток не можна видалити – він потрібен для профілю користувача %1$s." + "Цей додаток не можна видалити – він потрібен для вашого робочого профілю." "Цей додаток не можна видалити – не дозволяє адміністратор пристрою." "Керувати адміністраторами пристрою" "Програму %1$s неможливо видалити." @@ -91,7 +91,35 @@ "Відхилити" "%1$s з %2$s" "Дозволити додатку %1$s %2$s?" + "Додатки" "Дозволи додатків" "Більше не запитувати" "Немає дозволів" + "Додаткові дозволи" + + Ще %1$d + Ще %1$d + Ще %1$d + Ще %1$d + + "Цей додаток створено для старішої версії ОС Android. Якщо скасувати дозвіл, він може працювати неналежним чином." + "виконувати невідому дію" + "Дозволено додатків: %1$d з %2$d" + "Показати системні додатки" + "Сховати системні додатки" + "Дозволи: %1$s" + "Немає додатків" + "Налаштування геоданих" + "%1$s є постачальником служб локації для цього пристрою. Доступом до місцезнаходження можна керувати в налаштуваннях геоданих." + "Якщо скасувати цей дозвіл, основні функції вашого пристрою можуть працювати неналежним чином." + "Застосовується правилом" + "Завантаження…" + "Усі дозволи" + "Інші дозволи додатка" + "Запит на дозвіл" + "Виявлено накладання на екрані" + "Щоб змінити налаштування цього дозволу, спершу вимкніть накладання на екрані в меню \"Налаштування\" > \"Додатки\"" + "Відкрити налаштування" + "Android Wear" + "Функція \"Встановити/видалити\" не підтримується на пристроях Android Wear." diff --git a/res/values-ur-rPK-television/strings.xml b/res/values-ur-rPK-television/strings.xml new file mode 100644 index 00000000..234ef31a --- /dev/null +++ b/res/values-ur-rPK-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "انکار کریں اور دوبارہ مت پوچھیں" + "آپ بعد میں ترتیبات > ایپس میں جا کر اسے تبدیل کرسکتے ہیں" + "%1$s / %2$s" + "سسٹم ایپس دکھائیں" + diff --git a/res/values-ur-rPK-watch/strings.xml b/res/values-ur-rPK-watch/strings.xml new file mode 100644 index 00000000..f3746d50 --- /dev/null +++ b/res/values-ur-rPK-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "انکار کریں، دوبارہ مت پوچھیں" + "%1$s / %2$s" + "سسٹم ایپس دکھائیں" + "ناقابل تبدیل" + "فعال" + "غیر فعال" + diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index f5b331eb..51aa8e26 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -75,7 +75,7 @@ "اَن انسٹال ناکام۔" "اَن انسٹال نہیں کر سکتا کیونکہ یہ پیکیج ایک فعال آلے کا منتظم ہے۔" "اَن انسٹال نہیں کیا جا سکتا کیونکہ یہ پیکیج صارف %1$s کیلئے فعال آلہ کا منتظم ہے۔" - "یہ ایپ آپ کے %1$s پروفائل کیلئے درکار ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔" + "یہ ایپ آپ کے دفتری پروفائل کیلئے درکار ہے اور اسے اَن انسٹال نہیں کیا جا سکتا۔" "یہ ایپ آپ کے آلہ کے منتظم کو درکار ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔" "آلہ کے منتظمین کا نظم کریں" "%1$s کو اَن انسٹال نہیں کیا جا سکا۔" @@ -90,8 +90,34 @@ "اجازت دیں" "مسترد کریں" "%1$s از %2$s" - "%1$s کو %2$s کی اجازت دیں؟" + "%1$s کو \"%2$s\" کی اجازت دیں؟" + "ایپس" "ایپ کی اجازتیں" "دوبارہ کبھی نہ پوچھیں" "کوئی اجازتیں نہیں ہیں" + "اضافی اجازتیں" + + %1$d مزید + %1$d مزید + + "‏یہ ایپ Android کے ایک پرانے ورژن کیلئے ڈیزائن کی گئی تھی۔ اجازت دینے سے انکار کرنے پر ممکن ہے کہ وہ مزید ٹھیک سے کام نہ کرے۔" + "ایک نامعلوم کارروائی کو انجام دیں" + "%1$d میں سے %2$d ایپس کو اجازت دے دی گئی" + "سسٹم دکھائیں" + "سسٹم چھپائیں" + "%1$s اجازتیں" + "کوئی ایپس نہیں ہیں" + "مقام کی ترتیبات" + "%1$s اس آلہ کیلئے مقام کی سروسز کا فراہم کنندہ ہے۔ مقام کی رسائی میں مقام کی ترتیبات سے ترمیم کی جا سکتی ہے۔" + "اگرآپ اس اجازت کو مسترد کرتے ہیں تو شاید آپ کے آلہ کی بنیادی خصوصیات ٹھیک سے کام نہ کریں۔" + "پالیسی کی طرف سے نافذ کردہ" + "لوڈ ہورہا ہے…" + "تمام اجازاتیں" + "دوسری ایپ اہلیتیں" + "اجازت کی درخواست" + "اسکرین اورلے کا پتہ چلا ہے" + "‏اس اجازت کی ترتیب کو تبدیل کرنے کیلئے آپ کو پہلے ترتیبات > Apps سے سکرین اورلے آف کرنا ہوگا" + "ترتیبات کھولیں" + "Android Wear" + "‏Wear پر غیر تعاون یافتہ کاروائیاں انسٹال/ان انسٹال کریں۔" diff --git a/res/values-uz-rUZ-television/strings.xml b/res/values-uz-rUZ-television/strings.xml new file mode 100644 index 00000000..faf8c269 --- /dev/null +++ b/res/values-uz-rUZ-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Rad etilsin va boshqa so‘ralmasin" + "Siz buni keyinroq Sozlamalar > Ilovalar bo‘limi orqali ham o‘zgartirishingiz mumkin" + "%1$s / %2$s" + "Tizim ilovalarini ko‘rsatish" + diff --git a/res/values-uz-rUZ-watch/strings.xml b/res/values-uz-rUZ-watch/strings.xml new file mode 100644 index 00000000..dca320a9 --- /dev/null +++ b/res/values-uz-rUZ-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Rad etilsin va boshqa so‘ralmasin" + "%1$s / %2$s" + "Tizim ilovalarini ko‘rsatish" + "O‘zgartirilmaydi" + "YONIQ" + "O‘CHIQ" + diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index fcf9ffd5..aba004e2 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -75,7 +75,7 @@ "O‘chirish muvaffaqiyatsizlikka uchradi." "O‘chirib bo‘lmadi, chunki ushbu paket faol qurilma administratoridir." "Bu paketni o‘chirib bo‘lmaydi, chunki u %1$s u-n qurilma administratori hisoblanadi." - "Bu ilova sizning %1$s profilingiz uchun kerak va uni olib tashlab bo\'lmaydi." + "Bu ilova ishchi profilingiz uchun kerak va uni o‘chirib bo‘lmaydi." "Ushbu ilova qurilmangiz ma\'muri tomonidan ishlatiladi, shuning uchun uni olib tashlab bo\'lmaydi." "Qurilma administratorlarini boshqarish" "%1$s o‘chirilmadi." @@ -91,7 +91,33 @@ "Rad etish" "%1$s / %2$s" "%1$s ilovasiga %2$s uchun ruxsat berilsinmi?" - "Ilova ruxsatnomalari" + "Ilovalar" + "Ilovalar uchun ruxsatlar" "Boshqa so‘ralmasin" - "Kirish huquqi yo‘q" + "Hech qanday ruxsat talab qilinmaydi" + "Qo‘shimcha ruxsatlar" + + Yana %1$d ta + Yana %1$d ta + + "Bu ilova Androidning eskiroq versiyasiga mo‘ljallab ishlab chiqilgan. Agar ruxsat bermasangiz, u kutilganidek ishlamasligi mumkin." + "noma’lum amalni bajarish" + "Ruxsat berilgan: %1$d/%2$d" + "Tizimga oid jarayonlarni ko‘rsatish" + "Tizimga oid jarayonlarni berkitish" + "%1$s uchun ruxsatlar" + "Hech qanday ilova yo‘q" + "Joylashuv sozlamalari" + "%1$s bu qurilma uchun joylashuvni aniqlash xizmatini taqdim etuvchi ilova hisoblanadi. Joylashuv ma’lumotlariga kirish vakolatini joylashuv sozlamalaridan o‘zgartirish mumkin." + "Agar bu ruxsatni rad qilsangiz, qurilmangizning asosiy funksiyalari bundan buyon kutilganidek ishlamasligi mumkin." + "Qoidaga muvofiq" + "Yuklanmoqda…" + "Barcha ruxsatnomalar" + "Ilovaning boshqa imkoniyatlari" + "Ruxsatnoma so‘rovi" + "Ekran ustidan ochiladigan ilova aniqlandi" + "Bu ruxsatnoma parametrini o‘zgartirish uchun avval Sozlamalar > Ilovalar bo‘limidan ekran ustidan ochilish funksiyasini o‘chirib qo‘ying" + "Sozlamalarni ochish" + "Android Wear" + "Wear qurilmasi o‘rnatish/o‘chirish amallarini qo‘llab-quvvatlamaydi." diff --git a/res/values-vi-television/strings.xml b/res/values-vi-television/strings.xml new file mode 100644 index 00000000..fd7282c7 --- /dev/null +++ b/res/values-vi-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Từ chối và không hỏi lại" + "Bạn có thể thay đổi cài đặt này sau trong Cài đặt > Ứng dụng" + "%1$s / %2$s" + "Hiển thị ứng dụng hệ thống" + diff --git a/res/values-vi-watch/strings.xml b/res/values-vi-watch/strings.xml new file mode 100644 index 00000000..c342949e --- /dev/null +++ b/res/values-vi-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Từ chối, không hỏi lại" + "%1$s / %2$s" + "Hiển thị ứng dụng hệ thống" + "Ko thể thay đổi" + "ĐÃ BẬT" + "ĐÃ TẮT" + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 4de238e1..6ca7e0ce 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -73,9 +73,9 @@ "Đang gỡ cài đặt..." "Gỡ cài đặt đã hoàn tất." "Gỡ cài đặt không thành công." - "Không thể cài đặt vì gói này là của quản trị viên thiết bị đang hoạt động." - "Không thể gỡ cài đặt do gói này là của quản trị viên thiết bị đang hoạt động dành cho người dùng %1$s." - "Ứng dụng này là cần thiết cho tiểu sử %1$s của bạn và không thể gỡ cài đặt." + "Không thể cài đặt vì gói này là ứng dụng quản trị thiết bị đang hoạt động." + "Không thể gỡ cài đặt do gói này là ứng dụng quản trị thiết bị đang hoạt động dành cho người dùng %1$s." + "Ứng dụng này là cần thiết cho hồ sơ Android Work của bạn và không thể gỡ cài đặt." "Ứng dụng này được quản trị viên thiết bị của bạn yêu cầu và không thể gỡ cài đặt." "Quản lý quản trị viên điện thoại" "Không thể gỡ cài đặt %1$s" @@ -91,7 +91,33 @@ "Từ chối" "%1$s / %2$s" "Cho phép %1$s %2$s?" + "Ứng dụng" "Giấy phép ứng dụng" "Không bao giờ hỏi lại" "Không có quyền" + "Quyền khác" + + %1$d quyền khác + %1$d quyền khác + + "Ứng dụng này được thiết kế cho các phiên bản Android cũ hơn. Từ chối quyền có thể làm cho ứng dụng không còn hoạt động như mong muốn." + "thực hiện hành động không xác định" + "Đã cho phép %1$d trong số %2$d ứng dụng" + "Hiển thị hệ thống" + "Ẩn hệ thống" + "%1$s quyền" + "Không có ứng dụng" + "Cài đặt vị trí" + "%1$s là nhà cung cấp dịch vụ vị trí cho thiết bị này. Bạn có thể sửa đổi quyền truy cập vị trí từ cài đặt vị trí." + "Nếu bạn từ chối quyền này, các tính năng cơ bản trên thiết bị của bạn có thể không còn hoạt động như dự kiến." + "Được thực thi bằng chính sách" + "Đang tải…" + "Tất cả các quyền" + "Các khả năng khác của ứng dụng" + "Yêu cầu quyền" + "Đã phát hiện lớp phủ màn hình" + "Để thay đổi cài đặt quyền này, trước tiên bạn phải tắt lớp phủ màn hình từ Cài đặt > Ứng dụng" + "Mở cài đặt" + "Android Wear" + "Không hỗ trợ tác vụ Cài đặt/Gỡ cài đặt trên Wear." diff --git a/res/values-zh-rCN-television/strings.xml b/res/values-zh-rCN-television/strings.xml new file mode 100644 index 00000000..be3cdce7 --- /dev/null +++ b/res/values-zh-rCN-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "拒绝,不要再询问" + "您以后可以在“设置”>“应用”中更改此设置" + "%1$s / %2$s" + "显示系统应用" + diff --git a/res/values-zh-rCN-watch/strings.xml b/res/values-zh-rCN-watch/strings.xml new file mode 100644 index 00000000..d6e64c34 --- /dev/null +++ b/res/values-zh-rCN-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "拒绝,不要再询问" + "%1$s / %2$s" + "显示系统应用" + "无法更改" + "已启用" + "已停用" + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index b3bf220c..08c9134b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -75,7 +75,7 @@ "卸载失败。" "此软件包是当前使用的设备管理器,无法卸载。" "无法卸载此软件包,因为它是用户 %1$s 当前使用的设备管理软件包。" - "这是您的%1$s个人资料所需的应用,因此无法卸载。" + "这是您的工作资料所需的应用,因此无法卸载。" "这是您的设备管理员要求必须安装的应用,因此无法卸载。" "管理设备管理器" "无法卸载“%1$s”。" @@ -91,7 +91,33 @@ "拒绝" "第 %1$s 项权限(共 %2$s 项)" "要允许%1$s%2$s吗?" - "应用权限" + "应用" + "应用访问授权" "不再询问" "没有权限" + "其他权限" + + 另外 %1$d + 另外 %1$d + + "此应用专为旧版 Android 打造。拒绝权限可能会导致其无法正常运行。" + "执行未知操作" + "已授权 %1$d 个应用(共 %2$d 个)" + "显示系统应用" + "隐藏系统应用" + "%1$s权限" + "没有应用" + "位置信息设置" + "“%1$s”是此设备的一个位置信息服务提供程序。您可以在位置信息设置中修改位置信息使用权。" + "如果您拒绝此权限,您设备的基本功能可能会无法正常使用。" + "依据政策强制执行" + "正在加载…" + "所有权限" + "其他应用功能" + "权限请求" + "检测到屏幕叠加层" + "要更改此权限设置,您必须首先在“设置”>“应用”中关闭屏幕叠加层" + "打开设置" + "Android Wear" + "Wear 不支持安装/卸载操作。" diff --git a/res/values-zh-rHK-television/strings.xml b/res/values-zh-rHK-television/strings.xml new file mode 100644 index 00000000..cc6a84df --- /dev/null +++ b/res/values-zh-rHK-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "拒絕,不要再詢問" + "您日後可以在 [設定] > [應用程式] 中變更這項設定" + "%1$s / %2$s" + "顯示系統應用程式" + diff --git a/res/values-zh-rHK-watch/strings.xml b/res/values-zh-rHK-watch/strings.xml new file mode 100644 index 00000000..9c21b2ab --- /dev/null +++ b/res/values-zh-rHK-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "拒絕,不要再詢問" + "%1$s / %2$s" + "顯示系統應用程式" + "不可變更" + "已啟用" + "已停用" + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index e1623bd0..56ea1404 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -75,7 +75,7 @@ "解除安裝失敗。" "這個套件是目前的裝置管理員,因此無法解除安裝。" "無法解除安裝,因為這個套件是使用者「%1$s」目前使用的裝置管理員。" - "這是使用者 %1$s 的個人檔案所需的應用程式,因此無法解除安裝。" + "這是您的公司檔案所需的應用程式,因此無法解除安裝。" "這是您的裝置管理員要求安裝的應用程式,因此無法解除安裝。" "管理裝置管理員" "無法解除安裝「%1$s」。" @@ -91,7 +91,33 @@ "拒絕" "第 %2$s 個 (共 %1$s 個)" "允許 %1$s %2$s嗎?" + "應用程式" "應用程式權限" "不再要求輸入" "沒有權限" + "其他權限" + + 還有 %1$d + 還有 %1$d + + "這個應用程式專為舊版本的 Android 設計。拒絕權限可能會導致它無法如預期 運作。" + "執行不明的操作" + "已允許 %1$d 個應用程式 (共 %2$d 個)" + "顯示系統" + "隱藏系統" + "%1$s權限" + "沒有應用程式" + "位置設定" + "%1$s為此裝置提供位置資訊服務。您可以在位置設定中更改位置存取權。" + "如果您拒絕這個權限,您的裝置的基本功能可能無法正常運作。" + "由政策強制執行" + "正在載入…" + "所有權限" + "其他應用程式功能" + "權限要求" + "已偵測到螢幕重疊功能" + "如要變更此權限設定,請先前往 [設定] > [應用程式],以關閉螢幕重疊功能" + "開啟設定" + "Android Wear" + "Wear 不支援安裝/解除安裝操作。" diff --git a/res/values-zh-rTW-television/strings.xml b/res/values-zh-rTW-television/strings.xml new file mode 100644 index 00000000..aa860102 --- /dev/null +++ b/res/values-zh-rTW-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "拒絕且不要再詢問" + "您日後可在 [設定] > [應用程式] 中進行變更" + "%1$s/%2$s" + "顯示系統應用程式" + diff --git a/res/values-zh-rTW-watch/strings.xml b/res/values-zh-rTW-watch/strings.xml new file mode 100644 index 00000000..4c9245d1 --- /dev/null +++ b/res/values-zh-rTW-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "拒絕且不要再詢問" + "%1$s / %2$s" + "顯示系統應用程式" + "無法變更" + "已啟用" + "已停用" + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index b5960efc..7c7f732c 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -75,7 +75,7 @@ "解除安裝失敗。" "這個套件是目前的裝置管理員,因此無法解除安裝。" "這個套件是%1$s目前使用中的裝置權限管理工具,因此無法解除安裝。" - "這是使用者 %1$s 的個人資料所需的應用程式,因此無法解除安裝。" + "這是 Work 設定檔所需的應用程式,因此無法解除安裝。" "這是您的裝置管理員要求安裝的應用程式,因此無法解除安裝。" "管理裝置管理員" "無法解除安裝「%1$s」。" @@ -90,8 +90,34 @@ "允許" "拒絕" "%1$s/%2$s" - "要允許「%1$s%2$s嗎?" + "允許「%1$s%2$s嗎?" + "應用程式" "應用程式權限" "不要再詢問我" "沒有權限" + "其他權限" + + 還有 %1$d + 還有 %1$d + + "這個應用程式是為舊版 Android 所開發。拒絕授予權限可能導致應用程式無法正常運作。" + "執行不明的動作" + "已授權 %1$d 個應用程式 (共 %2$d 個)" + "顯示系統" + "隱藏系統" + "%1$s權限" + "沒有應用程式" + "位置資訊設定" + "%1$s 是這台裝置的定位服務供應商。您可以在位置資訊設定中修改位置資訊存取權。" + "如果您拒絕這項權限,裝置的基本功能可能無法正常運作。" + "依據政策規定執行" + "載入中…" + "所有權限" + "其他應用程式功能" + "權限要求" + "偵測到畫面重疊圖層" + "如要變更這項權限設定,您必須先依序前往 [設定] > [應用程式],關閉裝置畫面重疊圖層" + "開啟設定" + "Android Wear" + "Wear 不支援安裝及解除安裝操作。" diff --git a/res/values-zu-television/strings.xml b/res/values-zu-television/strings.xml new file mode 100644 index 00000000..0d9cbeab --- /dev/null +++ b/res/values-zu-television/strings.xml @@ -0,0 +1,23 @@ + + + + + "Yenqaba futhi ungasabuzi" + "Ungashintsha lokhu kamuva kuzilungiselelo > izinhlelo zokusebenza" + "%1$s / %2$s" + "Bonisa izinhlelo zokusebenza zesistimu" + diff --git a/res/values-zu-watch/strings.xml b/res/values-zu-watch/strings.xml new file mode 100644 index 00000000..82f45df9 --- /dev/null +++ b/res/values-zu-watch/strings.xml @@ -0,0 +1,25 @@ + + + + + "Yenqaba, ungangibuzi futhi" + "%1$s / %2$s" + "Bonisa izinhlelo zokusebenza zesistimu" + "Akukwazi ukushintshwa" + "KUNIKWE AMANDLA" + "KUKHUTSHAZIWE" + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 89e425a3..acd9b5b2 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -75,7 +75,7 @@ "Ukukhipha akuphumelelanga." "Ayikwazi ukukhupha: leliphasela liwumqondisi wedivayisi osebenzayo" "Ayikwazi ukukhipha ngoba le phakheji ingumlawuli osebenzayo wedivayisi womsebenzisi we-%1$s." - "Lolu hlelo lokusebenza luyadingeka kuphrofayela yakho ye-%1$s futhi alikwazi ukukhishwa." + "Lolu hlelo lokusebenza ludingelwa iphrofayela yakho yokusebenza futhi alikwazi ukukhishwa." "Lolu hlelo lokusebenza ludingwa umlawuli wedivayisi yakho futhi alukwazi ukukhishwa." "Phatha amadivayisi abaqondisi" "I-%1$s ayikwazanga ukukhishwa" @@ -91,7 +91,33 @@ "Phika" "%1$s kokungu-%2$s" "Vumela i-%1$s ukuthi %2$s?" + "Izinhlelo zokusebenza" "Izimvume zohlelo lokusebenza" "Ungaphinde ubuze" "Akukho zimvume" + "Izimvume ezingeziwe" + + %1$d okuningi + %1$d okuningi + + "Lolu hlelo lokusebenza ludizayinelwe inguqulo endala ye-Android. Ukwala imvume kungalibangela ukuthi lingasasebenzi njengoba kuhlosiwe." + "Yenza isenzo esingaziwa" + "%1$d kuzinhlelo zokusebenza ezingu-%2$d ezivunyelwe" + "Bonisa isistimu" + "Fihla isistimu" + "%1$s izimvume" + "Azikho izinhlelo zokusebenza" + "Izilungiselelo Zendawo" + "%1$s ingumhlinzeki wamasevisi wendawo kule divayisi. Ukufinyelela kwendawo kungashintshwa kusuka kuzilungiselelo zendawo." + "Uma unqabela le mvume, izici eziyisisekelo zedivayisi yakho zingahle zingasasebenzi njengoba zihlosiwe." + "Isetshenziswe yinqubomgomo" + "Iyalayisha..." + "Zonke izimvume" + "Amanye amakhono wohlelo lokusebenza" + "Isicelo semvume" + "Kutholwe imbondela yesikrini" + "Ukuze uguqule lesi silungiselelo semvume, kuzomele uqale uvale imbondela yesikrini kusukela ku-Izilungiselelo > Izinhlelo zokusebenza" + "Vula izilungiselelo" + "I-Android Wear" + "Izenzo zokufaka/ukukhipha azisekelwe ku-Wear." -- cgit v1.2.3 From 08f085b8a22d2b3b1daf5ca80c57bb4cff14a027 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Wed, 13 Jan 2016 17:27:32 -0800 Subject: Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 26156247 Change-Id: Id5f79138340d752b9288b83dd0922e2deb58d9fe --- res/values-de-television/strings.xml | 2 +- res/values-de/strings.xml | 46 ++++++++++++++++++------------------ res/values-mk-rMK/strings.xml | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/res/values-de-television/strings.xml b/res/values-de-television/strings.xml index cf52f8ca..2eae5499 100644 --- a/res/values-de-television/strings.xml +++ b/res/values-de-television/strings.xml @@ -17,7 +17,7 @@ "Ablehnen und nicht mehr fragen" - "Sie können dies später unter \"Einstellungen > Apps\" ändern." + "Du kannst dies später unter \"Einstellungen > Apps\" ändern." "%1$s/%2$s" "System-Apps anzeigen" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c7798a26..0208d4a2 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -25,12 +25,12 @@ "Unbekannt" "Wird installiert..." "App wurde installiert." - "Möchten Sie diese App installieren? Sie erhält dann folgende Berechtigungen:" - "Möchten Sie diese App installieren? Sie benötigt keinen besonderen Zugriff." - "Möchten Sie ein Update für diese vorhandene App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese bestehende App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." + "Möchtest du diese App installieren? Sie erhält dann folgende Berechtigungen:" + "Möchtest du diese App installieren? Sie benötigt keinen besonderen Zugriff." + "Möchtest du ein Update für diese vorhandene App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese bestehende App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." "App wurde nicht installiert." "Das Paket ist offenbar beschädigt." "Ein Paket mit dem gleichen Namen, aber in Konflikt stehender Signatur, ist bereits installiert." @@ -40,36 +40,36 @@ "Diese App ist mit Ihrem Telefon nicht kompatibel." "Das angegebene Paket wurde gelöscht, bevor die Installation abgeschlossen werden konnte." "Das Paket hat die Prüfung nicht bestanden und kann daher nicht installiert werden." - "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederholen Sie die Installation." + "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederhole die Installation." "%1$s konnte nicht auf Ihrem Tablet installiert werden." "%1$s konnte nicht auf Ihrem Fernseher installiert werden." "%1$s konnte nicht auf Ihrem Telefon installiert werden." "Öffnen" "Installation gesperrt" - "Aus Sicherheitsgründen können Sie auf Ihrem Tablet keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf dem Fernseher keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf Ihrem Telefon keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Tablet keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf dem Fernseher keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Telefon keine Apps von unbekannten Quellen installieren." "Ihr Administrator erlaubt die Installation von Apps aus unbekannten Quellen nicht." "OK" "Einstellungen" "Neue Quelle für Apps" - "%1$s möchte andere Apps installieren.\n\nMöchten Sie dies jetzt und in Zukunft zulassen?" + "%1$s möchte andere Apps installieren.\n\nMöchtest du dies jetzt und in Zukunft zulassen?" "Apps verwalten" "App ersetzen?" - "Die App, die Sie momentan installieren, wird eine andere App ersetzen.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." + "Die App, die du momentan installierst, wird eine andere App ersetzen.\n\nAlle deine bisherigen Nutzerdaten werden gespeichert." "Dies ist eine Systemanwendung.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." "Kein freier Speicher vorhanden" - "%1$s konnte nicht installiert werden. Geben Sie Speicherplatz frei und versuchen Sie es erneut." + "%1$s konnte nicht installiert werden. Gib Speicherplatz frei und versuche es erneut." "OK" "App nicht gefunden" "Die App wurde nicht in der Liste der installierten Apps gefunden." "App deinstallieren" "Update deinstallieren" "%1$s gehört zu folgender App:" - "Möchten Sie diese App deinstallieren?" - "Möchten Sie diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." - "Möchten Sie diese App für den Nutzer %1$s deinstallieren?" - "Möchten Sie diese App durch die Werksversion ersetzen?" + "Möchtest du diese App deinstallieren?" + "Möchtest du diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." + "Möchtest du diese App für den Nutzer %1$s deinstallieren?" + "Möchtest du diese App durch die Werksversion ersetzen?" "Wird deinstalliert..." "Deinstallation abgeschlossen" "Deinstallation fehlgeschlagen" @@ -86,9 +86,9 @@ "Datenschutz" "Gerätezugriff" "Für dieses Update sind keine neuen Berechtigungen erforderlich." - "Möchten Sie die folgenden Berechtigungen gewähren? Diese ermöglichen den Zugriff auf Folgendes:" + "Möchtest du die folgenden Berechtigungen gewähren? Sie ermöglichen den Zugriff auf Folgendes:" "Zulassen" - "Verweigern" + "Ablehnen" "%1$s von %2$s" "%1$s ermöglichen, %2$s?" "Apps" @@ -100,7 +100,7 @@ Noch %1$d Noch %1$d - "Diese App wurde für eine ältere Version von Android konzipiert. Wenn Sie keine Berechtigung erteilen, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." + "Diese App wurde für eine ältere Version von Android konzipiert. Wenn du keine Berechtigung erteilst, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." "Unbekannte Aktion durchführen" "%1$d von %2$d Apps sind berechtigt." "System anzeigen" @@ -108,15 +108,15 @@ "Berechtigungen für %1$s" "Keine Apps" "Standorteinstellungen" - "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf Ihren Standort können Sie in den Standorteinstellungen ändern." - "Wenn Sie diese Berechtigung deaktivieren, funktionieren grundlegende Funktionen Ihres Geräts möglicherweise nicht mehr ordnungsgemäß." + "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf deinen Standort kannst du in den Standorteinstellungen ändern." + "Wenn du diese Berechtigung deaktivierst, funktionieren grundlegende Funktionen deines Geräts möglicherweise nicht mehr ordnungsgemäß." "Von Richtlinien durchgesetzt" "Wird geladen…" "Alle Berechtigungen" "Andere App-Funktionen" "Berechtigungsanfrage" "Display-Overlay erkannt" - "Um diese Berechtigungseinstellung zu ändern, müssen Sie zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." + "Um diese Berechtigungseinstellung zu ändern, musst du zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." "Einstellungen öffnen" "Android Wear" "Von Android Wear nicht unterstützte Aktionen installieren/deinstallieren." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 80b5feb3..c7cac3f8 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -51,7 +51,7 @@ "За безбедност, вашиот телефон е подесен да блокира инсталирање апликации добиени од непознати извори." "Вашиот администратор не дозволува инсталација на апликации добиени од непознати извори." "Во ред" - "Подесувања" + "Поставки" "Нов извор за апликации" "%1$s сака да инсталира други апликации.\n\nДозволи го ова сега и во иднина?" "Управувај со апликации" -- cgit v1.2.3 From 0271c5dc57ea98042478e51c79021f283b97cd1e Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Wed, 13 Jan 2016 17:48:29 -0800 Subject: Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 26156247 Change-Id: I049be9283026362d8b703e618b3b8c47ff0bf01e --- res/values-de-television/strings.xml | 2 +- res/values-de/strings.xml | 44 ++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/res/values-de-television/strings.xml b/res/values-de-television/strings.xml index cf52f8ca..2eae5499 100644 --- a/res/values-de-television/strings.xml +++ b/res/values-de-television/strings.xml @@ -17,7 +17,7 @@ "Ablehnen und nicht mehr fragen" - "Sie können dies später unter \"Einstellungen > Apps\" ändern." + "Du kannst dies später unter \"Einstellungen > Apps\" ändern." "%1$s/%2$s" "System-Apps anzeigen" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index eb06dbd3..0208d4a2 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -25,12 +25,12 @@ "Unbekannt" "Wird installiert..." "App wurde installiert." - "Möchten Sie diese App installieren? Sie erhält dann folgende Berechtigungen:" - "Möchten Sie diese App installieren? Sie benötigt keinen besonderen Zugriff." - "Möchten Sie ein Update für diese vorhandene App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese bestehende App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." + "Möchtest du diese App installieren? Sie erhält dann folgende Berechtigungen:" + "Möchtest du diese App installieren? Sie benötigt keinen besonderen Zugriff." + "Möchtest du ein Update für diese vorhandene App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese bestehende App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." "App wurde nicht installiert." "Das Paket ist offenbar beschädigt." "Ein Paket mit dem gleichen Namen, aber in Konflikt stehender Signatur, ist bereits installiert." @@ -40,36 +40,36 @@ "Diese App ist mit Ihrem Telefon nicht kompatibel." "Das angegebene Paket wurde gelöscht, bevor die Installation abgeschlossen werden konnte." "Das Paket hat die Prüfung nicht bestanden und kann daher nicht installiert werden." - "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederholen Sie die Installation." + "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederhole die Installation." "%1$s konnte nicht auf Ihrem Tablet installiert werden." "%1$s konnte nicht auf Ihrem Fernseher installiert werden." "%1$s konnte nicht auf Ihrem Telefon installiert werden." "Öffnen" "Installation gesperrt" - "Aus Sicherheitsgründen können Sie auf Ihrem Tablet keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf dem Fernseher keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf Ihrem Telefon keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Tablet keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf dem Fernseher keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Telefon keine Apps von unbekannten Quellen installieren." "Ihr Administrator erlaubt die Installation von Apps aus unbekannten Quellen nicht." "OK" "Einstellungen" "Neue Quelle für Apps" - "%1$s möchte andere Apps installieren.\n\nMöchten Sie dies jetzt und in Zukunft zulassen?" + "%1$s möchte andere Apps installieren.\n\nMöchtest du dies jetzt und in Zukunft zulassen?" "Apps verwalten" "App ersetzen?" - "Die App, die Sie momentan installieren, wird eine andere App ersetzen.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." + "Die App, die du momentan installierst, wird eine andere App ersetzen.\n\nAlle deine bisherigen Nutzerdaten werden gespeichert." "Dies ist eine Systemanwendung.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." "Kein freier Speicher vorhanden" - "%1$s konnte nicht installiert werden. Geben Sie Speicherplatz frei und versuchen Sie es erneut." + "%1$s konnte nicht installiert werden. Gib Speicherplatz frei und versuche es erneut." "OK" "App nicht gefunden" "Die App wurde nicht in der Liste der installierten Apps gefunden." "App deinstallieren" "Update deinstallieren" "%1$s gehört zu folgender App:" - "Möchten Sie diese App deinstallieren?" - "Möchten Sie diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." - "Möchten Sie diese App für den Nutzer %1$s deinstallieren?" - "Möchten Sie diese App durch die Werksversion ersetzen?" + "Möchtest du diese App deinstallieren?" + "Möchtest du diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." + "Möchtest du diese App für den Nutzer %1$s deinstallieren?" + "Möchtest du diese App durch die Werksversion ersetzen?" "Wird deinstalliert..." "Deinstallation abgeschlossen" "Deinstallation fehlgeschlagen" @@ -86,7 +86,7 @@ "Datenschutz" "Gerätezugriff" "Für dieses Update sind keine neuen Berechtigungen erforderlich." - "Möchten Sie die folgenden Berechtigungen gewähren? Diese ermöglichen den Zugriff auf Folgendes:" + "Möchtest du die folgenden Berechtigungen gewähren? Sie ermöglichen den Zugriff auf Folgendes:" "Zulassen" "Ablehnen" "%1$s von %2$s" @@ -100,7 +100,7 @@ Noch %1$d Noch %1$d - "Diese App wurde für eine ältere Version von Android konzipiert. Wenn Sie keine Berechtigung erteilen, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." + "Diese App wurde für eine ältere Version von Android konzipiert. Wenn du keine Berechtigung erteilst, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." "Unbekannte Aktion durchführen" "%1$d von %2$d Apps sind berechtigt." "System anzeigen" @@ -108,15 +108,15 @@ "Berechtigungen für %1$s" "Keine Apps" "Standorteinstellungen" - "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf Ihren Standort können Sie in den Standorteinstellungen ändern." - "Wenn Sie diese Berechtigung deaktivieren, funktionieren grundlegende Funktionen Ihres Geräts möglicherweise nicht mehr ordnungsgemäß." + "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf deinen Standort kannst du in den Standorteinstellungen ändern." + "Wenn du diese Berechtigung deaktivierst, funktionieren grundlegende Funktionen deines Geräts möglicherweise nicht mehr ordnungsgemäß." "Von Richtlinien durchgesetzt" "Wird geladen…" "Alle Berechtigungen" "Andere App-Funktionen" "Berechtigungsanfrage" "Display-Overlay erkannt" - "Um diese Berechtigungseinstellung zu ändern, müssen Sie zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." + "Um diese Berechtigungseinstellung zu ändern, musst du zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." "Einstellungen öffnen" "Android Wear" "Von Android Wear nicht unterstützte Aktionen installieren/deinstallieren." -- cgit v1.2.3 From 4e5cd3a5b25aba8d0682c2ace91f63b6e59661e8 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Wed, 13 Jan 2016 18:01:45 -0800 Subject: Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 26156247 Change-Id: Ia9ac78b31ed8b37dd75dc6e983661544f87aaf4d --- res/values-af/strings.xml | 2 +- res/values-am/strings.xml | 2 +- res/values-da-television/strings.xml | 2 +- res/values-da/strings.xml | 2 +- res/values-de-television/strings.xml | 2 +- res/values-de/strings.xml | 46 ++++++++++++++++++------------------ res/values-fr-rCA/strings.xml | 2 +- res/values-ko/strings.xml | 2 +- res/values-mk-rMK/strings.xml | 2 +- res/values-ne-rNP/strings.xml | 6 ++--- res/values-nl/strings.xml | 6 ++--- res/values-pl/strings.xml | 2 +- res/values-pt-rBR/strings.xml | 2 +- res/values-pt/strings.xml | 2 +- res/values-ro/strings.xml | 2 +- res/values-ru/strings.xml | 2 +- res/values-sv/strings.xml | 6 ++--- res/values-ta-rIN/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 2 +- 19 files changed, 47 insertions(+), 47 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index d814aa9c..0588dacb 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -90,7 +90,7 @@ "Laat toe" "Weier" "%1$s van %2$s" - "Laat %1$s toe om te %2$s?" + "Laat %1$s toe om %2$s?" "Programme" "Programtoestemmings" "Moet nooit weer vra nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index de1f8538..942e3a1d 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -90,7 +90,7 @@ "ፍቀድ" "ከልክል" "%1$s%2$s" - "%1$s %2$s እንዲያደርግ ይፈቀድለት?" + "%1$s መተግበሪያ %2$s እንዲያደርግ ይፈቀድለት?" "መተግበሪያዎች" "የመተግበሪያ ፈቃዶች" "ሁለተኛ እንዳትጠይቅ" diff --git a/res/values-da-television/strings.xml b/res/values-da-television/strings.xml index 63b9de88..5e28b62f 100644 --- a/res/values-da-television/strings.xml +++ b/res/values-da-television/strings.xml @@ -17,7 +17,7 @@ "Afvis, og spørg ikke igen" - "Du kan ændre dette på et senere tidspunkt i Indstillinger og apps" + "Du kan altid ændre dette i Indstillinger > Apps" "%1$s/%2$s" "Vis systemapps" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 90f0e8a0..c7575642 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -105,7 +105,7 @@ "%1$d ud af %2$d apps har tilladelse" "Vis systemapps" "Skjul systemapps" - "%1$s tilladelser" + "%1$s-tilladelser" "Ingen apps" "Placeringsindstillinger" "%1$s udbyder placeringstjenester for denne enhed. Adgangen til din placering kan ændres i Placeringsindstillinger." diff --git a/res/values-de-television/strings.xml b/res/values-de-television/strings.xml index cf52f8ca..2eae5499 100644 --- a/res/values-de-television/strings.xml +++ b/res/values-de-television/strings.xml @@ -17,7 +17,7 @@ "Ablehnen und nicht mehr fragen" - "Sie können dies später unter \"Einstellungen > Apps\" ändern." + "Du kannst dies später unter \"Einstellungen > Apps\" ändern." "%1$s/%2$s" "System-Apps anzeigen" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 76776b60..de59d6e5 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -25,12 +25,12 @@ "Unbekannt" "Wird installiert..." "App wurde installiert." - "Möchten Sie diese App installieren? Sie erhält dann folgende Berechtigungen:" - "Möchten Sie diese App installieren? Sie benötigt keinen besonderen Zugriff." - "Möchten Sie ein Update für diese vorhandene App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" - "Möchten Sie ein Update für diese bestehende App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." - "Möchten Sie ein Update für diese integrierte App installieren? Ihre vorhandenen Daten bleiben erhalten. Sie benötigen keine besonderen Zugriffsrechte." + "Möchtest du diese App installieren? Sie erhält dann folgende Berechtigungen:" + "Möchtest du diese App installieren? Sie benötigt keinen besonderen Zugriff." + "Möchtest du ein Update für diese vorhandene App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff auf:" + "Möchtest du ein Update für diese bestehende App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." + "Möchtest du ein Update für diese integrierte App installieren? Deine vorhandenen Daten bleiben erhalten. Die App benötigt keine besonderen Zugriffsrechte." "App wurde nicht installiert." "Das Paket ist offenbar beschädigt." "Ein Paket mit dem gleichen Namen, aber in Konflikt stehender Signatur, ist bereits installiert." @@ -40,36 +40,36 @@ "Diese App ist mit Ihrem Telefon nicht kompatibel." "Das angegebene Paket wurde gelöscht, bevor die Installation abgeschlossen werden konnte." "Das Paket hat die Prüfung nicht bestanden und kann daher nicht installiert werden." - "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederholen Sie die Installation." + "Bei der Paketüberprüfung ist eine Zeitüberschreitung aufgetreten. Wiederhole die Installation." "%1$s konnte nicht auf Ihrem Tablet installiert werden." "%1$s konnte nicht auf Ihrem Fernseher installiert werden." "%1$s konnte nicht auf Ihrem Telefon installiert werden." "Öffnen" "Installation gesperrt" - "Aus Sicherheitsgründen können Sie auf Ihrem Tablet keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf dem Fernseher keine Apps von unbekannten Quellen installieren." - "Aus Sicherheitsgründen können Sie auf Ihrem Telefon keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Tablet keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf dem Fernseher keine Apps von unbekannten Quellen installieren." + "Aus Sicherheitsgründen kannst du auf deinem Telefon keine Apps von unbekannten Quellen installieren." "Ihr Administrator erlaubt die Installation von Apps aus unbekannten Quellen nicht." "OK" "Einstellungen" "Neue Quelle für Apps" - "%1$s möchte andere Apps installieren.\n\nMöchten Sie dies jetzt und in Zukunft zulassen?" + "%1$s möchte andere Apps installieren.\n\nMöchtest du dies jetzt und in Zukunft zulassen?" "Apps verwalten" "App ersetzen?" - "Die App, die Sie momentan installieren, wird eine andere App ersetzen.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." + "Die App, die du momentan installierst, wird eine andere App ersetzen.\n\nAlle deine bisherigen Nutzerdaten werden gespeichert." "Dies ist eine Systemanwendung.\n\nAlle Ihre bisherigen Nutzerdaten werden gespeichert." "Kein freier Speicher vorhanden" - "%1$s konnte nicht installiert werden. Geben Sie Speicherplatz frei und versuchen Sie es erneut." + "%1$s konnte nicht installiert werden. Gib Speicherplatz frei und versuche es erneut." "OK" "App nicht gefunden" "Die App wurde nicht in der Liste der installierten Apps gefunden." "App deinstallieren" "Update deinstallieren" "%1$s gehört zu folgender App:" - "Möchten Sie diese App deinstallieren?" - "Möchten Sie diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." - "Möchten Sie diese App für den Nutzer %1$s deinstallieren?" - "Möchten Sie diese App durch die Werksversion ersetzen?" + "Möchtest du diese App deinstallieren?" + "Möchtest du diese App für ""alle"" Nutzer entfernen? Die App und alle zugehörigen Daten werden für ""alle"" Nutzer des Geräts entfernt." + "Möchtest du diese App für den Nutzer %1$s deinstallieren?" + "Möchtest du diese App durch die Werksversion ersetzen?" "Wird deinstalliert..." "Deinstallation abgeschlossen" "Deinstallation fehlgeschlagen" @@ -86,9 +86,9 @@ "Datenschutz" "Gerätezugriff" "Für dieses Update sind keine neuen Berechtigungen erforderlich." - "Möchten Sie die folgenden Berechtigungen gewähren? Diese ermöglichen den Zugriff auf Folgendes:" + "Möchtest du die folgenden Berechtigungen gewähren? Sie ermöglichen den Zugriff auf Folgendes:" "Zulassen" - "Verweigern" + "Ablehnen" "%1$s von %2$s" "%1$s ermöglichen, %2$s?" "Apps" @@ -100,7 +100,7 @@ Noch %1$d Noch %1$d - "Diese App wurde für eine ältere Version von Android konzipiert. Wenn Sie keine Berechtigung erteilen, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." + "Diese App wurde für eine ältere Version von Android konzipiert. Wenn du keine Berechtigung erteilst, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." "Unbekannte Aktion durchführen" "%1$d von %2$d Apps sind berechtigt." "System anzeigen" @@ -108,14 +108,14 @@ "Berechtigungen für %1$s" "Keine Apps" "Standorteinstellungen" - "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf Ihren Standort können Sie in den Standorteinstellungen ändern." - "Wenn Sie diese Berechtigung deaktivieren, funktionieren grundlegende Funktionen Ihres Geräts möglicherweise nicht mehr ordnungsgemäß." + "%1$s ist ein Anbieter von Standortdiensten für dieses Gerät. Die Berechtigungen für den Zugriff auf deinen Standort kannst du in den Standorteinstellungen ändern." + "Wenn du diese Berechtigung deaktivierst, funktionieren grundlegende Funktionen deines Geräts möglicherweise nicht mehr ordnungsgemäß." "Von Richtlinien durchgesetzt" "Wird geladen…" "Alle Berechtigungen" "Andere App-Funktionen" "Berechtigungsanfrage" "Display-Overlay erkannt" - "Um diese Berechtigungseinstellung zu ändern, müssen Sie zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." + "Um diese Berechtigungseinstellung zu ändern, musst du zunächst das Display-Overlay über \"Einstellungen\" > \"Apps\" deaktivieren." "Einstellungen öffnen" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 25d900c6..e51f39d6 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -16,7 +16,7 @@ - "Programme d\'installation de la trousse" + "Programme installation trousse" "Suivante" "Installer" "Terminé" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 55867cc9..34a58a8d 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -100,7 +100,7 @@ %1$d개 더보기 %1$d개 더보기 - "이 앱은 Android 이전 버전에 맞게 설계되었습니다. 권한이 거부되면 정상적으로 작동하지 않을 수 있습니다." + "이 앱은 Android 이전 버전에 맞게 설계되었습니다. 권한을 거부하면 정상적으로 작동하지 않을 수 있습니다." "알 수 없는 작업 수행" "%1$d/%2$d개 앱 허용됨" "시스템 표시" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 8cc487b2..5681b0e6 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -51,7 +51,7 @@ "За безбедност, вашиот телефон е подесен да блокира инсталирање апликации добиени од непознати извори." "Вашиот администратор не дозволува инсталација на апликации добиени од непознати извори." "Во ред" - "Подесувања" + "Поставки" "Нов извор за апликации" "%1$s сака да инсталира други апликации.\n\nДозволи го ова сега и во иднина?" "Управувај со апликации" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 4a3c6708..9fe7cf8f 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -28,7 +28,7 @@ "के तपाईँ यो अनुप्रयोग स्थापन गर्न चाहनु हुन्छ? यसले पहुँच प्राप्त गर्ने छ:" "के तपाईँ यस अनुप्रयोगलाई जडान गर्न चाहनु हुन्छ? यसको लागि कुनै विशेष पहुँचको आवश्यकता पर्दैन।" "के तपाईँसँग अहिले भईरहेको अनुप्रयोगको एक अपडेट लाई स्थापित गर्न चाहानुहुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। अपडेट भएको अनुप्रयोग पहुँच पाउनेछ मा:" - "के तपाईं यस पूर्व-निर्मित अनुप्रयोगमा अपडेट स्थापित गर्न चाहनु हुन्छ? तपाईंको रहेको डेटा हराउने छैन। अपडेट गरिएको अनुप्रयोगले पहुँच पाउने छ:" + "के तपाईँ यस पूर्व-निर्मित अनुप्रयोगमा अपडेट स्थापित गर्न चाहनु हुन्छ? तपाईँको रहेको डेटा हराउने छैन। अपडेट गरिएको अनुप्रयोगले पहुँच पाउने छ:" "के तपाईँसँग अहिले भइरहेको अनुप्रयोगको एउटा अपडेटलाई स्थापित गर्न चाहनु हुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। यसलाई कुनै विशेष पहुँचको आवश्यकता छैन।" "के तपाईँ यस जोडिएको अनुप्रयोगको एउटा अपडेटलाई स्थापित गर्न चाहनुहुन्छ? तपाईँको अहिलेको डेटा हराउने छैन। यसलाई कुनै विशेष पहुँचको आवश्यकता छैन।" "अनुप्रयोग स्थापना भएन।" @@ -67,7 +67,7 @@ "परिस्कारहरू अस्थापना गर्नुहोस्" "%1$s निम्न अनुप्रयोगको अंश हो:" "के तपाईँ यो अनुप्रयोग अस्थापना गर्न चाहनु हुन्छ?" - "के तपाईं यो अनुप्रयोग ""सबै"" प्रयोगकर्ताहरूको लागि स्थापना रद्द गर्न चाहनु हुन्छ? अनुप्रयोग र यसको डेटा ""सबै"" प्रयोगकर्ताहरूबाट उपकरणमा हटाइने छ।" + "के तपाईँ यो अनुप्रयोग ""सबै"" प्रयोगकर्ताहरूको लागि स्थापना रद्द गर्न चाहनु हुन्छ? अनुप्रयोग र यसको डेटा ""सबै"" प्रयोगकर्ताहरूबाट उपकरणमा हटाइने छ।" "के तपाईँ प्रयोगकर्ता %1$s को लागि यो अनुप्रयोग स्थापना रद्द गर्न चाहनुहुन्छ?" "के तपाईँ यस अनुप्रयोगलाई मूल संस्करणसँग फेर्न चाहनु हुन्छ?" "अस्थापना गर्दै..." @@ -86,7 +86,7 @@ "गोपनीयता" "उपकरण पहुँच" "यस अपडेटलाई नयाँ अनुमति आवश्यक पर्दैन।" - "के तपाईं निम्न अनुमति प्रदान गर्न चाहनु हुन्छ? यसले पहुँच पाउने छ:" + "के तपाईँ निम्न अनुमति प्रदान गर्न चाहनु हुन्छ? यसले पहुँच पाउने छ:" "अनुमति दिनुहोस्" "अस्वीकार गर्नुहोस्" "%2$s को %1$s" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 72fc07dd..c16efaf1 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -16,7 +16,7 @@ - "Installatieprogramma van pakket" + "Pakket-installatie" "Volgende" "Installeren" "Gereed" @@ -88,7 +88,7 @@ "Voor deze update zijn geen nieuwe machtigingen vereist." "Wilt u de volgende machtigingen verlenen? Hiermee kan toegang worden verkregen tot:" "Toestaan" - "Afwijzen" + "Weigeren" "%1$s van %2$s" "Toestaan dat %1$s het volgende doet: %2$s?" "Apps" @@ -109,7 +109,7 @@ "Geen apps" "Locatie-instellingen" "%1$s is een leverancier van locatieservices voor dit apparaat. Locatietoegang kan worden aangepast via de locatie-instellingen." - "Als u deze toestemming weigert, functioneren basisfuncties van je apparaat mogelijk niet meer zoals bedoeld." + "Als je deze toestemming weigert, kan het zijn dat basisfuncties van je apparaat niet meer werken zoals bedoeld." "Afgedwongen door beleid" "Laden…" "Alle rechten" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index d6929bd8..0e9a3314 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -102,7 +102,7 @@ Jeszcze %1$d Jeszcze %1$d - "Ta aplikacja jest przeznaczona na straszą wersję Androida. Odmówienie uprawnień może spowodować, że przestanie ona działać w zamierzony sposób." + "Ta aplikacja jest na straszą wersję Androida. Jeśli odmówisz uprawnień, aplikacja może nie działać prawidłowo." "wykonywanie nieznanych działań" "Dozwolone: %1$d z %2$d aplikacji" "Pokaż systemowe" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 7fd4f79d..713a8aa3 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -73,7 +73,7 @@ "Desinstalando..." "Desinstalação concluída." "Desinstalação malsucedida." - "Não é possível desinstalar, pois este pacote é um admin. de dispositivos ativo." + "Não é possível desinstalar um administrador de dispositivos ativo." "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 7fd4f79d..713a8aa3 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -73,7 +73,7 @@ "Desinstalando..." "Desinstalação concluída." "Desinstalação malsucedida." - "Não é possível desinstalar, pois este pacote é um admin. de dispositivos ativo." + "Não é possível desinstalar um administrador de dispositivos ativo." "Não é possível desinstalar este pacote porque ele é um administrador de dispositivo ativo para o usuário %1$s." "Este app é necessário para seu perfil de trabalho e não pode ser desinstalado." "O app é exigido pelo administrador do dispositivo e não pode ser desinstalado." diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 2a7800ca..eae848e5 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -110,7 +110,7 @@ "Nicio aplicație" "Setări privind locația" "%1$s este un furnizor de servicii de localizare pentru acest dispozitiv. Accesul la locație poate fi modificat din setările privind locația." - "Dacă refuzați această permisiune, este posibil ca funcțiile de bază ale dispozitivului să nu mai funcționează corespunzător." + "Dacă refuzați această permisiune, este posibil ca funcțiile de bază ale dispozitivului să nu mai funcționeze corespunzător." "Aplicată conform politicii" "Se încarcă..." "Toate permisiunile" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 21ae1fe6..dd270bdc 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -16,7 +16,7 @@ - "Программа установки пакета" + "Установщик пакетов" "Далее" "Установить" "Готово" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 86c19317..a8bd7e04 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -36,18 +36,18 @@ "Det finns redan ett paket med samma namn och en signatur som är i konflikt." "Paketet fungerar bara med nyare versioner av Android." "Appen är inte kompatibel med din surfplatta." - "Appen är inte kompatibel med din tv." + "Appen är inte kompatibel med din TV." "Appen är inte kompatibel med din mobil." "Paketet som angavs togs bort innan installationen var slutförd." "Paketet klarade inte verifieringen och får inte installeras." "En timeout inträffade när paketet skulle verifieras. Prova att installera paketet senare." "Det gick inte att installera %1$s på surfplattan." - "%1$s kunde inte installeras på tv:n." + "%1$s kunde inte installeras på TV:n." "Det gick inte att installera %1$s på mobilen." "Öppna" "Installation blockerad" "Av säkerhetsskäl går det inte att installera appar från okända källor på din surfplatta." - "Tv:n är av säkerhetsskäl inställd på att blockera installationer av appar från okända källor." + "TV:n är av säkerhetsskäl inställd på att blockera installationer av appar från okända källor." "Av säkerhetsskäl går det inte att installera appar från okända källor på din mobil." "Administratören tillåter inte installation av appar från okända källor." "OK" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 6c16c03d..0e3e5809 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -90,7 +90,7 @@ "அனுமதி" "நிராகரி" "%1$s / %2$s" - "%2$s செயலுக்கு %1$s-ஐ அனுமதிக்கவா?" + "%2$s செயலுக்கு %1$sஐ அனுமதிக்கவா?" "பயன்பாடுகள்" "பயன்பாட்டு அனுமதிகள்" "மீண்டும் கேட்காதே" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4248b05c..ab5925a6 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -92,7 +92,7 @@ "第 %1$s 项权限(共 %2$s 项)" "要允许%1$s%2$s吗?" "应用" - "应用所需权限" + "应用访问授权" "不再询问" "没有权限" "其他权限" -- cgit v1.2.3