diff options
189 files changed, 4666 insertions, 2333 deletions
@@ -155,6 +155,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/INetworkManagementEventObserver.aidl \ core/java/android/net/INetworkPolicyListener.aidl \ core/java/android/net/INetworkPolicyManager.aidl \ + core/java/android/net/INetworkScoreService.aidl \ core/java/android/net/INetworkStatsService.aidl \ core/java/android/net/INetworkStatsSession.aidl \ core/java/android/net/nsd/INsdManager.aidl \ diff --git a/CleanSpec.mk b/CleanSpec.mk index ffdac4e..c6f6a62 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -189,6 +189,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/servic $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/media/java/android/media/IMedia*) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/view/IMagnificationCallbacks*) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/tv/) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/media/java/android/media/) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST diff --git a/api/current.txt b/api/current.txt index 3573e6d..4e2a3bb 100644 --- a/api/current.txt +++ b/api/current.txt @@ -27974,7 +27974,6 @@ package android.tv { public static final class TvInputManager.Session { method public void release(); - method public void setSurface(android.view.Surface); method public void setVolume(float); method public void tune(android.net.Uri); } @@ -27996,12 +27995,22 @@ package android.tv { field public static final java.lang.String SERVICE_INTERFACE = "android.tv.TvInputService"; } - public static abstract class TvInputService.TvInputSessionImpl { + public abstract class TvInputService.TvInputSessionImpl { ctor public TvInputService.TvInputSessionImpl(); + method public android.view.View onCreateOverlayView(); method public abstract void onRelease(); method public abstract boolean onSetSurface(android.view.Surface); method public abstract void onSetVolume(float); method public abstract boolean onTune(android.net.Uri); + method public void setOverlayViewEnabled(boolean); + } + + public class TvView extends android.view.SurfaceView { + ctor public TvView(android.content.Context); + ctor public TvView(android.content.Context, android.util.AttributeSet); + ctor public TvView(android.content.Context, android.util.AttributeSet, int); + method public void bindTvInput(android.content.ComponentName, android.tv.TvInputManager.SessionCreateCallback); + method public void unbindTvInput(); } } diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 51cb12a..edf21dd 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -33,17 +33,20 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.TextureView; import android.view.TextureView.SurfaceTextureListener; -import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import dalvik.system.CloseGuard; + +import java.lang.ref.WeakReference; /** @hide */ public class ActivityView extends ViewGroup { - private final String TAG = "ActivityView"; - private final boolean DEBUG = false; + private static final String TAG = "ActivityView"; + private static final boolean DEBUG = false; + DisplayMetrics mMetrics; private final TextureView mTextureView; - private IActivityContainer mActivityContainer; + private ActivityContainerWrapper mActivityContainer; private Activity mActivity; private int mWidth; private int mHeight; @@ -75,68 +78,33 @@ public class ActivityView extends ViewGroup { throw new IllegalStateException("The ActivityView's Context is not an Activity."); } - mTextureView = new TextureView(context); - mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener()); - addView(mTextureView); - if (DEBUG) Log.v(TAG, "ctor()"); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - mTextureView.layout(0, 0, r - l, b - t); - } - - @Override - protected void onAttachedToWindow() { - if (DEBUG) Log.v(TAG, "onAttachedToWindow()"); - super.onAttachedToWindow(); try { - final IBinder token = mActivity.getActivityToken(); - mActivityContainer = ActivityManagerNative.getDefault().createActivityContainer(token, - new ActivityContainerCallback()); + mActivityContainer = new ActivityContainerWrapper( + ActivityManagerNative.getDefault().createActivityContainer( + mActivity.getActivityToken(), new ActivityContainerCallback(this))); } catch (RemoteException e) { - throw new IllegalStateException("ActivityView: Unable to create ActivityContainer. " + throw new RuntimeException("ActivityView: Unable to create ActivityContainer. " + e); } - attachToSurfaceWhenReady(); - } + mTextureView = new TextureView(context); + mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener()); + addView(mTextureView); - @Override - protected void onDetachedFromWindow() { - if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer); - super.onDetachedFromWindow(); - if (mActivityContainer != null) { - detach(); - try { - ActivityManagerNative.getDefault().deleteActivityContainer(mActivityContainer); - } catch (RemoteException e) { - } - mActivityContainer = null; - } + WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE); + mMetrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(mMetrics); + + if (DEBUG) Log.v(TAG, "ctor()"); } @Override - protected void onWindowVisibilityChanged(int visibility) { - if (DEBUG) Log.v(TAG, "onWindowVisibilityChanged(): visibility=" + visibility); - super.onWindowVisibilityChanged(visibility); - switch (visibility) { - case View.VISIBLE: - attachToSurfaceWhenReady(); - break; - case View.INVISIBLE: - break; - case View.GONE: - break; - } + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mTextureView.layout(0, 0, r - l, b - t); } private boolean injectInputEvent(InputEvent event) { - try { - return mActivityContainer != null && mActivityContainer.injectEvent(event); - } catch (RemoteException e) { - return false; - } + return mActivityContainer != null && mActivityContainer.injectEvent(event); } @Override @@ -154,40 +122,45 @@ public class ActivityView extends ViewGroup { return super.onGenericMotionEvent(event); } + @Override + public void onAttachedToWindow() { + if (DEBUG) Log.v(TAG, "onAttachedToWindow(): mActivityContainer=" + mActivityContainer + + " mSurface=" + mSurface); + } + + @Override + public void onDetachedFromWindow() { + if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer + + " mSurface=" + mSurface); + } + public boolean isAttachedToDisplay() { return mSurface != null; } public void startActivity(Intent intent) { + if (mActivityContainer == null) { + throw new IllegalStateException("Attempt to call startActivity after release"); + } if (DEBUG) Log.v(TAG, "startActivity(): intent=" + intent + " " + (isAttachedToDisplay() ? "" : "not") + " attached"); if (mSurface != null) { - try { - mActivityContainer.startActivity(intent); - } catch (RemoteException e) { - throw new IllegalStateException("ActivityView: Unable to startActivity. " + e); - } + mActivityContainer.startActivity(intent); } else { mQueuedIntent = intent; mQueuedPendingIntent = null; } } - private void startActivityIntentSender(IIntentSender iIntentSender) { - try { - mActivityContainer.startActivityIntentSender(iIntentSender); - } catch (RemoteException e) { - throw new IllegalStateException( - "ActivityView: Unable to startActivity from IntentSender. " + e); - } - } - public void startActivity(IntentSender intentSender) { + if (mActivityContainer == null) { + throw new IllegalStateException("Attempt to call startActivity after release"); + } if (DEBUG) Log.v(TAG, "startActivityIntentSender(): intentSender=" + intentSender + " " + (isAttachedToDisplay() ? "" : "not") + " attached"); final IIntentSender iIntentSender = intentSender.getTarget(); if (mSurface != null) { - startActivityIntentSender(iIntentSender); + mActivityContainer.startActivityIntentSender(iIntentSender); } else { mQueuedPendingIntent = iIntentSender; mQueuedIntent = null; @@ -195,84 +168,102 @@ public class ActivityView extends ViewGroup { } public void startActivity(PendingIntent pendingIntent) { + if (mActivityContainer == null) { + throw new IllegalStateException("Attempt to call startActivity after release"); + } if (DEBUG) Log.v(TAG, "startActivityPendingIntent(): PendingIntent=" + pendingIntent + " " + (isAttachedToDisplay() ? "" : "not") + " attached"); final IIntentSender iIntentSender = pendingIntent.getTarget(); if (mSurface != null) { - startActivityIntentSender(iIntentSender); + mActivityContainer.startActivityIntentSender(iIntentSender); } else { mQueuedPendingIntent = iIntentSender; mQueuedIntent = null; } } + public void release() { + if (DEBUG) Log.v(TAG, "release() mActivityContainer=" + mActivityContainer + + " mSurface=" + mSurface); + if (mActivityContainer == null) { + Log.e(TAG, "Duplicate call to release"); + return; + } + mActivityContainer.release(); + mActivityContainer = null; + + if (mSurface != null) { + mSurface.release(); + mSurface = null; + } + + mTextureView.setSurfaceTextureListener(null); + } + private void attachToSurfaceWhenReady() { final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); - if (mActivityContainer == null || surfaceTexture == null || mSurface != null) { + if (surfaceTexture == null || mSurface != null) { // Either not ready to attach, or already attached. return; } - WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE); - DisplayMetrics metrics = new DisplayMetrics(); - wm.getDefaultDisplay().getMetrics(metrics); - mSurface = new Surface(surfaceTexture); try { - mActivityContainer.attachToSurface(mSurface, mWidth, mHeight, metrics.densityDpi); + mActivityContainer.setSurface(mSurface, mWidth, mHeight, mMetrics.densityDpi); } catch (RemoteException e) { mSurface.release(); mSurface = null; - throw new IllegalStateException( - "ActivityView: Unable to create ActivityContainer. " + e); + throw new RuntimeException("ActivityView: Unable to create ActivityContainer. " + e); } if (DEBUG) Log.v(TAG, "attachToSurfaceWhenReady: " + (mQueuedIntent != null || mQueuedPendingIntent != null ? "" : "no") + " queued intent"); if (mQueuedIntent != null) { - startActivity(mQueuedIntent); + mActivityContainer.startActivity(mQueuedIntent); mQueuedIntent = null; } else if (mQueuedPendingIntent != null) { - startActivityIntentSender(mQueuedPendingIntent); + mActivityContainer.startActivityIntentSender(mQueuedPendingIntent); mQueuedPendingIntent = null; } } - private void detach() { - if (DEBUG) Log.d(TAG, "detach: attached=" + isAttachedToDisplay()); - if (mSurface != null) { - try { - mActivityContainer.detachFromDisplay(); - } catch (RemoteException e) { - } - mSurface.release(); - mSurface = null; - } - } - private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { + if (mActivityContainer == null) { + return; + } if (DEBUG) Log.d(TAG, "onSurfaceTextureAvailable: width=" + width + " height=" + height); mWidth = width; mHeight = height; - if (mActivityContainer != null) { - attachToSurfaceWhenReady(); - } + attachToSurfaceWhenReady(); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) { + if (mActivityContainer == null) { + return; + } if (DEBUG) Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { + if (mActivityContainer == null) { + return true; + } if (DEBUG) Log.d(TAG, "onSurfaceTextureDestroyed"); - detach(); + mSurface.release(); + mSurface = null; + try { + mActivityContainer.setSurface(null, mWidth, mHeight, mMetrics.densityDpi); + } catch (RemoteException e) { + throw new RuntimeException( + "ActivityView: Unable to set surface of ActivityContainer. " + e); + } return true; } @@ -283,13 +274,95 @@ public class ActivityView extends ViewGroup { } - private class ActivityContainerCallback extends IActivityContainerCallback.Stub { + private static class ActivityContainerCallback extends IActivityContainerCallback.Stub { + private final WeakReference<ActivityView> mActivityViewWeakReference; + + ActivityContainerCallback(ActivityView activityView) { + mActivityViewWeakReference = new WeakReference<ActivityView>(activityView); + } + @Override public void setVisible(IBinder container, boolean visible) { - if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible); - if (visible) { - } else { + if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible + + " ActivityView=" + mActivityViewWeakReference.get()); + } + } + + private static class ActivityContainerWrapper { + private final IActivityContainer mIActivityContainer; + private final CloseGuard mGuard = CloseGuard.get(); + + ActivityContainerWrapper(IActivityContainer container) { + mIActivityContainer = container; + mGuard.open("release"); + } + + void attachToDisplay(int displayId) { + try { + mIActivityContainer.attachToDisplay(displayId); + } catch (RemoteException e) { + } + } + + void setSurface(Surface surface, int width, int height, int density) + throws RemoteException { + mIActivityContainer.setSurface(surface, width, height, density); + } + + int startActivity(Intent intent) { + try { + return mIActivityContainer.startActivity(intent); + } catch (RemoteException e) { + throw new RuntimeException("ActivityView: Unable to startActivity. " + e); + } + } + + int startActivityIntentSender(IIntentSender intentSender) { + try { + return mIActivityContainer.startActivityIntentSender(intentSender); + } catch (RemoteException e) { + throw new RuntimeException( + "ActivityView: Unable to startActivity from IntentSender. " + e); + } + } + + int getDisplayId() { + try { + return mIActivityContainer.getDisplayId(); + } catch (RemoteException e) { + return -1; } } + + boolean injectEvent(InputEvent event) { + try { + return mIActivityContainer.injectEvent(event); + } catch (RemoteException e) { + return false; + } + } + + void release() { + if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called"); + try { + mIActivityContainer.release(); + mGuard.close(); + } catch (RemoteException e) { + } + } + + @Override + protected void finalize() throws Throwable { + if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: finalize called"); + try { + if (mGuard != null) { + mGuard.warnIfOpen(); + release(); + } + } finally { + super.finalize(); + } + } + } } diff --git a/core/java/android/app/IActivityContainer.aidl b/core/java/android/app/IActivityContainer.aidl index 5b80e06..cc3b10c 100644 --- a/core/java/android/app/IActivityContainer.aidl +++ b/core/java/android/app/IActivityContainer.aidl @@ -26,10 +26,10 @@ import android.view.Surface; /** @hide */ interface IActivityContainer { void attachToDisplay(int displayId); - void attachToSurface(in Surface surface, int width, int height, int density); - void detachFromDisplay(); + void setSurface(in Surface surface, int width, int height, int density); int startActivity(in Intent intent); int startActivityIntentSender(in IIntentSender intentSender); int getDisplayId(); boolean injectEvent(in InputEvent event); + void release(); } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index bb6eeda..8681f5c 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -23,6 +23,7 @@ import android.app.Notification; import android.content.ComponentName; import android.content.Intent; import android.service.notification.INotificationListener; +import android.service.notification.ZenModeConfig; /** {@hide} */ interface INotificationManager @@ -49,4 +50,7 @@ interface INotificationManager StatusBarNotification[] getActiveNotificationsFromListener(in INotificationListener token, in String[] keys); String[] getActiveNotificationKeysFromListener(in INotificationListener token); + + ZenModeConfig getZenModeConfig(); + boolean setZenModeConfig(in ZenModeConfig config); }
\ No newline at end of file diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java index 7328fe3..ee2adac 100644 --- a/core/java/android/hardware/camera2/impl/CameraDevice.java +++ b/core/java/android/hardware/camera2/impl/CameraDevice.java @@ -315,6 +315,12 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { holder = (index >= 0) ? mCaptureListenerMap.valueAt(index) : null; if (holder != null) { mCaptureListenerMap.removeAt(index); + if (DEBUG) { + Log.v(TAG, String.format( + "remove holder for requestId %d, " + + "because lastFrame is %d.", + requestId, lastFrameNumber)); + } } if (holder != null) { @@ -390,6 +396,10 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { if (listener != null) { mCaptureListenerMap.put(requestId, new CaptureListenerHolder(listener, requestList, handler, repeating)); + } else { + if (DEBUG) { + Log.d(TAG, "Listen for request " + requestId + " is null"); + } } long lastFrameNumber = lastFrameNumberRef.getNumber(); @@ -828,7 +838,8 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { CaptureResultExtras resultExtras) throws RemoteException { int requestId = resultExtras.getRequestId(); if (DEBUG) { - Log.d(TAG, "Received result for id " + requestId); + Log.v(TAG, "Received result frame " + resultExtras.getFrameNumber() + " for id " + + requestId); } final CaptureListenerHolder holder; synchronized (mLock) { @@ -838,17 +849,26 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { Boolean quirkPartial = result.get(CaptureResult.QUIRKS_PARTIAL_RESULT); boolean quirkIsPartialResult = (quirkPartial != null && quirkPartial); + // Update tracker (increment counter) when it's not a partial result. + if (!quirkIsPartialResult) { + mFrameNumberTracker.updateTracker(resultExtras.getFrameNumber(), /*error*/false); + } + // Check if we have a listener for this if (holder == null) { if (DEBUG) { - Log.v(TAG, "holder is null, early return"); + Log.d(TAG, + "holder is null, early return at frame " + + resultExtras.getFrameNumber()); } return; } if (isClosed()) { if (DEBUG) { - Log.v(TAG, "camera is closed, early return"); + Log.d(TAG, + "camera is closed, early return at frame " + + resultExtras.getFrameNumber()); } return; } @@ -891,7 +911,6 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { // Fire onCaptureSequenceCompleted if (!quirkIsPartialResult) { - mFrameNumberTracker.updateTracker(resultExtras.getFrameNumber(), /*error*/false); checkAndFireSequenceComplete(); } } diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl new file mode 100644 index 0000000..a72d9a0 --- /dev/null +++ b/core/java/android/net/INetworkScoreService.aidl @@ -0,0 +1,49 @@ +/** + * 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 android.net; + +import android.net.ScoredNetwork; + +/** + * A service for updating network scores from a network scorer application. + * @hide + */ +interface INetworkScoreService +{ + /** + * Update scores. + * @return whether the update was successful. + * @throws SecurityException if the caller is not the current active scorer. + */ + boolean updateScores(in ScoredNetwork[] networks); + + /** + * Clear all scores. + * @return whether the clear was successful. + * @throws SecurityException if the caller is neither the current active scorer nor the scorer + * manager. + */ + boolean clearScores(); + + /** + * Set the active scorer and clear existing scores. + * @param packageName the package name of the new scorer to use. + * @return true if the operation succeeded, or false if the new package is not a valid scorer. + * @throws SecurityException if the caller is not the scorer manager. + */ + boolean setActiveScorer(in String packageName); +} diff --git a/core/java/android/net/NetworkKey.java b/core/java/android/net/NetworkKey.java index cc3ad3e..bc19658 100644 --- a/core/java/android/net/NetworkKey.java +++ b/core/java/android/net/NetworkKey.java @@ -19,11 +19,19 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + /** * Information which identifies a specific network. * * @hide */ +// NOTE: Ideally, we would abstract away the details of what identifies a network of a specific +// type, so that all networks appear the same and can be scored without concern to the network type +// itself. However, because no such cross-type identifier currently exists in the Android framework, +// and because systems might obtain information about networks from sources other than Android +// devices, we need to provide identifying details about each specific network type (wifi, cell, +// etc.) so that clients can pull out these details depending on the type of network. public class NetworkKey implements Parcelable { /** A wifi network, for which {@link #wifiKey} will be populated. */ @@ -79,6 +87,21 @@ public class NetworkKey implements Parcelable { } @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + NetworkKey that = (NetworkKey) o; + + return type == that.type && Objects.equals(wifiKey, that.wifiKey); + } + + @Override + public int hashCode() { + return Objects.hash(type, wifiKey); + } + + @Override public String toString() { switch (type) { case TYPE_WIFI: diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java index 3430547..5e61613 100644 --- a/core/java/android/net/NetworkScoreManager.java +++ b/core/java/android/net/NetworkScoreManager.java @@ -19,6 +19,9 @@ package android.net; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.Context; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; /** * Class that manages communication between network subsystems and a network scorer. @@ -40,7 +43,7 @@ import android.content.Context; * <p>The system keeps track of a default scorer application; at any time, only this application * will receive {@link #ACTION_SCORE_NETWORKS} broadcasts and will be permitted to call * {@link #updateScores}. Applications may determine the current default scorer with - * {@link #getDefaultScorerPackage()} and request to change the default scorer by sending an + * {@link #getActiveScorerPackage()} and request to change the default scorer by sending an * {@link #ACTION_CHANGE_DEFAULT} broadcast with another scorer. * * @hide @@ -81,38 +84,82 @@ public class NetworkScoreManager { public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore"; private final Context mContext; + private final INetworkScoreService mService; /** @hide */ public NetworkScoreManager(Context context) { mContext = context; + IBinder iBinder = ServiceManager.getService(Context.NETWORK_SCORE_SERVICE); + mService = INetworkScoreService.Stub.asInterface(iBinder); } /** - * Obtain the package name of the current default network scorer. + * Obtain the package name of the current active network scorer. * - * At any time, only one scorer application will receive {@link #ACTION_SCORE_NETWORKS} + * <p>At any time, only one scorer application will receive {@link #ACTION_SCORE_NETWORKS} * broadcasts and be allowed to call {@link #updateScores}. Applications may use this method to * determine the current scorer and offer the user the ability to select a different scorer via * the {@link #ACTION_CHANGE_DEFAULT} intent. - * @return the full package name of the current default scorer, or null if there is no active + * @return the full package name of the current active scorer, or null if there is no active * scorer. */ - public String getDefaultScorerPackage() { - // TODO: Implement. - return null; + public String getActiveScorerPackage() { + return NetworkScorerAppManager.getActiveScorer(mContext); } /** * Update network scores. * - * This may be called at any time to re-score active networks. Scores will generally be updated - * quickly, but if this method is called too frequently, the scores may be held and applied at - * a later time. + * <p>This may be called at any time to re-score active networks. Scores will generally be + * updated quickly, but if this method is called too frequently, the scores may be held and + * applied at a later time. * * @param networks the networks which have been scored by the scorer. - * @throws SecurityException if the caller is not the default scorer. + * @return whether the update was successful. + * @throws SecurityException if the caller is not the active scorer. */ - public void updateScores(ScoredNetwork[] networks) throws SecurityException { - // TODO: Implement. + public boolean updateScores(ScoredNetwork[] networks) throws SecurityException { + try { + return mService.updateScores(networks); + } catch (RemoteException e) { + return false; + } + } + + /** + * Clear network scores. + * + * <p>Should be called when all scores need to be invalidated, i.e. because the scoring + * algorithm has changed and old scores can no longer be compared to future scores. + * + * <p>Note that scores will be cleared automatically when the active scorer changes, as scores + * from one scorer cannot be compared to those from another scorer. + * + * @return whether the clear was successful. + * @throws SecurityException if the caller is not the active scorer or privileged. + */ + public boolean clearScores() throws SecurityException { + try { + return mService.clearScores(); + } catch (RemoteException e) { + return false; + } + } + + /** + * Set the active scorer to a new package and clear existing scores. + * + * @return true if the operation succeeded, or false if the new package is not a valid scorer. + * @throws SecurityException if the caller does not hold the + * {@link android.Manifest.permission#BROADCAST_SCORE_NETWORKS} permission indicating that + * it can manage scorer applications. + * @hide + */ + public boolean setActiveScorer(String packageName) throws SecurityException { + try { + return mService.setActiveScorer(packageName); + } catch (RemoteException e) { + return false; + } } } diff --git a/core/java/android/net/NetworkScorerApplication.java b/core/java/android/net/NetworkScorerAppManager.java index b137ad3..726208a 100644 --- a/core/java/android/net/NetworkScorerApplication.java +++ b/core/java/android/net/NetworkScorerAppManager.java @@ -26,6 +26,7 @@ import android.content.pm.ResolveInfo; import android.provider.Settings; import android.provider.Settings.Global; import android.text.TextUtils; +import android.util.Log; import java.util.ArrayList; import java.util.Collection; @@ -36,13 +37,14 @@ import java.util.List; * * @hide */ -public final class NetworkScorerApplication { +public final class NetworkScorerAppManager { + private static final String TAG = "NetworkScorerAppManager"; private static final Intent SCORE_INTENT = new Intent(NetworkScoreManager.ACTION_SCORE_NETWORKS); /** This class cannot be instantiated. */ - private NetworkScorerApplication() {} + private NetworkScorerAppManager() {} /** * Returns the list of available scorer app package names. @@ -111,30 +113,38 @@ public final class NetworkScorerApplication { * @param context the context of the calling application * @param packageName the packageName of the new scorer to use. If null, scoring will be * disabled. Otherwise, the scorer will only be set if it is a valid scorer application. + * @return true if the scorer was changed, or false if the package is not a valid scorer. */ - public static void setActiveScorer(Context context, String packageName) { + public static boolean setActiveScorer(Context context, String packageName) { String oldPackageName = Settings.Global.getString(context.getContentResolver(), Settings.Global.NETWORK_SCORER_APP); if (TextUtils.equals(oldPackageName, packageName)) { // No change. - return; + return true; } + Log.i(TAG, "Changing network scorer from " + oldPackageName + " to " + packageName); + if (packageName == null) { Settings.Global.putString(context.getContentResolver(), Global.NETWORK_SCORER_APP, null); + return true; } else { // We only make the change if the new package is valid. Collection<String> applications = getAllValidScorers(context); if (isPackageValidScorer(applications, packageName)) { Settings.Global.putString(context.getContentResolver(), Settings.Global.NETWORK_SCORER_APP, packageName); + return true; + } else { + Log.w(TAG, "Requested network scorer is not valid: " + packageName); + return false; } } } /** Determine whether the application with the given UID is the enabled scorer. */ - public static boolean isCallerDefaultScorer(Context context, int callingUid) { + public static boolean isCallerActiveScorer(Context context, int callingUid) { String defaultApp = getActiveScorer(context); if (defaultApp == null) { return false; diff --git a/core/java/android/net/RssiCurve.java b/core/java/android/net/RssiCurve.java index 7af7998..33e81c2 100644 --- a/core/java/android/net/RssiCurve.java +++ b/core/java/android/net/RssiCurve.java @@ -19,6 +19,9 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Arrays; +import java.util.Objects; + /** * A curve defining the network score over a range of RSSI values. * @@ -94,6 +97,30 @@ public class RssiCurve implements Parcelable { out.writeByteArray(rssiBuckets); } + /** + * Determine if two RSSI curves are defined in the same way. + * + * <p>Note that two curves can be equivalent but defined differently, e.g. if one bucket in one + * curve is split into two buckets in another. For the purpose of this method, these curves are + * not considered equal to each other. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + RssiCurve rssiCurve = (RssiCurve) o; + + return start == rssiCurve.start && + bucketWidth == rssiCurve.bucketWidth && + Arrays.equals(rssiBuckets, rssiCurve.rssiBuckets); + } + + @Override + public int hashCode() { + return Objects.hash(start, bucketWidth, rssiBuckets); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/core/java/android/net/ScoredNetwork.java b/core/java/android/net/ScoredNetwork.java index 8af3c3c..7902313 100644 --- a/core/java/android/net/ScoredNetwork.java +++ b/core/java/android/net/ScoredNetwork.java @@ -19,6 +19,8 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + /** * A network identifier along with a score for the quality of that network. * @@ -80,6 +82,22 @@ public class ScoredNetwork implements Parcelable { } @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ScoredNetwork that = (ScoredNetwork) o; + + return Objects.equals(networkKey, that.networkKey) && + Objects.equals(rssiCurve, that.rssiCurve); + } + + @Override + public int hashCode() { + return Objects.hash(networkKey, rssiCurve); + } + + @Override public String toString() { return "ScoredNetwork[key=" + networkKey + ",score=" + rssiCurve + "]"; } diff --git a/core/java/android/net/WifiKey.java b/core/java/android/net/WifiKey.java index ffcd85a..9e92e89 100644 --- a/core/java/android/net/WifiKey.java +++ b/core/java/android/net/WifiKey.java @@ -19,6 +19,7 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; import java.util.regex.Pattern; /** @@ -87,6 +88,21 @@ public class WifiKey implements Parcelable { } @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + WifiKey wifiKey = (WifiKey) o; + + return Objects.equals(ssid, wifiKey.ssid) && Objects.equals(bssid, wifiKey.bssid); + } + + @Override + public int hashCode() { + return Objects.hash(ssid, bssid); + } + + @Override public String toString() { return "WifiKey[SSID=" + ssid + ",BSSID=" + bssid + "]"; } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 426f21e..e640649 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -2861,29 +2861,21 @@ public abstract class BatteryStats implements Parcelable { int oldTemp = -1; int oldVolt = -1; long lastTime = -1; + long firstTime = -1; - public void printNextItem(PrintWriter pw, HistoryItem rec, long now, boolean checkin, + public void printNextItem(PrintWriter pw, HistoryItem rec, long baseTime, boolean checkin, boolean verbose) { if (!checkin) { pw.print(" "); - if (now >= 0) { - TimeUtils.formatDuration(rec.time-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); - } else { - TimeUtils.formatDuration(rec.time, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); - } + TimeUtils.formatDuration(rec.time - baseTime, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); pw.print(" ("); pw.print(rec.numReadInts); pw.print(") "); } else { if (lastTime < 0) { - if (now >= 0) { - pw.print("@"); - pw.print(rec.time-now); - } else { - pw.print(rec.time); - } + pw.print(rec.time - baseTime); } else { - pw.print(rec.time-lastTime); + pw.print(rec.time - lastTime); } lastTime = rec.time; } @@ -3132,10 +3124,27 @@ public abstract class BatteryStats implements Parcelable { pw.println("):"); HistoryPrinter hprinter = new HistoryPrinter(); long lastTime = -1; + long baseTime = -1; + boolean printed = false; while (getNextHistoryLocked(rec)) { lastTime = rec.time; + if (baseTime < 0) { + baseTime = lastTime; + } if (rec.time >= histStart) { - hprinter.printNextItem(pw, rec, histStart >= 0 ? -1 : now, false, + if (histStart >= 0 && !printed) { + if (rec.cmd == HistoryItem.CMD_CURRENT_TIME) { + printed = true; + } else if (rec.currentTime != 0) { + printed = true; + byte cmd = rec.cmd; + rec.cmd = HistoryItem.CMD_CURRENT_TIME; + hprinter.printNextItem(pw, rec, baseTime, false, + (flags&DUMP_VERBOSE) != 0); + rec.cmd = cmd; + } + } + hprinter.printNextItem(pw, rec, baseTime, false, (flags&DUMP_VERBOSE) != 0); } } @@ -3152,8 +3161,12 @@ public abstract class BatteryStats implements Parcelable { try { pw.println("Old battery History:"); HistoryPrinter hprinter = new HistoryPrinter(); + long baseTime = -1; while (getNextOldHistoryLocked(rec)) { - hprinter.printNextItem(pw, rec, now, false, (flags&DUMP_VERBOSE) != 0); + if (baseTime < 0) { + baseTime = rec.time; + } + hprinter.printNextItem(pw, rec, baseTime, false, (flags&DUMP_VERBOSE) != 0); } pw.println(); } finally { @@ -3226,20 +3239,42 @@ public abstract class BatteryStats implements Parcelable { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_STRING_POOL); pw.print(','); pw.print(i); - pw.print(','); - pw.print(getHistoryTagPoolString(i)); - pw.print(','); + pw.print(","); pw.print(getHistoryTagPoolUid(i)); + pw.print(",\""); + String str = getHistoryTagPoolString(i); + str = str.replace("\\", "\\\\"); + str = str.replace("\"", "\\\""); + pw.print(str); + pw.print("\""); pw.println(); } HistoryPrinter hprinter = new HistoryPrinter(); long lastTime = -1; + long baseTime = -1; + boolean printed = false; while (getNextHistoryLocked(rec)) { lastTime = rec.time; + if (baseTime < 0) { + baseTime = lastTime; + } if (rec.time >= histStart) { + if (histStart >= 0 && !printed) { + if (rec.cmd == HistoryItem.CMD_CURRENT_TIME) { + printed = true; + } else if (rec.currentTime != 0) { + printed = true; + byte cmd = rec.cmd; + rec.cmd = HistoryItem.CMD_CURRENT_TIME; + pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); + pw.print(HISTORY_DATA); pw.print(','); + hprinter.printNextItem(pw, rec, baseTime, true, false); + rec.cmd = cmd; + } + } pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(','); - hprinter.printNextItem(pw, rec, histStart >= 0 ? -1 : now, true, false); + hprinter.printNextItem(pw, rec, baseTime, true, false); } } if (histStart >= 0) { diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 63e15a9..19be2c8 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -487,7 +487,7 @@ public class Build { * new changes in behavior:</p> * <ul> * <li> {@link android.content.Context#bindService Context.bindService} now - * requires an explicit Intent, and will throw an exception if given an explicit + * requires an explicit Intent, and will throw an exception if given an implicit * Intent.</li> * </ul> */ diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index e96398a..e98a26b 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -42,6 +42,7 @@ public class Environment { private static final String ENV_SECONDARY_STORAGE = "SECONDARY_STORAGE"; private static final String ENV_ANDROID_ROOT = "ANDROID_ROOT"; private static final String ENV_OEM_ROOT = "OEM_ROOT"; + private static final String ENV_VENDOR_ROOT = "VENDOR_ROOT"; /** {@hide} */ public static final String DIR_ANDROID = "Android"; @@ -57,6 +58,7 @@ public class Environment { private static final File DIR_ANDROID_ROOT = getDirectory(ENV_ANDROID_ROOT, "/system"); private static final File DIR_OEM_ROOT = getDirectory(ENV_OEM_ROOT, "/oem"); + private static final File DIR_VENDOR_ROOT = getDirectory(ENV_VENDOR_ROOT, "/vendor"); private static final File DIR_MEDIA_STORAGE = getDirectory(ENV_MEDIA_STORAGE, "/data/media"); private static final String CANONCIAL_EMULATED_STORAGE_TARGET = getCanonicalPathOrNull( @@ -225,6 +227,15 @@ public class Environment { } /** + * Return root directory of the "vendor" partition that holds vendor-provided + * software that should persist across simple reflashing of the "system" partition. + * @hide + */ + public static File getVendorDirectory() { + return DIR_VENDOR_ROOT; + } + + /** * Gets the system directory available for secure storage. * If Encrypted File system is enabled, it returns an encrypted directory (/data/secure/system). * Otherwise, it returns the unencrypted /data/system directory. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1e202ca..2ce6210 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6120,6 +6120,13 @@ public final class Settings { } /** + * Opaque value, changes when persisted zen mode configuration changes. + * + * @hide + */ + public static final String ZEN_MODE_CONFIG_ETAG = "zen_mode_config_etag"; + + /** * Defines global heads up toggle. One of HEADS_UP_OFF, HEADS_UP_ON. * * @hide diff --git a/core/java/android/service/notification/ZenModeConfig.aidl b/core/java/android/service/notification/ZenModeConfig.aidl new file mode 100644 index 0000000..c73b75e --- /dev/null +++ b/core/java/android/service/notification/ZenModeConfig.aidl @@ -0,0 +1,20 @@ +/* + * 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 android.service.notification; + +parcelable ZenModeConfig; + diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java new file mode 100644 index 0000000..925ddcf --- /dev/null +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -0,0 +1,234 @@ +/** + * 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 android.service.notification; + +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.util.Objects; + +/** + * Persisted configuration for zen mode. + * + * @hide + */ +public class ZenModeConfig implements Parcelable { + + public static final String SLEEP_MODE_NIGHTS = "nights"; + public static final String SLEEP_MODE_WEEKNIGHTS = "weeknights"; + + private static final int XML_VERSION = 1; + private static final String ZEN_TAG = "zen"; + private static final String ZEN_ATT_VERSION = "version"; + private static final String ALLOW_TAG = "allow"; + private static final String ALLOW_ATT_CALLS = "calls"; + private static final String ALLOW_ATT_MESSAGES = "messages"; + private static final String SLEEP_TAG = "sleep"; + private static final String SLEEP_ATT_MODE = "mode"; + + private static final String SLEEP_ATT_START_HR = "startHour"; + private static final String SLEEP_ATT_START_MIN = "startMin"; + private static final String SLEEP_ATT_END_HR = "endHour"; + private static final String SLEEP_ATT_END_MIN = "endMin"; + + public boolean allowCalls; + public boolean allowMessages; + + public String sleepMode; + public int sleepStartHour; + public int sleepStartMinute; + public int sleepEndHour; + public int sleepEndMinute; + + public ZenModeConfig() { } + + public ZenModeConfig(Parcel source) { + allowCalls = source.readInt() == 1; + allowMessages = source.readInt() == 1; + if (source.readInt() == 1) { + sleepMode = source.readString(); + } + sleepStartHour = source.readInt(); + sleepStartMinute = source.readInt(); + sleepEndHour = source.readInt(); + sleepEndMinute = source.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(allowCalls ? 1 : 0); + dest.writeInt(allowMessages ? 1 : 0); + if (sleepMode != null) { + dest.writeInt(1); + dest.writeString(sleepMode); + } else { + dest.writeInt(0); + } + dest.writeInt(sleepStartHour); + dest.writeInt(sleepStartMinute); + dest.writeInt(sleepEndHour); + dest.writeInt(sleepEndMinute); + } + + @Override + public String toString() { + return new StringBuilder(ZenModeConfig.class.getSimpleName()).append('[') + .append("allowCalls=").append(allowCalls) + .append(",allowMessages=").append(allowMessages) + .append(",sleepMode=").append(sleepMode) + .append(",sleepStart=").append(sleepStartHour).append('.').append(sleepStartMinute) + .append(",sleepEnd=").append(sleepEndHour).append('.').append(sleepEndMinute) + .append(']').toString(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ZenModeConfig)) return false; + if (o == this) return true; + final ZenModeConfig other = (ZenModeConfig) o; + return other.allowCalls == allowCalls + && other.allowMessages == allowMessages + && Objects.equals(other.sleepMode, sleepMode) + && other.sleepStartHour == sleepStartHour + && other.sleepStartMinute == sleepStartMinute + && other.sleepEndHour == sleepEndHour + && other.sleepEndMinute == sleepEndMinute; + } + + @Override + public int hashCode() { + return Objects.hash(allowCalls, allowMessages, sleepMode, sleepStartHour, + sleepStartMinute, sleepEndHour, sleepEndMinute); + } + + public boolean isValid() { + return isValidHour(sleepStartHour) && isValidMinute(sleepStartMinute) + && isValidHour(sleepEndHour) && isValidMinute(sleepEndMinute) + && (sleepMode == null || sleepMode.equals(SLEEP_MODE_NIGHTS) + || sleepMode.equals(SLEEP_MODE_WEEKNIGHTS)); + } + + public static ZenModeConfig readXml(XmlPullParser parser) + throws XmlPullParserException, IOException { + int type = parser.getEventType(); + if (type != XmlPullParser.START_TAG) return null; + String tag = parser.getName(); + if (!ZEN_TAG.equals(tag)) return null; + final ZenModeConfig rt = new ZenModeConfig(); + final int version = Integer.parseInt(parser.getAttributeValue(null, ZEN_ATT_VERSION)); + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) { + tag = parser.getName(); + if (type == XmlPullParser.END_TAG && ZEN_TAG.equals(tag)) return rt; + if (type == XmlPullParser.START_TAG) { + if (ALLOW_TAG.equals(tag)) { + rt.allowCalls = safeBoolean(parser, ALLOW_ATT_CALLS, false); + rt.allowMessages = safeBoolean(parser, ALLOW_ATT_MESSAGES, false); + } else if (SLEEP_TAG.equals(tag)) { + final String mode = parser.getAttributeValue(null, SLEEP_ATT_MODE); + rt.sleepMode = (SLEEP_MODE_NIGHTS.equals(mode) + || SLEEP_MODE_WEEKNIGHTS.equals(mode)) ? mode : null; + final int startHour = safeInt(parser, SLEEP_ATT_START_HR, 0); + final int startMinute = safeInt(parser, SLEEP_ATT_START_MIN, 0); + final int endHour = safeInt(parser, SLEEP_ATT_END_HR, 0); + final int endMinute = safeInt(parser, SLEEP_ATT_END_MIN, 0); + rt.sleepStartHour = isValidHour(startHour) ? startHour : 0; + rt.sleepStartMinute = isValidMinute(startMinute) ? startMinute : 0; + rt.sleepEndHour = isValidHour(endHour) ? endHour : 0; + rt.sleepEndMinute = isValidMinute(endMinute) ? endMinute : 0; + } + } + } + return rt; + } + + public void writeXml(XmlSerializer out) throws IOException { + out.startTag(null, ZEN_TAG); + out.attribute(null, ZEN_ATT_VERSION, Integer.toString(XML_VERSION)); + + out.startTag(null, ALLOW_TAG); + out.attribute(null, ALLOW_ATT_CALLS, Boolean.toString(allowCalls)); + out.attribute(null, ALLOW_ATT_MESSAGES, Boolean.toString(allowMessages)); + out.endTag(null, ALLOW_TAG); + + out.startTag(null, SLEEP_TAG); + if (sleepMode != null) { + out.attribute(null, SLEEP_ATT_MODE, sleepMode); + } + out.attribute(null, SLEEP_ATT_START_HR, Integer.toString(sleepStartHour)); + out.attribute(null, SLEEP_ATT_START_MIN, Integer.toString(sleepStartMinute)); + out.attribute(null, SLEEP_ATT_END_HR, Integer.toString(sleepEndHour)); + out.attribute(null, SLEEP_ATT_END_MIN, Integer.toString(sleepEndMinute)); + out.endTag(null, SLEEP_TAG); + + out.endTag(null, ZEN_TAG); + } + + public static boolean isValidHour(int val) { + return val >= 0 && val < 24; + } + + public static boolean isValidMinute(int val) { + return val >= 0 && val < 60; + } + + private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { + final String val = parser.getAttributeValue(null, att); + if (TextUtils.isEmpty(val)) return defValue; + return Boolean.valueOf(val); + } + + private static int safeInt(XmlPullParser parser, String att, int defValue) { + final String val = parser.getAttributeValue(null, att); + if (TextUtils.isEmpty(val)) return defValue; + return Integer.valueOf(val); + } + + @Override + public int describeContents() { + return 0; + } + + public ZenModeConfig copy() { + final Parcel parcel = Parcel.obtain(); + try { + writeToParcel(parcel, 0); + parcel.setDataPosition(0); + return new ZenModeConfig(parcel); + } finally { + parcel.recycle(); + } + } + + public static final Parcelable.Creator<ZenModeConfig> CREATOR + = new Parcelable.Creator<ZenModeConfig>() { + @Override + public ZenModeConfig createFromParcel(Parcel source) { + return new ZenModeConfig(source); + } + + @Override + public ZenModeConfig[] newArray(int size) { + return new ZenModeConfig[size]; + } + }; +} diff --git a/core/java/android/tv/ITvInputManager.aidl b/core/java/android/tv/ITvInputManager.aidl index a927dc9..a4c99e4 100644 --- a/core/java/android/tv/ITvInputManager.aidl +++ b/core/java/android/tv/ITvInputManager.aidl @@ -17,6 +17,7 @@ package android.tv; import android.content.ComponentName; +import android.graphics.Rect; import android.net.Uri; import android.tv.ITvInputClient; import android.tv.TvInputInfo; @@ -40,4 +41,9 @@ interface ITvInputManager { void setSurface(in IBinder sessionToken, in Surface surface, int userId); void setVolume(in IBinder sessionToken, float volume, int userId); void tune(in IBinder sessionToken, in Uri channelUri, int userId); + + void createOverlayView(in IBinder sessionToken, in IBinder windowToken, in Rect frame, + int userId); + void relayoutOverlayView(in IBinder sessionToken, in Rect frame, int userId); + void removeOverlayView(in IBinder sessionToken, int userId); } diff --git a/core/java/android/tv/ITvInputService.aidl b/core/java/android/tv/ITvInputService.aidl index d80f286..672784f 100644 --- a/core/java/android/tv/ITvInputService.aidl +++ b/core/java/android/tv/ITvInputService.aidl @@ -17,7 +17,6 @@ package android.tv; import android.tv.ITvInputServiceCallback; -import android.tv.ITvInputSession; import android.tv.ITvInputSessionCallback; /** diff --git a/core/java/android/tv/ITvInputSession.aidl b/core/java/android/tv/ITvInputSession.aidl index d379d2d..32fee4b 100644 --- a/core/java/android/tv/ITvInputSession.aidl +++ b/core/java/android/tv/ITvInputSession.aidl @@ -16,6 +16,7 @@ package android.tv; +import android.graphics.Rect; import android.net.Uri; import android.view.Surface; @@ -31,4 +32,8 @@ oneway interface ITvInputSession { // is to introduce some new concepts that will solve a number of problems in audio policy today. void setVolume(float volume); void tune(in Uri channelUri); + + void createOverlayView(in IBinder windowToken, in Rect frame); + void relayoutOverlayView(in Rect frame); + void removeOverlayView(); } diff --git a/core/java/android/tv/ITvInputSessionWrapper.java b/core/java/android/tv/ITvInputSessionWrapper.java index 66fe5e1..a6e0877 100644 --- a/core/java/android/tv/ITvInputSessionWrapper.java +++ b/core/java/android/tv/ITvInputSessionWrapper.java @@ -17,13 +17,16 @@ package android.tv; import android.content.Context; +import android.graphics.Rect; import android.net.Uri; +import android.os.IBinder; import android.os.Message; import android.tv.TvInputService.TvInputSessionImpl; import android.util.Log; import android.view.Surface; import com.android.internal.os.HandlerCaller; +import com.android.internal.os.SomeArgs; /** * Implements the internal ITvInputSession interface to convert incoming calls on to it back to @@ -38,6 +41,9 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand private static final int DO_SET_SURFACE = 2; private static final int DO_SET_VOLUME = 3; private static final int DO_TUNE = 4; + private static final int DO_CREATE_OVERLAY_VIEW = 5; + private static final int DO_RELAYOUT_OVERLAY_VIEW = 6; + private static final int DO_REMOVE_OVERLAY_VIEW = 7; private TvInputSessionImpl mTvInputSession; private final HandlerCaller mCaller; @@ -71,6 +77,20 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand mTvInputSession.tune((Uri) msg.obj); return; } + case DO_CREATE_OVERLAY_VIEW: { + SomeArgs args = (SomeArgs) msg.obj; + mTvInputSession.createOverlayView((IBinder) args.arg1, (Rect) args.arg2); + args.recycle(); + return; + } + case DO_RELAYOUT_OVERLAY_VIEW: { + mTvInputSession.relayoutOverlayView((Rect) msg.obj); + return; + } + case DO_REMOVE_OVERLAY_VIEW: { + mTvInputSession.removeOverlayView(true); + return; + } default: { Log.w(TAG, "Unhandled message code: " + msg.what); return; @@ -97,4 +117,20 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand public void tune(Uri channelUri) { mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_TUNE, channelUri)); } + + @Override + public void createOverlayView(IBinder windowToken, Rect frame) { + mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_CREATE_OVERLAY_VIEW, windowToken, + frame)); + } + + @Override + public void relayoutOverlayView(Rect frame) { + mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_RELAYOUT_OVERLAY_VIEW, frame)); + } + + @Override + public void removeOverlayView() { + mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_REMOVE_OVERLAY_VIEW)); + } } diff --git a/core/java/android/tv/TvInputManager.java b/core/java/android/tv/TvInputManager.java index 4cf2b35..05f0b9c 100644 --- a/core/java/android/tv/TvInputManager.java +++ b/core/java/android/tv/TvInputManager.java @@ -17,6 +17,7 @@ package android.tv; import android.content.ComponentName; +import android.graphics.Rect; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -24,6 +25,7 @@ import android.os.RemoteException; import android.util.Log; import android.util.SparseArray; import android.view.Surface; +import android.view.View; import java.util.ArrayList; import java.util.HashMap; @@ -320,8 +322,8 @@ public final class TvInputManager { /** The Session provides the per-session functionality of TV inputs. */ public static final class Session { private final ITvInputManager mService; - private final IBinder mToken; private final int mUserId; + private IBinder mToken; /** @hide */ private Session(ComponentName name, IBinder token, ITvInputManager service, int userId) { @@ -332,10 +334,16 @@ public final class TvInputManager { /** * Releases this session. + * + * @throws IllegalStateException if the session has been already released. */ public void release() { + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } try { mService.releaseSession(mToken, mUserId); + mToken = null; } catch (RemoteException e) { throw new RuntimeException(e); } @@ -345,8 +353,12 @@ public final class TvInputManager { * Sets the {@link android.view.Surface} for this session. * * @param surface A {@link android.view.Surface} used to render video. + * @throws IllegalStateException if the session has been already released. */ - public void setSurface(Surface surface) { + void setSurface(Surface surface) { + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } // surface can be null. try { mService.setSurface(mToken, surface, mUserId); @@ -360,8 +372,12 @@ public final class TvInputManager { * * @param volume A volume value between 0.0f to 1.0f. * @throws IllegalArgumentException if the volume value is out of range. + * @throws IllegalStateException if the session has been already released. */ public void setVolume(float volume) { + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } try { if (volume < 0.0f || volume > 1.0f) { throw new IllegalArgumentException("volume should be between 0.0f and 1.0f"); @@ -377,16 +393,90 @@ public final class TvInputManager { * * @param channelUri The URI of a channel. * @throws IllegalArgumentException if the argument is {@code null}. + * @throws IllegalStateException if the session has been already released. */ public void tune(Uri channelUri) { if (channelUri == null) { throw new IllegalArgumentException("channelUri cannot be null"); } + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } try { mService.tune(mToken, channelUri, mUserId); } catch (RemoteException e) { throw new RuntimeException(e); } } + + /** + * Creates an overlay view. Once the overlay view is created, {@link #relayoutOverlayView} + * should be called whenever the layout of its containing view is changed. + * {@link #removeOverlayView()} should be called to remove the overlay view. + * Since a session can have only one overlay view, this method should be called only once + * or it can be called again after calling {@link #removeOverlayView()}. + * + * @param view A view playing TV. + * @param frame A position of the overlay view. + * @throws IllegalArgumentException if any of the arguments is {@code null}. + * @throws IllegalStateException if {@code view} is not attached to a window or + * if the session has been already released. + */ + void createOverlayView(View view, Rect frame) { + if (view == null) { + throw new IllegalArgumentException("view cannot be null"); + } + if (frame == null) { + throw new IllegalArgumentException("frame cannot be null"); + } + if (view.getWindowToken() == null) { + throw new IllegalStateException("view must be attached to a window"); + } + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } + try { + mService.createOverlayView(mToken, view.getWindowToken(), frame, mUserId); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + /** + * Relayouts the current overlay view. + * + * @param frame A new position of the overlay view. + * @throws IllegalArgumentException if the arguments is {@code null}. + * @throws IllegalStateException if the session has been already released. + */ + void relayoutOverlayView(Rect frame) { + if (frame == null) { + throw new IllegalArgumentException("frame cannot be null"); + } + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } + try { + mService.relayoutOverlayView(mToken, frame, mUserId); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + /** + * Removes the current overlay view. + * + * @throws IllegalStateException if the session has been already released. + */ + void removeOverlayView() { + if (mToken == null) { + throw new IllegalStateException("the session has been already released"); + } + try { + mService.removeOverlayView(mToken, mUserId); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } } } diff --git a/core/java/android/tv/TvInputService.java b/core/java/android/tv/TvInputService.java index d7f6c32..80eb407 100644 --- a/core/java/android/tv/TvInputService.java +++ b/core/java/android/tv/TvInputService.java @@ -18,7 +18,10 @@ package android.tv; import android.app.Service; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.graphics.PixelFormat; +import android.graphics.Rect; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -26,7 +29,10 @@ import android.os.Message; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; +import android.view.Gravity; import android.view.Surface; +import android.view.View; +import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; @@ -125,7 +131,37 @@ public abstract class TvInputService extends Service { /** * Base class for derived classes to implement to provide {@link TvInputManager.Session}. */ - public abstract static class TvInputSessionImpl { + public abstract class TvInputSessionImpl { + private final WindowManager mWindowManager; + private WindowManager.LayoutParams mWindowParams; + private View mOverlayView; + private boolean mOverlayViewEnabled; + private IBinder mWindowToken; + private Rect mOverlayFrame; + + public TvInputSessionImpl() { + mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); + } + + public void setOverlayViewEnabled(final boolean enable) { + mHandler.post(new Runnable() { + @Override + public void run() { + if (enable == mOverlayViewEnabled) { + return; + } + mOverlayViewEnabled = enable; + if (enable) { + if (mWindowToken != null) { + createOverlayView(mWindowToken, mOverlayFrame); + } + } else { + removeOverlayView(false); + } + } + }); + } + /** * Called when the session is released. */ @@ -157,11 +193,22 @@ public abstract class TvInputService extends Service { public abstract boolean onTune(Uri channelUri); /** + * Called when an application requests to create an overlay view. Each session + * implementation can override this method and return its own view. + * + * @return a view attached to the overlay window + */ + public View onCreateOverlayView() { + return null; + } + + /** * This method is called when the application would like to stop using the current input * session. */ void release() { onRelease(); + removeOverlayView(true); } /** @@ -186,6 +233,87 @@ public abstract class TvInputService extends Service { onTune(channelUri); // TODO: Handle failure. } + + /** + * Creates an overlay view. This calls {@link onCreateOverlayView} to get + * a view to attach to the overlay window. + * + * @param windowToken A window token of an application. + * @param frame A position of the overlay view. + */ + void createOverlayView(IBinder windowToken, Rect frame) { + if (mOverlayView != null) { + mWindowManager.removeView(mOverlayView); + mOverlayView = null; + } + if (DEBUG) { + Log.d(TAG, "create overlay view(" + frame + ")"); + } + mWindowToken = windowToken; + mOverlayFrame = frame; + if (!mOverlayViewEnabled) { + return; + } + mOverlayView = onCreateOverlayView(); + if (mOverlayView == null) { + return; + } + // TvView's window type is TYPE_APPLICATION_MEDIA and we want to create + // an overlay window above the media window but below the application window. + int type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY; + // We make the overlay view non-focusable and non-touchable so that + // the application that owns the window token can decide whether to consume or + // dispatch the input events. + int flag = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + mWindowParams = new WindowManager.LayoutParams( + frame.right - frame.left, frame.bottom - frame.top, + frame.left, frame.top, type, flag, PixelFormat.TRANSPARENT); + mWindowParams.privateFlags |= + WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; + mWindowParams.gravity = Gravity.START | Gravity.TOP; + mWindowParams.token = windowToken; + mWindowManager.addView(mOverlayView, mWindowParams); + } + + /** + * Relayouts the current overlay view. + * + * @param frame A new position of the overlay view. + */ + void relayoutOverlayView(Rect frame) { + if (DEBUG) { + Log.d(TAG, "relayout overlay view(" + frame + ")"); + } + mOverlayFrame = frame; + if (!mOverlayViewEnabled || mOverlayView == null) { + return; + } + mWindowParams.x = frame.left; + mWindowParams.y = frame.top; + mWindowParams.width = frame.right - frame.left; + mWindowParams.height = frame.bottom - frame.top; + mWindowManager.updateViewLayout(mOverlayView, mWindowParams); + } + + /** + * Removes the current overlay view. + */ + void removeOverlayView(boolean clearWindowToken) { + if (DEBUG) { + Log.d(TAG, "remove overlay view(" + mOverlayView + ")"); + } + if (clearWindowToken) { + mWindowToken = null; + mOverlayFrame = null; + } + if (mOverlayView != null) { + mWindowManager.removeView(mOverlayView); + mOverlayView = null; + mWindowParams = null; + } + } } private final class ServiceHandler extends Handler { diff --git a/core/java/android/tv/TvView.java b/core/java/android/tv/TvView.java new file mode 100644 index 0000000..325950d --- /dev/null +++ b/core/java/android/tv/TvView.java @@ -0,0 +1,228 @@ +/* + * 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 android.tv; + +import android.content.ComponentName; +import android.content.Context; +import android.graphics.Rect; +import android.os.Handler; +import android.tv.TvInputManager; +import android.tv.TvInputManager.Session; +import android.tv.TvInputManager.SessionCreateCallback; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.ViewTreeObserver; + +/** + * View playing TV + */ +public class TvView extends SurfaceView { + private static final String TAG = "TvView"; + + private final Handler mHandler = new Handler(); + private TvInputManager.Session mSession; + private Surface mSurface; + private boolean mOverlayViewCreated; + private Rect mOverlayViewFrame; + private boolean mGlobalListenersAdded; + private TvInputManager mTvInputManager; + private SessionCreateCallback mSessionCreateCallback; + + private SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() { + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + Log.d(TAG, "surfaceChanged(holder=" + holder + ", format=" + format + ", width=" + width + + ", height=" + height + ")"); + if (holder.getSurface() == mSurface) { + return; + } + mSurface = holder.getSurface(); + setSessionSurface(mSurface); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + mSurface = holder.getSurface(); + setSessionSurface(mSurface); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mSurface = null; + setSessionSurface(null); + } + }; + + public TvView(Context context) { + this(context, null, 0); + } + + public TvView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TvView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + getHolder().addCallback(mSurfaceHolderCallback); + mTvInputManager = (TvInputManager) getContext().getSystemService(Context.TV_INPUT_SERVICE); + } + + /** + * Binds a TV input to this view. {@link SessionCreateCallback#onSessionCreated} will be + * called to send the result of this binding with {@link TvInputManager.Session}. + * If a TV input is already bound, the input will be unbound from this view and its session + * will be released. + * + * @param name TV input name will be bound to this view. + * @param callback called when TV input is bound. The callback sends + * {@link TvInputManager.Session} + * @throws IllegalArgumentException if any of the arguments is {@code null}. + */ + public void bindTvInput(ComponentName name, SessionCreateCallback callback) { + if (name == null) { + throw new IllegalArgumentException("name cannot be null"); + } + if (callback == null) { + throw new IllegalArgumentException("callback cannot be null"); + } + if (mSession != null) { + release(); + } + // When bindTvInput is called multiple times before the callback is called, + // only the callback of the last bindTvInput call will be actually called back. + // The previous callbacks will be ignored. For the logic, mSessionCreateCallback + // is newly assigned for every bindTvInput call and compared with + // MySessionCreateCallback.this. + mSessionCreateCallback = new MySessionCreateCallback(callback); + mTvInputManager.createSession(name, mSessionCreateCallback, mHandler); + } + + /** + * Unbinds a TV input currently bound. Its corresponding {@link TvInputManager.Session} + * is released. + */ + public void unbindTvInput() { + if (mSession != null) { + release(); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + createSessionOverlayView(); + } + + @Override + protected void onDetachedFromWindow() { + removeSessionOverlayView(); + super.onDetachedFromWindow(); + } + + /** @hide */ + @Override + protected void updateWindow(boolean force, boolean redrawNeeded) { + super.updateWindow(force, redrawNeeded); + relayoutSessionOverlayView(); + } + + private void release() { + setSessionSurface(null); + removeSessionOverlayView(); + mSession.release(); + mSession = null; + } + + private void setSessionSurface(Surface surface) { + if (mSession == null) { + return; + } + mSession.setSurface(surface); + } + + private void createSessionOverlayView() { + if (mSession == null || !isAttachedToWindow() + || mOverlayViewCreated) { + return; + } + mOverlayViewFrame = getViewFrameOnScreen(); + mSession.createOverlayView(this, mOverlayViewFrame); + mOverlayViewCreated = true; + } + + private void removeSessionOverlayView() { + if (mSession == null || !mOverlayViewCreated) { + return; + } + mSession.removeOverlayView(); + mOverlayViewCreated = false; + mOverlayViewFrame = null; + } + + private void relayoutSessionOverlayView() { + if (mSession == null || !isAttachedToWindow() + || !mOverlayViewCreated) { + return; + } + Rect viewFrame = getViewFrameOnScreen(); + if (viewFrame.equals(mOverlayViewFrame)) { + return; + } + mSession.relayoutOverlayView(viewFrame); + mOverlayViewFrame = viewFrame; + } + + private Rect getViewFrameOnScreen() { + int[] location = new int[2]; + getLocationOnScreen(location); + return new Rect(location[0], location[1], + location[0] + getWidth(), location[1] + getHeight()); + } + + private class MySessionCreateCallback implements SessionCreateCallback { + final SessionCreateCallback mExternalCallback; + + MySessionCreateCallback(SessionCreateCallback externalCallback) { + mExternalCallback = externalCallback; + } + + @Override + public void onSessionCreated(Session session) { + if (this != mSessionCreateCallback) { + // This callback is obsolete. + session.release(); + return; + } + mSession = session; + if (session != null) { + // mSurface may not be ready yet as soon as starting an application. + // In the case, we don't send Session.setSurface(null) unnecessarily. + // setSessionSurface will be called in surfaceCreated. + if (mSurface != null) { + setSessionSurface(mSurface); + } + createSessionOverlayView(); + } + if (mExternalCallback != null) { + mExternalCallback.onSessionCreated(session); + } + } + } +} diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 23123dd..4a2cc1a 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -422,7 +422,8 @@ public class SurfaceView extends View { mWindowType = type; } - private void updateWindow(boolean force, boolean redrawNeeded) { + /** @hide */ + protected void updateWindow(boolean force, boolean redrawNeeded) { if (!mHaveFrame) { return; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1f9ba46..be316e2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4737,13 +4737,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private void manageFocusHotspot(boolean focused, View v) { if (mBackground != null && mBackground.supportsHotspots()) { final Rect r = new Rect(); - if (v != null) { + if (!focused && v != null) { v.getBoundsOnScreen(r); final int[] location = new int[2]; getLocationOnScreen(location); r.offset(-location[0], -location[1]); } else { - r.set(mLeft, mTop, mRight, mBottom); + r.set(0, 0, mRight - mLeft, mBottom - mTop); } final float x = r.exactCenterX(); @@ -4858,16 +4858,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mPrivateFlags & PFLAG_FOCUSED) != 0) { mPrivateFlags &= ~PFLAG_FOCUSED; - if (hasFocus()) { - manageFocusHotspot(false, focused); - } - if (propagate && mParent != null) { mParent.clearChildFocus(this); } onFocusChanged(false, 0, null); + manageFocusHotspot(false, focused); refreshDrawableState(); if (propagate && (!refocus || !rootViewRequestFocus())) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 4e4f37b..097dff0 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3722,7 +3722,8 @@ public final class ViewRootImpl implements ViewParent, if (result == InputMethodManager.DISPATCH_HANDLED) { return FINISH_HANDLED; } else if (result == InputMethodManager.DISPATCH_NOT_HANDLED) { - return FINISH_NOT_HANDLED; + // The IME could not handle it, so skip along to the next InputStage + return FORWARD; } else { return DEFER; // callback will be invoked later } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 4c11fa9..eaedba5 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -5580,13 +5580,13 @@ public final class BatteryStatsImpl extends BatteryStats { if (end) { Slog.w(TAG, "New history ends before old history!"); } else if (!out.same(mHistoryReadTmp)) { - long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); PrintWriter pw = new FastPrintWriter(new LogWriter(android.util.Log.WARN, TAG)); pw.println("Histories differ!"); pw.println("Old history:"); - (new HistoryPrinter()).printNextItem(pw, out, now, false, true); + (new HistoryPrinter()).printNextItem(pw, out, 0, false, true); pw.println("New history:"); - (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now, false, true); + (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, 0, false, + true); pw.flush(); } } @@ -5664,7 +5664,12 @@ public final class BatteryStatsImpl extends BatteryStats { return false; } + final long lastRealtime = out.time; + final long lastWalltime = out.currentTime; readHistoryDelta(mHistoryBuffer, out); + if (out.cmd != HistoryItem.CMD_CURRENT_TIME && lastWalltime != 0) { + out.currentTime = lastWalltime + (out.time - lastRealtime); + } return true; } diff --git a/core/res/res/color/primary_text_quantum_dark.xml b/core/res/res/color/primary_text_quantum_dark.xml new file mode 100644 index 0000000..1fcd0e3 --- /dev/null +++ b/core/res/res/color/primary_text_quantum_dark.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2008 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:alpha="0.5" android:color="@color/primary_text_default_quantum_dark"/> + <item android:color="@color/primary_text_default_quantum_dark"/> +</selector> diff --git a/core/res/res/color/primary_text_quantum_light.xml b/core/res/res/color/primary_text_quantum_light.xml new file mode 100644 index 0000000..1ec1634 --- /dev/null +++ b/core/res/res/color/primary_text_quantum_light.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2008 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" android:alpha="0.5" android:color="@color/primary_text_default_quantum_light"/> + <item android:color="@color/primary_text_default_quantum_light"/> +</selector> diff --git a/core/res/res/drawable/btn_color_quantum.xml b/core/res/res/drawable/btn_color_quantum.xml index e923003..2da9226 100644 --- a/core/res/res/drawable/btn_color_quantum.xml +++ b/core/res/res/drawable/btn_color_quantum.xml @@ -19,7 +19,8 @@ <selector> <item android:state_enabled="false"> <nine-patch android:src="@drawable/btn_qntm_alpha" - android:tint="?attr/colorButtonNormal" /> + android:tint="?attr/colorButtonNormal" + android:alpha="?attr/disabledAlpha" /> </item> <item> <nine-patch android:src="@drawable/btn_qntm_alpha" diff --git a/core/res/res/drawable/btn_default_quantum.xml b/core/res/res/drawable/btn_default_quantum.xml index 2919621..c6a3a33 100644 --- a/core/res/res/drawable/btn_default_quantum.xml +++ b/core/res/res/drawable/btn_default_quantum.xml @@ -17,7 +17,18 @@ <touch-feedback xmlns:android="http://schemas.android.com/apk/res/android" android:tint="?attr/colorButtonPressed"> <item> - <nine-patch android:src="@drawable/btn_qntm_alpha" - android:tint="?attr/colorButtonNormal" /> + <selector> + <item android:state_enabled="false"> + <nine-patch + android:src="@drawable/btn_qntm_alpha" + android:tint="?attr/colorButtonNormal" + android:alpha="?attr/disabledAlpha" /> + </item> + <item> + <nine-patch + android:src="@drawable/btn_qntm_alpha" + android:tint="?attr/colorButtonNormal" /> + </item> + </selector> </item> </touch-feedback> diff --git a/core/res/res/drawable/edit_text_quantum.xml b/core/res/res/drawable/edit_text_quantum.xml index d1f9831..c42c7b7 100644 --- a/core/res/res/drawable/edit_text_quantum.xml +++ b/core/res/res/drawable/edit_text_quantum.xml @@ -14,29 +14,26 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> - <item android:state_window_focused="false" android:state_enabled="false"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> - <item android:state_enabled="true" android:state_focused="true"> - <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" - android:tint="?attr/colorControlActivated" /> - </item> - <item android:state_enabled="true" android:state_activated="true"> - <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" - android:tint="?attr/colorControlActivated" /> - </item> - <item android:state_enabled="true"> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> - </item> +<touch-feedback xmlns:android="http://schemas.android.com/apk/res/android" + android:tint="?attr/colorControlActivated"> <item> - <nine-patch android:src="@drawable/textfield_default_qntm_alpha" - android:tint="?attr/colorControlNormal" /> + <selector> + <item android:state_window_focused="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item android:state_enabled="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item android:state_focused="false" android:state_activated="false"> + <nine-patch android:src="@drawable/textfield_default_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + <item> + <nine-patch android:src="@drawable/textfield_activated_qntm_alpha" + android:tint="?attr/colorControlNormal" /> + </item> + </selector> </item> -</selector> +</touch-feedback> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index bf8037a..2988f06 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkroniseer"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Te veel <xliff:g id="CONTENT_TYPE">%s</xliff:g> uitgevee."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet se berging is vol. Vee \'n aantal lêers uit om spasie vry te maak."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Horlosieberging is vol! Vee \'n paar lêers uit om plek te maak."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Foon se berging is vol. Vee \'n aantal lêers uit om spasie vry te maak."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan dalk gemonitor word"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Deur \'n onbekende derde party"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Luitoestel aan"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Sit tans af…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Jou tablet gaan nou afskakel."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Jou horlosie gaan nou afskakel."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Jou foon gaan nou afsit."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Wil jy afskakel?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Herlaai na veilige modus"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Laat die program toe om \'n kennisgewing uit te saai dat \'n SMS-boodskap ontvang is. Kwaadwillige programme kan dit dalk gebruik om inkomende SMS-boodskappe na te maak."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"stuur WAP-PUSH-ontvange uitsending"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Laat die program toe om \'n kennisgewing uit te saai dat \'n WAP PUSH-boodskap ontvang is. Kwaadwillige programme kan dit dalk gebruik om MMS-boodskap-ontvangsbewyse na te maak of die inhoud van enige webbladsy stilweg te vervang met kwaadwillige variante."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"stuur uitsending vir netwerktelling"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Laat die program toe om \'n kennisgewing uit te saai dat netwerke tellings moet kry. Nooit vir normale programme nodig nie."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"beperk hoeveelheid lopende prosesse"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Laat die program toe om die maksimum getal prosesse te beheer wat sal loop. Nooit nodig vir normale programme nie."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"dwing agtergrondprogramme om te sluit"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Dit laat die houer toe om aan die top-koppelvlak van \'n afstandskerm te koppel. Behoort nooit vir gewone programme nodig te wees nie."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind aan \'n legstukdiens"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Dit laat die houer toe om aan die topvlak-koppelvlak van \'n legstuk-diens te bind. Dit moet nooit vir normale programme nodig wees nie."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"bind aan \'n roeteverskafferdiens"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Laat die houer toe om aan enige geregistreerde roeteverskaffers te bind. Behoort nooit vir normale programme nodig te wees nie."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"skakel met \'n toestel-admin"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Laat die houer toe om bedoelings na \'n toesteladministrateur te stuur. Dit moet nooit vir normale programme nodig wees nie."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"bind aan \'n TV-invoer"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Verander WiMAX-status"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Laat die program toe om die tablet aan WiMAX-netwerke te koppel en daarvan te ontkoppel."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Laat die program toe om die foon aan WiMAX-netwerke te koppel en daarvan te ontkoppel."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"gee telling vir netwerke"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Laat die program toe om netwerke te gradeer en beïnvloed watter netwerke die tablet moet verkies."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Laat die program toe om netwerke te gradeer en beïnvloed watter netwerke die foon moet verkies."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"bind saam met Bluetooth-toestelle"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Laat die program toe om die opstelling van Bluetooth op die tablet te sien, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Laat die program toe om die opstelling van die Bluetooth op die foon te sien, en om verbindings met saamgebinde toestelle te maak en te aanvaar."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 585857b..a32c834 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ሥምሪያ"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"በጣም ብዙ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ስርዞች።"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"የጡባዊ ተኮ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"የእጅ ሰዓት ማከማቻ ሙሉ ነው። ቦታ ለማስለቀቅ አንዳንድ ፋይሎችን ይሰርዙ።"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"የስልክ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"አውታረ መረብ በክትትል ውስጥ ሊሆን ይችላል"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ባልታወቀ ሶስተኛ ወገን"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"መጥሪያ በርቷል"</string> <string name="shutdown_progress" msgid="2281079257329981203">"በመዝጋት ላይ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ጡባዊዎ ይዘጋል።"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"የእርስዎ የእጅ ሰዓት ይዘጋል።"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ስልክዎ ይዘጋል።"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"ዘግተህ መውጣት ትፈልጋለህ?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"በአስተማማኝ ኹነታ ውስጥ ዳግም አስጀምር"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ኤስ ኤም ኤስ መልዕክት መቀበሉን ማሳወቂያ እንዲያሰራጭ ለመተግበሪያው ይፈቅዳሉ፡፡ መጪ ኤስ ኤም ኤስ መልዕክቶችን አመሳስሎ በማቅረብ ተንኮል አዘል መተግበሪያዎች ይሄንን ሊጠቀሙበት ይችላሉ፡፡"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"የWAP-PUSH ደርስዋል ስርጭት ላክ"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"የWAP PUSH መልዕክት እንደተቀበለ ማሳወቂያ ለማሰራጨት ለመተግበሪያው ይፈቅዳሉ፡፡ ኤም ኤም ኤስ መልዕክት መቀበልን ለማስመሰል ወይም በተንኮል አዘል መሰሎች ለማንኛውም የድር ገፅ ይዘት በዝምታ ለመተካት ተንኮል አዘል መተግበሪያዎች ሊጠቀሙበት ይችላሉ፡፡"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ለአውታረ መረቦች የነጥብ ስጥ ስርጭት ይልካል"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"መተግበሪያው አውታረ መረቦች ነጥብ እንዲያዝለት የሚፈልጉት አንድ ማሳወቂያ እንዲያሰራጭ ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"የአሂድ ሂደቶችን ቁጥር ወስን"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"የሚሄዱ ሂደቶችን የመጨረሻ ቁጥር ለመቆጣጠር ለመተግበሪያው ይፈቅዳሉ፡፡ ለመደበኛ መተግበሪያዎች መቼም አያስፈልግም፡፡"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"የጀርባ መተግበሪያዎች እንዲዘጉ አስገድዳቸው"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"ያዢው ከአንድ የርቀት ማሳያ ከፍተኛ-ደረጃ በይነገጽ ጋር እንዲጠርዝ ይፈቅድለታል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ወደ ፍርግም አገልግሎት አያይዝ"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ያዡ ግቤት ስልቱን ወደ ከፍተኛ-ደረጃ ፍርግም አገልግሎት ለመጠረዝ ይፈቅዳሉ። ለመደበኛ ትግበራዎች በፍፁም አያስፈልግም።"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"ከመንገድ አቅራቢዎች አገልግሎት ጋር ያስተሳስሩ"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"አቃፊው ከማናቸውም የተመዘገቡ የመንገድ አቅራቢዎች ጋር እንዲተሳሰር ይፈቅድለታል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ከመሣሪያ አስተዳደር ጋር ተገናኝ"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ያዡ በይነመረብን ለመሣሪያ አስተዳዳሪ ለመላክ ይፈቅዳሉ። ለመደበኛ መተግበሪያዎች በፍፁም አያስፈልግም።"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"ከአንድ የቴሌቪዥን ግብዓት ጋር እሰር"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"የWiMAX ሁኔታ ለውጥ"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"መተግበሪያው ጡባዊ ተኮውን ከWiMAX አውታረ መረብ ጋር እንዲያገናኝና እንዲያለያይ ይፈቅድለታል።"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"መተግበሪያው ስልኩን ከWiMAX አውታረ መረብ ጋር እንዲያገናኝና እንዲያለያይ ይፈቅድለታል።"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ለአውታረ መረቦች ነጥብ ይሰጣል"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"መተግበሪያው ለአውታረ መረቦች ደረጃ እንዲሰጥ እና ጡባዊው የትኛዎቹን አውታረ መረቦች እንደሚመርጥ ላይ ተጽዕኖ እንዲያሳርፍ ያስችለዋል።"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"መተግበሪያው ለአውታረ መረቦች ደረጃ እንዲሰጥ እና ስልኩ የትኛዎቹን አውታረ መረቦች እንደሚመርጥ ላይ ተጽዕኖ እንዲያሳርፍ ያስችለዋል።"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"ከብሉቱዝ መሣሪያዎች ጋር ተጣመር"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"መተግበሪያው በጡባዊ ተኮው ላይ ያለውን የብሉቱዝ ውቅር እንዲያይ እና ከተጣመሩ መሳሪያዎች ጋር ግንኙነቶችን እንዲያደርግና እንዲቀበል ይፈቅድለታል።"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"መተግበሪያው በስልኩ ላይ ያለውን የብሉቱዝ ውቅር እንዲያይ እና ከተጣመሩ መሳሪያዎች ጋር ግንኙነቶችን እንዲያደርግና እንዲቀበል ይፈቅድለታል።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 468c14b..86d2be3 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"للسماح للتطبيق ببث إشعار باستلام رسالة قصيرة SMS. قد تستخدم التطبيقات الضارة هذا لتزييف الرسائل القصيرة SMS الواردة."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"إرسال بث WAP-PUSH المستلم"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"للسماح للتطبيق ببث إشعار باستلام رسالة WAP PUSH. يمكن أن تستخدم التطبيقات الضارة هذا لتزيف استلام رسالة وسائط متعددة أو لاستبدال محتوى أي صفحة ويب بمتغيرات ضارة بشكل غير ملحوظ."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"إرسال بث الشبكات التي تم تقييمها"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"السماح للتطبيق لكي يبث إشعارًا يفيد بأنه يلزم تقييم الشبكات. لا يلزم ذلك مطلقًا مع التطبيقات العادية."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"تحديد عدد العمليات قيد التشغيل"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"للسماح للتطبيق بالتحكم في الحد الأقصى لعدد العمليات التي سيتم تشغيلها. غير مطلوب على الإطلاق للتطبيقات العادية."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"فرض إغلاق تطبيقات الخلفية"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"للسماح للمالك بالالتزام بواجهة المستوى العلوي للعرض عن بُعد. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"الالتزام بخدمة أداة"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة الأداة. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"الربط مع خدمة مزود طريق"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"للسماح لحامل البطاقة الربط مع أي مزود طريق مسجل. لا يجب استخدامه على الإطلاق مع التطبيقات العادية."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"التفاعل مع مشرف الجهاز"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"للسماح للمالك بإرسال الأهداف إلى أحد مشرفي الجهاز. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"الالتزام بإدخال التلفزيون"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغيير حالة WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"للسماح للتطبيق بتوصيل الجهاز اللوحي بشبكات WiMAX وقطع اتصاله بها."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"للسماح للتطبيق بتوصيل الهاتف بشبكات WiMAX وقطع اتصاله بها."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"تقييم الشبكات"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"للسماح للتطبيق بترتيب الشبكات وتحديد تلك الشبكات التي من المفضل أن يستخدمها الجهاز اللوحي."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"للسماح للتطبيق بترتيب الشبكات وتحديد تلك الشبكات التي من المفضل أن يستخدمها الهاتف."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"الاتصال بأجهزة بلوتوث"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"للسماح للتطبيق بعرض تهيئة البلوتوث على الجهاز اللوحي وإجراء اتصالات وقبولها مع الأجهزة المقترنة."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"للسماح للتطبيق بعرض تهيئة البلوتوث على الهاتف وإجراء اتصالات وقبولها مع الأجهزة المقترنة."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index bb2bf43..fcf3e1b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизиране"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Изтриванията за <xliff:g id="CONTENT_TYPE">%s</xliff:g> са твърде много."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Хранилището на таблета е пълно. Изтрийте файлове, за да освободите място."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Хранилището на часовника е пълно. Изтрийте файлове, за да освободите място."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Хранилището на телефона е пълно. Изтрийте файлове, за да освободите място."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежата може да се наблюдава"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"От неизвестна трета страна"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Звъненето е включено"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Изключва се..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таблетът ви ще се изключи."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Часовникът ви ще се изключи."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефонът ви ще се изключи."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Искате ли да изключите?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Рестартиране в безопасен режим"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Разрешава на приложението да излъчва известие, че е получен SMS. Злонамерените приложения могат да използват това, за да фалшифицират входящите SMS съобщения."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"изпращане на излъчване при получено WAP PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Разрешава на приложението да излъчва известие, че е получено WAP PUSH съобщение. Злонамерените приложения могат да използват това, за да фалшифицират получаването на MMS или скрито да заменят съдържанието на произволна уеб страница със злонамерен вариант."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"изпращане на излъчване за оценяване на мрежите"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Разрешава на приложението да излъчи известие, че мрежите трябва да бъдат оценени. Не е необходимо за нормалните приложения."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ограничаване на броя изпълнявани процеси"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Разрешава на приложението да контролира максималния брой изпълнявани процеси. Нормалните приложения никога не се нуждаят от това."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"принудително затваряне на приложенията на заден план"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Разрешава на притежателя да се свърже с интерфейса от първо ниво на отдалечен екран. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"обвързване с услуга за приспособления"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на услуга за приспособления. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"свързване с услуга за предоставяне на маршрути"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Разрешава на собственика да се свързва с всички регистрирани доставчици на маршрути. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаимодействие с администратор на устройството"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Разрешава на притежателя да изпраща намерения до администратор на устройството. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"свързване към вход на телевизор"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промяна на състоянието на WiMAX мрежата"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Разрешава на приложението да свързва таблета към WiMAX мрежа и да прекратява връзката му с нея."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Разрешава на приложението да свързва телефона към WiMAX мрежа и да прекратява връзката му с нея."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"оценяване на мрежите"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Разрешава на приложението да класира мрежите и да повлияе върху това, кои да са предпочитаните за таблета."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Разрешава на приложението да класира мрежите и да повлияе върху това, кои да са предпочитаните за телефона."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"сдвояване с устройства с Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Разрешава на приложението да вижда конфигурацията на Bluetooth на таблета и да изгражда и приема връзки със сдвоени устройства."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Разрешава на приложението да вижда конфигурацията на Bluetooth на телефона и да изгражда и приема връзки със сдвоени устройства."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 11601bb..b422a6d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronització"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Massa supressions de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"L\'emmagatzematge de la tauleta és ple. Suprimeix uns quants fitxers per alliberar espai."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"L\'emmagatzematge del rellotge està ple. Suprimeix uns quants fitxers per alliberar espai."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"L\'emmagatzematge del telèfon és ple. Suprimeix uns quants fitxers per alliberar espai."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"És possible que la xarxa estigui supervisada"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Per un tercer desconegut"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Timbre activat"</string> <string name="shutdown_progress" msgid="2281079257329981203">"S\'està apagant..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"La tauleta s\'apagarà."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"El rellotge s\'apagarà."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El telèfon s\'apagarà."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vols apagar-lo?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reinicia en mode segur"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permet que l\'aplicació difongui una notificació en què s\'indiqui que s\'ha rebut un missatge SMS. Les aplicacions malicioses poden fer servir aquesta funció per falsificar els missatges SMS entrants."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar una difusió de tipus WAP-PUSH-received"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permet que l\'aplicació difongui una notificació que indica que s\'ha rebut un missatge d\'inserció WAP. Les aplicacions malicioses poden utilitzar-ho per falsificar la recepció dels missatges MMS o per substituir silenciosament el contingut d\'una pàgina web per variants malicioses."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"enviar l\'emissió de la puntuació de les xarxes"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permet que l\'aplicació emeti una notificació necessària perquè les xarxes rebin una puntuació. No es necessita mai per a les aplicacions normals."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitar el nombre de processos en execució"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permet que l\'aplicació controli el nombre màxim de processos que s\'executaran. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"com fer que es tanquin les aplicacions en segon pla"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permet que el titular es vinculi a la interfície de nivell superior d\'una pantalla remota. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vincula a un servei de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permet que el titular vinculi a la interfície de nivell superior d\'un servei de widget. No s\'hauria de necessitar mai per a les aplicacions normals."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"establir vincles amb un servei d\'aprovisionament de rutes"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permet que el titular estableixi vincles amb els proveïdors de rutes registrats. No hauria de ser mai necessari per a les aplicacions normals."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar amb un administrador del dispositiu"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permet que el titular enviï intents a un administrador del sistema. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"Vinculació a una entrada de televisor"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Canvia l\'estat de WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permet que l\'aplicació connecti i desconnecti la tauleta de les xarxes WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permet que l\'aplicació connecti i desconnecti el telèfon de les xarxes WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"puntuar les xarxes"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permet que l\'aplicació classifiqui les xarxes i indiqui quines han de ser les xarxes preferides de la tauleta."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permet que l\'aplicació classifiqui les xarxes i indiqui quines han de ser les xarxes preferides del telèfon."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"emparella amb dispositius Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permet que l\'aplicació visualitzi la configuració de Bluetooth de la tauleta i que estableixi i accepti connexions amb dispositius sincronitzats."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permet que una aplicació visualitzi la configuració de Bluetooth del telèfon i que estableixi i accepti connexions amb els dispositius sincronitzats."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index ef6c7e9..416eca9 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Umožňuje aplikaci vysílat oznámení o přijetí zprávy SMS. Škodlivé aplikace mohou toto oprávnění použít k vytváření falešných příchozích zpráv SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"odeslání vysílání typu WAP-PUSH-received"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Umožňuje aplikaci vysílat oznámení o přijetí zprávy WAP PUSH. Škodlivé aplikace mohou toto oprávnění použít k vytváření falešných přijatých zpráv MMS nebo utajenému nahrazení obsahu libovolné webové stránky jejich škodlivými variantami."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"odeslání skóre vysílaných sítěmi"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Umožňuje aplikaci vysílat oznámení, že je třeba zadat skóre sítí. Běžné aplikace toto oprávnění nepotřebují."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"omezení počtu spuštěných procesů"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Umožňuje aplikaci řídit maximální počet spuštěných procesů. Běžné aplikace toto oprávnění nikdy nepotřebují."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"vynucení zavření aplikací na pozadí"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Umožňuje držiteli připojit se k vysokoúrovňovému rozhraní vzdáleného displeje. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"navázat se na službu widgetu"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Umožňuje držiteli navázat se na nejvyšší úroveň služby widgetu. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"navázání na službu poskytovatele tras"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Umožňuje držiteli navázat se na libovolného poskytovatele registrovaných tras. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"komunikovat se správcem zařízení"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Umožňuje držiteli oprávnění odesílat informace správci zařízení. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"navázání na televizní vstup"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Změnit stav připojení WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Umožňuje aplikaci připojovat tablet k sítím WiMAX a odpojovat jej od nich."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Umožňuje aplikaci připojovat telefon k sítím WiMAX a odpojovat jej od nich."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"zadání skóre sítí"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Umožňuje aplikaci hodnotit sítě a ovlivňovat, které sítě by měl tablet preferovat."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Umožňuje aplikaci hodnotit sítě a ovlivňovat, které sítě by měl telefon preferovat."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"párování se zařízeními Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Umožňuje aplikaci zobrazit konfiguraci tabletu s rozhraním Bluetooth, vytvářet připojení ke spárovaným zařízením a přijímat tato připojení."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Umožňuje aplikaci zobrazit konfiguraci telefonu s rozhraním Bluetooth, vytvářet připojení ke spárovaným zařízením a přijímat tato připojení."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index be6e28e..7e08df5 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkroniser"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"For mange <xliff:g id="CONTENT_TYPE">%s</xliff:g> sletninger"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Din tablets lager er fuldt. Slet nogle filer for at frigøre plads."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Urets lager er fuldt. Slet nogle filer for at frigøre plads."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonens lager er fuldt. Slet nogle filer for at frigøre plads."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netværket kan være overvåget"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Af en ukendt tredjepart"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ringeren er aktiveret"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Lukker ned..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Din tablet slukkes nu."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Dit ur lukkes ned."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Din telefon slukkes nu."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vil du slukke?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Genstart i sikker tilstand"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Tillader, at appen kan udsende en underretning om, at der er modtaget en sms-besked. Ondsindede apps kan bruge dette til at simulere indgående sms-beskeder."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"send WAP-PUSH-modtaget udsendelse"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Tillader, at appen kan udsende en underretning om, at der er modtaget en WAP PUSH-besked. Ondsindede apps kan bruge dette til at simulere modtagelse af mms-beskeder eller i det skjulte erstatte indholdet på en webside med ondsindede varianter."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"sende underretninger om bedømmelse af netværk"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Tillader, at appen kan udsende en underretning om, at netværket skal bedømmes. Dette er aldrig nødvendigt for almindelige apps."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"begræns antallet af kørende processer"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Tillader, at appen kan kontrollere det maksimale antal kørende processer. Dette er aldrig nødvendigt til normale apps."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"tvinge baggrundsapps til at lukke"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Tillader, at brugeren kan foretage en binding til grænsefladens øverste niveau på en ekstern skærm. Bør aldrig være nødvendigt til almindelige apps."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"forpligt til en widgettjeneste"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Tillader, at brugeren kan forpligte sig til en grænseflade for en widgettjeneste på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"oprette tilknytning til en ruteudbydertjeneste"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Tillader, at indehaveren opretter tilknytninger til registrerede ruteudbydere. Dette bør aldrig være nødvendigt for normale apps."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunikere med en enhedsadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Tillader, at brugeren kan sende hensigter til en enhedsadministrator. Dette bør aldrig være nødvendigt for almindelige apps."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"knyt til en tv-indgang"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Skift WiMAX-tilstand"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tillader, at appen kan oprette forbindelse fra tabletten og afbryde forbindelsen til tabletten på WiMAX-netværk."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tillader, at appen kan oprette forbindelse fra telefonen og afbryde forbindelsen til telefonen på WiMAX-netværk."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"bedømme netværk"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Tillader, at appen rangerer netværk og påvirker, hvilke netværk tabletten bør foretrække."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Tillader, at appen rangerer netværk og påvirker, hvilke netværk telefonen bør foretrække."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"parre med Bluetooth-enheder"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tillader, at appen kan læse konfigurationen af Bluetooth på tabletten samt kan oprette og acceptere forbindelser med parrede enheder."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Tillader, at appen kan læse konfigurationen af Bluetooth på telefonen samt kan oprette og acceptere forbindelser med parrede enheder."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 3ba4c6f..162d0d8 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronisierung"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Zu viele <xliff:g id="CONTENT_TYPE">%s</xliff:g> gelöscht."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Der Tablet-Speicher ist voll. Löschen Sie Dateien, um Speicherplatz freizugeben."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Der Speicher Ihrer Uhr ist voll. Löschen Sie Dateien, um Speicherplatz freizugeben."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Der Handyspeicher ist voll! Löschen Sie Dateien, um Speicherplatz freizugeben."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Das Netzwerk wird möglicherweise überwacht."</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Von einem unbekannten Dritten"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Klingelton ein"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Wird heruntergefahren..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ihr Tablet wird heruntergefahren."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Ihre Uhr wird heruntergefahren."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon wird heruntergefahren."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Möchten Sie das Gerät herunterfahren?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Im abgesicherten Modus starten"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ermöglicht der App, eine Benachrichtigung zu senden, dass eine SMS empfangen wurde. Schädliche Apps können so eingehende SMS fälschen."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Von WAP-PUSH empfangenen Broadcast senden"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ermöglicht der App, eine Benachrichtigung zu senden, dass eine WAP PUSH-Nachricht empfangen wurde. Schädliche Apps können so den Empfang von MMS vortäuschen oder unbemerkt den Inhalt einer beliebigen Webseite durch schädliche Inhalte ersetzen."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"Netzwerkbewertungen senden"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Ermöglicht der App, Benachrichtigungen zu senden, dass Netzwerke bewertet werden müssen. Für normale Apps sollte dies nie erforderlich sein."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Anzahl der laufenden Prozesse beschränken"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ermöglicht der App, die maximale Anzahl an aktiven Prozessen zu steuern. Wird nie für normale Apps benötigt."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"Apps im Hintergrund schließen"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Ermöglicht dem Halter, sich an die Oberfläche eines Remote-Displays auf oberster Ebene zu binden. Sollte für normale Apps nie benötigt werden."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"An einen Widget-Dienst binden"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Ermöglicht dem Halter, sich an die Oberfläche eines Widget-Dienstes auf oberster Ebene zu binden. Sollte nie für normale Apps benötigt werden."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"An Routenanbieterdienst binden"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Ermöglicht dem Inhaber die Bindung an registrierte Routenanbieter. Sollte für normale Apps nicht erforderlich sein"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"Interaktion mit einem Geräteadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Ermöglicht dem Halter, Intents an einen Geräteadministrator zu senden. Sollte nie für normale Apps benötigt werden."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"An eine TV-Eingabe binden"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-Status ändern"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ermöglicht der App, eine Verbindung zwischen dem Tablet und WiMAX-Netzwerken herzustellen und solche zu trennen."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ermöglicht der App, eine Verbindung zwischen dem Telefon und WiMAX-Netzwerken herzustellen und solche zu trennen."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"Netzwerke bewerten"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Ermöglicht der App, Netzwerke zu bewerten und die Auswahl des jeweiligen Netzwerks für das Tablet zu beeinflussen"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Ermöglicht der App, Netzwerke zu bewerten und die Auswahl des jeweiligen Netzwerks für das Telefon zu beeinflussen"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Pairing mit Bluetooth-Geräten durchführen"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ermöglicht der App, die Bluetooth-Konfiguration eines Tablets einzusehen und Verbindungen zu gekoppelten Geräten herzustellen und zu akzeptieren."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ermöglicht der App, die Bluetooth-Konfiguration des Telefons einzusehen und Verbindungen mit gekoppelten Geräten herzustellen und zu akzeptieren."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index b951897..6f013b2 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Συγχρονισμός"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Πάρα πολλές <xliff:g id="CONTENT_TYPE">%s</xliff:g> διαγραφές."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Ο αποθηκευτικός χώρος του tablet είναι πλήρης. Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Ο αποθηκευτικός χώρος παρακολούθησης είναι πλήρης! Διαγράψτε μερικά αρχεία για να απελευθερώσετε χώρο."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Ο αποθηκευτικός χώρος του τηλεφώνου είναι πλήρης. Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Το δίκτυο ενδέχεται να παρακολουθείται"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Από ένα άγνωστο τρίτο μέρος"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ειδοποίηση ήχου ενεργή"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Απενεργοποίηση..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Το tablet σας θα απενεργοποιηθεί."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Η παρακολούθησή σας θα τερματιστεί."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Το τηλέφωνό σας θα απενεργοποιηθεί."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Θέλετε να γίνει τερματισμός λειτουργίας;"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Επανεκκίνηση στην ασφαλή λειτουργία"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Επιτρέπει στην εφαρμογή την εκπομπή ειδοποίησης σχετικά με τη λήψη μηνύματος SMS. Τυχόν κακόβουλες εφαρμογές ενδέχεται να χρησιμοποιήσουν αυτήν τη δυνατότητα για τη δημιουργία πλαστών εισερχόμενων μηνυμάτων SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"αποστολή εκπομπής που έχει ληφθεί με WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Επιτρέπει στην εφαρμογή τη μετάδοση μιας ειδοποίησης ότι έχει ληφθεί κάποιο μήνυμα WAP PUSH. Τυχόν κακόβουλες εφαρμογές ενδέχεται να χρησιμοποιήσουν αυτήν τη δυνατότητα για τη λήψη πλαστών μηνυμάτων MMS ή την εν αγνοία του χρήστη αντικατάσταση του περιεχομένου οποιασδήποτε ιστοσελίδας με κακόβουλες παραλλαγές."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"αποστολή μετάδοσης κατάταξης δικτύων"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Επιτρέπει στην εφαρμογή να μεταδίδει μια ειδοποίηση ότι απαιτείται κατάταξη των δικτύων. Δεν απαιτείται ποτέ για τις συνήθεις εφαρμογές."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"περιορισμός αριθμού εκτελούμενων διαδικασιών"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Επιτρέπει στην εφαρμογή τον έλεγχο του μέγιστου αριθμού διαδικασιών που θα εκτελούνται. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"αναγκαστικός τερματισμός εφαρμογών στο παρασκήνιο"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας απομακρυσμένης οθόνης. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"δέσμευση σε υπηρεσία γραφικών στοιχείων"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας γραφικών στοιχείων. Δεν απαιτείται για κανονικές εφαρμογές."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"σύνδεση σε μια υπηρεσία παρόχου δρομολογητή"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Δίνει στον κάτοχο τη δυνατότητα σύνδεσης με οποιονδήποτε εγγεγραμμένο πάροχο δρομολογητή. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"επικοινωνία με έναν διαχειριστή συσκευής"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Επιτρέπει στον κάτοχο την αποστολή στόχων σε έναν διαχειριστή συσκευής. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"σύνδεση σε μία είσοδο τηλεόρασης"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Αλλαγή κατάστασης WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Επιτρέπει στην εφαρμογή τη σύνδεση στο tablet και την αποσύνδεση από αυτό, από δίκτυα WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Επιτρέπει στην εφαρμογή τη σύνδεση στο τηλέφωνο και την αποσύνδεση από αυτό, από δίκτυα WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"κατάταξη δικτύων"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Επιτρέπει στην εφαρμογή να κατατάσσει τα δίκτυα και να επιλέγει τα προτιμώμενα δίκτυα του tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Επιτρέπει στην εφαρμογή να κατατάσσει τα δίκτυα και να επιλέγει τα προτιμώμενα δίκτυα του τηλεφώνου."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"σύζευξη με συσκευές Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο tablet, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συζευγμένες συσκευές."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο τηλέφωνο, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συζευγμένες συσκευές."</string> @@ -1382,7 +1377,7 @@ <string name="vpn_lockdown_error" msgid="6009249814034708175">"Σφάλμα πάντα ενεργοποιημένου VPN"</string> <string name="vpn_lockdown_config" msgid="6415899150671537970">"Αγγίξτε για διαμόρφωση"</string> <string name="upload_file" msgid="2897957172366730416">"Επιλογή αρχείου"</string> - <string name="no_file_chosen" msgid="6363648562170759465">"Δεν έχει επιλεγεί αρχείο"</string> + <string name="no_file_chosen" msgid="6363648562170759465">"Δεν επιλέχθηκε κανένα αρχείο."</string> <string name="reset" msgid="2448168080964209908">"Επαναφορά"</string> <string name="submit" msgid="1602335572089911941">"Υποβολή"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Η λειτουργία αυτοκινήτου είναι ενεργοποιημένη"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index c13bb1e..9e94287 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Phone storage is full. Delete some files to free space."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"By an unknown third party"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ringer on"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Shutting down…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Your tablet will shut down."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Your watch will shut down."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Your phone will shut down."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Do you want to shut down?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot to safe mode"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Allows the app to broadcast a notification that an SMS message has been received. Malicious apps may use this to forge incoming SMS messages."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"send WAP-PUSH-received broadcast"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Allows the app to broadcast a notification that a WAP PUSH message has been received. Malicious apps may use this to forge MMS message receipt or to silently replace the content of any web page with malicious variants."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"send score networks broadcast"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Allows the app to broadcast a notification that networks need to be scored. Never needed for normal apps."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limit number of running processes"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Allows the app to control the maximum number of processes that will run. Never needed for normal apps."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"force background apps to close"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Allows the holder to bind to the top-level interface of a remote display. Should never be needed for normal apps."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind to a widget service"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Allows the holder to bind to the top-level interface of a widget service. Should never be needed for normal apps."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"bind to a route provider service"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Allows the holder to bind to any registered route providers. Should never be needed for normal apps."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interact with device admin"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Allows the holder to send intents to a device administrator. Should never be needed for normal apps."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"bind to a TV input"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Allows the app to connect the tablet to and disconnect the tablet from WiMAX networks."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Allows the app to connect the phone to and disconnect the phone from WiMAX networks."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"score networks"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Allows the app to rank networks and influence which networks the tablet should prefer."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Allows the app to rank networks and influence which networks the phone should prefer."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"pair with Bluetooth devices"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Allows the app to view the configuration of Bluetooth on the tablet and to make and accept connections with paired devices."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Allows the app to view the configuration of the Bluetooth on the phone and to make and accept connections with paired devices."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index c13bb1e..9e94287 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Phone storage is full. Delete some files to free space."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"By an unknown third party"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ringer on"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Shutting down…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Your tablet will shut down."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Your watch will shut down."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Your phone will shut down."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Do you want to shut down?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot to safe mode"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Allows the app to broadcast a notification that an SMS message has been received. Malicious apps may use this to forge incoming SMS messages."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"send WAP-PUSH-received broadcast"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Allows the app to broadcast a notification that a WAP PUSH message has been received. Malicious apps may use this to forge MMS message receipt or to silently replace the content of any web page with malicious variants."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"send score networks broadcast"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Allows the app to broadcast a notification that networks need to be scored. Never needed for normal apps."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limit number of running processes"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Allows the app to control the maximum number of processes that will run. Never needed for normal apps."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"force background apps to close"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Allows the holder to bind to the top-level interface of a remote display. Should never be needed for normal apps."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind to a widget service"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Allows the holder to bind to the top-level interface of a widget service. Should never be needed for normal apps."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"bind to a route provider service"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Allows the holder to bind to any registered route providers. Should never be needed for normal apps."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interact with device admin"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Allows the holder to send intents to a device administrator. Should never be needed for normal apps."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"bind to a TV input"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Allows the app to connect the tablet to and disconnect the tablet from WiMAX networks."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Allows the app to connect the phone to and disconnect the phone from WiMAX networks."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"score networks"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Allows the app to rank networks and influence which networks the tablet should prefer."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Allows the app to rank networks and influence which networks the phone should prefer."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"pair with Bluetooth devices"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Allows the app to view the configuration of Bluetooth on the tablet and to make and accept connections with paired devices."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Allows the app to view the configuration of the Bluetooth on the phone and to make and accept connections with paired devices."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index b999506..337ab64 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que la aplicación transmita una notificación acerca de la recepción de un mensaje SMS. Las aplicaciones maliciosas pueden utilizar este permiso para falsificar mensajes SMS entrantes."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar emisiones WAP-PUSH-recibido"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que la aplicación transmita una notificación acerca de la recepción de un mensaje WAP PUSH. Las aplicaciones maliciosas pueden utilizar este permiso para falsificar la recepción de mensajes MMS o para reemplazar sin aviso el contenido de cualquier página web con variantes maliciosas."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"enviar transmisión de puntuación de redes"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permite que la aplicación transmita una notificación que las redes necesitan para recibir una puntuación. Las aplicaciones normales no necesitan nunca este permiso."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitar la cantidad de procesos en ejecución"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite que la aplicación controle la cantidad máxima de procesos que se ejecutarán. Las aplicaciones normales no deben utilizar este permiso."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forzar el cierre de aplicaciones de fondo"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite al propietario vincularse a la interfaz de nivel superior de una pantalla remota. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vincular a un servicio de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite al propietario vincularse a la interfaz de nivel superior del servicio de widget. Las aplicaciones normales no deberían necesitar este permiso."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"vincular con un servicio de proveedor de rutas"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permite al propietario vincular con proveedores de rutas registrados. No debe ser necesario para las aplicaciones normales."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con un administrador de dispositivos"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite enviar intentos a un administrador de dispositivos. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"vincular a una entrada de TV"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar el estado de WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que la aplicación conecte la tablet a una red WiMAX y que la desconecte de ella."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que la aplicación conecte el dispositivo a una red WiMAX y que lo desconecte de ella."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"puntuar redes"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite que la aplicación clasifique redes e influya en las redes que la tablet debería preferir."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite que la aplicación clasifique redes e influya en las redes que el teléfono debería preferir."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"vincular con dispositivos Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos sincronizados."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos sincronizados."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 24a919f..920bdbc 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronización"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento del tablet. Elimina algunos archivos para liberar espacio."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un tercero desconocido"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Timbre activado"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Apagando..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"El tablet se apagará."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"El reloj se apagará."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El teléfono se apagará."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"¿Seguro que quieres apagar el teléfono?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar en modo seguro"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que la aplicación emita una notificación cuando se haya recibido un mensaje SMS. Las aplicaciones malintencionadas pueden usar este permiso para falsificar mensajes SMS entrantes."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar emisión recibida mediante mensaje WAP PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que la aplicación envíe una notificación cuando se haya recibido un mensaje WAP PUSH. Las aplicaciones malintencionadas pueden usar este permiso para falsificar la recepción de un mensaje MMS o para reemplazar sin aviso el contenido de cualquier página web con variantes malintencionadas."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"enviar notificaciones sobre la puntuación de las redes"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permite que la aplicación emita una notificación que la red necesita para recibir una puntuación. Las aplicaciones normales no necesitan nunca este permiso."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitar el número de procesos en ejecución"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite que la aplicación controle el número máximo de procesos que se ejecutarán. No es necesario nunca para las aplicaciones normales."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forzar el cierre de aplicaciones en segundo plano"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite enlazar con la interfaz de nivel superior de una pantalla remota. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"enlazar con un servicio de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite enlazar con la interfaz de nivel superior de un servicio de widget. Las aplicaciones normales no deberían necesitar este permiso."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"enlazar con un servicio de proveedor de rutas"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permite enlazar con proveedores de rutas registrados. No debe ser necesario para las aplicaciones normales."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con el administrador de un dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite que se envíen intentos a un administrador de dispositivos. Las aplicaciones normales nunca deberían necesitar este permiso."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"enlazar a una entrada de TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar estado de WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que la aplicación conecte el tablet a redes WiMAX y lo desconecte de ellas."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que la aplicación conecte el teléfono a redes WiMAX y lo desconecte de ellas."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"puntuar redes"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite que la aplicación clasifique redes e influya en las redes que el tablet debe preferir."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite que la aplicación clasifique una red e influya en las redes que el teléfono debe preferir."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"vincular con dispositivos Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que la aplicación acceda a la configuración de Bluetooth del tablet y que establezca y acepte conexiones con los dispositivos sincronizados."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que la aplicación acceda a la configuración de Bluetooth del teléfono y que establezca y acepte conexiones con los dispositivos sincronizados."</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 92b7acb..222a06c 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sünkroonimine"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Liiga palju üksuse <xliff:g id="CONTENT_TYPE">%s</xliff:g> kustutusi."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tahvelarvuti mäluruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Kella talletusruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonimälu on täis. Ruumi vabastamiseks kustutage mõned failid."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Võrku võidakse jälgida"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Tundmatu kolmas osapool:"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Helin on sees"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Väljalülitamine ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Teie tahvelarvuti lülitub välja."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Teie kell lülitub välja."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Teie telefon lülitub välja."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Kas soovite välja lülitada?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Ohutus režiimis taaskäivitamine"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Võimaldab rakendusel edastada teatise SMS-sõnumi vastuvõtmise kohta. Pahatahtlikud rakendused võivad seda kasutada sissetulevate SMS-sõnumite võltsimiseks."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"saada WAP-PUSH-vastuvõetud saateid"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Võimaldab rakendusel edastada teatise WAP PUSH-sõnumi vastuvõtmise kohta. Pahatahtlikud rakendused võivad seda kasutada MMS-sõnumite vastuvõtmise võltsimiseks või mis tahes veebilehe sisu salaja asendamiseks pahatahtlikuga."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"võrkude levi hinnangu saatmine"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Lubab rakendusel levitada märguannet, et võrke tuleb hinnata. Seda ei ole kunagi vaja tavapäraste rakenduste puhul."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"piira töötavate protsesside arvu"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Võimaldab rakendusel juhtida töötavate protsesside maksimaalset arvu. Tavarakenduste puhul pole seda vaja."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"sundige taustarakendused sulguma"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Lubab omanikul siduda rakenduse kaugekraani ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vidinateenusega sidumine"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lubab omanikul siduda vidina teenuse ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"sidumine marsruudi pakkumisteenusega"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Lubab õiguste omajal luua seosed kõikide registreeritud marsruutide pakkujatega. Pole kunagi vajalik tavaliste rakenduste korral."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"seadme administraatoriga suhtlemine"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Võimaldab omanikul saata kavatsusi seadme administraatorile. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"sidumine TV-sisendiga"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-i oleku muutmine"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Võimaldab rakendusel luua ja katkestada tahvelarvuti ühenduse WiMAX-i võrkudega."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Võimaldab rakendusel luua ja katkestada telefoni ühenduse WiMAX-i võrkudega."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"võrkude hindamine"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Lubab rakendusel võrke hinnata ja mõjutada seda, milliseid võrke peaks tahvelarvuti eelistama."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Lubab rakendusel võrke hinnata ja mõjutada seda, milliseid võrke peaks telefon eelistama."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"siduge Bluetoothi seadmetega"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Võimaldab rakendusel vaadata tahvelarvuti Bluetooth-konfiguratsiooni ning luua ja heaks kiita ühendusi seotud seadmetega."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Võimaldab rakendusel vaadata telefoni Bluetooth-konfiguratsiooni ning luua ja heaks kiita ühendusi seotud seadmetega."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index cf2f957..300dfcd 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"همگامسازی"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"تعداد موارد حذف شده <xliff:g id="CONTENT_TYPE">%s</xliff:g> بسیار زیاد است."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"حافظه رایانهٔ لوحی پر است! برخی از فایلها را حذف کنید تا فضا آزاد شود."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"حافظه ساعت پر است. برای آزادسازی فضا، چند فایل را حذف کنید."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"حافظه تلفن پر است. بعضی از فایلها را حذف کنید تا فضا آزاد شود."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ممکن است شبکه نظارت شده باشد"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"توسط یک شخص ثالث ناشناس"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"زنگ روشن"</string> <string name="shutdown_progress" msgid="2281079257329981203">"در حال خاموش شدن…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"رایانهٔ لوحی شما خاموش میشود."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"ساعت شما خاموش میشود."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"گوشی شما خاموش میشود."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"آیا میخواهید تلفن خاموش شود؟"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"راهاندازی مجدد در حالت امن"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"به برنامه اجازه میدهد تا اعلان دریافت پیام کوتاه را پخش کند. برنامههای مخرب میتوانند از این برای جعل پیامهای کوتاه ورودی استفاده کنند."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ارسال پخش دریافت شده توسط WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"به برنامه اجازه میدهد تا اعلانی را پخش کند که پیام WAP PUSH دریافت کرده است. برنامههای مخرب میتوانند از آن استفاده کنند تا دریافت پیام MMS را جعل کنند یا محتوای هر صفحهٔ وب را با انواع مخرب جایگزین کنند."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ارسال اعلان پخش برای امتیازبندی شبکهها"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"به برنامه اجازه میدهد تا اعلانی پخش کند که شبکهها باید امتیازبندی شوند. هرگز برای برنامههای عادی مورد نیاز نیست."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"محدود کردن تعداد فرآیندهای در حال اجرا"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"به برنامه اجازه میدهد تا حداکثر تعداد پردازشهایی را که اجرا خواهد شد کنترل کند. هرگز برای برنامههای عادی لازم نیست."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"بستن اجباری برنامههای پسزمینه"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"به دارنده امکان میدهد تا به رابط سطح بالای نمایشگر راه دور وصل شود. نباید هرگز برای برنامههای عادی لازم باشد."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"اتصال به یک سرویس ابزارک"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"به دارنده اجازه میدهد که به رابط سطح بالای سرویس ابزارک متصل شود. هرگز برای برنامههای معمولی مورد نیاز نیست."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"اتصال به یک سرویس ارائهدهنده مسیر"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"به دارنده امکان میدهد به هر ارائهدهنده مسیر ثبت شدهای متصل شود. هرگز برای برنامههای عادی مورد نیاز نیست."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"تعامل با یک سرپرست دستگاه"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"به دارنده اجازه میدهد اهداف خود را به سرپرست دستگاه ارسال کند. برنامههای معمولی هیچگاه به این ویژگی نیازی ندارند."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"اتصال به ورودی تلویزیون"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغییر وضعیت WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"به برنامه امکان میدهد رایانهٔ لوحی را به شبکههای وایمکس متصل کرده یا اتصال آن را از این شبکهها قطع کند."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"به برنامه امکان میدهد تا تلفن را به شبکههای وایمکس متصل کرده یا اتصال آنرا از این شبکهها قطع کند."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"امتیازبندی شبکهها"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"به برنامه اجازه میدهد که شبکهها را درجهبندی کند و روی اینکه رایانه لوحی باید کدام شبکه را در اولویت قرار دهد تأثیر میگذارد."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"به برنامه اجازه میدهد که شبکهها را درجهبندی کند و روی اینکه تلفن باید کدام شبکه را در اولویت قرار دهد تأثیر میگذارد."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"جفت کردن با دستگاههای بلوتوث"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"به برنامه اجازه میدهد تا پیکربندی بلوتوث در رایانهٔ لوحی را مشاهده کند و اتصال با دستگاههای مرتبط را برقرار کرده و بپذیرد."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"به برنامه اجازه میدهد تا پیکربندی بلوتوث در تلفن را مشاهده کند، و اتصالات دستگاههای مرتبط را برقرار کرده و بپذیرد."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 4d11ad4..9202e0d 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Sallii sovelluksen lähettää ilmoituksen tekstiviestin vastaanotosta. Haitalliset sovellukset voivat käyttää tätä saapuvien tekstiviestien väärentämiseen."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"lähetä WAP-PUSH-vastaanotettu lähetys"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Antaa sovelluksen lähettää ilmoituksen WAP PUSH -viestin vastaanotosta. Haitalliset sovellukset voivat käyttää tätä MMS-viestien vastaanoton väärentämiseen tai sivujen sisällön korvaamiseen huomaamattomasti haitallisella sisällöllä."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"lähetä verkkojen pisteet"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Sallii sovelluksen lähettää ilmoituksen verkon pisteytystarpeesta. Ei tarvita tavallisissa sovelluksissa."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"rajoita käynnissä olevien prosessien määrää"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Antaa sovelluksen hallita suoritettavien sovellusten enimmäismäärää. Ei tavallisten sovellusten käyttöön."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"pakota taustasovelluksia sulkeutumaan"</string> @@ -392,6 +390,10 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Antaa sovelluksen sitoutua etänäytön ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"sitoudu widget-palveluun"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Antaa sovelluksen sitoutua widget-palvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> + <!-- no translation found for permlab_bindRouteProvider (4869394607915096847) --> + <skip /> + <!-- no translation found for permdesc_bindRouteProvider (4703804520859960329) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunikoi laitteen järjestelmänvalvojan kanssa"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Antaa sovelluksen lähettää aikomuksia laitteen järjestelmänvalvojalle. Ei tavallisten sovellusten käyttöön."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"sido TV-tuloon"</string> @@ -642,12 +644,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Vaihda WiMAX-verkon tilaa"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Antaa sovelluksen muodostaa tablet-laitteella yhteyden WiMAX-verkkoon ja katkaista yhteyden."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Antaa sovelluksen muodostaa puhelimella yhteyden WiMAX-verkkoon ja katkaista yhteyden."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"pisteytä verkot"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Sallii sovelluksen asettaa verkkoja paremmuusjärjestykseen ja vaikuttaa siihen, mikä verkko tablet-laitteen kannattaa valita."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Sallii sovelluksen asettaa verkkoja paremmuusjärjestykseen ja vaikuttaa siihen, mikä verkko puhelimen kannattaa valita."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"muodosta laitepari Bluetooth-laitteiden kanssa"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Antaa sovelluksen tarkastella tablet-laitteen Bluetooth-asetuksia sekä muodostaa ja hyväksyä laitepariyhteyksiä."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Antaa sovelluksen tarkastella puhelimen Bluetooth-asetuksia sekä muodostaa ja hyväksyä laitepariyhteyksiä muihin laitteisiin."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index d2f4c9b..5e2cb28 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchroniser"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Le réseau peut être surveillé"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Par un tiers inconnu"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Sonnerie activée"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Arrêt en cours..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Votre tablette va s\'éteindre."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Votre montre va s\'éteindre."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Votre téléphone va s\'éteindre."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Voulez-vous éteindre l\'appareil?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Redémarrer en mode sans échec"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un message texte. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux messages entrants."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"envoyer une diffusion de réception de WAP par poussée"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un message WAP par poussée. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux messages multimédias entrants ou pour remplacer le contenu d\'une page Web par du contenu malveillant."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"diffuser le classement des réseaux"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Autorise l\'application à diffuser une notification signalant que les réseaux doivent être évalués. Cela n\'est jamais nécessaire pour les applications normales."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"restreindre le nombre de processus en cours d\'exécution"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permet à l\'application de définir le nombre maximal de processus devant s\'exécuter. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forcer la fermeture des applications en arrière-plan"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un écran distant. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"s\'associer à un service de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de widget. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"associer à un fournisseur d\'itinéraires enregistré"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permet à l\'application autorisée de s\'associer à des fournisseurs d\'itinéraires enregistrés. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir avec l\'administrateur d\'un périphérique"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permet à l\'application autorisée d\'envoyer des intentions à l\'administrateur de l\'appareil. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"s\'associer à une entrée de téléviseur"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permet à l\'application de connecter la tablette aux réseaux WiMAX et de l\'en déconnecter."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permet à l\'application de connecter le téléphone aux réseaux WiMAX et de l\'en déconnecter."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"classer les réseaux"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Autorise l\'application à classer les réseaux et à influencer la sélection du réseau par la tablette."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Autorise l\'application à classer les réseaux et à influencer la sélection du réseau par le téléphone."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"s\'associer à des appareils Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur la tablette, et d\'établir et accepter des connexions avec les appareils associés."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur le téléphone, et d\'établir et accepter des connexions avec les appareils associés."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 7a42a6d..6435652 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronisation"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Il est possible que le réseau soit surveillé."</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Par un tiers inconnu"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Sonnerie activée"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Arrêt en cours..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Votre tablette va s\'éteindre."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"La montre va s\'éteindre."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Votre téléphone va s\'éteindre."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Voulez-vous éteindre l\'appareil ?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Redémarrer en mode sans échec"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un SMS. Des applications malveillantes peuvent exploiter cette fonctionnalité pour créer de faux SMS entrants."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Envoi de diffusion de réception de WAP PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un message WAP PUSH. Des applications malveillantes peuvent exploiter cette fonctionnalité pour créer de faux MMS entrants ou pour remplacer le contenu d\'une page Web par du contenu malveillant."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"diffuser des notifications pour l\'évaluation des réseaux"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Autoriser l\'application à diffuser une notification signalant que les réseaux doivent être évalués. Cette autorisation n\'est pas nécessaire pour les applications standards."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Nombre maximal de processus en cours d\'exécution"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permet à l\'application de contrôler le nombre maximal de processus devant s\'exécuter. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forcer la fermeture des applications en arrière-plan"</string> @@ -361,7 +357,7 @@ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Permet à l\'application de lancer l\'interface utilisateur de confirmation de sauvegarde complète. Seules certaines applications peuvent bénéficier de cette permission."</string> <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Affichage de fenêtres non autorisées"</string> <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Permet à l\'application de créer des fenêtres destinées à être utilisées par l\'interface utilisateur du système interne. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> - <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"S\'afficher en surimpression dans les autres applis"</string> + <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"Se superposer aux autres applis"</string> <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Permet à l\'application d\'ignorer d\'autres applications ou certaines parties de l\'interface utilisateur. Cela peut altérer votre utilisation de l\'interface de n\'importe quelle application, ou modifier ce que vous pensez voir dans d\'autres applications."</string> <string name="permlab_setAnimationScale" msgid="2805103241153907174">"Réglage de la vitesse des animations"</string> <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Permet à l\'application de modifier à tout moment la vitesse générale des animations pour les ralentir ou les accélérer."</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permettre à l\'application autorisée de s\'associer à l\'interface de niveau supérieur d\'un écran à distance. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"associer à un service widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service widget. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"s\'associer à un fournisseur d\'itinéraires"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permettre à l\'application autorisée de s\'associer à n\'importe quel fournisseur d\'itinéraires. Ne devrait pas être nécessaire pour les applications standards."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir avec l\'administrateur du périphérique"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permet à l\'application autorisée d\'envoyer des intentions à l\'administrateur de l\'appareil. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"s\'associer à une entrée TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permet à l\'application de connecter la tablette aux réseaux WiMAX et de l\'en déconnecter."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permet à l\'application de connecter le téléphone aux réseaux WiMAX et de l\'en déconnecter."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"évaluer les réseaux"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Autoriser l\'application à classer les réseaux et à influencer la sélection du réseau sur la tablette"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Autoriser l\'application à classer les réseaux et à influencer la sélection du réseau sur le téléphone"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"associer à des appareils Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur la tablette, et d\'établir et accepter des connexions avec les appareils associés."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur le téléphone, et d\'établir et accepter des connexions avec les appareils associés."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index dc298de..831b327 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"समन्वयन"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"बहुत से <xliff:g id="CONTENT_TYPE">%s</xliff:g> हटाए जाते हैं."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"टेबलेट संग्रहण भर गया है. स्थान रिक्त करने के लिए कुछ फ़ाइलें हटाएं."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"घड़ी संग्रहण भर गया है. स्थान रिक्त करने के लिए कुछ फ़ाइलें हटाएं."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"फ़ोन संग्रहण भर गया है. स्थान रिक्त करने के लिए कुछ फ़ाइलें हटाएं."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"नेटवर्क को मॉनिटर किया जा सकता है"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"किसी अज्ञात तृतीय पक्ष के द्वारा"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"रिंगर चालू"</string> <string name="shutdown_progress" msgid="2281079257329981203">"शट डाउन हो रहा है..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"आपकी टेबलेट शट डाउन हो जाएगी."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"आपकी घड़ी बंद हो जाएगी."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"आपका फ़ोन शट डाउन हो जाएगा."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"क्या आप शट डाउन करना चाहते हैं?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"सुरक्षित मोड में रीबूट करें"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ऐप्स को वह सूचना प्रसारित करने देता है जो SMS संदेश ने प्राप्त की है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली इनकमिंग संदेश गढ़ने के लिए कर सकते हैं."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-प्राप्त प्रसारण भेजें"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ऐप्स को वह सूचना प्रसारित करने देता है जो WAP PUSH संदेश को प्राप्त हुआ है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली MMS संदेश प्राप्त करने या किसी वेबपृष्ठ की सामग्री को दुर्भावनापूर्ण दूसरे रूप से चुपचाप प्रतिस्थापित करने के लिए कर सकते हैं."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"स्कोर नेटवर्क प्रसारण भेजें"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"ऐप्स को यह सूचना प्रसारित करने देती है कि नेटवर्क को स्कोर किए जाने की आवश्यकता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"चल रही प्रक्रियाओं की संख्या सीमित करें"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ऐप्स को चलाई जाने वाली अधिकतम प्रक्रियाओं को नियंत्रित करने देता है. सामान्य ऐप्स के लिए कभी आवश्यक नहीं होती."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृष्ठभूमि ऐप्स को बलपूर्वक बंद करें"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"धारक को किसी रिमोट डिस्प्ले के शीर्ष-स्तरीय इंटरफ़ेस से आबद्ध होने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"किसी विजेट सेवा से आबद्ध करें"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"धारक को किसी विजेट सेवा के शीर्ष-स्तर इंटरफ़ेस से आबद्ध होने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"किसी रूट प्रदाता सेवा से आबद्ध हों"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"धारक को किसी भी पंजीकृत रूट प्रदाता से आबद्ध रहने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"किसी उपकरण व्यवस्थापक के साथ सहभागिता करें"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"धारक को किसी उपकरण व्यवस्थापक को उद्देश्य भेजने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"टीवी इनपुट से आबद्ध करें"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX स्थिति बदलें"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ऐप्स को WiMAX नेटवर्क से टेबलेट को कनेक्ट और डिस्कनेक्ट करने देता है."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ऐप्स को WiMAX नेटवर्क से फ़ोन को कनेक्ट और डिस्कनेक्ट करने देता है."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"स्कोर नेटवर्क"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"ऐप्स को नेटवर्क को रैंक करने देती है और इस बात पर ज़ोर देती है कि टेबलेट को किस नेटवर्क को प्राथमिकता देनी चाहिए."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"ऐप्स को नेटवर्क को रैंक करने देती है और इस बात पर ज़ोर देती है कि फ़ोन को किस नेटवर्क को प्राथमिकता देनी चाहिए."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth उपकरणों के साथ युग्मित करें"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ऐप्स को टेबलेट पर Bluetooth का कॉन्फ़िगरेशन देखने, और युग्मित उपकरणों के साथ कनेक्शन बनाने और स्वीकार करने देता है."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ऐप्स को फ़ोन पर Bluetooth का कॉन्फ़िगरेशन देखने, और युग्मित उपकरणों के साथ कनेक्शन बनाने और स्वीकार करने देता है."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 96872e8..40b194c 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkronizacija"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Previše brisanja stavki <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Prostor za pohranu tabletnog računala pun je. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Pohrana sata puna je. Izbrišite neke datoteke da biste oslobodili prostor."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Prostor za pohranu na telefonu je pun. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mreža se možda nadzire"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Od strane nepoznate treće strane"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Zvono uključeno"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Isključivanje..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Vaš tabletni uređaj će se isključiti."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Sat će se isključiti."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Vaš će se telefon isključiti."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Želite li isključiti uređaj?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Ponovno pokretanje u sigurnom načinu rada"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Omogućuje aplikaciji emitiranje obavijesti da je primljena SMS poruka. Zlonamjerne aplikacije mogu to upotrijebiti za krivotvorenje dolaznih SMS poruka."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"slanje WAP-PUSH-primljenih prijenosa"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Omogućuje aplikaciji emitiranje obavijesti da je primljena WAP PUSH poruka. Zlonamjerne aplikacije mogu to upotrijebiti da bi krivotvorile prijem MMS poruka ili da bi potajno zamijenile sadržaj bilo koje web-stranice zlonamjernim varijantama."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"slanje obavijesti za ocjenjivanje mreža"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Aplikaciji omogućuje emitiranje obavijesti da se mreža treba ocijeniti. Nije potrebno za normalne aplikacije."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ograničavanje broja pokrenutih postupaka"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Omogućuje aplikaciji upravljanje maksimalnim brojem postupaka koji će biti pokrenuti. Nikada nije potrebno za uobičajene aplikacije."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"prisilno zatvaranje pozadinskih aplikacija"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Nositelju omogućuje vezanje uza sučelje najviše razine udaljenog zaslona. Ne bi smjelo biti potrebno za normalne aplikacije."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vezanje na uslugu widgeta"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Nositelju omogućuje vezanje uz sučelje najviše razine usluge widgeta. Ne bi smjelo biti potrebno za normalne aplikacije."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"povezivanje s davateljem usluge usmjeravanja poziva"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Nositelju omogućuje povezivanje s registriranim davateljem usluga usmjeravanja poziva. Nije potrebno za normalne aplikacije."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcija s administratorom uređaja"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Nositelju omogućuje slanje namjera administratoru uređaja. Ne bi smjelo biti potrebno za normalne aplikacije."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"povezivanje s TV ulazom"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Promjena stanja WiMAX mreže"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Aplikaciji omogućuje povezivanje tabletnog računala s WiMAX mrežama i prekidanje veze tabletnog računala s njima."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Aplikaciji omogućuje povezivanje telefona s WiMAX mrežama i prekidanje veze telefona s njima."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ocjenjivanje mreža"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Aplikaciji omogućuje rangiranje mreža i utjecanje na odabir preferiranih mreža na tabletu."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Aplikaciji omogućuje rangiranje mreža i utjecanje na odabir preferiranih mreža na telefonu."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"uparivanje s Bluetooth uređajima"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Aplikaciji omogućuje pregled konfiguracije Bluetootha na tabletnom računalu te uspostavljanje i prihvaćanje veza s uparenim uređajima."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Aplikaciji omogućuje pregled konfiguracije Bluetootha na telefonu te uspostavljanje i prihvaćanje veza s uparenim uređajima."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index aded23b..7c95b53 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Szinkronizálás"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Túl sok <xliff:g id="CONTENT_TYPE">%s</xliff:g> törlés."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"A táblagép tárhelye tele van. Szabadítson fel helyet néhány fájl törlésével."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Az óra tárhelye megtelt. Szabadítson fel helyet néhány fájl törlésével."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"A telefon tárhelye megtelt. Hely felszabadításához töröljön néhány fájlt."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Lehet, hogy a hálózat felügyelt"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ismeretlen harmadik fél által"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Csengő bekapcsolva"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Leállítás..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"A táblagép ki fog kapcsolni."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Az óra ki fog kapcsolni."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"A telefon le fog állni."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Kikapcsolja?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Újraindítás csökkentett módban"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Lehetővé teszi az alkalmazás számára értesítés küldését SMS érkezéséről. A rosszindulatú alkalmazások beérkező SMS-ek hamisítására használhatják fel ezt."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH alapú üzenetek küldése"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Lehetővé teszi az alkalmazás számára értesítés küldését WAP PUSH üzenet érkezése esetén. A rosszindulatú alkalmazások arra használhatják ezt, hogy MMS-kézbesítési jelentést hamisítsanak, vagy hogy a háttérben rosszindulatú variánssal cseréljék le bármelyik weboldal tartalmát."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"hálózatpontozási értesítés küldése"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Lehetővé teszi, hogy az alkalmazás szétküldjön egy értesítést, amely szerint a hálózatokat pontozni kell. A normál alkalmazásoknak erre soha nincs szükségük."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"futó folyamatok számának korlátozása"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Lehetővé teszi az alkalmazás számára a futtatható folyamatok maximális számának vezérlését. Soha nem lehet rá szüksége a normál alkalmazásoknak."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"háttéralkalmazások leállításának kényszerítése"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Lehetővé teszi a használó számára, hogy csatlakozzon egy távoli kijelző legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"csatlakozás modulszolgáltatáshoz"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lehetővé teszi a használó számára, hogy csatlakozzon egy modulszolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szüksége."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"csatlakozás egy útvonal-szolgáltatóhoz"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Az eszköz kezelője csatlakozhat bármely regisztrált útvonal-szolgáltatóhoz. A normál alkalmazások esetében erre nincs szükség."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"az eszközkezelő használata"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Lehetővé teszi a tulajdonos számára, hogy célokat küldjön egy eszközkezelőnek. A normál alkalmazásoknak erre soha nincs szüksége."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"csatlakozás tévébemenethez"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-állapot módosítása"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Lehetővé teszi az alkalmazás számára, hogy a táblagépet csatlakoztassa WiMAX-hálózathoz vagy leválassza azt róla."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Lehetővé teszi az alkalmazás számára, hogy a telefont csatlakoztassa WiMAX-hálózathoz vagy leválassza azt róla."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"hálózatok pontozása"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Lehetővé teszi, hogy az alkalmazás rangsorolja a hálózatokat, illetve befolyásolja, hogy a táblagép mely hálózatokat részesítse előnyben."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Lehetővé teszi, hogy az alkalmazás rangsorolja a hálózatokat, illetve befolyásolja, hogy a telefon mely hálózatokat részesítse előnyben."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth-eszközök párosítása"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Lehetővé teszi az alkalmazás számára a táblagépen lévő Bluetooth beállításainak megtekintését, valamint kapcsolatok kezdeményezését és fogadását a párosított eszközökkel."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Lehetővé teszi az alkalmazás számára a telefonon lévő Bluetooth beállításainak megtekintését, valamint kapcsolatok kezdeményezését és fogadását a párosított eszközökkel."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 9edccf8..c788068 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Թույլ է տալիս հավելվածին հաղորդել ծանուցում, որ ստացվել է SMS հաղորդագրություն: Վնասարար հավելվածները կարող են օգտագործել սա` կեղծելու մուտքային SMS հաղորդագրությունները:"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ուղարկել ստացված WAP-PUSH-ի հաղորդում"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Թույլ է տալիս հավելվածին հաղորդել ծանուցում, որ ստացվել է WAP PUSH հաղորդագրություն: Վնասարար հավելվածները կարող են օգտագործել սա` կեղծելու MMS հաղորդագրության ստացումը կամ աննկատ փոխարինելու ցանկացած կայքի բովանդակությունը վնասարար տարբերակներով:"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ուղարկել ցանցերի գնահատականի հեռարձակում"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Ծրագրին թույլ է տալիս հեռարձակել ծանուցում, որ ցանցերը պետք է հաշվարկվեն: Նորմալ ծրագրերում երբեք պետք չի գալիս:"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"սահմանափակել աշխատող գործընթացների թիվը"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Թույլ է տալիս հավելվածին վերահսկել գործընթացների առավելագույն թիվը, որ աշխատելու են: Երբևէ անհրաժեշտ չէ սովորական հավելվածների համար:"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"ստիպել, որ առաջին պլանի հավելվածները փակվեն"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Թույլ է տալիս սեփականատիրոջը միանալ հեռակա էկրանի վերին մակարդակի ինտերֆեյսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"միանալ վիջեթ ծառայությանը"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Թույլ է տալիս սեփականատիրոջը միանալ վիջեթ ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"կապվել երթուղու մատակարարի ծառայությանը"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Թույլ է տալիս տիրոջը կապվել երթուղու մատակարարներից ցանկացածին: Սովորական ծրագրերի համար երբեք անհրաժեշտ չէ:"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"փոխգործակցել սարքի կառավարչի հետ"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Թույլ է տալիս սեփականատիրոջը ուղարկել մտադրություններ սարքի կառավարչին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"միանալ հեռուստացույցի մուտքին"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Փոխել WiMAX-ի կարգավիճակը"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Թույլ է տալիս հավելվածին գրասալիկը միացնել WiMAX ցանցին և անջատվել այդ ցանցից:"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Թույլ է տալիս հավելվածին հեռախոսը միացնել WiMAX ցանցին և անջատել այդ ցանցից:"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ցանցերի գնահատական"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Ծրագրին թույլ է տալիս դասակարգել ցանցերը և ազդել գրասալիկի նախընտրելի ցանցի ընտրության գործընթացի վրա:"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Ծրագրին թույլ է տալիս դասակարգել ցանցերը և ազդել հեռախոսի նախընտրելի ցանցի ընտրության գործընթացի վրա:"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"զուգակցվել Bluetooth սարքերի հետ"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը գրասալիկի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը հեռախոսի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index be0730a..a7ede78 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkron"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Terlalu banyak <xliff:g id="CONTENT_TYPE">%s</xliff:g> penghapusan."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Penyimpanan tablet penuh. Hapus beberapa file untuk mengosongkan ruang."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Penyimpanan arloji penuh. Hapus beberapa file untuk mengosongkan ruang."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Penyimpanan di ponsel penuh. Hapus sebagian file untuk mengosongkan ruang."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Jaringan mungkin dipantau"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Oleh pihak ketiga yang tidak dikenal"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Pendering nyala"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Sedang mematikan..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet Anda akan dimatikan."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Arloji Anda akan dimatikan."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ponsel Anda akan dimatikan."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Anda ingin mematikannya?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot ke mode aman"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Mengizinkan apl menyiarkan pemberitahuan bahwa pesan SMS telah diterima. Apl berbahaya dapat menggunakan ini untuk memalsukan pesan SMS masuk."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"kirim siaran WAP-PUSH-diterima"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Mengizinkan apl menyiarkan pemberitahuan bahwa pesan WAP PUSH telah diterima. Apl berbahaya dapat menggunakan ini untuk memalsukan penerimaan pesan MMS atau diam-diam mengganti konten laman web apa pun dengan varian berbahaya."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"mengirim siaran beri skor jaringan"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Memungkinkan aplikasi menyiarkan pemberitahuan bahwa jaringan perlu diberi skor. Tidak pernah diperlukan untuk aplikasi normal."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"batasi jumlah dari proses yang berjalan"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Mengizinkan apl mengontrol jumlah maksimum proses yang akan berjalan. Tidak pernah diperlukan oleh apl normal."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"paksa aplikasi latar belakang agar menutup"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Mengizinkan pemegang mengikat ke antarmuka tingkat atas dari layar jarak jauh. Tidak pernah diperlukan untuk aplikasi normal."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"mengikat ke layanan widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Mengizinkan pemegang mengikat antarmuka tingkat tinggi dari suatu layanan widget. Tidak pernah diperlukan oleh apl normal."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"mengikat ke layanan penyedia rute"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Memungkinkan pemegang mengikat ke penyedia rute terdaftar mana pun. Tidak pernah dibutuhkan untuk aplikasi normal."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"berinteraksi dengan admin perangkat"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Mengizinkan pemegang mengirimkan tujuan kepada administrator perangkat. Tidak pernah diperlukan oleh apl normal."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"mengikat ke masukan TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Ubah status WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Memungkinkan aplikasi menyambungkan tablet ke dan memutus tablet dari jaringan WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Memungkinkan aplikasi menyambungkan ponsel ke dan memutus ponsel dari jaringan WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"memberi skor jaringan"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Memungkinkan aplikasi menilai jaringan dan memengaruhi jaringan mana yang sebaiknya dipilih tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Memungkinkan aplikasi menilai jaringan dan memengaruhi jaringan mana yang sebaiknya dipilih ponsel."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"sandingkan dengan perangkat Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di tablet, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di ponsel, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 1ef77de..4c3d8a3 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizzazione"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Troppe eliminazioni di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Spazio di archiviazione del tablet esaurito. Elimina alcuni file per liberare spazio."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"La rete potrebbe essere monitorata"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Da una terza parte sconosciuta"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Suoneria attiva"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Spegnimento..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Il tablet verrà spento."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"L\'orologio verrà spento."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Il telefono verrà spento."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Spegnere?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Riavvia in modalità provvisoria"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Consente all\'applicazione di trasmettere una notifica che informa della ricezione di un messaggio SMS. Le applicazioni dannose potrebbero farne uso per creare messaggi SMS in arrivo."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"invio broadcast ricevuti tramite WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Consente all\'applicazione di trasmettere una notifica che informa della ricezione di un messaggio WAP PUSH. Le applicazioni dannose potrebbero farne uso per simulare la ricezione di messaggi MMS o per sostituire di nascosto i contenuti di qualsiasi pagina web con varianti dannose."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"invio trasmissione classificazione reti"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Consente all\'app di trasmettere una notifica indicante che le reti devono essere classificate. Opzione non necessaria per le app normali."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"numero limite di processi in esecuzione"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Consente all\'applicazione di controllare il numero massimo di processi che verranno eseguiti. Mai necessaria per le applicazioni normali."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"chiusura forzata applicazioni di background"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un display remoto. Non dovrebbe essere mai necessaria per le normali applicazioni."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"associazione a un servizio widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Consente l\'associazione all\'interfaccia principale di un servizio widget. Non dovrebbe mai essere necessario per le normali applicazioni."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"collegamento a un servizio provider di routing"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Consente al titolare di collegarsi a qualsiasi provider di routing registrato. Non dovrebbe mai essere necessario per le normali applicazioni."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interazione con un amministratore dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Consente l\'invio di intent a un amministratore del dispositivo. L\'autorizzazione non dovrebbe mai essere necessaria per le normali applicazioni."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"collegamento a ingresso TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifica stato WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Consente all\'applicazione di connettere/disconnettere il tablet dalle reti WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Consente all\'applicazione di connettere/disconnettere il telefono dalle reti WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"valutazione reti"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Consente all\'app di stilare una classifica delle reti e determinare quali di queste il tablet deve prediligere."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Consente all\'app di stilare una classifica delle reti e determinare quali di queste il telefono deve prediligere."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"accoppiamento con dispositivi Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Consente all\'applicazione di visualizzare la configurazione del Bluetooth sul tablet e di stabilire e accettare connessioni con dispositivi accoppiati."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Consente all\'applicazione di visualizzare la configurazione del Bluetooth sul telefono e di stabilire e accettare connessioni con dispositivi accoppiati."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index f343f4a..f818574 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"סינכרון"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"יש מחיקות רבות מדי של <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"שטח האחסון של הטאבלט מלא. מחק קבצים כדי לפנות מקום."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"שטח האחסון של השעון מלא. מחק כמה קבצים כדי לפנות שטח."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"שטח האחסון של הטלפון מלא. מחק חלק מהקבצים כדי לפנות שטח."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ייתכן שהרשת מנוטרת"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"על ידי צד שלישי לא מוכר"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"צלצול מופעל"</string> <string name="shutdown_progress" msgid="2281079257329981203">"מכבה..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"הטאבלט שלך יכבה."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"השעון יכבה."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"הטלפון שלך יכובה."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"האם ברצונך לבצע כיבוי?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"אתחל למצב בטוח"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"מאפשר לאפליקציה לשדר התראה על כך שהתקבלה הודעת SMS. אפליקציות זדוניות עלולות להשתמש בכך כדי לזייף הודעות SMS נכנסות."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"שלח שידור שהתקבל באמצעות WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"מאפשר לאפליקציה לשדר התראה על כך שהתקבלה הודעה מסוג WAP PUSH. אפליקציות זדוניות עלולות להשתמש בכך כדי לזייף קבלה של הודעות MMS או כדי להחליף בחשאי את התוכן של דף אינטרנט כלשהו בגירסאות זדוניות."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"שלח שידור לדירוג רשתות"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"מאפשר לאפליקציה לשדר התראה על כדי שיש לדרג את הרשתות. לא בשימוש עבור אפליקציות רגילות."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"הגבל את מספר התהליכים הפועלים"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"מאפשר לאפליקציה לשלוט על המספר המרבי של תהליכים שיפעלו. הרשאה זו לעולם אינה נחוצה לאפליקציות רגילים."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"אילוץ סגירה של אפליקציות ברקע"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"הרשאה זו מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של צג רחוק. לעולם אינה אמורה להיות נחוצה לאפליקציות רגילות."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"הכפפה לשירות Widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"מאפשר למשתמש לבצע איגוד לממשק הרמה העליונה של שירות Widget. הרשאה זו לעולם אינה נחוצה לאפליקציות רגילים."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"איגוד לשירות של ספק ניתוב"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"מאפשרת לבעלים לאגד לספקי ניתוב רשומים. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"קיים אינטראקציה עם מנהל המכשיר"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"מאפשר למשתמש לשלוח כוונות למנהל התקנים. הרשאה זו לעולם אינה נחוצה לאפליקציות רגילים."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"איגוד לקלט טלוויזיה"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"שנה את מצב WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"מאפשר לאפליקציה לחבר את הטאבלט לרשתות WiMAX ולהתנתק מהן."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"מאפשר לאפליקציה לחבר את הטלפון לרשתות WiMAX ולהתנתק מהן."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"דרג רשתות"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"מאפשר ליישום לדרג רשתות ולהשפיע על הרשתות שאותן הטאבלט יעדיף."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"מאפשר ליישום לדרג רשתות ולהשפיע על הרשתות שאותן הטלפון יעדיף."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"התאמה למכשירי Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטאבלט, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטלפון, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 501fb81..159a19e 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同期"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>での削除が多すぎます。"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"タブレットのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"ウォッチのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"端末のストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ネットワークが監視される場合があります"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"着信音オン"</string> <string name="shutdown_progress" msgid="2281079257329981203">"シャットダウン中..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"タブレットの電源をOFFにします。"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"ウォッチの電源をOFFにします。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"携帯電話の電源を切ります。"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"シャットダウンしますか?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"再起動してセーフモードに変更"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"SMSメッセージの受信通知の配信をアプリに許可します。この許可を悪意のあるアプリケーションに利用されると、受信SMSメッセージが偽造される恐れがあります。"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH受信ブロードキャストの送信"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"WAP PUSHメッセージの受信通知を配信することをアプリに許可します。この許可を悪意のあるアプリに利用されると、MMSメッセージの受信確認が偽造されたりウェブページのコンテンツが悪意のあるコンテンツに密かに置き換えられたりする恐れがあります。"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ネットワークスコアのブロードキャスト送信"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"ネットワークのスコアリングが必要であるという通知をブロードキャスト送信することをアプリに許可します。通常のアプリでは不要です。"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"実行中のプロセスの数を制限"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"実行するプロセスの上限数を制御することをアプリに許可します。通常のアプリでは不要です。"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"バックグラウンドのアプリの強制終了"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"リモートディスプレイのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ウィジェットサービスにバインド"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ウィジェットサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"ルートプロバイダサービスへのバインド"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"登録済みのルートプロバイダにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"デバイス管理者との通信"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"デバイス管理者へのintentの送信を所有者に許可します。通常のアプリでは不要です。"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"テレビの入力へのバインド"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX状態の変更"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"タブレットのWiMAXネットワークへの接続と切断をアプリに許可します。"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"携帯端末のWiMAXネットワークへの接続と切断をアプリに許可します。"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ネットワークスコア"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"ネットワークを順位付けし、タブレットでのネットワークの優先順位に反映することをアプリに許可します。"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"ネットワークを順位付けし、携帯電話でのネットワークの優先順位に反映することをアプリに許可します。"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetoothデバイスのペアの設定"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"タブレットのBluetooth設定を表示すること、ペアの端末に接続すること/ペアの端末からの接続を受け入れることをアプリに許可します。"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"携帯端末のBluetooth設定を表示すること、ペアの端末に接続すること/ペアの端末からの接続を受け入れることをアプリに許可します。"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 5f7fa89..db9088c 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"სინქრონიზაცია"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>-ის ძალიან ბევრი წაშლილები."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"ტაბლეტის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"საათის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"ტელეფონის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"შესაძლოა ქსელი მონიტორინგის ქვეშ იმყოფება"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"უცნობი მესამე მხარის მიერ"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"ზარი ჩართულია"</string> <string name="shutdown_progress" msgid="2281079257329981203">"გამორთვა…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"თქვენი ტაბლეტი გაითიშება."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"თქვენი საათი გაითიშება."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"თქვენი ტელეფონი გაითიშება."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"გსურთ გამორთვა?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"უსაფრთხო რეჟიმის ჩატვირთვა"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"აპს საშუალებას აძლევს გააგზავნოს შეტყობინება SMS შეტყობინების მიღების თაობაზე. მავნე აპლიკაციებში ეს ფუნქცია შეიძლება გამოყენებული იქნას SMS შეტყობინებების მიღების იმიტაციიისათვის."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-ით მიღებული სამაუწყებლო შეტყობინების გაგზავნა"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"აპს შეეძლება, გაგზავნოს შეტყობინება WAP PUSH შეტყობინების მიღების თაობაზე. მავნე აპებმა ეს შეიძლება გამოიყენონ MMS შეტყობინების მიღების გასაყალბებლად ან ნებისმიერი ვებგვერდის კონტენტის სახიფათო ვარიანტებით ჩუმად ჩასანაცვლებლად."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ქსელის შეფასებების მაუწყებლობის გაგზავნა"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"აპს ნებას რთავს გადასცეს შეტყობინება, რომ ქსელები შეფასებას საჭიროებს. ჩვეულებრივ აპებს ეს არასოდეს ჭირდება."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"მიმდინარე პროცესების რაოდენობის ლიმიტი"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"აპს შეეძლება, გააკონტროლოს მიმდინარე პროცესების მაქსიმალური რაოდენობა. ჩვეულებრივ აპებში არასდროს არის საჭირო."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"უკანა ფონის აპის იძულებით დახურვა"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"მფლობელს შეეძლება მიებას დისტანციურ მონიტორის ზედა დონის ინტერფეისს. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დაჭირდეს."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ვიჯეტ სერვისთან დაკავშირება"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"აპს შეეძლება ზედა დონის ინტერფეისის ვიჯეტთან დაკავშირება. არასდროს გამოიყენება ჩვეულებრივ აპებში."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"მარშრუტის სერვისის პროვაიდერთან შეკავშირება"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"საშუალებას აძლევს მფლობელს შეკავშირდეს მარშრუტების ნებისმიერ პროვაიდერთან. ჩვეულებრივ აპებს უმეტეს შემთხვევაში არ დაჭირდება."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"მოწყობილობის ადმინთან ინტერაქცია"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"აპს შეეძლება მოწყობილობის ადმინისტრატორისთვის intent ობიექტების გაგზავნა. არასდროს გამოიყენება ჩვეულებრივ აპებში."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"TV შეყვანასთან მიბმა"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX მდგომარეობის შეცვლა"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"აპს შეეძლება, დაუკავშიროს და გამოაერთოს ტაბლეტი WiMAX ქსელებიდან."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"აპს შეეძლება, დაუკავშიროს და გამოაერთოს ტელეფონი WiMAX ქსელებიდან."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ქსელების შეფასება"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"აპს ნებას რთავს შეაფასოს ქსელები და იქონიოს ზეგავლენა, თუ რომელი ქსელი ამჯობინოს ტაბლეტმა."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"აპს ნებას რთავს შეაფასოს ქსელები და იქონიოს ზეგავლენა, თუ რომელი ქსელი ამჯობინოს ტელეფონმა."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth მოწყობილობებთან დაწყვილება"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"აპს შეეძლება, ნახოს Bluetooth-ის კონფიგურაცია ტაბლეტზე, შექმნას და მიიღოს კავშირები დაწყვილებულ მოწყობილობებთან."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"აპს შეეძლება, ნახოს Bluetooth-ის კონფიგურაცია ტელეფონზე და შექმნას და მიიღოს კავშირები დაწყვილებულ მოწყობილობებთან."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 45389f7..7eb674a 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ធ្វើសមកាលកម្ម"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"មានការលុប <xliff:g id="CONTENT_TYPE">%s</xliff:g> ច្រើនពេក។"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"ឧបករណ៍ផ្ទុកនៃកុំព្យូទ័របន្ទះពេញ។ លុបឯកសារមួយចំនួន។"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"ឧបករណ៍របស់នាឡិកាពេញ។ លុបឯកសារមួយចំនួន។"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"ឧបករណ៍ផ្ទុកទូរស័ព្ទពេញ! លុបឯកសារមួយចំនួនដើម្បីបង្កើនទំហំ។"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"បណ្ដាញអាចត្រូវបានតាមដាន"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ដោយភាគីទីបីដែលមិនស្គាល់"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"បើកកម្មវិធីរោទ៍"</string> <string name="shutdown_progress" msgid="2281079257329981203">"កំពុងបិទ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"កុំព្យូទ័របន្ទះរបស់អ្នកនឹងបិទ។"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"នាឡិការបស់អ្នកនឹងបិទ។"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ទូរស័ព្ទរបស់អ្នកនឹងបិទ។"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"តើអ្នកចង់បិទ?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"ចាប់ផ្ដើមឡើងវិញដើម្បីចូលរបៀបសុវត្ថិភាព"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ឲ្យកម្មវិធីប្រកាសការជូនដំណឹងការទទួលសារ SMS ។ កម្មវិធីព្យាបាទអាចប្រើវាដើម្បីបន្លំសារ SMS ចូល។"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ផ្ញើការប្រកាសបានទទួល WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ឲ្យកម្មវិធីប្រកាសការជូនដំណឹងថាបានទទួលសារ WAP PUSH ។ កម្មវិធីព្យាបាទអាចប្រើវាដើម្បីក្លែងបង្កាន់ដៃសារ MMS ឬជំនួសមាតិកាទំព័របណ្ដាញណាមួយស្ងាត់ៗដោយអ្វីដែលក្លែងក្លាយ។"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ផ្ញើពិន្ទុការប្រកាសបណ្ដាញ"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"ឲ្យកម្មវិធីប្រកាសការជូនដំណឹងដែលបណ្ដាញតម្រូវឲ្យដាក់ពិន្ទុ។ មិនចាំបាច់សម្រាប់កម្មវិធីធម្មតា។"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"កំណត់ចំនួនដំណើរការដែលកំពុងដំណើរការ"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ឲ្យកម្មវិធីពិនិត្យចំនួនដំណើរការអតិបរមាដែលនឹងដំណើរការ។ មិនចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"បង្ខំឲ្យបិទកម្មវិធីក្នុងផ្ទៃខាងក្រោយ"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅចំណុចប្រទាក់កម្រិតកំពូលនៃការបង្ហាញពីចម្ងាយ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ចងសេវាកម្មធាតុក្រាហ្វិក"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មធាតុក្រាហ្វិក។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"ភ្ជាប់ទៅសេវាកម្មក្រុមហ៊ុនផ្ដល់ច្រក"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅក្រុមហ៊ុនផ្ដល់ច្រកដែលបានចុះឈ្មោះ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ទាក់ទងជាមួយអ្នកគ្រប់គ្រងឧបករណ៍"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ឲ្យម្ចាស់ផ្ញើគោលបំណងទៅអ្នកគ្រប់គ្រងឧបករណ៍។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"ភ្ជាប់ទៅការបញ្ចូលទូរទស្សន៍"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ប្ដូរស្ថានភាព WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ឲ្យកម្មវិធីតភ្ជាប់ និងផ្ដាច់កុំព្យូទ័របន្ទះពីបណ្ដាញ WiMAX ។"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ឲ្យកម្មវិធីភ្ជាប់ទូរស័ព្ទ និងផ្ដាច់ពីបណ្ដាញ WiMAX ។"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ដាក់ពិន្ទុបណ្ដាញ"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"ឲ្យកម្មវិធីចាត់ថ្នាក់បណ្ដាញ និងមានឥទ្ធិពលលើបណ្ដាញណាមួយដែលកុំព្យូទ័របន្ទះប្រើ។"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"ឲ្យកម្មវិធីចាត់ថ្នាក់បណ្ដាញ និងមានឥទ្ធិពលលើបណ្ដាញណាមួយដែលទូរស័ព្ទគួរប្រើ។"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"ផ្គូផ្គងជាមួយឧបករណ៍ប៊្លូធូស"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ឲ្យកម្មវិធីមើលការកំណត់រចនាសម្ព័ន្ធប៊្លូធូសលើកុំព្យូទ័របន្ទះ ព្រមទាំងធ្វើការតភ្ជាប់ និងទទួលជាមួយឧបករណ៍បានផ្គូផ្គង។"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ឲ្យកម្មវិធីមើលការកំណត់រចនាសម្ព័ន្ធប៊្លូធូសក្នុងទូរស័ព្ទ ដើម្បីទទួល និងតភ្ជាប់ជាមួយឧបករណ៍បានផ្គូផ្គង។"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5b2747f..f73469a 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"동기화"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> 삭제가 너무 많습니다."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"태블릿 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"시계 저장공간이 가득 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장공간을 늘리세요."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"네트워크가 모니터링될 수 있음"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자의 모니터링"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"벨소리가 켜져 있습니다."</string> <string name="shutdown_progress" msgid="2281079257329981203">"종료 중..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"태블릿이 종료됩니다."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"시계가 종료됩니다."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"휴대전화가 종료됩니다."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"종료하시겠습니까?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"안전 모드로 다시 부팅"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"앱이 SMS 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 허용합니다. 이 경우 악성 앱이 수신된 SMS 메시지를 위조할 수 있습니다."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-수신 브로드캐스트 보내기"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"앱이 WAP PUSH 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 허용합니다. 이 경우 악성 앱이 MMS 메시지를 받은 것처럼 위장하거나 웹페이지의 콘텐츠를 악성 콘텐츠로 몰래 바꿀 수 있습니다."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"네트워크 점수화 브로드캐스트 전송"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"네트워크를 점수화할 필요가 있다는 알림을 앱이 브로드캐스트할 수 있도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"실행 중인 프로세스 수 제한"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"앱이 실행할 최대 프로세스 수를 제어할 수 있도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"백그라운드 앱 강제 종료"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"권한을 가진 프로그램이 원격 디스플레이에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"위젯 서비스와 연결"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"권한을 가진 프로그램이 위젯 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"경로 제공업체 서비스 사용"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"권한을 가진 프로그램이 등록된 경로 제공업체를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"기기 관리자와 상호 작용"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"권한을 가진 프로그램이 기기 관리자에게 인텐트를 보낼 수 있도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"TV 입력 사용"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX 상태 변경"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"앱이 태블릿을 WiMAX 네트워크에 연결하거나 연결을 끊을 수 있도록 허용합니다."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"앱이 휴대전화를 WiMAX 네트워크에 연결하거나 연결을 끊을 수 있도록 허용합니다."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"네트워크 점수화"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"앱이 네트워크 순위를 정하고 태블릿에서 어떤 네트워크를 선호할지 영향을 주도록 허용합니다."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"앱이 네트워크 순위를 정하고 휴대전화에서 어떤 네트워크를 선호할지 영향을 주도록 허용합니다."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"블루투스 기기와 페어링"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"앱이 태블릿의 블루투스 설정을 확인하고 페어링된 기기에 연결하며 연결을 수락할 수 있도록 허용합니다."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"앱이 휴대전화의 블루투스 설정을 확인하고 페어링된 기기에 연결하며 연결을 수락할 수 있도록 허용합니다."</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index efe3354..80964b6 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ອະນຸຍາດໃຫ້ແອັບຯ ກະຈາຍສັນຍານການແຈ້ງເຕືອນວ່າຂໍ້ຄວາມ SMS ໄດ້ຮັບແລ້ວ. ແອັບຯທີ່ເປັນອັນຕະລາຍອາດຈະໃຊ້ສິ່ງນີ້ໃນການປອມແປງຂໍ້ຄວາມ SMS ຂາເຂົ້າ."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ສົ່ງການກະຈາຍ WAP-PUSH ທີ່ໄດ້ຮັບ"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ອະນຸຍາດໃຫ້ແອັບຯສົ່ງການແຈ້ງເຕືອນໃນເວລາທີ່ໄດ້ຮັບຂໍ້ມຄວາມ WAP PUSH. ແອັບຯທີ່ເປັນອັນຕະລາຍ ອາດໃຊ້ການກະທຳນີ້ເພື່ອປອມການໄດ້ຮັບຂໍ້ຄວາມ MMS ຫຼືລັກປ່ຽນເນື້ອຫາຂອງໜ້າເວັບຕ່າງໆ ດ້ວຍສິ່ງອັນຕະລາຍທັງຫຼາຍຢ່າງງຽບໆ."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ສົ່ງການກະຈາຍເຄືອຂ່າຍຄະແນນ"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"ອະນຸຍາດໃຫ້ແອັບຯກະຈາຍການແຈ້ງເຕືອນທີ່ເຄືອຂ່າຍຈຳເປັນໃຊ້ນັບຄະແນນ. ບໍ່ເຄີຍໄດ້ໃຊ້ໃນແອັບຯທົ່ວໄປ."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ຈຳກັດຈຳນວນຂອງໂປຣເຊສທີ່ເຮັດວຽກຢູ່"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ອະນຸຍາດໃຫ້ແອັບຯຄວບຄຸມຈຳນວນສູງສຸດ ຂອງໂປຣເຊສທີ່ຈະເຮັດວຽກ. ບໍ່ຄວນຖືກໃຊ້ກັບແອັບພລິເຄຊັນທົ່ວໄປ."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"ບັງຄັບໃຫ້ແອັບຯທີ່ເຮັດວຽກຢູ່ພື້ນຫຼັງປິດໂຕລົງ"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"ອະນຸຍາດໃຫ້ຜູ່ຖືຜູກກັບສ່ວນຕິດຕໍ່ລະດັບສູງສຸດ ຂອງການສະແດງຜົນທາງໄກ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ເຊື່ອມໂຍງໄປຫາບໍລິການວິດເຈັດ"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ອະນຸຍາດໃຫ້ຜູ່ຖືຜູກກັບອິນເຕີເຟດລະດັບສູງສຸດ ຂອງບໍລິການວິເຈັດ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"ເຊື່ອມໂຍງກັບການບໍລິການຂອງຜູ່ໃຫ້ບໍລິການເສັ້ນທາງ"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງສາມາດເຊື່ອມໂຍງກັບທຸກໆຜູ່ໃຫ້ບໍລິການເສັ້ນທາງທີ່ລົງທະບຽນ. ບໍ່ຄວນຈະໄດ້ໃຊ້ໃນແອັບຯທົ່ວໄປ."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ຕິດຕໍ່ກັບຜູ່ເບິ່ງແຍງອຸປະກອນ"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງສົ່ງເຈດຕະນາຫາຜູ່ເບິ່ງແຍງລະບົບອຸປະກອນ. ແອັບຯທົ່ວໄປບໍ່ຄວນຈຳເປັນຕ້ອງໃຊ້."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"ຜູກກັບການປ້ອນຂໍ້ມູນເຂົ້າໂທລະທັດ"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ປ່ຽນສະຖານະ WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ອະນຸຍາດໃຫ້ແອັບຯເຊື່ອມຕໍ່ ແລະຕັດການເຊື່ອມຕໍ່ແທັບເລັດຈາກເຄືອຂ່າຍ WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ອະນຸຍາດໃຫ້ແອັບຯເຊື່ອມຕໍ່ ແລະຕັດການເຊື່ອມຕໍ່ຂອງໂທລະສັບຈາກເຄືອຂ່າຍ WiMax ໄດ້."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ເຄືອຂ່າຍຄະແນນ"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"ອະນຸຍາດໃຫ້ແອັບຯຈັດລຳດັບເຄືອຂ່າຍ ແລະ ຊ່ວຍຕັດສິນໃຈວ່າເຄືອຂ່າຍໃດທີ່ແທັບເລັດຄວນນຳໃຊ້."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"ອະນຸຍາດໃຫ້ແອັບຯຈັດລຳດັບເຄືອຂ່າຍ ແລະ ຊ່ວຍຕັດສິນໃຈວ່າເຄືອຂ່າຍໃດທີ່ໂທລະສັບຄວນນຳໃຊ້."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"ຈັບຄູ່ກັບອຸປະກອນ Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ອະນຸຍາດໃຫ້ແອັບຯເບິ່ງການຕັ້ງຄ່າຂອງ Bluetooth ໃນແທັບເລັດ ຕະຫຼອດຈົນເຊື່ອມຕໍ່ ແລະຍອມຮັບການເຊື່ອມຕໍ່ກັບອຸປະກອນທີ່ຈັບຄູ່ກັນແລ້ວ."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ອະນຸຍາດໃຫ້ແອັບຯເບິ່ງການຕັ້ງຄ່າຂອງ Bluetooth ໃນໂທລະສັບ, ຮວມທັງໃຫ້ສ້າງ ແລະຮັບການເຊື່ອມຕໍ່ຈາກອຸປະກອນທີ່ຈັບຄູ່ກັນ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 2828dc2..f10135b 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinchronizuoti"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Per daug <xliff:g id="CONTENT_TYPE">%s</xliff:g> trynimo."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Planšetinio kompiuterio atmintis pilna. Kad atlaisvintumėte vietos, ištrinkite kelis failus."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Laikrodžio saugykla pilna. Ištrinkite kelis failus, kad atlaisvintumėte vietos."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefono atmintis pilna. Ištrinkite kai kuriuos failus, kad atlaisvintumėte vietos."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Tinklas gali būti stebimas"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Nežinoma trečioji šalis"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Skambutis įjungtas"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Išsijungia..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetinio kompiuterio veikimas bus sustabdytas."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Laikrodis išsijungs."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonas bus išjungtas."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ar norite išjungti?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Iš naujo įkelti operacinę sistemą saugos režimu"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Leidžiama programai pateikti pranešimą, kad buvo gautas SMS pranešimas. Kenkėjiškos programos gali tai naudoti, kad klastotų gaunamuosius SMS pranešimus."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"siųsti „WAP-PUSH-received“ perdavimą"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Leidžiama programai pateikti pranešimą, kai gaunamas WAP PUSH pranešimas. Kenkėjiškos programos gali tai naudoti, kad klastotų MMS pranešimo gavimą ar kad nepastebimai pakeistų bet kurio tinklalapio turinį kenkėjiškais variantais."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"siųsti tinklų transliavimo įvertinimą"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Programai leidžiama transliuoti pranešimą, kad reikia įvertinti tinklus. Niekada nereikia įprastoms programoms."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"riboti vykdomų procesų skaičių"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Leidžiama programai valdyti didžiausią vykdomų procesų skaičių. Nereikalinga įprastoms programoms."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"priverstinai uždaryti fonines programas"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Leidžiama savininkui susisaistyti su aukščiausiojo lygio nuotolinio ekrano sąsaja. Įprastoms programoms to neturėtų prireikti."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"susaistyti su valdiklio paslauga"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Leidžiama savininkui susisaistyti su aukščiausio lygio valdiklio paslaugos sąsaja. Įprastoms programoms to neturėtų prireikti."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"susisaistyti su maršruto parinkimo paslauga"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Savininkui leidžiama susisaistyti su bet kokiomis registruotomis maršrutų parinkimo paslaugomis. To niekada neturėtų prireikti naudojant įprastas programas."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"sąveikauti su įrenginio administratoriumi"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Leidžiama savininkui siųsti tikslus įrenginio administratoriui. Įprastoms programoms to neturėtų prireikti."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"susisaistyti su TV įvestimi"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Keisti „WiMAX“ būseną"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Leidžia programai prijungti planšetinį kompiuterį prie „WiMAX“ ryšio tinklų ir nuo jų atjungti."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Leidžia programai prijungti telefoną prie „WiMAX“ ryšio tinklų ir nuo jų atjungti."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"įvertinti tinklus"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Programai leidžiama įvertinti tinklus ir nustatyti, kuriems tinklams planšetiniame kompiuteryje turėtų būti taikoma pirmenybė."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Programai leidžiama įvertinti tinklus ir nustatyti, kuriems tinklams telefone turėtų būti taikoma pirmenybė."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"susieti su „Bluetooth“ įrenginiais"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Leidžiama programai peržiūrėti „Bluetooth“ konfigūraciją planšetiniame kompiuteryje ir užmegzti bei priimti ryšius iš susietų įrenginių."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Leidžiama programai peržiūrėti „Bluetooth“ konfigūraciją telefone ir užmegzti bei priimti ryšius iš susietų įrenginių."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index c51cf90..f53f0ca 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizācija"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Pārāk daudz <xliff:g id="CONTENT_TYPE">%s</xliff:g> dzēsto vienumu."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Planšetdatora atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Pulksteņa atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Tālruņa atmiņa ir pilna! Dzēsiet dažus failus, lai atbrīvotu vietu."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Iespējams, tīklā veiktās darbības tiek pārraudzītas."</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Nezināma trešā puse"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Zvanītājs ieslēgts"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Notiek izslēgšana..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetdators tiks beidzēts."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Pulkstenis tiks izslēgts."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Tālrunis tiks izslēgts."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vai vēlaties izslēgt?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Atsāknēšana drošajā režīmā"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ļauj lietotnei pārraidīt paziņojumu par saņemtu īsziņu. Ļaunprātīgas lietotnes to var izmantot, lai viltotu ienākošas īsziņas."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"sūtīt WAP-PUSH-saņemto apraidi"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ļauj lietotnei pārraidīt paziņojumu par to, ka ir saņemts WAP PUSH ziņojums. Ļaunprātīgas lietotnes to var izmantot, lai viltotu multiziņas saņemšanu vai jebkuras tīmekļa lapas saturu nemanāmi nomainītu ar ļaunprātīgiem variantiem."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"apraidīt ziņojumu par tīklu vērtēšanu"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Ļauj lietotnei apraidīt paziņojumu, ka tīkli ir jānovērtē. Parastām lietotnēm tas nekad nav nepieciešams."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ierobežot aktīvo procesu skaitu"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ļauj lietotnei kontrolēt izpildāmo procesu maksimālo skaitu. Parastajām lietotnēm tas nekad nav nepieciešams."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"veikt fonā darbojošos lietotņu piespiedu aizvēršanu"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Ļauj īpašniekam izveidot saiti ar attāla displeja augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"saistīt ar logrīka pakalpojumu"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Ļauj īpašniekam izveidot saiti ar logrīka pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"Saistīšana ar maršruta nodrošinātāja pakalpojumu"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Ļauj īpašniekam saistīt jebkādus reģistrētus maršrutēšanas nodrošinātājus. Parastām lietotnēm šī atļauja nekad nav nepieciešama."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"mijiedarboties ar ierīces administratoru"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Ļauj īpašniekam nosūtīt informāciju par nodomiem ierīces administratoram. Parastajām lietotnēm tas nekad nav nepieciešams."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"Izveidot saiti ar TV ieeju"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX statusa mainīšana"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ļauj lietotnei izveidot un pārtraukt planšetdatora savienojumu ar WiMAX tīkliem."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ļauj lietotnei izveidot un pārtraukt tālruņa savienojumu ar WiMAX tīkliem."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"vērtēt tīklus"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Ļauj lietotnei ranžēt tīklus un ietekmēt to, kuriem tīkliem planšetdators dos priekšroku."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Ļauj lietotnei ranžēt tīklus un ietekmēt to, kuriem tīkliem tālrunis dos priekšroku."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"savienot pārī ar Bluetooth ierīcēm"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ļauj lietotnei skatīt Bluetooth konfigurāciju planšetdatorā, kā arī veidot un pieņemt savienojumus ar pārī savienotām ierīcēm."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ļauj lietotnei skatīt Bluetooth konfigurāciju tālrunī, kā arī veidot un pieņemt savienojumus ar pārī savienotām ierīcēm."</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index c8c8fac..f5f8fd3 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синк"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Хэт олон <xliff:g id="CONTENT_TYPE">%s</xliff:g> устгах."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Таблетийн сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Цагны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Утасны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Сүлжээ хянагдаж байж болзошгүй"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Тодорхойгүй гуравдагч талаас"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Хонх ассан"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Унтрааж байна…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таны таблет унтрах болно."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Таны цаг унтрах болно."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Таны утас унтрах болно."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Та унтраах уу?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Аюулгүй горимоор дахин асаах"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Апп нь SMS мессеж хүлээн авсан талаарх мэдэгдлийг өргөн дамжуулах боломжтой. Хортой апп энийг ашиглан ирсэн SMS мессежийг хуурамчаар хийх боломжтой."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-хүлээн авав өргөн дамжууллыг илгээх"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Аппликешн нь WAP PUSH мессеж хүлээж авсан мэдэгдлийг өргөн дамжуулах боломжтой. Хортой апп нь энийг ашиглан MMS мессеж хүлээн авсан гэж хуурамчаар мэдэгдэх эсвэл хортой хувьсагч агуулсан веб хуудасны контентыг чимээгүй орлуулах боломжтой."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"бүртгэгдсэн сүлжээнүүд рүү түгээх"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Апп-д сүлжээнүүдэд бүртгэгдсэн байх шаардлагатай мэдэгдлийг түгээх боломжийг олгоно. Энгийн апп-д хэзээ ч шаардагдахгүй."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ажиллаж байгаа процессийн тоог хязгаарлах"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Апп нь нэг зэрэг ажиллах процессийн тооны дээд утгыг удирдах боломжтой. Энгийн апп-д хэзээ ч ашиглагдахгүй."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"арын апп-г хүчээр хаах"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Эзэмшигчид алсын дэлгэц дэх дээд давхаргын интерфэйстэй холбогдох боломж олгоно. Энгийн апп-д шаардагдахгүй."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"виджет үйлчилгээтэй холбох"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Эзэмшигч нь виджет үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"маршрут нийлүүлэгчийн үйлчилгээтэй холбогдох"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Эзэмшигчид бүртгэгдсэн маршрут нийлүүлэгчтэй холбогдох боломж олгоно. Энгийн апп-уудад хэзээ ч шаардагдахгүй."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"төхөөрөмжийн админтай харилцан үйлчлэх"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Эзэмшигч нь төхөөрөмжийн админруу интент илгээх боломжтой. Энгийн апп-д шаардлагагүй."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"ТВ оролт холбох"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX статусыг өөрчлөх"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Апп нь WiMAX сүлжээнд таблетыг холбох болон салгах боломжтой."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Апп нь WiMAX сүлжээнд утсыг холбох болон салгах боломжтой."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"бүртгэгдсэн сүлжээ"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Апп-д сүлжээнүүдийг эрэмбэлж, аль сүлжээнд таблетыг холбоход нөлөөлөх боломж олгоно."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Апп-д сүлжээнүүдийг эрэмбэлж, аль сүлжээнд утсыг холбоход нөлөөлөх боломж олгоно."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Блютүүт төхөөрөмжтэй хос үүсгэх"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Апп нь таблет дээрх блютүүт тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Апп нь утсан дээрх Блютүүт тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой."</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 0e15840..aee4cdf 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Penyegerakan"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Terlalu banyak pemadaman <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Storan tablet penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Storan tontonan penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Storan telefon penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rangkaian mungkin dipantau"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Oleh pihak ketiga yang tidak diketahui"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Pendering dihidupkan"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Mematikan..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet anda akan dimatikan."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Tontonan anda akan dimatikan."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon anda akan dimatikan."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Adakah anda mahu menutup?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"But semula ke mod selamat"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Membenarkan apl untuk menyiarkan pemberitahuan bahawa mesej SMS telah diterima. Apl hasad boleh menggunakannya untuk memalsukan mesej SMS masuk."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"hantar siaran WAP-TOLAK-diterima"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Membenarkan apl untuk menyiarkan pemberitahuan bahawa mesej WAP PUSH telah diterima. Apl hasad boleh menggunakannya untuk memalsukan penerimaan mesej MMS atau secara diam-diam menggantikan kandungan mana-mana laman web dengan varian hasad."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"hantar siaran markah rangkaian"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Membenarkan apl menyiarkan pemberitahuan bahawa rangkaian perlu diberi markah. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"hadkan bilangan proses yang dijalankan"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Membenarkan apl untuk mengawal bilangan maksimum proses yang akan berlangsung. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"memaksa apl latar belakang untuk menutup"</string> @@ -394,6 +390,10 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi paparan jauh. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"terikat kepada perkhidmatan widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan widget. Tidak sekali-kali diperlukan untuk apl biasa."</string> + <!-- no translation found for permlab_bindRouteProvider (4869394607915096847) --> + <skip /> + <!-- no translation found for permdesc_bindRouteProvider (4703804520859960329) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"berinteraksi dengan pentadbir peranti"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Membenarkan pemegang menghantar tujuan kepada pentadbir peranti. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"ikat kepada input TV"</string> @@ -644,12 +644,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Tukar keadaan WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Membenarkan apl untuk menyambungkan tablet ke dan menyahsambungkan tablet dari rangkaian WiMaX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Membenarkan apl untuk menyambungkan telefon ke dan menyahsambung telefon dari rangkaian WiMaX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"beri markah kepada rangkaian"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Membenarkan apl menilai rangkaian dan mempengaruhi rangkaian yang harus dipilih oleh tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Membenarkan apl menilai rangkaian dan mempengaruhi rangkaian yang harus dipilih oleh telefon."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"berpasangan dengan peranti Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Membenarkan apl melihat konfigurasi Bluetooth pada tablet dan untuk membuat serta menerima sambungan dengan peranti yang dipasangkan."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Membenarkan apl melihat konfigurasi Bluetooth pada telefon dan membuat serta menerima sambungan dengan peranti yang dipasangkan."</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 781f7d1..029ceb5 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronisering"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"For mange slettinger av <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Nettbrettlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Klokkens lagringsplass er full. Slett filer for å frigjøre plass."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nettverket blir muligens overvåket"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Av en ukjent tredjepart"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ringelyd på"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Avslutter…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Nettbrettet slås av."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Klokken slås av."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonen kommer til å slås av."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vil du slå av?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Start på nytt i sikker modus"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Lar appen kringkaste et varsel om at en SMS-melding er mottatt. Ondsinnede apper kan bruke dette til å forfalske innkommende SMS-meldinger."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"kringkaste melding om mottatt WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Lar appen kringkaste et varsel om at en WAP-PUSH-melding er mottatt. Ondsinnede apper kan bruke dette til å forfalske MMS-meldingskvitteringer, eller ubemerket erstatte innholdet av alle slags nettsider med ondsinnede varianter."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"sende kringkasting om nettverksvurdering"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Gir appen tillatelse til å kringkaste et varsel om at nettverk må vurderes. Denne tillatelsen bør aldri være nødvendig for vanlige apper."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"begrense antallet kjørende prosesser"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Lar appen kontrollere det maksimale antallet prosesser som kjører. Aldri nødvendig for vanlige apper."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"tvinge bakgrunnsapper til å lukkes"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Lar innehaveren binde seg til det øverste grensesnittnivået for ekstern skjerm. Skal aldri være nødvendig for vanlige apper."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"binde til modultjenste"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lar innehaveren binde seg til det øverste nivået av grensesnittet for en modultjeneste. Skal aldri være nødvendig for vanlige apper."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"binde seg til en ruteleverandørtjeneste"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Innehaveren av tillatelsen kan binde seg til ruteleverandører. Dette er ikke nødvendig for vanlige apper."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunisere med enhetsadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Lar innehaveren sende hensikter til en enhetsadministrator. Skal aldri være nødvendig for normale apper."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"binde applikasjonen til en TV-inngang"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Endre WiMAX-status"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Lar appen koble nettbrettet til og fra WiMAX-nettverk."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Lar appen koble telefonen til og fra WiMAX-nettverk."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"vurdere nettverk"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Gir appen tillatelse til å rangere nettverk, og påvirke hvilket nettverk nettbrettet skal foretrekke."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Gir appen tillatelse til å rangere nettverk, og påvirke hvilket nettverk telefonen skal foretrekke."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"koble til Bluetooth-enheter"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Lar appen se Bluetooth-konfigurasjonen på nettbrettet, samt opprette og godta tilkoblinger med sammenkoblede enheter."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Lar appen se Bluetooth-konfigurasjonen på telefonen, samt opprette og godta tilkoblinger med sammenkoblede enheter."</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index c45f65d..5010748 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchroniseren"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Te veel verwijderen voor <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletgeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Horlogegeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefoongeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan worden gecontroleerd"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Door een onbekende derde partij"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Belsoftware aan"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Uitschakelen..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Uw tablet wordt uitgeschakeld."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Uw horloge wordt uitgeschakeld."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Uw telefoon wordt uitgeschakeld."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Wilt u afsluiten?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Opnieuw opstarten in veilige modus"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Hiermee kan de app een melding verzenden dat een sms\'je is ontvangen. Schadelijke apps kunnen dit gebruiken om inkomende sms\'jes te vervalsen."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"melding over ontvangen WAP-PUSH-bericht verzenden"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Hiermee kan de app een melding verzenden dat een WAP PUSH-bericht is ontvangen. Schadelijke apps kunnen dit gebruiken om de ontvangst van MMS-berichten te vervalsen of de inhoud van een webpagina ongemerkt te vervangen door schadelijke varianten."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"melding verzenden dat netwerken een score moeten krijgen"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Hiermee kan de app een melding uitzenden dat netwerken een score moeten krijgen. Nooit vereist voor normale apps."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"aantal actieve processen beperken"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Hiermee kan de app het maximale aantal processen beheren dat kan worden uitgevoerd. Nooit nodig voor normale apps."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"achtergrondapps gedwongen stoppen"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Hiermee wordt de houder toegestaan verbinding te maken met de hoofdinterface van een extern display. Nooit vereist voor normale apps."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"verbinden met een widgetservice"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Hiermee wordt de houder toegestaan verbinding te maken met de hoofdinterface van een widgetservice. Nooit vereist voor normale apps."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"binden aan de service van een routeprovider"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Hiermee kan de houder binden aan geregistreerde routeproviders. Nooit gebruikt voor normale apps."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactie met apparaatbeheer"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Hiermee kan de houder intenties verzenden naar een apparaatbeheerder. Nooit vereist voor normale apps."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"binden aan een tv-ingang"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-status wijzigen"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Hiermee kan de app de tablet verbinden met WiMAX-netwerken en de verbinding daarmee verbreken."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Hiermee kan de app de telefoon verbinden met WiMAX-netwerken en de verbinding daarmee verbreken."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"score toekennen aan netwerken"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Hiermee kan de app netwerken rangschikken en beïnvloeden aan welke netwerken de tablet de voorkeur moet geven."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Hiermee kan de app netwerken rangschikken en beïnvloeden aan welke netwerken de telefoon de voorkeur moet geven."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"koppelen met Bluetooth-apparaten"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Hiermee kan de app de Bluetooth-configuratie van de tablet bekijken en verbindingen met gekoppelde apparaten maken en accepteren."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Hiermee kan de app de Bluetooth-configuratie van de telefoon bekijken en verbindingen met gekoppelde apparaten maken en accepteren."</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 3ebe3f1..c8d7298 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronizuj"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Zbyt wiele usuwanych <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Pamięć tabletu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Pamięć w zegarku jest pełna. Usuń niektóre pliki, by zwolnić miejsce."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Pamięć telefonu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieć może być monitorowana"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Przez nieznany podmiot zewnętrzny"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Dzwonek włączony"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Wyłączanie..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet zostanie wyłączony."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Zegarek zostanie wyłączony."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon zostanie wyłączony"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Czy chcesz wyłączyć?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Uruchom w trybie awaryjnym"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Pozwala aplikacji na wysyłanie powiadomienia, że została odebrana wiadomość SMS. Złośliwe aplikacje mogą to wykorzystać do fałszowania przychodzących wiadomości SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"wysyłanie transmisji informującej o otrzymaniu wiadomości WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Pozwala aplikacji na nadanie powiadomienia o odebraniu wiadomości WAP PUSH. Złośliwe aplikacje mogą to wykorzystać do fałszowania potwierdzenia odbioru wiadomości MMS lub do niezauważalnego podmieniania zawartości dowolnej strony internetowej jej szkodliwymi wariantami."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"rozsyłanie informacji o ocenie sieci"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Pozwala aplikacji na wysłanie powiadomienia, że sieci wymagają oceny. Nieprzeznaczone dla zwykłych aplikacji."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ograniczanie liczby uruchomionych procesów"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Pozwala aplikacji na kontrolowanie maksymalnej liczby uruchamianych procesów. Nigdy niewykorzystywane przez normalne aplikacje."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"wymuszanie zamknięcia aplikacji w tle"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu wyświetlacza zdalnego. Nieprzeznaczone dla zwykłych aplikacji."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"powiązanie z usługą widżetów"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi widżetów. Nie powinno być nigdy potrzebne w przypadku zwykłych aplikacji."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"powiązanie z usługą dostawcy tras"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Umożliwia właścicielowi powiązanie z dowolnymi zarejestrowanymi dostawcami tras. Nie powinno być nigdy potrzebne w normalnych aplikacjach."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcja z administratorem urządzenia"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Zezwala na wysyłanie intencji do administratora urządzenia. Nie powinno być nigdy potrzebne w przypadku zwykłych aplikacji."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"powiązanie z wejściem TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"zmienianie stanu WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Pozwala aplikacji na nawiązywanie i kończenie połączeń z sieciami WiMAX w tablecie."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Pozwala aplikacji na nawiązywanie i kończenie połączeń z sieciami WiMAX w telefonie."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ocenianie sieci"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Pozwala aplikacji na ocenę sieci i wybieranie sieci preferowanych przez tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Pozwala aplikacji na ocenę sieci i wybieranie sieci preferowanych przez telefon."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"parowanie z urządzeniami Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Pozwala aplikacji na dostęp do konfiguracji Bluetooth na tablecie oraz na nawiązywanie i akceptowanie połączeń ze sparowanych urządzeń."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Pozwala aplikacji na dostęp do konfiguracji Bluetooth na telefonie oraz na nawiązywanie i akceptowanie połączeń ze sparowanych urządzeń."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 7267cf2..718c8d9 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronização"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiadas eliminações de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Elimine alguns ficheiros para libertar espaço."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorizada"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Campainha ativada"</string> <string name="shutdown_progress" msgid="2281079257329981203">"A encerrar..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"O seu tablet irá encerrar."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"As suas visualizações vão ser encerradas."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone será encerrado."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Pretende encerrar?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar no modo de segurança"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que a aplicação difunda uma notificação de que foi recebida uma mensagem SMS. As aplicações maliciosas podem utilizar este recurso para forjar mensagens SMS recebidas."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar difusão recebida através de PUSH WAP"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que a aplicação difunda uma notificação de que foi recebida uma mensagens PUSH WAP. As aplicações maliciosas podem utilizar isto para forjar um recibo de mensagem MMS ou substituir, de forma silenciosa, o conteúdo de qualquer página Web por variantes maliciosas."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"enviar transmissão de pontuação de redes"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permite à aplicação transmitir uma notificação de que é necessário pontuar as redes. Nunca é necessário para aplicações normais."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"número limite de processos em execução"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite a uma aplicação controlar o número máximo de processos que será executado. Nunca é necessário para aplicações normais."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forçar as aplicações em segundo plano a fechar"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite ao detentor associar a interface de nível superior a um ecrã remoto. Nunca deve ser necessário para aplicações normais."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vincular a um serviço de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite que o titular vincule a interface de nível superior de um serviço de widget. Nunca deverá ser necessário para aplicações normais."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"vincular a serviço de fornecedor de trajeto"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permite ao titular vincular a quaisquer fornecedores de trajeto registado. Nunca deverá ser necessário para aplicações normais."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com um administrador do dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite ao titular enviar intenções para um administrador do aparelho. Nunca deverá ser necessário para aplicações normais."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"vincular a uma entrada de TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que a aplicação ligue e desligue o tablet de redes WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que a aplicação ligue e desligue o telemóvel de redes WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"pontuar redes"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite à aplicação classificar redes e influenciar as redes que o tablet deve preferir."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite à aplicação classificar redes e influenciar as redes que o telemóvel deve preferir."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"sincronizar com dispositivos Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que a aplicação visualize a configuração do Bluetooth no tablet e que estabeleça e aceite ligações com dispositivos emparelhados."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que a aplicação visualize a configuração do Bluetooth no telemóvel e que estabeleça e aceite ligações com dispositivos emparelhados."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 690d047..29a294a 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizar"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Muitas exclusões de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Exclua alguns arquivos para liberar espaço."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorada"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por terceiros desconhecidos"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Campainha ligada"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Encerrando…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Seu tablet será desligado."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Seu relógio será desligado."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone será desligado."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Deseja desligar?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar no modo de segurança"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que o aplicativo transmita uma notificação quando uma mensagem SMS foi recebida. Aplicativos maliciosos podem usar esse recurso para forjar mensagens SMS recebidas."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar transmissão WAP-PUSH recebida"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que o aplicativo transmita uma notificação quando uma mensagem WAP PUSH for recebida. Aplicativos maliciosos podem usar esse recurso para forjar o recebimento de mensagens MMS ou substituir o conteúdo de qualquer página da web com variantes maliciosas."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"enviar transmissão de avaliação de redes"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permite que o aplicativo transmita uma notificação informando que as redes devem ser avaliadas. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitar número de processos em execução"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite que o aplicativo controle o máximo de processos que serão executados. Nunca é necessário para aplicativos normais."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forçar encerramento de aplicativos em segundo plano"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite que o proprietário use a interface de nível superior de uma tela remota. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"sujeitar-se a um serviço de widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite que o proprietário utilize a interface de nível superior de um serviço de widget. Nunca deve ser necessário para aplicativos normais."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"usar um serviço provedor de rotas"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permite que o proprietário use qualquer provedor de rotas registrado. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com o administrador de um dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite que o proprietário envie tentativas ao administrador de um aparelho. Nunca deve ser necessário para aplicativos normais."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"associar a uma entrada de TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que o aplicativo conecte e desconecte o tablet de redes WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que o aplicativo conecte e desconecte o telefone de redes WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"avaliar redes"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite que o aplicativo classifique as redes e influencie a escolha de redes pelo tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite que o aplicativo classifique as redes e influencie a escolha de redes pelo smartphone."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"parear com dispositivos Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que o aplicativo acesse a configuração do Bluetooth no tablet, além de fazer e aceitar conexões com dispositivos pareados."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que o aplicativo acesse a configuração do Bluetooth no telefone, além de fazer e aceitar conexões com dispositivos pareados."</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index a9e0d4e..e362590 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -614,6 +614,10 @@ <skip /> <!-- no translation found for permdesc_bindRemoteViews (4717987810137692572) --> <skip /> + <!-- no translation found for permlab_bindRouteProvider (4869394607915096847) --> + <skip /> + <!-- no translation found for permdesc_bindRouteProvider (4703804520859960329) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interacziun cun in administratur dad apparats"</string> <!-- no translation found for permdesc_bindDeviceAdmin (569715419543907930) --> <skip /> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index ebcf7d6..c173eef 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizare"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Prea multe ştergeri <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Stocarea pe tabletă este plină. Ștergeţi câteva fişiere pentru a elibera spaţiu."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Spațiul de stocare de pe ceas este plin! Ștergeți câteva fișiere pentru a elibera spațiu."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Stocarea pe telefon este plină. Ștergeţi câteva fişiere pentru a elibera spaţiu."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rețeaua poate fi monitorizată"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"De o terță parte necunoscută"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Sonerie activată"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Se închide..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Computerul dvs. tablet PC se va închide."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Ceasul dvs. se va închide."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonul dvs. se va închide."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Doriţi să închideţi?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reporniţi în modul sigur"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite aplicaţiei să difuzeze o notificare de primire a unui mesaj SMS. Aplicaţiile rău intenţionate pot să utilizeze această permisiune pentru a deturna primirea mesajelor SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"trimitere mesaj difuzat primit prin WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite aplicaţiei să difuzeze o notificare de primire a unui mesaj WAP PUSH. Aplicaţiile rău intenţionate pot să utilizeze această permisiune pentru a deturna primirea mesajelor MMS sau pentru a înlocui fără a vă înştiinţa conţinutul oricărei pagini web cu variante rău intenţionate."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"trimiteți transmisia cu rețelele punctate"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Permite aplicației să transmită o notificare de care rețelele au nevoie pentru a fi punctate. Nu este necesară pentru aplicațiile obișnuite."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitare număr de procese în derulare"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite aplicaţiei să controleze numărul maxim de procese care vor rula. Nu este niciodată necesară pentru aplicaţiile obişnuite."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forţează închiderea aplicaţiilor de fundal"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite proprietarului să se conecteze la interfața de nivel superior a unui ecran la distanță. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"conectare la un serviciu widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unui serviciu widget. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"se conectează la un serviciu de furnizare a traseelor"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Permite titularului să se conecteze la furnizorii de trasee înregistrați. Nu este necesară pentru aplicațiile obișnuite."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interacţionare cu administratorul unui dispozitiv"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite proprietarului să trimită intenţii către un administrator al dispozitivului. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"se conectează la o intrare TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Schimbaţi starea WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite aplicaţiei să conecteze şi să deconecteze tableta la şi de la reţelele WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite aplicaţiei să conecteze şi să deconecteze telefonul la şi de la reţelele WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"rețele punctate"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite aplicației să clasifice rețelele și să stabilească ce rețele preferă tableta."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite aplicației să clasifice rețelele și să stabilească ce rețele preferă telefonul."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"conectează dispozitive Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite aplicaţiei să vadă configuraţia tabletei Bluetooth, să efectueze şi să accepte conexiuni cu dispozitive împerecheate."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite aplicaţiei să vadă configuraţia telefonului Bluetooth, să efectueze şi să accepte conexiuni cu dispozitive împerecheate."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 25fe679..a3d5d92 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхр."</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Слишком много удалений <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Память планшетного ПК заполнена. Удалите какие-нибудь файлы, чтобы освободить место."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Память устройства заполнена. Удалите файлы, чтобы освободить место."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Память телефона заполнена. Удалите какие-нибудь файлы, чтобы освободить место."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Сеть может отслеживаться"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"администратором"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Звонок включен"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Выключение..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшетный ПК будет отключен."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Устройство будет отключено."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефон будет выключен."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Завершить работу?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Переход в безопасный режим"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Приложение сможет уведомлять о получении SMS. Вредоносные программы смогут таким образом подделывать входящие SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Отправка уведомлений о доставке SMS с ссылкой на WAP-страницу"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Приложение сможет уведомлять о получении сообщений WAP PUSH. Вредоносные программы смогут таким образом фальсифицировать получение MMS или незаметно подменять содержание любой страницы вредоносными данными."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"Отправка уведомлений о рейтинге сетей"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Приложение сможет отправлять уведомления о том, что сети необходимо присвоить рейтинг. Это разрешение обычно используется только специальными приложениями."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Ограничение количества запущенных процессов"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Приложение сможет управлять максимальным количеством процессов, которые могут быть запущены. Это разрешение не используется обычными приложениями."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"Закрытие фоновых приложений"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Приложение сможет подключаться к базовому интерфейсу удаленного дисплея. Это разрешение обычно используется только специальными приложениями."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"Подключение к службе виджетов"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Приложение сможет подключаться к базовому интерфейсу службы виджетов. Это разрешение не используется обычными приложениями."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"Подключение к серверам поставщиков маршрутов"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Приложение сможет подключаться к серверам зарегистрированных поставщиков маршрутов. Это разрешение не используется обычными приложениями."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"Взаимодействие с администратором устройства"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Приложение сможет отправлять объекты intent администратору устройства. Это разрешение не используется обычными приложениями."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"Подключение к ТВ-входу"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Изменение статуса WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Приложение сможет подключать устройство к сетям WiMAX и отключать его от них."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Приложение сможет подключать устройство к сетям WiMAX и отключать его от них."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"Определение рейтинга сетей"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Приложение сможет присваивать сетям рейтинг и решать, к каким из них устройство должно подключаться в первую очередь."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Приложение сможет присваивать сетям рейтинг и решать, к каким из них устройство должно подключаться в первую очередь."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Установление связи с устройствами Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Приложение сможет просматривать конфигурацию Bluetooth на планшетном ПК, а также запрашивать и подтверждать соединение с другими устройствами."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Приложение сможет просматривать конфигурацию Bluetooth на телефоне, а также запрашивать и подтверждать соединение с другими устройствами."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 229e9f3..e9f3adc 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronizovať"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Príliš veľa odstránených položiek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Ukladací priestor tabletu je plný. Odstráňte niektoré súbory a uvoľnite miesto."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Ukladací priestor hodiniek je plný. Uvoľnite miesto odstránením niektorých súborov."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Pamäť telefónu je plná. Odstráňte niektoré súbory a uvoľnite miesto."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieť môže byť monitorovaná"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Neznámou treťou stranou"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Zvonenie je zapnuté"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Prebieha vypínanie..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Váš tablet bude vypnutý."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Hodinky sa vypnú."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Váš telefón bude vypnutý."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Chcete zariadenie vypnúť?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Reštartovať do núdzového režimu"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Umožňuje aplikácii vysielať oznámenie, že správa SMS bola doručená. Škodlivé aplikácie môžu toto nastavenie použiť na falšovanie prichádzajúcich správ SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"odoslanie vysielania typu WAP-PUSH-received"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Umožňuje aplikácii vysielať oznámenie, že správa WAP PUSH bola doručená. Škodlivé aplikácie môžu použiť toto nastavenie na vytvorenie potvrdenia o doručení správy MMS alebo na utajené nahradenie obsahu akejkoľvek stránky škodlivými variantmi."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"odoslanie skóre vysielaných sieťami"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Umožňuje aplikácii vysielať upozornenie, že je potrebné zadať skóre sietí. Bežné aplikácie toto povolenie nepotrebujú."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"obmedzenie počtu spustených procesov"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Umožňuje aplikácii kontrolovať maximálny počet spustených procesov. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"vynútiť zavretie aplikácií na pozadí"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania vzdialeného displeja. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"viazať sa k službe miniaplikácie"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby miniaplikácií. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"viazanie na službu poskytovateľa cesty"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Umožňuje držiteľovi viazať sa na akýchkoľvek registrovaných poskytovateľov cesty. Normálne aplikácie by toto povolenie nemali nikdy nepotrebovať."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"komunikovať so správcom zariadenia"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Umožňuje držiteľovi odosielať informácie správcovi zariadenia. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"viazanie na televízny vstup"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Zmeniť stav siete WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Umožňuje aplikácii pripojiť tablet k sieťam WiMAX a odpojiť ho od nich."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Umožňuje aplikácii pripojiť telefón k sieťam WiMAX a odpojiť ho od nich."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"zadanie skóre sietí"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Umožňuje aplikácii hodnotiť siete a ovplyvňovať, ktoré siete by mal tablet preferovať."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Umožňuje aplikácii hodnotiť siete a ovplyvňovať, ktoré siete by mal telefón preferovať."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"párovať so zariadeniami Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Umožňuje aplikácii zobraziť informácie o konfigurácii Bluetooth na tablete. Taktiež jej umožňuje nadväzovať a akceptovať spojenia so spárovanými zariadeniami."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Umožňuje aplikácii zobraziť informácie o konfigurácii Bluetooth na telefóne. Taktiež jej umožňuje nadväzovať a akceptovať spojenia so spárovanými zariadeniami."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index de57325..6d4f21c 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizacija"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Preveč izbrisov vsebine <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Pomnilnik tabličnega računalnika je poln. Izbrišite nekaj datotek, da sprostite prostor."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Shramba ure je polna. Izbrišite nekaj datotek, da sprostite prostor."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Pomnilnik telefona je poln. Izbrišite nekaj datotek, da sprostite prostor."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Omrežje je lahko nadzorovano"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Neznana tretja oseba"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Vklopi zvonjenje"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Se zaustavlja ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablični računalnik se bo zaustavil."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Ura se bo izklopila."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon bo zaustavljen."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ali želite izklopiti napravo?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Vnovičen zagon v varnem načinu"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Programu omogoča oddajo obvestila o prejetih sporočilih SMS. Zlonamerni programi lahko to uporabijo za ponarejanje dohodnih SMS-ov."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"pošiljanje oddaje, prejete s potisnim sporočilom WAP"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Programu omogoča oddajo obvestila, da je bilo potisno sporočilo WAP prejeto. Zlonamerni programi lahko to uporabijo za ponarejanje potrdila o prejemu sporočila MMS ali za neopazno menjavo vsebine poljubne spletne strani z zlonamernimi različicami."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"pošiljanje oddaj o ocenjevanju omrežij"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Aplikaciji dovoli oddajo obvestila, da je treba omrežja oceniti. Tega nikoli ni treba uporabiti za navadne aplikacije."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"omejevanje števila izvajajočih se procesov"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Programu omogoča nadzor največjega števila postopkov, ki se bodo izvajali. Tega nikoli ni treba uporabiti za navadne programe."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"vsiljeno zapiranje aplikacij v ozadju"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Imetniku omogoča povezovanje z vmesnikom oddaljenega prikaza najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"poveži s storitvijo pripomočka"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lastniku omogoča povezovanje z vmesnikom storitve pripomočka najvišje ravni. Tega ni treba nikoli uporabiti za navadne programe."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"Povezava s storitvijo ponudnika poti"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Omogoča imetniku, da se povezuje z registriranimi ponudniki poti. Tega ni treba nikoli uporabiti za navadne aplikacije."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcija s skrbnikom naprave"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Omogoča lastniku, da pošlje namere skrbniku naprave. Nikoli se ne uporablja za navadne programe."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"povezava s TV-vhodom"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Sprememba stanja omrežja WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Aplikaciji omogoča, da vzpostavi povezavo med tabličnim računalnikom in omrežjem WiMAX ter jo prekine."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Aplikaciji omogoča, da vzpostavi povezavo med telefonom in omrežjem WiMAX ter jo prekine."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ocenjevanje omrežij"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Aplikaciji dovoli, da omrežja razvršča in vpliva na to, katera naj tablični računalnik prednostno izbere."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Aplikaciji dovoli, da omrežja razvršča in vpliva na to, katera naj telefon prednostno izbere."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"seznanitev z napravami Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Aplikaciji omogoča ogled konfiguracije Bluetootha tabličnega računalnika ter vzpostavljanje in sprejemanje povezave s seznanjenimi napravami."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Aplikaciji omogoča ogled konfiguracije Bluetootha telefona ter ustvarjanje in sprejemanje povezave s seznanjenimi napravami."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 4bf015f..1a3a235 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизација"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Превише <xliff:g id="CONTENT_TYPE">%s</xliff:g> избрисаних ставки."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Меморија таблета је пуна! Избришите неке датотеке да бисте ослободили простор."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Меморија сата је пуна. Избришите неке датотеке да бисте ослободили простор."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Складиште телефона је пуно! Избришите неке датотеке како бисте ослободили простор."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежа се можда надгледа"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Од стране непознате треће стране"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Звоно је укључено"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Искључивање…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таблет ће се искључити."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Сат ће се угасити."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефон ће се искључити."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Да ли желите да искључите телефон?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Поново покрени систем у безбедном режиму"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Дозвољава апликацији да емитује обавештење да је SMS порука примљена. Злонамерне апликације на тај начин могу да фалсификују долазне SMS поруке."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"слање примљених PUSH емитовања преко WAP-а"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Дозвољава апликацији да емитује обавештење да је примљена PUSH порука преко WAP-а. Злонамерне апликације то могу да искористе да фалсификују пријем MMS порука или да кришом замене садржај било које веб-странице уносом злонамерног садржаја."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"шаљи обавештења о тестирању мрежа"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Омогућава апликацији да емитује обавештење да је потребно тестирање мрежа. Никада није потребно за стандардне апликације."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ограничење броја покренутих процеса"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Дозвољава апликацији да управља максималним бројем процеса који ће моћи да се покрену. Никада није потребна уобичајеним апликацијама."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"принудно затварање позадинских апликација"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Дозвољава власнику да се повеже са интерфејсом удаљеног екрана највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"обавезивање на услугу виџета"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Дозвољава власнику да се обавеже на интерфејс услуге виџета највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"повежи са услугом добављача путања"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Дозвољава власнику да се повеже са добављачима путања. Никада не би требало да буде потребно за обичне апликације."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"интеракција са администратором уређаја"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Омогућава да власник шаље своје намере администратору уређаја. Уобичајене апликације никада не би требало да је користе."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"повезивање са ТВ улазом"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промени WiMAX статус"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Дозвољава апликацији да повезује таблет са WiMAX мрежама и прекида везе са њима."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Дозвољава апликацији да повезује телефон са WiMAX мрежама и прекида везе са њима."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"тестирај мреже"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Омогућава апликацији да рангира мреже и утиче на то које су мреже примарне на таблету."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Омогућава апликацији да рангира мреже и утиче на то које су мреже примарне на телефону."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"упаривање са Bluetooth уређајима"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Дозвољава апликацији да прегледа конфигурацију Bluetooth-а на таблету, као и да успоставља и прихвата везе са упареним уређајима."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Дозвољава апликацији да прегледа конфигурацију Bluetooth-а на телефону, као и да успоставља и прихвата везе са упареним уређајима."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 24b032e..03dc691 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronisera"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"För många <xliff:g id="CONTENT_TYPE">%s</xliff:g>-borttagningar."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Pekdatorns lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Klockans lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Mobilens lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nätverket kan vara övervakat"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Av en okänd tredje part"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Ringsignal på"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Avslutar…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Din surfplatta stängs av."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Klockan stängs av."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Din telefon stängs av."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vill du stänga av?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Starta om i felsäkert läge"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Tillåter att appen sänder ut en avisering när SMS tas emot. Skadliga appar kan använda detta för att förfalska inkommande SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"skicka WAP-PUSH-mottagen sändning"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Tillåter att appen skickar ett meddelande om att ett WAP PUSH-meddelande har tagits emot. Skadliga appar kan använda detta för att förfalska mottagning av MMS eller för att obemärkt byta ut innehållet på en webbsida mot skadligt innehåll."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"skicka betyg som nätverk skickar"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Tillåter att appen skickar ett meddelande om att nätverket måste betygsättas. Ska inte behövas för vanliga appar."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"begränsa antalet processer som körs"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Tillåter att appen styr högsta antalet processer som körs. Behövs inte för vanliga appar."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"tvinga bakgrundsappar att avslutas"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en fjärrskärm. Ska inte behövas för vanliga appar."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind till en widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en widget. Ska inte behövas för vanliga appar."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"bind till en ruttleverantörstjänst"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Tillåter att innehavaren binds till en registrerad ruttleverantör. Detta ska inte behövas för vanliga appar."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"arbeta med en enhetsadministratör"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Tillåter att innehavaren skickar avsikter till en enhetsadministratör. Vanliga appar behöver aldrig göra detta."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"binda till en tv-insignal"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ändra WiMAX-status"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tillåter att appen ansluter surfplattan till eller kopplar från WiMAX-nätverk."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tillåter att appen ansluter mobilen till eller kopplar från WiMAX-nätverk."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"betygsätt nätverk"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Tillåter att appen betygsätter nätverk och påverkar vilka nätverk som ska användas i första hand av surfplattan."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Tillåter att appen betygsätter nätverk och påverkar vilka nätverk som ska användas i första hand av mobilen."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"koppla till Bluetooth-enheter"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tillåter att appen kommer åt pekdatorns Bluetooth-konfiguration och upprättar och godkänner anslutningar till parkopplade enheter."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Tillåter att appen kommer åt mobilens Bluetooth-konfiguration och upprättar och godkänner anslutningar till parkopplade enheter."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 233bd7a..71f5003 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sawazisha"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Ufutaji mwingi sana <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Hifadhi ya kompyuta kibao imejaa. Futa baadhi ya faili ili kupata nafasi."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Hifadhi ya saa imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Hifadhi ya simu imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Huenda mtandao unafuatiliwa"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Na mtu mwingine asiyejulikana"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Programu ya milio imewashwa"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Inafunga..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Kompyuta kibao yako itazima."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Saa yako itajizima."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Simu yako itazima."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Unataka kuzima?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Washa upya kwa hali salama"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Huruhusu programu kutangaza taarifa kwamba ujumbe wa SMS umeingia. Programu hasidi zinaweza kutumia hii kubuni SMS zinazoingia."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"tuma tangazo lililopokewa la MSUKUMO WA WAP"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Inaruhusu programu kutangaza taarifa kwamba ujumbe wa WAP PUSH umepokewa. Programu hasidi zinaweza kutumia hii kubuni risiti ya ujumbe wa MMS au polepole kubadilisha maudhui yoyote ya ukurasa wa tovuti na vibadala vibovu."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"tuma tangazo la alama za mitandao"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Huruhusu programu kutangaza arifa kuwa mitandao inafaa kupewa alama. Haihitajiki kamwe kwa programu za kawaida."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"zuia idadi ya michakato inayoendeshwa"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Inaruhusu programu kudhibiti upeo wa idadi ya michakato ambayo itaendeshwa. Kamwe hazihitajiki kwa programu za kwaida."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"lazimisha programu za usuli kufunga"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Huruhusu mtumiaji kujifungia kiolesura cha kiwango cha juu cha mwonekano wa mbali. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"funga kwenye huduma ya widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Inaruhusu mmiliki kushurutisha kusano ya kiwango cha juu ya huduma ya wijeti. Haipaswi kuhitajika kwa programu za kawaida."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"shurutisha kwenye huduma ya mtoa huduma wa njia"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Huruhusu mmiliki kushurutisha kwenye watoa huduma wa njia waliosajiliwa. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"jiunge na msimamizi wa kifaa"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Inamruhusu mmiliki kutuma malengo kwa msimamizi wa kifaa. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"bandika kwenye zana za data ya runinga"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Badilisha hali ya WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Inaruhusu programu kuunganisha kompyuta kibao, na kukata kompyuta kibao kutoka mitandao ya WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Inaruhusu programu kuunganisha simu kwenye, na kukata simu kutoka mitandao ya WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ipe mitandao alama"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Huruhusu programu kupanga mitandao kwa alama na kushawishi mitandao ambayo kompyuta kibao inapaswa kupendelea."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Huruhusu programu kupanga mitandao kwa alama na kushawishi mitandao ambayo simu inapaswa kupendelea."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"oanisha na vifaa vya Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Inaruhusu programu kuona usanidi wa Bluetooth kwenye kompyuta kibao, na kuunda na kukubali miunganisho kwa vifaa vilivyooanishwa."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Inaruhusu programu kuona usanidi wa Bluetooth kwenye simu, na kuunda na kukubali miunganisho kwa vifaa vilivyooanishwa."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 452c02d..b8d99b0 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ซิงค์"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"มีการลบ <xliff:g id="CONTENT_TYPE">%s</xliff:g> มากเกินไป"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"ที่จัดเก็บข้อมูลของแท็บเล็ตเต็ม ลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"ที่เก็บข้อมูลนาฬิกาเต็ม โปรดลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"ที่เก็บข้อมูลโทรศัพท์เต็ม ลบบางไฟล์เพื่อเพิ่มที่ว่าง"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"เครือข่ายอาจได้รับการตรวจสอบ"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"โดยบุคคลที่สามที่ไม่รู้จัก"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"เปิดเสียง"</string> <string name="shutdown_progress" msgid="2281079257329981203">"กำลังปิดระบบ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"แท็บเล็ตของคุณจะปิดการทำงาน"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"นาฬิกาจะปิดการทำงาน"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"โทรศัพท์ของคุณจะปิดเครื่อง"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"คุณต้องการปิดการทำงานหรือไม่"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"รีบูตเข้าสู่โหมดปลอดภัย"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"อนุญาตให้แอปพลิเคชันกระจายข้อมูลการแจ้งเตือนว่าได้รับข้อความ SMS แล้ว แอปพลิเคชันที่เป็นอันตรายอาจใช้การอนุญาตนี้ปลอมข้อความ SMS ที่เข้ามา"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ส่งการกระจายข้อมูลว่าได้รับ WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"อนุญาตให้แอปพลิเคชันกระจายข้อมูลการแจ้งเตือนว่าได้รับข้อความ WAP PUSH แอปพลิเคชันที่เป็นอันตรายอาจใช้การอนุญาตนี้ปลอมการแจ้งรับข้อความ MMS หรือแอบเปลี่ยนเนื้อหาในหน้าเว็บโดยใช้ตัวแปรที่เป็นอันตราย"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ส่งเผยแพร่การให้คะแนนเครือข่าย"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"อนุญาตให้แอปนี้เผยแพร่ข้อมูลการแจ้งเตือนว่าเครือข่ายจะต้องผ่านการให้คะแนน ไม่จำเป็นสำหรับแอปทั่วไป"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"จำกัดจำนวนกระบวนการที่กำลังทำงาน"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"อนุญาตให้แอปพลิเคชันควบคุมจำนวนสูงสุดของกระบวนการที่จะเรียกใช้ ไม่จำเป็นต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"บังคับปิดแอปพลิเคชันในพื้นหลัง"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"อนุญาตให้ผู้ใช้ผูกกับอินเทอร์เฟซระดับสูงสุดของจอแสดงผลระยะไกล ซึ่งแอปพลิเคชันทั่วไปไม่จำเป็นต้องใช้"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"เชื่อมโยงกับบริการวิดเจ็ต"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"อนุญาตให้ผู้ใช้เชื่อมโยงกับส่วนติดต่อผู้ใช้ระดับสูงสุดของบริการวิดเจ็ต ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"เชื่อมโยงกับบริการของผู้ให้บริการเส้นทาง"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"ช่วยให้เจ้าของสามารถเชื่อมโยงกับผู้ให้บริการเส้นทางที่ลงทะเบียนรายใดก็ได้ ไม่จำเป็นสำหรับแอปทั่วไป"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ติดต่อกับผู้ดูแลอุปกรณ์"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"อนุญาตให้ผู้ใช้ส่งการติดต่อไปยังโปรแกรมควบคุมอุปกรณ์ ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"เชื่อมโยงกับอินพุตทีวี"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"เปลี่ยนสถานะของ WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"อนุญาตให้แอปพลิเคชันเชื่อมต่อและยกเลิกการเชื่อมต่อแท็บเล็ตกับเครือข่าย WiMAX"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"อนุญาตให้แอปพลิเคชันเชื่อมต่อและยกเลิกการเชื่อมต่อโทรศัพท์กับเครือข่าย WiMAX"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ให้คะแนนเครือข่าย"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"อนุญาตให้แอปนี้จัดลำดับเครือข่าย ซึ่งมีผลต่อการเลือกใช้เครือข่ายของแท็บเล็ต"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"อนุญาตให้แอปนี้จัดอันดับเครือข่ายและมีผลต่อการเลือกใช้เครือข่ายของโทรศัพท์"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"จับคู่กับอุปกรณ์บลูทูธ"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าบลูทูธของแท็บเล็ต ตลอดจนเชื่อมต่อและยอมรับการเชื่อมต่อกับอุปกรณ์ที่จับคู่ไว้"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าบลูทูธของโทรศัพท์ ตลอดจนเชื่อมต่อและยอมรับการเชื่อมต่อกับอุปกรณ์ที่จับคู่ไว้"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index dc7de15..394f01e 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"I-sync"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Masyadong maraming pagtanggal ng <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Puno na ang storage ng tablet. Magtanggal ng ilang file upang magbakante ng espasyo."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Puno na ang storage ng relo. Magtanggal ng ilang file upang magbakante ng espasyo."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Puno na ang storage ng telepono. Magtanggal ng ilang file upang magbakante ng espasyo."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Maaaring sinusubaybayan ang network"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ng isang di-kilalang third party"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"I-on ang ringer"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Nagsa-shut down…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Mag-shut down ang iyong tablet."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Magsa-shut down ang iyong relo."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Magsa-shut down ang iyong telepono."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Nais mo bang mag-shut down?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Mag-reboot sa safe mode"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Pinapayagan ang app na mag-broadcast ng isang notification na natanggap ang isang mensaheng SMS. Maaari itong gamitin ng nakakahamak na apps upang dayain ang papasok na mga mensaheng SMS."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ipadala ang WAP-PUSH-natanggap na pag-broadcast"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Pinapayagan ang app na mag-broadcast ng isang notification na natanggap ang isang mensaheng WAP PUSH. Maaari itong gamitin ng nakakahamak na apps upang dayain ang pagtanggap ng mensaheng MMS o upang tahimik na palitan ang nilalaman ng anumang webpage ng mga nakakahamak na variant."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"magpadala ng broadcast ng mga network ng score"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Nagbibigay-daan sa app na mag-broadcast ng notification na kailangang ma-score ng mga network. Hindi kailanman kinakailangan para sa mga normal na app."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitahan ang numero ng mga tumatakbong proseso"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Pinapayagan ang app na kontrolin ang maximum na bilang ng mga proseso na tatakbo. Hindi kailanman kinakailangan para sa normal na apps."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"pwersahin ang mga app sa background na magsara"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Binibigyang-daan ang may-hawak na masaklaw ang pinakamataas na antas ng interface ng isang remote na display. Hindi dapat kailanman kailanganin ng normal na apps."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"itali sa serbisyo ng widget"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Pinapayagan ang may-hawak na sumailalim sa nangungunang interface ng serbisyo ng widget. Hindi kailanman dapat na kailanganin para sa normal na apps."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"mag-bind sa isang serbisyo ng route provider"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Nagbibigay-daan sa may-pahintulot na mag-bind sa anumang nakarehistrong route provider. Hindi dapat kailanganin kailanman ng mga normal na app."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"makipag-ugnay sa tagapangasiwa ng device"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Pinapayagan ang mga may-ari na magpadala ng mga layunin sa administrator ng device. Hindi kailanman dapat na kailanganin para sa normal na apps."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"i-bind sa isang TV input"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Baguhin ang katayuan ng WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Pinapayagan ang app na ikonekta ang tablet at idiskonekta ang tablet mula sa mga WiMAX network."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Pinapayagan ang app na ikonekta ang telepono at idiskonekta ang telepono mula sa mga WiMAX network."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"mga network ng score"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Nagbibigay-daan sa app na iranggo ang mga network at impluwensiyahan kung aling mga network ang dapat na piliin ng tablet."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Nagbibigay-daan sa app na iranggo ang mga network at impluwensiyahan kung aling mga network ang dapat na piliin ng telepono."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"ipares sa mga Bluetooth device"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Pinapayagan ang app na tingnan ang configuration ng Bluetooth sa tablet, at na gumawa at tumanggap ng mga koneksyong may mga nakapares na device."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Pinapayagan ang app na tingnan ang configuration ng Bluetooth sa telepono, at na gumawa at tumanggap ng mga koneksyong may mga nakapares na device."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index db8c9d4..cde7219 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Senk."</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Çok fazla <xliff:g id="CONTENT_TYPE">%s</xliff:g> silme var."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletin depolama alanı dolu! Yer açmak için bazı dosyaları silin."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Saat depolama alanınız dolu. Lütfen yer boşaltmak için bazı dosyaları silin."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonun depolama alanı dolu! Yer açmak için bazı dosyaları silin."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Ağ izlenebilir"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Bunu, bilinmeyen üçüncü taraflar yapabilir"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Telefon zili açık"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Kapanıyor…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tabletiniz kapanacak."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Saatiniz kapatılacak."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz kapanacak."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Kapatmak istiyor musunuz?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Güvenli modda yeniden aç"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Uygulamaya, SMS mesajı alındığına dair bildirim yayınlama izni verir. Kötü amaçlı uygulamalar sahte SMS mesajları göndermek için bunu kullanabilir."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH ile alınan yayın gönder"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Uygulamaya, WAP PUSH mesajı alındığına dair bildirim yayınlama izni verir. Kötü amaçlı uygulamalar sahte MMS bildirimleri oluşturmak veya bir web sayfasının içeriğini sessiz şekilde zararlı öğelerle değiştirmek için bunu kullanabilir."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"ağları puanlama yayını gönderme"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Uygulamaya, ağların puanlanması gerektiği bildirimini yayınlama izni verir. Normal uygulamalar için hiçbir zaman gerekmez."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"çalışan işlem sayısını sınırla"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Uygulamaya, çalışacak süreçlerin azami sayısını denetleme izni verir. Normal uygulamalar için gerekli değildir."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"arka plan uygulamaları kapanmaya zorla"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"İzin sahibine, bir uzak ekranın en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bir widget hizmetine bağla"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Cihazın sahibine bir widget hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"rota sağlayıcı hizmetine bağlanma"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"İzin verilen uygulamaya tüm kayıtlı rota sağlayıcılarına bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"bir cihaz yöneticisi ile etkileşimde bulun"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Cihazın sahibinin cihaz yöneticisine amaç göndermesine izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"TV girişine bağlanma"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX durumunu değiştir"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Uygulamaya, tableti WiMAX ağlarına bağlanma veya bağlantıyı kesme izni verir."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Uygulamaya, telefonu WiMAX ağlarına bağlanma veya bağlantıyı kesme izni verir."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"ağları puanlama"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Uygulamaya, ağları sıralama ve tabletin tercih edeceği ağları etkileme izni verir."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Uygulamaya, ağları sıralama ve telefonunun tercih edeceği ağları etkileme izni verir."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth cihazlarla eşle"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Uygulamaya, tabletteki Bluetooth yapılandırmasını görüntüleme, eşleştirilmiş cihazlarla bağlantı yapma ve bu tür bağlantıları kabul etme izni verir."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Uygulamaya, telefondaki Bluetooth yapılandırmasını görüntüleme, eşleştirilmiş cihazlarla bağlantı yapma ve bu tür bağlantıları kabul etme izni verir."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 388d124..f55fcf3 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -337,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Дозволяє програмі передавати сповіщення про отримання SMS повідомлення. Шкідливі програми можуть використовувати це для підробки вхідних SMS повідомлень."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"надсил. запис, отр. через WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Дозволяє програмі передавати сповіщення про отримання повідомлення WAP PUSH. Шкідливі програми можуть використовувати це для підробки отримання MMS повідомлень або для непомітної заміни вмісту будь-якої веб-сторінки шкідливими варіантами."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"надсилати сповіщення про оцінку мереж"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Дозволяє додатку передавати сповіщення про оцінку мереж. Ніколи не застосовується для звичайних додатків."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"обмежувати кількість запущ. процесів"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Дозволяє програмі контролювати максимальну кількість процесів, які буде запущено. Ніколи не вимагається для звичайних програм."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"примусово закривати фонові програми"</string> @@ -392,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня віддаленого екрана. Ніколи не застосовується для звичайних програм."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"прив\'язувати до служби віджетів"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня служби віджетів. Ніколи не застосовується для звичайних програм."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"підключитися до служби постачання маршрутів"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Дозволяє власникові підключатися до зареєстрованих постачальників маршрутів. Звичайні додатки ніколи не використовують цей дозвіл."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаємодіяти з адмін. пристрою"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Дозволяє власнику надсилати задавані функції адміністратору пристрою. Ніколи не застосовується для звичайних програм."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"підключатися до TV-входу"</string> @@ -642,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Змінити стан WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Дозволяє програмі під’єднувати планшетний ПК до мереж WiMAX і від’єднувати його від них."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Дозволяє програмі під’єднувати телефон до мереж WiMAX і від’єднувати його від них."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"оцінювати мережі"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Дозволяє додатку оцінювати мережі та впливати на вибір мережі планшетом."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Дозволяє додатку оцінювати мережі та впливати на вибір мережі телефоном."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"створювати пару з пристроями Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Дозволяє програмі переглядати конфігурацію Bluetooth на планшетному ПК, а також створювати та приймати з’єднання зі спареними пристроями."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Дозволяє програмі переглядати конфігурацію Bluetooth на телефоні, а також створювати та приймати з’єднання зі спареними пристроями."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index afde154..841a68d 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -339,10 +339,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Cho phép ứng dụng truyền phát thông báo cho biết đã nhận được tin nhắn SMS. Ứng dụng độc hại có thể sử dụng quyền này để giả mạo tin nhắn SMS đến."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"gửi truyền phát WAP-PUSH nhận được"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Cho phép ứng dụng truyền phát thông báo cho biết rằng đã nhận được tin nhắn WAP PUSH. Ứng dụng độc hại có thể sử dụng quyền này để giả mạo xác nhận đã nhận được tin nhắn MMS hoặc ngầm thay thế nội dung của bất kỳ trang web nào bằng các biến thể độc hại."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"gửi chương trình phát mạng điểm số"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Cho phép ứng dụng truyền thông báo rằng các mạng cần để được tính điểm. Không bao giờ cần cho ứng dụng thông thường."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"giới hạn số quá trình đang chạy"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Cho phép ứng dụng kiểm soát số quy trình tối đa sẽ chạy. Không cần thiết cho các ứng dụng thông thường."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"buộc ứng dụng nền đóng"</string> @@ -394,6 +392,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của màn hình từ xa. Không cần thiết cho các ứng dụng thông thường."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"liên kết với dịch vụ tiện ích con"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ tiện ích con. Không cần thiết cho các ứng dụng thông thường."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"liên kết với dịch vụ nhà cung cấp định tuyến"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Cho phép chủ sở hữu liên kết với bất kỳ nhà cung cấp định tuyến đã đăng ký nào. Không cần thiết cho các ứng dụng thông thường."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"tương tác với quản trị viên thiết bị"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Cho phép chủ sở hữu gửi các ý định đến quản trị viên thiết bị. Không cần thiết cho các ứng dụng thông thường."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"liên kết với đầu vào TV"</string> @@ -644,12 +644,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Thay đổi trạng thái WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Cho phép ứng dụng kết nối máy tính bảng và ngắt kết nối máy tính bảng khỏi mạng WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Cho phép ứng dụng kết nối điện thoại và ngắt kết nối điện thoại khỏi mạng WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"mạng điểm số"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Cho phép ứng dụng xếp hạng mạng và ảnh hưởng đến việc máy tính bảng nên ưu tiên mạng nào."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Cho phép ứng dụng xếp hạng các mạng và ảnh hưởng đến việc điện thoại nên ưu tiên mạng nào."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"ghép nối với thiết bị Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Cho phép ứng dụng xem cấu hình của Bluetooth trên máy tính bảng và tạo và chấp nhận các kết nối với các thiết bị được ghép nối."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Cho phép ứng dụng xem cấu hình của Bluetooth trên điện thoại, tạo và chấp nhận các kết nối với các thiết bị được ghép nối."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 38ce45d..020484e 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同步"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"太多<xliff:g id="CONTENT_TYPE">%s</xliff:g>删除项。"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"平板电脑存储空间已满。请删除一些文件以腾出空间。"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"手表存储空间已满。请删除一些文件以腾出空间。"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"手机存储空间已满。请删除一些文件以腾出空间。"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"网络可能会受到监控"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"受到不明第三方的监控"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"振铃器开启"</string> <string name="shutdown_progress" msgid="2281079257329981203">"正在关机..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板电脑会关闭。"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"您的手表即将关机。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"您的手机将会关机。"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要关机吗?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"重新启动并进入安全模式"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"允许应用广播一条有关已收到短信的通知。恶意应用可能借此伪造接到的短信。"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"发送 WAP-PUSH 收到的广播"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"允许应用广播一条有关已收到 WAP PUSH 短信的通知。恶意应用可能借此伪造短信接收,或在后台将任意网页的内容替换为恶意内容。"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"发送网络评分广播通知"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"允许应用广播“需要为网络评分”的通知。普通应用绝不需要此权限。"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"限制运行的进程个数"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"允许应用控制将运行的进程数上限。普通应用绝不需要此权限。"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"强制关闭后台应用"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"允许应用绑定至远程显示屏的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"绑定到小部件服务"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"允许应用绑定到小部件服务的顶级接口。普通应用绝不需要此权限。"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"绑定到路由程序服务"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"允许应用绑定到任何已注册的路由程序。普通应用绝不需要此权限。"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"与设备管理器交互"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"允许用户将意向发送给设备管理员。普通应用绝不需要此权限。"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"绑定至电视输入设备"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 状态"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"允许该应用建立和断开平板电脑与 WiMAX 网络之间的连接。"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"允许该应用建立和断开手机与 WiMAX 网络之间的连接。"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"为网络评分"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"允许应用为网络排名,并控制平板电脑应优先使用的网络。"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"允许应用为网络排名,并控制手机应优先使用的网络。"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"与蓝牙设备配对"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"允许该应用查看平板电脑上的蓝牙配置,以及建立和接受与配对设备的连接。"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"允许该应用查看手机上的蓝牙配置,以及建立和接受与配对设备的连接。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index e4f54af..8841536 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Google Sync"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"平板電腦的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"手錶的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"手機的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網絡可能會受到監控"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"由不明的第三方監管"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"鈴聲開啟"</string> <string name="shutdown_progress" msgid="2281079257329981203">"正在關機..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板電腦將會關機。"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"您的手錶即將關機。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"您的手機即將關機。"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要關機嗎?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"重新啟動進入安全模式"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"允許應用程式在收到短訊時發出通知。惡意應用程式可能會藉此偽造外來短訊。"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"傳送可由 WAP PUSH 接收的廣播"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"允許應用程式在收到 WAP PUSH 訊息時發送通知。惡意應用程式可能會藉此偽造 MMS 訊息回條或私自以惡意內容更換網頁。"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"傳送網絡計分廣播"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"允許應用程式廣播網絡需要計分的通知,但一般應用程式並不需要使用。"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"執行程序數目上限"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"允許應用程式控制可執行程序的數量上限 (不建議一般應用程式使用)。"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"強制關閉背景應用程式"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"允許應用程式繫結至遠端屏螢的頂層介面 (不建議一般應用程式使用)。"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"繫結至小工具服務"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"允許應用程式繫結至小工具服務的頂層介面 (不建議一般應用程式使用)。"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"繫結至路由供應商服務"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"允許應用程式繫結至任何已註冊的路由供應商,但一般應用程式並不需要使用。"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"與裝置管理員互動"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"允許應用程式將調用請求傳送至裝置管理員 (不建議一般應用程式使用)。"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"繫結至電視訊號輸入裝置"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 狀態"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"允許應用程式建立或中斷平板電腦與 WiMAX 網絡的連線。"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"允許應用程式建立或中斷手機與 WiMAX 網絡的連線。"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"為網絡計分"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"允許應用程式為網絡排名,及決定平板電腦偏好使用的網絡。"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"允許應用程式為網絡排名,及決定手機偏好使用的網絡。"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"與藍牙裝置配對"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"允許應用程式查看平板電腦的藍牙設定,以及建立和接受與其他配對裝置的連線。"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"允許應用程式查看手機的藍牙設定,以及建立和接受與其他配對裝置的連線。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 9b89c75..bab94b4 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同步處理"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"平板電腦的儲存空間已滿。請刪除一些檔案,以釋放出可用空間。"</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"手錶儲存空間已用盡,請刪除一些檔案以釋出可用空間。"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"手機儲存空間已滿。請刪除一些檔案,以釋放可用空間。"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網路可能會受到監控"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"受到不明的第三方監控"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"鈴聲開啟"</string> <string name="shutdown_progress" msgid="2281079257329981203">"關機中…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板電腦將會關機。"</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"您的手錶即將關機。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"手機即將關機。"</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要關機嗎?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"重新啟動進入安全模式"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"允許應用程式在收到 SMS 簡訊時發出通知。請注意,惡意應用程式可能利用此功能偽造外來的 SMS 簡訊。"</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"送出「WAP PUSH 已接收」廣播"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"允許應用程式在收到 WAP PUSH 訊息時發送通知。請注意,惡意應用程式可能利用此功能偽造 MMS 簡訊回條,或私自將網頁內容更換為惡意陷阱。"</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"傳送網路計分廣播通知"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"允許應用程式廣播網路需計分的通知訊息 (一般應用程式並不需要)。"</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"執行程序限制數"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"允許應用程式控制可執行程序的數量上限 (一般應用程式不需使用)。"</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"強制關閉背景應用程式"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"允許應用程式繫結至遠端螢幕的頂層介面 (一般應用程式不需使用)。"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"繫結至小工具服務"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"允許應用程式繫結至小工具服務的頂層介面 (一般應用程式不需使用)。"</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"繫結至路由供應商服務"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"允許應用程式繫結至任何已註冊的路由供應商 (一般應用程式並不需要)。"</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"與裝置管理員互動"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"允許應用程式將調用請求傳送至裝置管理員 (一般應用程式不需使用)。"</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"繫結至電視訊號輸入裝置"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"變更 WiMAX 狀態"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"允許應用程式建立或中斷平板電腦與 WiMAX 網路的連線。"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"允許應用程式建立或中斷手機與 WiMAX 網路的連線。"</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"為網路計分"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"允許應用程式建立網路排名,決定平板電腦偏好使用的網路。"</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"允許應用程式建立網路排名,決定手機偏好使用的網路。"</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"與藍牙裝置配對"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"允許應用程式查看平板電腦的藍牙設定,以及建立和接受與其他配對裝置的連線。"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"允許應用程式查看手機的藍牙設定,以及建立和接受與其他配對裝置的連線。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index e552c4e..4dbd003 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -135,8 +135,7 @@ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Vumelanisa"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Kunokususa <xliff:g id="CONTENT_TYPE">%s</xliff:g> okuningi kakhulu."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Isilondolozi sethebhulethi sigcwele! Susa amanye amafayela ukukhulula isikhala."</string> - <!-- no translation found for low_memory (4415914910770005166) --> - <skip /> + <string name="low_memory" product="watch" msgid="4415914910770005166">"Isitoreji sokubuka sigcwele. Susa amanye amafayela ukukhulula isikhala."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Isilondolozi sefoni sigcwele! Susa amanye amafayela ukukhulula isikhala."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Inethiwekhi ingase inganyelwe"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ngenkampani yangaphandle engaziwa"</string> @@ -154,8 +153,7 @@ <string name="silent_mode_ring" msgid="8592241816194074353">"Iringa iyasebenza"</string> <string name="shutdown_progress" msgid="2281079257329981203">"Ivala shaqa..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ithebhulethi yakho izocima."</string> - <!-- no translation found for shutdown_confirm (3490275567476369184) --> - <skip /> + <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Ukubuka kwakho kuzocima."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ifoni yakho izocima."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ingabe ufuna ukucisha?"</string> <string name="reboot_safemode_title" msgid="7054509914500140361">"Qala kabusha emodini ephephile"</string> @@ -339,10 +337,8 @@ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ivumela uhlelo lokusebenza ukuthi isakaze isaziso sokuthi umyalezo we-SMS utholakele. Izuhlelo lokusebenza ezinobungozi zingasebenzisa lokhu ukufoja imiyalezo ye-SMS engenayo."</string> <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"thumela umsakazo otholwe nge-WAP-PUSH"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ivumela uhlelo lokusebenza ukuthi isakaze isaziso sokuthi umyalezo we-WAP PUSH utholakele. Izuhlelo lokusebenza ezinobungozi zingasebenzisa lokhu ukufoja ukutholakala kwemiyalezo ye-S noma zisuse okuqukethwe kwanoma iliphi ikhasi lewebhu eliqukethe okunobungozi."</string> - <!-- no translation found for permlab_broadcastScoreNetworks (6432008366605475024) --> - <skip /> - <!-- no translation found for permdesc_broadcastScoreNetworks (7652980974435077828) --> - <skip /> + <string name="permlab_broadcastScoreNetworks" msgid="6432008366605475024">"thumela ukusakaza kwamanethiwekhi ayisikolo"</string> + <string name="permdesc_broadcastScoreNetworks" msgid="7652980974435077828">"Ivumela uhlelo lokusebenza ukusakaza isaziso sokuthi amanethiwekhi adinga isikolo. Awadingeki kuzinhlelo zokusebenza ezivamile."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"khawula inani lezinqubo ezisebenzayo"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ivumela uhlelo lokusebenza ukuthi ilawule isibalo esikhulu sezinto eziqhubekayo eziyosebenza. Ayidingakeli izinhlelo zokusebenza ezijwayelekile."</string> <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"phoqa izinhlelo zokusebenza ezingemuva ukuthi zivaleke"</string> @@ -394,6 +390,8 @@ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Ivumela umbambi ukuhlanganisa isixhumi esibonakalayo esisezingeni eliphezulu sesibonisi sesilawuli kude. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bophezela kube isevisi yesinqunjana"</string> <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Ivumela umbambi ukuhlanganisa uxhumano nomsebenzisi kwezinga eliphezulu lensizakalo yesinqunjwana. Akusoze kwadingeka kwezinhlelo zokusebenza ezivamile."</string> + <string name="permlab_bindRouteProvider" msgid="4869394607915096847">"bophezela kusevisi yomhlinzeki womzila"</string> + <string name="permdesc_bindRouteProvider" msgid="4703804520859960329">"Ivumela isibambi ukubophezela kunoma yimuphi umhlinzeki womzila obhalisiwe. Akufanele kudingeke izinhlelo zokusebenza ezivamile."</string> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"xhumana nomphathi wedivaysi"</string> <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Ivumela ummeli ukuthumela okuqukethwe kumphathi wedivaysi. Akusoze kwadingeka kwizinhlelo zokusebenza ezivamile."</string> <string name="permlab_bindTvInput" msgid="5601264742478168987">"bophezela kokokufaka kwe-TV"</string> @@ -644,12 +642,9 @@ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Shintsha isimo se-WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ivumela uhlelo lokusebenza ukuxhuma ithebhulethi nokunqamula ithebhulethi kumanethiwekhi e-WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ivumela uhlelo lokusebenza ukuxhuma ifoni nokuyinqamula kumanethiwekhi e-WiMAX."</string> - <!-- no translation found for permlab_scoreNetworks (6445777779383587181) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1304304745850215556) --> - <skip /> - <!-- no translation found for permdesc_scoreNetworks (1831501848178651379) --> - <skip /> + <string name="permlab_scoreNetworks" msgid="6445777779383587181">"amanethiwekhi ayisikolo"</string> + <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Ivumela uhlelo lokusebenza ukuthi lilinganise amanethiwekhi futhi lithuthukise ukuthi imaphi amanethiwekhi ithebhulethi okufanele iwakhethe."</string> + <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Ivumela uhlelo lokusebenza ukuthi lilinganise amanethiwekhi futhi lithuthukise ukuthi imaphi amanethiwekhi ifoni okufanele iwakhethe."</string> <string name="permlab_bluetooth" msgid="6127769336339276828">"matanisa namadivayisi e-Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ivumela uhlelo lokusebenza ukubuka ukucushwa kwe-Bluetooth kuthebhulethi, nokwenza futhi nokwamukela uxhumo namadivayisi amatanisiwe."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ivumela uhlelo lokusebenza ukubuka ukucushwa kwe-Bluetooth efonini, ukwenza futhi nokwamukela uxhumo namadivayisi amatanisiwe."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 782066e..b7bffde 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4504,6 +4504,8 @@ result to valid color values. Saturate(S + D) --> <enum name="add" value="16" /> </attr> + <!-- Specifies the alpha multiplier to apply to the base drawable. --> + <attr name="alpha" /> </declare-styleable> <!-- Drawable used to draw 9-patches. --> @@ -4523,6 +4525,8 @@ <!-- When a tint color is set, specifies its Porter-Duff blending mode. The default value is src_in, which treats the drawable as an alpha mask. --> <attr name="tintMode" /> + <!-- Specifies the alpha multiplier to apply to the base drawable. --> + <attr name="alpha" /> </declare-styleable> <!-- Drawable used to draw a single color. --> diff --git a/core/res/res/values/colors_quantum.xml b/core/res/res/values/colors_quantum.xml index ebe4a49..f8f192f 100644 --- a/core/res/res/values/colors_quantum.xml +++ b/core/res/res/values/colors_quantum.xml @@ -118,11 +118,11 @@ <!-- Text & foreground colors --> - <color name="primary_text_quantum_light">#de000000</color> + <color name="primary_text_default_quantum_light">#de000000</color> <color name="secondary_text_quantum_light">#8a000000</color> <color name="tertiary_text_quantum_light">#4d000000</color> - <color name="primary_text_quantum_dark">#deffffff</color> + <color name="primary_text_default_quantum_dark">#deffffff</color> <color name="secondary_text_quantum_dark">#8affffff</color> <color name="tertiary_text_quantum_dark">#4dffffff</color> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 2df5dc1..89e870c 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -807,6 +807,21 @@ <item>com.android.location.fused</item> </string-array> + <!-- This string array can be overriden to enable test location providers initially. --> + <!-- Array of "[locationProviderName],[requiresNetwork], + [requiresSatellite],[requiresCell],[hasMonetaryCost], + [supportAltitute],[supportsSpeed],[supportsBearing], + [powerRequirement],[accuracy]" --> + <!-- powerRequirement is defined in android.location.Criteria + 0 = NO_REQUIREMENT / 1 = POWER_LOW / 2 = POWER_MEDIUM / 3 = POWER_HIGH --> + <!-- accuracy is defined in anroid.location.Criteria + 1 = ACCURACY_FINE / 2 = ACCURACY_COARSE --> + <string-array name="config_testLocationProviders" translatable="false"> + <!-- Example test network location provider + <item>network,false,false,false,false,true,true,true,1,2</item> + --> + </string-array> + <!-- Boolean indicating if current platform supports bluetooth SCO for off call use cases --> <bool name="config_bluetooth_sco_off_call">true</bool> @@ -1432,4 +1447,6 @@ <!-- default window inset isRound property --> <bool name="config_windowIsRound">false</bool> + <!-- Package name for default network scorer app; overridden by product overlays. --> + <string name="config_defaultNetworkScorerPackageName"></string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 03c617a..07e8341 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1230,6 +1230,7 @@ <java-symbol type="xml" name="sms_short_codes" /> <java-symbol type="xml" name="audio_assets" /> <java-symbol type="xml" name="global_keys" /> + <java-symbol type="xml" name="default_zen_mode_config" /> <java-symbol type="raw" name="accessibility_gestures" /> <java-symbol type="raw" name="incognito_mode_start_page" /> @@ -1441,6 +1442,7 @@ <java-symbol type="array" name="radioAttributes" /> <java-symbol type="array" name="config_oemUsbModeOverride" /> <java-symbol type="array" name="config_locationProviderPackageNames" /> + <java-symbol type="array" name="config_testLocationProviders" /> <java-symbol type="array" name="config_defaultNotificationVibePattern" /> <java-symbol type="array" name="config_notificationFallbackVibePattern" /> <java-symbol type="array" name="config_onlySingleDcAllowed" /> @@ -1625,6 +1627,7 @@ <java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" /> <java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" /> <java-symbol type="string" name="config_customAdbPublicKeyConfirmationComponent" /> + <java-symbol type="string" name="config_defaultNetworkScorerPackageName" /> <java-symbol type="layout" name="resolver_list" /> <java-symbol type="id" name="resolver_list" /> diff --git a/core/res/res/xml/default_zen_mode_config.xml b/core/res/res/xml/default_zen_mode_config.xml new file mode 100644 index 0000000..1bdc1ec --- /dev/null +++ b/core/res/res/xml/default_zen_mode_config.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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. +*/ +--> + +<!-- Default configuration for zen mode. See android.service.notification.ZenModeConfig. --> +<zen version="1"> + <allow calls="false" messages="false" /> + <sleep startHour="22" startMin="0" endHour="7" endMin="0" /> +</zen> diff --git a/core/tests/bluetoothtests/AndroidManifest.xml b/core/tests/bluetoothtests/AndroidManifest.xml index 60b6dc1..cbfa84d 100644 --- a/core/tests/bluetoothtests/AndroidManifest.xml +++ b/core/tests/bluetoothtests/AndroidManifest.xml @@ -31,5 +31,8 @@ <instrumentation android:name="android.bluetooth.BluetoothTestRunner" android:targetPackage="com.android.bluetooth.tests" android:label="Bluetooth Tests" /> + <instrumentation android:name="android.bluetooth.BluetoothInstrumentation" + android:targetPackage="com.android.bluetooth.tests" + android:label="Bluetooth Test Utils" /> </manifest> diff --git a/core/tests/bluetoothtests/src/android/bluetooth/BluetoothInstrumentation.java b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothInstrumentation.java new file mode 100644 index 0000000..34393f9 --- /dev/null +++ b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothInstrumentation.java @@ -0,0 +1,96 @@ +/* + * 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 android.bluetooth; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.Context; +import android.os.Bundle; + +public class BluetoothInstrumentation extends Instrumentation { + + private BluetoothTestUtils mUtils = null; + private BluetoothAdapter mAdapter = null; + private Bundle mArgs = null; + + private BluetoothTestUtils getBluetoothTestUtils() { + if (mUtils == null) { + mUtils = new BluetoothTestUtils(getContext(), + BluetoothInstrumentation.class.getSimpleName()); + } + return mUtils; + } + + private BluetoothAdapter getBluetoothAdapter() { + if (mAdapter == null) { + mAdapter = ((BluetoothManager)getContext().getSystemService( + Context.BLUETOOTH_SERVICE)).getAdapter(); + } + return mAdapter; + } + + @Override + public void onCreate(Bundle arguments) { + super.onCreate(arguments); + mArgs = arguments; + start(); + } + + @Override + public void onStart() { + String command = mArgs.getString("command"); + if ("enable".equals(command)) { + enable(); + } else if ("disable".equals(command)) { + disable(); + } else if ("unpairAll".equals(command)) { + unpairAll(); + } else if ("getName".equals(command)) { + getName(); + } else { + finish(null); + } + } + + public void enable() { + getBluetoothTestUtils().enable(getBluetoothAdapter()); + finish(null); + } + + public void disable() { + getBluetoothTestUtils().disable(getBluetoothAdapter()); + finish(null); + } + + public void unpairAll() { + getBluetoothTestUtils().unpairAll(getBluetoothAdapter()); + finish(null); + } + + public void getName() { + String name = getBluetoothAdapter().getName(); + Bundle bundle = new Bundle(); + bundle.putString("name", name); + finish(bundle); + } + + public void finish(Bundle result) { + if (result == null) { + result = new Bundle(); + } + finish(Activity.RESULT_OK, result); + } +} diff --git a/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java index 4858be8..8fbd214 100644 --- a/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java +++ b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java @@ -34,6 +34,7 @@ import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Set; public class BluetoothTestUtils extends Assert { @@ -893,6 +894,17 @@ public class BluetoothTestUtils extends Assert { } /** + * Deletes all pairings of remote devices + * @param adapter the BT adapter + */ + public void unpairAll(BluetoothAdapter adapter) { + Set<BluetoothDevice> devices = adapter.getBondedDevices(); + for (BluetoothDevice device : devices) { + unpair(adapter, device); + } + } + + /** * Connects a profile from the local device to a remote device and checks to make sure that the * profile is connected and that the correct actions were broadcast. * diff --git a/core/tests/coretests/src/android/net/NetworkScorerApplicationTest.java b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java index 6d5ede8..cac6b93 100644 --- a/core/tests/coretests/src/android/net/NetworkScorerApplicationTest.java +++ b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java @@ -33,7 +33,7 @@ import org.mockito.MockitoAnnotations; import java.util.Iterator; -public class NetworkScorerApplicationTest extends InstrumentationTestCase { +public class NetworkScorerAppManagerTest extends InstrumentationTestCase { @Mock private Context mMockContext; @Mock private PackageManager mMockPm; @@ -64,7 +64,7 @@ public class NetworkScorerApplicationTest extends InstrumentationTestCase { setScorers(package1, package2, package3); Iterator<String> result = - NetworkScorerApplication.getAllValidScorers(mMockContext).iterator(); + NetworkScorerAppManager.getAllValidScorers(mMockContext).iterator(); assertTrue(result.hasNext()); assertEquals("package1", result.next()); diff --git a/data/keyboards/Vendor_1949_Product_0401.kl b/data/keyboards/Vendor_1949_Product_0401.kl new file mode 100644 index 0000000..ab24bcd --- /dev/null +++ b/data/keyboards/Vendor_1949_Product_0401.kl @@ -0,0 +1,27 @@ +# 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. + +# Amazon Fire TV remote + +key 103 DPAD_UP +key 108 DPAD_DOWN +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 96 DPAD_CENTER +key 158 BACK +key 172 HOME +key 168 MEDIA_REWIND +key 208 MEDIA_FAST_FORWARD +key 164 MEDIA_PLAY_PAUSE +key 217 ASSIST diff --git a/docs/html/guide/topics/ui/actionbar.jd b/docs/html/guide/topics/ui/actionbar.jd index a122443..f169f5f 100644 --- a/docs/html/guide/topics/ui/actionbar.jd +++ b/docs/html/guide/topics/ui/actionbar.jd @@ -1145,7 +1145,7 @@ defined in a resource looks like this:</p> <item>Venus</item> <item>Earth</item> </string-array> -</pre> +</resources> </pre> <p>The {@link android.widget.ArrayAdapter} returned by {@link diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 66a88a2..60b4615 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -484,6 +484,15 @@ public class BitmapDrawable extends Drawable { copyBounds(mDstRect); } + final int restoreAlpha; + if (state.mBaseAlpha != 1.0f) { + final Paint p = getPaint(); + restoreAlpha = p.getAlpha(); + p.setAlpha((int) (restoreAlpha * state.mBaseAlpha + 0.5f)); + } else { + restoreAlpha = -1; + } + final boolean clearColorFilter; if (mTintFilter != null && paint.getColorFilter() == null) { paint.setColorFilter(mTintFilter); @@ -537,6 +546,10 @@ public class BitmapDrawable extends Drawable { if (clearColorFilter) { paint.setColorFilter(null); } + + if (restoreAlpha >= 0) { + paint.setAlpha(restoreAlpha); + } } @Override @@ -762,6 +775,10 @@ public class BitmapDrawable extends Drawable { paint.setDither(dither); } + if (themeAttrs == null || themeAttrs[R.styleable.BitmapDrawable_alpha] == 0) { + state.mBaseAlpha = a.getFloat(R.styleable.BitmapDrawable_alpha, 1.0f); + } + if (themeAttrs == null || themeAttrs[R.styleable.BitmapDrawable_gravity] == 0) { final int gravity = a.getInt( R.styleable.BitmapDrawable_gravity, Gravity.FILL); @@ -818,6 +835,10 @@ public class BitmapDrawable extends Drawable { paint.setDither(dither); } + if (a.hasValue(R.styleable.BitmapDrawable_alpha)) { + state.mBaseAlpha = a.getFloat(R.styleable.BitmapDrawable_alpha, state.mBaseAlpha); + } + if (a.hasValue(R.styleable.BitmapDrawable_gravity)) { final int gravity = a.getInt( R.styleable.BitmapDrawable_gravity, Gravity.FILL); @@ -933,6 +954,7 @@ public class BitmapDrawable extends Drawable { int[] mThemeAttrs; int mChangingConfigurations; int mGravity = Gravity.FILL; + float mBaseAlpha = 1.0f; Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS); Shader.TileMode mTileModeX = null; Shader.TileMode mTileModeY = null; @@ -954,6 +976,7 @@ public class BitmapDrawable extends Drawable { mTileModeX = bitmapState.mTileModeX; mTileModeY = bitmapState.mTileModeY; mTargetDensity = bitmapState.mTargetDensity; + mBaseAlpha = bitmapState.mBaseAlpha; mPaint = new Paint(bitmapState.mPaint); mRebuildShader = bitmapState.mRebuildShader; mAutoMirrored = bitmapState.mAutoMirrored; diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index 05df3bc..1f8b51d 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -238,6 +238,35 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { } @Override + public void setHotspot(int key, float x, float y) { + if (mCurrDrawable != null) { + mCurrDrawable.setHotspot(key, x, y); + } + } + + @Override + public void removeHotspot(int key) { + if (mCurrDrawable != null) { + mCurrDrawable.removeHotspot(key); + } + } + + @Override + public void clearHotspots() { + if (mCurrDrawable != null) { + mCurrDrawable.clearHotspots(); + } + } + + @Override + public boolean supportsHotspots() { + if (mCurrDrawable != null) { + return mCurrDrawable.supportsHotspots(); + } + return false; + } + + @Override protected boolean onStateChange(int[] state) { if (mLastDrawable != null) { return mLastDrawable.setState(state); diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 3e9ca0a..21992ce 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -241,6 +241,15 @@ public class NinePatchDrawable extends Drawable { canvas.scale(-1.0f, 1.0f); } + final int restoreAlpha; + if (mNinePatchState.mBaseAlpha != 1.0f) { + final Paint p = getPaint(); + restoreAlpha = p.getAlpha(); + p.setAlpha((int) (restoreAlpha * mNinePatchState.mBaseAlpha + 0.5f)); + } else { + restoreAlpha = -1; + } + mNinePatch.draw(canvas, bounds, mPaint); if (needsMirroring) { @@ -250,6 +259,10 @@ public class NinePatchDrawable extends Drawable { if (clearColorFilter) { mPaint.setColorFilter(null); } + + if (restoreAlpha >= 0) { + mPaint.setAlpha(restoreAlpha); + } } @Override @@ -491,6 +504,10 @@ public class NinePatchDrawable extends Drawable { } } + if (themeAttrs == null || themeAttrs[R.styleable.NinePatchDrawable_alpha] == 0) { + ninePatchState.mBaseAlpha = a.getFloat(R.styleable.NinePatchDrawable_alpha, 1.0f); + } + // Apply the constant state to the paint. initializeWithState(ninePatchState, r); @@ -584,6 +601,10 @@ public class NinePatchDrawable extends Drawable { } } + if (a.hasValue(R.styleable.NinePatchDrawable_alpha)) { + state.mBaseAlpha = a.getFloat(R.styleable.NinePatchDrawable_alpha, 1.0f); + } + // Apply the constant state to the paint. initializeWithState(state, r); @@ -689,12 +710,13 @@ public class NinePatchDrawable extends Drawable { Mode mTintMode = Mode.SRC_IN; Rect mPadding; Insets mOpticalInsets; + float mBaseAlpha = 1.0f; boolean mDither; int[] mThemeAttrs; int mChangingConfigurations; int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; boolean mAutoMirrored; - + NinePatchState() { // Empty constructor. } @@ -726,6 +748,7 @@ public class NinePatchDrawable extends Drawable { mThemeAttrs = state.mThemeAttrs; mPadding = state.mPadding; mOpticalInsets = state.mOpticalInsets; + mBaseAlpha = state.mBaseAlpha; mDither = state.mDither; mChangingConfigurations = state.mChangingConfigurations; mTargetDensity = state.mTargetDensity; diff --git a/graphics/java/android/graphics/drawable/Ripple.java b/graphics/java/android/graphics/drawable/Ripple.java index 03dd841..796da50 100644 --- a/graphics/java/android/graphics/drawable/Ripple.java +++ b/graphics/java/android/graphics/drawable/Ripple.java @@ -62,27 +62,31 @@ class Ripple { /** Whether the center is within the parent bounds. */ private boolean mInside; + + /** Whether to pulse this ripple. */ + boolean mPulse; /** Enter state. A value in [0...1] or -1 if not set. */ - private float mEnterState = -1; + float mEnterState = -1; /** Exit state. A value in [0...1] or -1 if not set. */ - private float mExitState = -1; + float mExitState = -1; /** Outside state. A value in [0...1] or -1 if not set. */ - private float mOutsideState = -1; + float mOutsideState = -1; /** Pulse state. A value in [0...1] or -1 if not set. */ - private float mPulseState = -1; + float mPulseState = -1; /** * Creates a new ripple with the specified parent bounds, padding, initial * position, and screen density. */ - public Ripple(Rect bounds, Rect padding, float x, float y, float density) { + public Ripple(Rect bounds, Rect padding, float x, float y, float density, boolean pulse) { mBounds = bounds; mPadding = padding; mInside = mBounds.contains((int) x, (int) y); + mPulse = pulse; mX = x; mY = y; @@ -115,6 +119,16 @@ class Ripple { } } + public void onBoundsChanged() { + final boolean inside = mBounds.contains((int) mX, (int) mY); + if (mInside != inside) { + if (mAnimator != null) { + mAnimator.outside(); + } + mInside = inside; + } + } + public RippleAnimator animate() { if (mAnimator == null) { mAnimator = new RippleAnimator(this); @@ -308,9 +322,11 @@ class Ripple { MathUtils.constrain((currentTime - mOutsideTime) / (float) OUTSIDE_DURATION, 0, 1)); // Pulse is a little more complicated. - final long pulseTime = (currentTime - mEnterTime - ENTER_DURATION - PULSE_DELAY); - mTarget.mPulseState = pulseTime < 0 ? -1 - : (pulseTime % (PULSE_INTERVAL + PULSE_DURATION)) / (float) PULSE_DURATION; + if (mTarget.mPulse) { + final long pulseTime = (currentTime - mEnterTime - ENTER_DURATION - PULSE_DELAY); + mTarget.mPulseState = pulseTime < 0 ? -1 + : (pulseTime % (PULSE_INTERVAL + PULSE_DURATION)) / (float) PULSE_DURATION; + } } } } diff --git a/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java b/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java index 5f59467..813d755 100644 --- a/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java +++ b/graphics/java/android/graphics/drawable/TouchFeedbackDrawable.java @@ -39,6 +39,7 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; +import java.util.Arrays; /** * Documentation pending. @@ -110,6 +111,34 @@ public class TouchFeedbackDrawable extends LayerDrawable { return false; } + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + + final int N = mActiveRipplesCount; + for (int i = 0; i < N; i++) { + mActiveRipples[i].onBoundsChanged(); + } + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + if (!visible) { + if (mTouchedRipples != null) { + mTouchedRipples.clear(); + } + + if (mActiveRipplesCount > 0) { + Arrays.fill(mActiveRipples, null); + mActiveRipplesCount = 0; + mAnimating = false; + unscheduleSelf(mAnimationRunnable); + } + } + + return super.setVisible(visible, restart); + } + /** * @hide */ @@ -272,7 +301,9 @@ public class TouchFeedbackDrawable extends LayerDrawable { y = bounds.exactCenterY(); } - final Ripple newRipple = new Ripple(bounds, padding, x, y, mDensity); + // TODO: Clean this up in the API. + final boolean pulse = (id != R.attr.state_focused); + final Ripple newRipple = new Ripple(bounds, padding, x, y, mDensity, pulse); newRipple.animate().enter(); mActiveRipples[mActiveRipplesCount++] = newRipple; diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index 7c45682..4fbd2a4 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -297,8 +297,6 @@ JDrm::JDrm( } JDrm::~JDrm() { - mDrm.clear(); - JNIEnv *env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObject); @@ -363,6 +361,13 @@ void JDrm::notify(DrmPlugin::EventType eventType, int extra, const Parcel *obj) } } +void JDrm::disconnect() { + if (mDrm != NULL) { + mDrm->destroyPlugin(); + mDrm.clear(); + } +} + // static bool JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { @@ -527,6 +532,7 @@ static void android_media_MediaDrm_release(JNIEnv *env, jobject thiz) { sp<JDrm> drm = setDrm(env, thiz, NULL); if (drm != NULL) { drm->setListener(NULL); + drm->disconnect(); } } diff --git a/media/jni/android_media_MediaDrm.h b/media/jni/android_media_MediaDrm.h index 620ad28..b7b8e5d 100644 --- a/media/jni/android_media_MediaDrm.h +++ b/media/jni/android_media_MediaDrm.h @@ -47,6 +47,8 @@ struct JDrm : public BnDrmClient { void notify(DrmPlugin::EventType, int extra, const Parcel *obj); status_t setListener(const sp<DrmListener>& listener); + void disconnect(); + protected: virtual ~JDrm(); diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 0e55228..d781336 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -859,6 +859,7 @@ void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) result = malloc(exifdata->size); if (result) { memcpy(result, exifdata->data, exifdata->size); + outThumbSize = exifdata->size; } } exif_data_unref(exifdata); diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index a9322b9..1406f6b 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -878,7 +878,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback protected int[] mConfigSpec; private int[] filterConfigSpec(int[] configSpec) { - if (mEGLContextClientVersion != 2) { + if (mEGLContextClientVersion != 2 && mEGLContextClientVersion != 3) { return configSpec; } /* We know none of the subclasses define EGL_RENDERABLE_TYPE. @@ -888,7 +888,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback int[] newConfigSpec = new int[len + 2]; System.arraycopy(configSpec, 0, newConfigSpec, 0, len-1); newConfigSpec[len-1] = EGL10.EGL_RENDERABLE_TYPE; - newConfigSpec[len] = 4; /* EGL_OPENGL_ES2_BIT */ + if (mEGLContextClientVersion == 2) { + newConfigSpec[len] = EGL14.EGL_OPENGL_ES2_BIT; /* EGL_OPENGL_ES2_BIT */ + } else { + newConfigSpec[len] = EGLExt.EGL_OPENGL_ES3_BIT_KHR; /* EGL_OPENGL_ES3_BIT_KHR */ + } newConfigSpec[len+1] = EGL10.EGL_NONE; return newConfigSpec; } diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index d371d70..327df8d 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -273,7 +273,8 @@ <service android:name=".keyguard.KeyguardService" - android:exported="true" /> + android:exported="true" + android:enabled="@bool/config_enableKeyguardService" /> <activity android:name=".Somnambulator" android:label="@string/start_dreams" diff --git a/packages/SystemUI/res/drawable-hdpi/search_bg_transparent.9.png b/packages/SystemUI/res/drawable-hdpi/search_bg_transparent.9.png Binary files differnew file mode 100644 index 0000000..85db9c8 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/search_bg_transparent.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/search_bg_transparent.9.png b/packages/SystemUI/res/drawable-mdpi/search_bg_transparent.9.png Binary files differnew file mode 100644 index 0000000..c4941a6 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/search_bg_transparent.9.png diff --git a/packages/SystemUI/res/drawable-xhdpi/search_bg_transparent.9.png b/packages/SystemUI/res/drawable-xhdpi/search_bg_transparent.9.png Binary files differnew file mode 100644 index 0000000..4618f40 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/search_bg_transparent.9.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_task_shadow.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_task_shadow.9.png Binary files differnew file mode 100644 index 0000000..36e7e45 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/recents_task_shadow.9.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/search_bg_transparent.9.png b/packages/SystemUI/res/drawable-xxhdpi/search_bg_transparent.9.png Binary files differnew file mode 100644 index 0000000..c0bf31d --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/search_bg_transparent.9.png diff --git a/packages/SystemUI/res/layout/flip_settings.xml b/packages/SystemUI/res/layout/flip_settings.xml index 28d9625..f3c1b90 100644 --- a/packages/SystemUI/res/layout/flip_settings.xml +++ b/packages/SystemUI/res/layout/flip_settings.xml @@ -22,4 +22,5 @@ android:layout_height="wrap_content" android:background="#5f000000" android:animateLayoutChanges="true" + android:visibility="gone" android:columnCount="@integer/quick_settings_num_columns" />
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml new file mode 100644 index 0000000..88b01c7 --- /dev/null +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> + +<com.android.systemui.statusbar.phone.KeyguardBottomAreaView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" + android:id="@+id/keyguard_bottom_area" + android:layout_height="match_parent" + android:layout_width="match_parent" + > + <com.android.systemui.statusbar.policy.KeyButtonView + android:id="@+id/camera_button" + android:layout_height="80dp" + android:layout_width="80dp" + android:layout_gravity="bottom|right" + android:src="@drawable/ic_sysbar_camera" + android:scaleType="center" + android:contentDescription="@string/accessibility_camera_button" + systemui:glowBackground="@drawable/ic_sysbar_highlight_land" /> +</com.android.systemui.statusbar.phone.KeyguardBottomAreaView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index a6fb443..2398849 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -159,18 +159,6 @@ android:visibility="gone" android:contentDescription="@string/accessibility_search_light" /> - - <com.android.systemui.statusbar.policy.KeyButtonView - android:id="@+id/camera_button" - android:layout_height="match_parent" - android:layout_width="80dp" - android:layout_gravity="center_vertical|right" - android:src="@drawable/ic_sysbar_camera" - android:scaleType="center" - android:visibility="gone" - android:contentDescription="@string/accessibility_camera_button" - systemui:glowBackground="@drawable/ic_sysbar_highlight_land" - /> </FrameLayout> <com.android.systemui.statusbar.policy.DeadZone diff --git a/packages/SystemUI/res/layout/quick_settings.xml b/packages/SystemUI/res/layout/quick_settings.xml deleted file mode 100644 index 75082ba..0000000 --- a/packages/SystemUI/res/layout/quick_settings.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 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. ---> - -<com.android.systemui.statusbar.phone.SettingsPanelView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:id="@+id/settings_panel" - android:background="@drawable/notification_panel_bg" - > - <!-- TODO: Put into ScrollView --> - <com.android.systemui.statusbar.phone.QuickSettingsScrollView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/close_handle_underlap" - android:overScrollMode="ifContentScrolls" - > - <com.android.systemui.statusbar.phone.QuickSettingsContainerView - android:id="@+id/quick_settings_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true" - android:columnCount="@integer/quick_settings_num_columns" - /> - </com.android.systemui.statusbar.phone.QuickSettingsScrollView> - - <View - android:id="@+id/handle" - android:layout_width="match_parent" - android:layout_height="@dimen/close_handle_height" - android:background="@drawable/status_bar_close" - android:visibility="invisible" - /> - -</com.android.systemui.statusbar.phone.SettingsPanelView >
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/recents_search_bar.xml b/packages/SystemUI/res/layout/recents_search_bar.xml new file mode 100644 index 0000000..915283e --- /dev/null +++ b/packages/SystemUI/res/layout/recents_search_bar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/search_bg_transparent"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:text="@string/recents_search_bar_label" + android:textColor="#99ffffff" + android:textSize="18sp" + android:textAllCaps="true" /> +</FrameLayout> + diff --git a/packages/SystemUI/res/layout/recents_task_view.xml b/packages/SystemUI/res/layout/recents_task_view.xml index 7f64032..4442bca 100644 --- a/packages/SystemUI/res/layout/recents_task_view.xml +++ b/packages/SystemUI/res/layout/recents_task_view.xml @@ -63,13 +63,6 @@ android:maxLines="2" android:ellipsize="marquee" android:fadingEdge="horizontal" /> - <ImageView - android:id="@+id/activity_icon" - android:layout_width="@dimen/recents_task_view_activity_icon_size" - android:layout_height="@dimen/recents_task_view_activity_icon_size" - android:layout_gravity="center_vertical|end" - android:padding="12dp" - android:visibility="invisible" /> </com.android.systemui.recents.views.TaskBarView> </com.android.systemui.recents.views.TaskView> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 8a3f090..69fbc1b 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -36,8 +36,9 @@ android:layout_gravity="bottom" /> - <ViewStub android:id="@+id/keyguard_flip_stub" - android:layout="@layout/status_bar_flip_button" + <include + layout="@layout/status_bar_flip_button" + android:id="@+id/keyguard_flipper" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="right|top" @@ -76,8 +77,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" > - <ViewStub android:id="@+id/flip_settings_stub" - android:layout="@layout/flip_settings" + <include + layout="@layout/flip_settings" android:layout_width="match_parent" android:layout_height="wrap_content" /> @@ -89,4 +90,8 @@ /> </FrameLayout> </LinearLayout> + + <include + layout="@layout/keyguard_bottom_area" + android:visibility="gone" /> </com.android.systemui.statusbar.phone.NotificationPanelView><!-- end of sliding panel --> diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index 56523db..8975728 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -84,6 +84,7 @@ /> <include layout="@layout/status_bar_flip_button" + android:id="@+id/header_flipper" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginStart="12dp" /> diff --git a/packages/SystemUI/res/layout/status_bar_flip_button.xml b/packages/SystemUI/res/layout/status_bar_flip_button.xml index db672ea..b7dff8c 100644 --- a/packages/SystemUI/res/layout/status_bar_flip_button.xml +++ b/packages/SystemUI/res/layout/status_bar_flip_button.xml @@ -16,7 +16,6 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/settings_button_holder" android:layout_width="50dp" android:layout_height="50dp"> <ImageView android:id="@+id/settings_button" diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 2b01a06..61d43d7 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -23,6 +23,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" + android:fitsSystemWindows="true" android:descendantFocusability="afterDescendants"> <include layout="@layout/status_bar" @@ -33,16 +34,11 @@ android:id="@+id/panel_holder" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="@dimen/panel_holder_padding_top" - android:layout_marginBottom="@dimen/navigation_bar_height"> + android:layout_marginTop="@dimen/panel_holder_padding_top"> <include layout="@layout/status_bar_expanded" android:layout_width="@dimen/notification_panel_width" android:layout_height="wrap_content" android:layout_gravity="start|top" /> - <ViewStub android:id="@+id/quick_settings_stub" - android:layout="@layout/quick_settings" - android:layout_width="@dimen/notification_panel_width" - android:layout_height="match_parent" /> </com.android.systemui.statusbar.phone.PanelHolder> </com.android.systemui.statusbar.phone.StatusBarWindowView> diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml index c6bc44d..fe2224e 100644 --- a/packages/SystemUI/res/values-sw600dp/config.xml +++ b/packages/SystemUI/res/values-sw600dp/config.xml @@ -20,9 +20,6 @@ <!-- These resources are around just to allow their values to be customized for different hardware and product builds. --> <resources> - <!-- Enable quick settings on tablets --> - <bool name="config_hasSettingsPanel">true</bool> - <!-- The number of columns in the QuickSettings --> <integer name="quick_settings_num_columns">3</integer> @@ -31,7 +28,4 @@ <!-- The number of columns that the top level tiles span in the QuickSettings --> <integer name="quick_settings_user_time_settings_tile_span">1</integer> - - <!-- Enable the "flip settings" panel --> - <bool name="config_hasFlipSettingsPanel">true</bool> </resources> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index b4fafec..5b5587d 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -23,10 +23,9 @@ <dimen name="notification_panel_margin_bottom">192dp</dimen> <dimen name="notification_panel_margin_left">16dp</dimen> - <!-- Gravity for the notification & quick settings panels --> - <!-- 0x31 = top|center_horizontal ; 0x800035 = end|top --> + <!-- Gravity for the notification panel --> + <!-- 0x31 = top|center_horizontal --> <integer name="notification_panel_layout_gravity">0x31</integer> - <integer name="settings_panel_layout_gravity">0x800035</integer> <!-- Diameter of outer shape drawable shown in navbar search--> <dimen name="navbar_search_outerring_diameter">430dip</dimen> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index f908a1e..722ca15 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -72,7 +72,7 @@ <!-- decay duration (from size_max -> size), in ms --> <integer name="navigation_bar_deadzone_hold">333</integer> <integer name="navigation_bar_deadzone_decay">333</integer> - + <bool name="config_dead_zone_flash">false</bool> <!-- Min alpha % that recent items will fade to while being dismissed --> @@ -99,11 +99,8 @@ <integer name="blinds_pop_duration_ms">10</integer> - <!-- Disable the separate quick settings panel --> - <bool name="config_hasSettingsPanel">true</bool> - - <!-- Enable the "flip settings" panel --> - <bool name="config_hasFlipSettingsPanel">true</bool> + <!-- The device supports quick settings. --> + <bool name="config_hasQuickSettings">true</bool> <!-- Should "4G" be shown instead of "LTE" when the network is NETWORK_TYPE_LTE? --> <bool name="config_show4GForLTE">true</bool> @@ -125,6 +122,9 @@ <!-- The minimum alpha for the dim applied to cards that go deeper into the stack. --> <integer name="recents_max_task_stack_view_dim">96</integer> + <!-- Whether to enable KeyguardService or not --> + <bool name="config_enableKeyguardService">true</bool> + <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow card. --> <integer name="keyguard_max_notification_count">4</integer> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 9aacf42..0604817 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -174,18 +174,9 @@ <dimen name="notification_panel_margin_bottom">0dp</dimen> <dimen name="notification_panel_margin_left">0dp</dimen> - <!-- Gravity for the notification & quick settings panels --> + <!-- Gravity for the notification panel --> <!-- 0x37 = fill_horizontal|top --> <integer name="notification_panel_layout_gravity">0x37</integer> - <integer name="settings_panel_layout_gravity">0x37</integer> - - <!-- Fraction of the status bar that, when dragged, will produce the quick settings panel - instead of the notification panel. See also @dimen/settings_panel_dragzone_min. - If zero, the settings panel will not be directly draggable from the status bar. --> - <item type="dimen" name="settings_panel_dragzone_fraction">0%</item> - - <!-- Quick settings dragzone, if used, should be at least this big (may be zero). --> - <dimen name="settings_panel_dragzone_min">100dp</dimen> <!-- Height of the carrier/wifi name label --> <dimen name="carrier_label_height">24dp</dimen> @@ -245,6 +236,12 @@ <!-- The amount of space a user has to scroll to dismiss any info panes. --> <dimen name="recents_task_stack_scroll_dismiss_info_pane_distance">50dp</dimen> + <!-- The height of the search bar space. --> + <dimen name="recents_search_bar_space_height">40dp</dimen> + + <!-- The search bar edge margins. --> + <dimen name="recents_search_bar_space_edge_margins">12dp</dimen> + <!-- Used to calculate the translation animation duration, the expected amount of movement in dps over one second of time. --> <dimen name="recents_animation_movement_in_dps_per_second">800dp</dimen> @@ -253,7 +250,7 @@ <dimen name="notification_stack_margin_bottom">0dp</dimen> <!-- Space reserved for the cards behind the top card in the top stack --> - <dimen name="top_stack_peek_amount">24dp</dimen> + <dimen name="top_stack_peek_amount">12dp</dimen> <!-- Space reserved for the cards behind the top card in the bottom stack --> <dimen name="bottom_stack_peek_amount">18dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 73e5e19..f3c956c 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -511,6 +511,8 @@ <string name="recents_empty_message">RECENTS</string> <!-- Recents: The info panel app info button string. [CHAR LIMIT=NONE] --> <string name="recents_app_info_button_label">Application Info</string> + <!-- Recents: Temporary string for the button in the recents search bar. [CHAR LIMIT=NONE] --> + <string name="recents_search_bar_label">search</string> <!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. --> @@ -537,6 +539,9 @@ <!-- Zen mode: Summary notification content text. [CHAR LIMIT=NONE] --> <string name="zen_mode_notification_text">Touch to show</string> + <!-- Zen mode: Short title. [CHAR LIMIT=40] --> + <string name="zen_mode_title">Do not disturb</string> + <!-- Text for overflow card on Keyguard when there is not enough space for all notifications on Keyguard. [CHAR LIMIT=12] --> <plurals name="keyguard_more_overflow_text"> <item quantity="other">%d more</item> diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index 1832d37..8dd3f8d 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -195,6 +195,12 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { mGravity = Gravity.TOP; mScaleAnimation = ObjectAnimator.ofFloat(mScaler, "height", 0f); mScaleAnimation.setDuration(EXPAND_DURATION); + mScaleAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mCallback.setUserLockedChild(mCurrView, false); + } + }); mPopLimit = mContext.getResources().getDimension(R.dimen.blinds_pop_threshold); mPopDuration = mContext.getResources().getInteger(R.integer.blinds_pop_duration_ms); mPullGestureMinXSpan = mContext.getResources().getDimension(R.dimen.pull_span_min); @@ -549,8 +555,9 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { mScaleAnimation.setFloatValues(targetHeight); mScaleAnimation.setupStartValues(); mScaleAnimation.start(); + } else { + mCallback.setUserLockedChild(mCurrView, false); } - mCallback.setUserLockedChild(mCurrView, false); mExpanding = false; mExpansionStyle = NONE; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index cbfc266..081e8de 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1271,11 +1271,6 @@ public class KeyguardViewMediator extends SystemUI { // (like recents). Temporary enable/disable (e.g. the "back" button) are // done in KeyguardHostView. flags |= StatusBarManager.DISABLE_RECENT; - if ((isSecure() && !mAllowNotificationsWhenSecure) - || !ENABLE_INSECURE_STATUS_BAR_EXPAND) { - // showing secure lockscreen; disable expanding. - flags |= StatusBarManager.DISABLE_EXPAND; - } if (isSecure()) { // showing secure lockscreen; disable ticker and switch private notifications // to show their public versions, if available. diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java index 4fb90cb..f2e322d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java @@ -44,6 +44,7 @@ import android.view.View; import android.view.WindowManager; import com.android.systemui.R; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -240,12 +241,10 @@ public class AlternateRecentsComponent { } /** Returns whether there is are multiple recents tasks */ - boolean hasMultipleRecentsTask() { + boolean hasMultipleRecentsTask(List<ActivityManager.RecentTaskInfo> tasks) { // NOTE: Currently there's no method to get the number of non-home tasks, so we have to // compute this ourselves SystemServicesProxy ssp = mSystemServicesProxy; - List<ActivityManager.RecentTaskInfo> tasks = ssp.getRecentTasks(4, - UserHandle.CURRENT.getIdentifier()); Iterator<ActivityManager.RecentTaskInfo> iter = tasks.iterator(); while (iter.hasNext()) { ActivityManager.RecentTaskInfo t = iter.next(); @@ -259,6 +258,17 @@ public class AlternateRecentsComponent { return (tasks.size() > 1); } + /** Returns whether the base intent of the top task stack was launched with the flag + * Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS. */ + boolean isTopTaskExcludeFromRecents(List<ActivityManager.RecentTaskInfo> tasks) { + if (tasks.size() > 0) { + ActivityManager.RecentTaskInfo t = tasks.get(0); + Console.log(t.baseIntent.toString()); + return (t.baseIntent.getFlags() & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0; + } + return false; + } + /** Converts from the device rotation to the degree */ float getDegreesForRotation(int value) { switch (value) { @@ -334,10 +344,18 @@ public class AlternateRecentsComponent { isTopTaskHome = ssp.isInHomeStack(topTask.id); } - // Otherwise, Recents is not the front-most activity and we should animate into it - boolean hasMultipleTasks = hasMultipleRecentsTask(); + // Otherwise, Recents is not the front-most activity and we should animate into it. If + // the activity at the root of the top task stack is excluded from recents, or if that + // task stack is in the home stack, then we just do a simple transition. Otherwise, we + // animate to the rects defined by the Recents service, which can differ depending on the + // number of items in the list. + List<ActivityManager.RecentTaskInfo> recentTasks = + ssp.getRecentTasks(4, UserHandle.CURRENT.getIdentifier()); + boolean hasMultipleTasks = hasMultipleRecentsTask(recentTasks); + boolean isTaskExcludedFromRecents = isTopTaskExcludeFromRecents(recentTasks); Rect taskRect = hasMultipleTasks ? mMultipleCountFirstTaskRect : mSingleCountFirstTaskRect; - if (!isTopTaskHome && taskRect != null && taskRect.width() > 0 && taskRect.height() > 0) { + if (!isTopTaskHome && !isTaskExcludedFromRecents && + (taskRect != null) && (taskRect.width() > 0) && (taskRect.height() > 0)) { // Loading from thumbnail Bitmap thumbnail; Bitmap firstThumbnail = loadFirstTaskThumbnail(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java index 64770a4..72d9a52 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java @@ -29,6 +29,7 @@ public class Constants { public static final boolean EnableTaskFiltering = true; public static final boolean EnableTaskStackClipping = false; public static final boolean EnableInfoPane = true; + public static final boolean EnableSearchButton = false; // This disables the bitmap and icon caches public static final boolean DisableBackgroundCache = false; @@ -84,6 +85,9 @@ public class Constants { public static final int TaskStackOverscrollRange = 150; public static final int FilterStartDelay = 25; + // The amount to inverse scale the movement if we are overscrolling + public static final float TouchOverscrollScaleFactor = 3f; + // The padding will be applied to the smallest dimension, and then applied to all sides public static final float StackPaddingPct = 0.15f; // The overlap height relative to the task height diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index 5e5b841..d54df13 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -44,6 +44,8 @@ public class RecentsConfiguration { public int taskStackMaxDim; public int taskViewInfoPaneAnimDuration; public int taskViewRoundedCornerRadiusPx; + public int searchBarSpaceHeightPx; + public int searchBarSpaceEdgeMarginsPx; public boolean launchedWithThumbnailAnimation; @@ -92,6 +94,9 @@ public class RecentsConfiguration { res.getInteger(R.integer.recents_animate_task_view_info_pane_duration); taskViewRoundedCornerRadiusPx = res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); + searchBarSpaceHeightPx = res.getDimensionPixelSize(R.dimen.recents_search_bar_space_height); + searchBarSpaceEdgeMarginsPx = + res.getDimensionPixelSize(R.dimen.recents_search_bar_space_edge_margins); } /** Updates the system insets */ @@ -99,6 +104,26 @@ public class RecentsConfiguration { systemInsets.set(insets); } + /** Returns the search bar bounds in the specified orientation */ + public void getSearchBarBounds(int width, int height, + Rect searchBarSpaceBounds, Rect searchBarBounds) { + // Return empty rects if search is not enabled + if (!Constants.DebugFlags.App.EnableSearchButton) { + searchBarSpaceBounds.set(0, 0, 0, 0); + searchBarBounds.set(0, 0, 0, 0); + return; + } + + // Calculate the search bar bounds, and account for the system insets + int edgeMarginPx = searchBarSpaceEdgeMarginsPx; + int availableWidth = width - systemInsets.left - systemInsets.right; + searchBarSpaceBounds.set(0, 0, availableWidth, 2 * edgeMarginPx + searchBarSpaceHeightPx); + + // Inset from the search bar space to get the search bar bounds + searchBarBounds.set(searchBarSpaceBounds); + searchBarBounds.inset(edgeMarginPx, edgeMarginPx); + } + /** Converts from DPs to PXs */ public int pxFromDp(float size) { return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java index 06ca9e2..36b761e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java @@ -66,22 +66,33 @@ class SystemUIMessageHandler extends Handler { Bundle replyData = new Bundle(); TaskViewTransform transform; + // Get the search bar bounds so that we can account for its height in the children + Rect searchBarSpaceBounds = new Rect(); + Rect searchBarBounds = new Rect(); + RecentsConfiguration config = RecentsConfiguration.getInstance(); + config.getSearchBarBounds(windowRect.width(), windowRect.height(), + searchBarSpaceBounds, searchBarBounds); + // Calculate the target task rect for when there is one task // NOTE: Since the nav bar height is already accounted for in the windowRect, don't // pass in a bottom inset stack.addTask(new Task()); - tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top, 0); + tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top - + systemInsets.bottom - searchBarSpaceBounds.height(), 0); tsv.boundScroll(); transform = tsv.getStackTransform(0, tsv.getStackScroll()); + transform.rect.offset(0, searchBarSpaceBounds.height()); replyData.putParcelable(AlternateRecentsComponent.KEY_SINGLE_TASK_STACK_RECT, new Rect(transform.rect)); // Also calculate the target task rect when there are multiple tasks stack.addTask(new Task()); - tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top, 0); + tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top - + systemInsets.bottom - searchBarSpaceBounds.height(), 0); tsv.setStackScrollRaw(Integer.MAX_VALUE); tsv.boundScroll(); transform = tsv.getStackTransform(1, tsv.getStackScroll()); + transform.rect.offset(0, searchBarSpaceBounds.height()); replyData.putParcelable(AlternateRecentsComponent.KEY_MULTIPLE_TASK_STACK_RECT, new Rect(transform.rect)); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java index fd0f6d1..da265e1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java @@ -415,7 +415,10 @@ public class RecentsTaskLoader { ActivityInfo info = ssp.getActivityInfo(t.baseIntent.getComponent(), t.userId); String activityLabel = (t.activityLabel == null ? ssp.getActivityLabel(info) : t.activityLabel.toString()); - Bitmap activityIcon = t.activityIcon; + BitmapDrawable activityIcon = null; + if (t.activityIcon != null) { + activityIcon = new BitmapDrawable(res, t.activityIcon); + } boolean isForemostTask = (i == (taskCount - 1)); // Create a new task diff --git a/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java index 7f0d9ee..33ac0a8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java @@ -19,6 +19,8 @@ package com.android.systemui.recents; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.AppGlobals; +import android.app.SearchManager; +import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -26,11 +28,15 @@ import android.content.pm.ActivityInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.text.TextUtils; +import android.util.Log; import java.util.ArrayList; import java.util.List; @@ -45,6 +51,7 @@ public class SystemServicesProxy { PackageManager mPm; IPackageManager mIpm; UserManager mUm; + SearchManager mSm; String mPackage; Bitmap mDummyIcon; @@ -55,6 +62,7 @@ public class SystemServicesProxy { mPm = context.getPackageManager(); mUm = (UserManager) context.getSystemService(Context.USER_SERVICE); mIpm = AppGlobals.getPackageManager(); + mSm = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE); mPackage = context.getPackageName(); if (Constants.DebugFlags.App.EnableSystemServicesProxy) { @@ -199,4 +207,28 @@ public class SystemServicesProxy { } return icon; } + + + /** + * Composes an intent to launch the global search activity. + */ + public Intent getGlobalSearchIntent(Rect sourceBounds) { + if (mSm == null) return null; + + // Try and get the global search activity + ComponentName globalSearchActivity = mSm.getGlobalSearchActivity(); + if (globalSearchActivity == null) return null; + + // Bundle the source of the search + Bundle appSearchData = new Bundle(); + appSearchData.putString("source", mPackage); + + // Compose the intent and Start the search activity + Intent intent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(globalSearchActivity); + intent.putExtra(SearchManager.APP_DATA, appSearchData); + intent.setSourceBounds(sourceBounds); + return intent; + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java index ff062f6..1566a49 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java @@ -18,6 +18,7 @@ package com.android.systemui.recents.model; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -69,8 +70,8 @@ public class Task { public TaskKey key; public Drawable applicationIcon; + public Drawable activityIcon; public String activityLabel; - public Bitmap activityIcon; public Bitmap thumbnail; public boolean isActive; public int userId; @@ -82,7 +83,7 @@ public class Task { } public Task(int id, boolean isActive, Intent intent, String activityTitle, - Bitmap activityIcon, int userId) { + BitmapDrawable activityIcon, int userId) { this.key = new TaskKey(id, intent, userId); this.activityLabel = activityTitle; this.activityIcon = activityIcon; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index b054a22..a04cd3e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -27,8 +27,11 @@ import android.graphics.Rect; import android.net.Uri; import android.os.UserHandle; import android.provider.Settings; +import android.view.Gravity; +import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; +import android.widget.TextView; import com.android.systemui.recents.Console; import com.android.systemui.recents.Constants; import com.android.systemui.recents.RecentsConfiguration; @@ -36,6 +39,7 @@ import com.android.systemui.recents.RecentsTaskLoader; import com.android.systemui.recents.model.SpaceNode; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; +import com.android.systemui.R; import java.util.ArrayList; @@ -53,11 +57,16 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV // The space partitioning root of this container SpaceNode mBSP; + // Search bar view + View mSearchBar; // Recents view callbacks RecentsViewCallbacks mCb; + LayoutInflater mInflater; + public RecentsView(Context context) { super(context); + mInflater = LayoutInflater.from(context); setWillNotDraw(false); } @@ -71,12 +80,22 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV mBSP = n; // Create and add all the stacks for this partition of space. + boolean hasTasks = false; removeAllViews(); ArrayList<TaskStack> stacks = mBSP.getStacks(); for (TaskStack stack : stacks) { TaskStackView stackView = new TaskStackView(getContext(), stack); stackView.setCallbacks(this); addView(stackView); + hasTasks |= (stack.getTaskCount() > 0); + } + + // Create the search bar (and hide it if we have no recent tasks) + if (Constants.DebugFlags.App.EnableSearchButton) { + createSearchBar(); + if (!hasTasks) { + mSearchBar.setVisibility(View.GONE); + } } } @@ -85,29 +104,45 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV // Get the first stack view int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { - TaskStackView stackView = (TaskStackView) getChildAt(i); - TaskStack stack = stackView.mStack; - ArrayList<Task> tasks = stack.getTasks(); - - // Get the first task in the stack - if (!tasks.isEmpty()) { - Task task = tasks.get(tasks.size() - 1); - TaskView tv = null; - - // Try and use the first child task view as the source of the launch animation - if (stackView.getChildCount() > 0) { - TaskView stv = (TaskView) stackView.getChildAt(stackView.getChildCount() - 1); - if (stv.getTask() == task) { - tv = stv; + View child = getChildAt(i); + if (child instanceof TaskStackView) { + TaskStackView stackView = (TaskStackView) child; + TaskStack stack = stackView.mStack; + ArrayList<Task> tasks = stack.getTasks(); + + // Get the first task in the stack + if (!tasks.isEmpty()) { + Task task = tasks.get(tasks.size() - 1); + TaskView tv = null; + + // Try and use the first child task view as the source of the launch animation + if (stackView.getChildCount() > 0) { + TaskView stv = (TaskView) stackView.getChildAt(stackView.getChildCount() - 1); + if (stv.getTask() == task) { + tv = stv; + } } + onTaskLaunched(stackView, tv, stack, task); + return true; } - onTaskLaunched(stackView, tv, stack, task); - return true; } } return false; } + /** Creates and adds the search bar */ + void createSearchBar() { + // Create a temporary search bar + mSearchBar = mInflater.inflate(R.layout.recents_search_bar, this, false); + mSearchBar.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + onSearchTriggered(); + } + }); + addView(mSearchBar); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); @@ -120,16 +155,26 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV Console.logTraceTime(Constants.DebugFlags.App.TimeRecentsStartup, Constants.DebugFlags.App.TimeRecentsStartupKey, "RecentsView.onMeasure"); - // We measure our stack views sans the status bar. It will handle the nav bar itself. + // Get the search bar bounds so that we can account for its height in the children + Rect searchBarSpaceBounds = new Rect(); + Rect searchBarBounds = new Rect(); RecentsConfiguration config = RecentsConfiguration.getInstance(); + config.getSearchBarBounds(getMeasuredWidth(), getMeasuredHeight(), + searchBarSpaceBounds, searchBarBounds); + if (mSearchBar != null) { + mSearchBar.measure(MeasureSpec.makeMeasureSpec(searchBarSpaceBounds.width(), widthMode), + MeasureSpec.makeMeasureSpec(searchBarSpaceBounds.height(), heightMode)); + } + + // We measure our stack views sans the status bar. It will handle the nav bar itself. int childWidth = width - config.systemInsets.right; - int childHeight = height - config.systemInsets.top; + int childHeight = height - config.systemInsets.top - searchBarSpaceBounds.height(); // Measure each child int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { + View child = getChildAt(i); + if (child instanceof TaskStackView && child.getVisibility() != GONE) { child.measure(MeasureSpec.makeMeasureSpec(childWidth, widthMode), MeasureSpec.makeMeasureSpec(childHeight, heightMode)); } @@ -145,18 +190,30 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV Console.logTraceTime(Constants.DebugFlags.App.TimeRecentsStartup, Constants.DebugFlags.App.TimeRecentsStartupKey, "RecentsView.onLayout"); - // We offset our stack views by the status bar height. It will handle the nav bar itself. + // Get the search bar bounds so that we can account for its height in the children + Rect searchBarSpaceBounds = new Rect(); + Rect searchBarBounds = new Rect(); RecentsConfiguration config = RecentsConfiguration.getInstance(); - top += config.systemInsets.top; + config.getSearchBarBounds(getMeasuredWidth(), getMeasuredHeight(), + searchBarSpaceBounds, searchBarBounds); + if (mSearchBar != null) { + mSearchBar.layout(config.systemInsets.left + searchBarSpaceBounds.left, + config.systemInsets.top + searchBarSpaceBounds.top, + config.systemInsets.left + mSearchBar.getMeasuredWidth(), + config.systemInsets.top + mSearchBar.getMeasuredHeight()); + } + + // We offset our stack views by the status bar height. It will handle the nav bar itself. + top += config.systemInsets.top + searchBarSpaceBounds.height(); // Layout each child // XXX: Based on the space node for that task view int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - final int width = child.getMeasuredWidth(); - final int height = child.getMeasuredHeight(); + View child = getChildAt(i); + if (child instanceof TaskStackView && child.getVisibility() != GONE) { + int width = child.getMeasuredWidth(); + int height = child.getMeasuredHeight(); child.layout(left, top, left + width, top + height); } } @@ -188,9 +245,12 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV // Get the first stack view int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { - TaskStackView stackView = (TaskStackView) getChildAt(i); - if (stackView.closeOpenInfoPanes()) { - return true; + View child = getChildAt(i); + if (child instanceof TaskStackView) { + TaskStackView stackView = (TaskStackView) child; + if (stackView.closeOpenInfoPanes()) { + return true; + } } } } @@ -266,7 +326,6 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV b, offsetX, offsetY); } - if (task.isActive) { // Bring an active task to the foreground RecentsTaskLoader.getInstance().getSystemServicesProxy() @@ -315,4 +374,24 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV TaskStackBuilder.create(getContext()) .addNextIntentWithParentStack(intent).startActivities(); } + + public void onSearchTriggered() { + // Get the search bar source bounds + Rect searchBarSpaceBounds = new Rect(); + Rect searchBarBounds = new Rect(); + RecentsConfiguration config = RecentsConfiguration.getInstance(); + config.getSearchBarBounds(getMeasuredWidth(), getMeasuredHeight(), + searchBarSpaceBounds, searchBarBounds); + + // Get the search intent and start it + Intent searchIntent = RecentsTaskLoader.getInstance().getSystemServicesProxy() + .getGlobalSearchIntent(searchBarBounds); + if (searchIntent != null) { + try { + getContext().startActivity(searchIntent); + } catch (ActivityNotFoundException anfe) { + Console.logError(getContext(), "Could not start Search activity"); + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java index c9a6d67..124f11e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java @@ -31,7 +31,6 @@ class TaskBarView extends FrameLayout { Task mTask; ImageView mApplicationIcon; - ImageView mActivityIcon; TextView mActivityDescription; public TaskBarView(Context context) { @@ -54,23 +53,22 @@ class TaskBarView extends FrameLayout { protected void onFinishInflate() { // Initialize the icon and description views mApplicationIcon = (ImageView) findViewById(R.id.application_icon); - mActivityIcon = (ImageView) findViewById(R.id.activity_icon); mActivityDescription = (TextView) findViewById(R.id.activity_description); } /** Binds the bar view to the task */ void rebindToTask(Task t, boolean animate) { mTask = t; - if (t.applicationIcon != null) { + // If an activity icon is defined, then we use that as the primary icon to show in the bar, + // otherwise, we fall back to the application icon + if (t.activityIcon != null) { + mApplicationIcon.setImageDrawable(t.activityIcon); + } else if (t.applicationIcon != null) { mApplicationIcon.setImageDrawable(t.applicationIcon); - mActivityDescription.setText(t.activityLabel); - if (t.activityIcon != null) { - mActivityIcon.setImageBitmap(t.activityIcon); - mActivityIcon.setVisibility(View.VISIBLE); - } - if (animate) { - // XXX: Investigate how expensive it will be to create a second bitmap and crossfade - } + } + mActivityDescription.setText(t.activityLabel); + if (animate) { + // XXX: Investigate how expensive it will be to create a second bitmap and crossfade } } @@ -78,8 +76,6 @@ class TaskBarView extends FrameLayout { void unbindFromTask() { mTask = null; mApplicationIcon.setImageDrawable(null); - mActivityIcon.setImageBitmap(null); - mActivityIcon.setVisibility(View.INVISIBLE); mActivityDescription.setText(""); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskInfoView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskInfoView.java index 233e38c..a81d01c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskInfoView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskInfoView.java @@ -70,10 +70,8 @@ class TaskInfoView extends FrameLayout { /** Updates the positions of each of the items to fit in the rect specified */ void updateContents(Rect visibleRect) { // Offset the app info button - LayoutParams lp = (LayoutParams) mAppInfoButton.getLayoutParams(); - lp.topMargin = visibleRect.top + - (visibleRect.height() - mAppInfoButton.getMeasuredHeight()) / 2; - requestLayout(); + mAppInfoButton.setTranslationY(visibleRect.top + + (visibleRect.height() - mAppInfoButton.getMeasuredHeight()) / 2); } /** Sets the circular clip radius on this panel */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index ee92b16..a77e61d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -395,9 +395,12 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal return false; } - /** Returns whether the current scroll is out of bounds */ + /** Returns whether the specified scroll is out of bounds */ + boolean isScrollOutOfBounds(int scroll) { + return (scroll < mMinScroll) || (scroll > mMaxScroll); + } boolean isScrollOutOfBounds() { - return (getStackScroll() < 0) || (getStackScroll() > mMaxScroll); + return isScrollOutOfBounds(getStackScroll()); } /** Updates the min and max virtual scroll bounds */ @@ -556,7 +559,14 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal int smallestDimension = Math.min(width, height); int padding = (int) (Constants.Values.TaskStackView.StackPaddingPct * smallestDimension / 2f); - mStackRect.inset(padding, padding); + if (Constants.DebugFlags.App.EnableSearchButton) { + // Don't need to pad the top since we have some padding on the search bar already + mStackRect.left += padding; + mStackRect.right -= padding; + mStackRect.bottom -= padding; + } else { + mStackRect.inset(padding, padding); + } mStackRectSansPeek.set(mStackRect); mStackRectSansPeek.top += Constants.Values.TaskStackView.StackPeekHeightPct * mStackRect.height(); @@ -1275,7 +1285,12 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { } } if (mIsScrolling) { - mSv.setStackScroll(mSv.getStackScroll() + deltaY); + int curStackScroll = mSv.getStackScroll(); + if (mSv.isScrollOutOfBounds(curStackScroll + deltaY)) { + // Scale the touch if we are overscrolling + deltaY /= Constants.Values.TaskStackView.TouchOverscrollScaleFactor; + } + mSv.setStackScroll(curStackScroll + deltaY); if (mSv.isScrollOutOfBounds()) { mVelocityTracker.clear(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index fdf4dbf..56f83df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -54,6 +54,7 @@ public class ExpandableNotificationRow extends FrameLayout private boolean mMaxHeightNeedsUpdate; private NotificationActivator mActivator; private LatestItemView.OnActivatedListener mOnActivatedListener; + private boolean mSelfInitiatedLayout; public ExpandableNotificationRow(Context context, AttributeSet attrs) { super(context, attrs); @@ -162,6 +163,11 @@ public class ExpandableNotificationRow extends FrameLayout } private void updateMaxExpandHeight() { + + // We don't want this method to trigger a layout of the whole view hierarchy, + // as the layout parameters in the end are the same which they were in the beginning. + // Otherwise a loop may occur if this method is called on the layout of a parent. + mSelfInitiatedLayout = true; ViewGroup.LayoutParams lp = getLayoutParams(); int oldHeight = lp.height; lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; @@ -171,6 +177,14 @@ public class ExpandableNotificationRow extends FrameLayout lp.height = oldHeight; setLayoutParams(lp); mMaxExpandHeight = getMeasuredHeight(); + mSelfInitiatedLayout = false; + } + + @Override + public void requestLayout() { + if (!mSelfInitiatedLayout) { + super.requestLayout(); + } } /** @@ -257,4 +271,11 @@ public class ExpandableNotificationRow extends FrameLayout public void setBackgroundResourceIds(int bgResId, int dimmedBgResId) { mLatestItemView.setBackgroundResourceIds(bgResId, dimmedBgResId); } + + /** + * @return the potential height this view could expand in addition. + */ + public int getExpandPotential() { + return getMaximumAllowedExpandHeight() - getHeight(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java new file mode 100644 index 0000000..3cc22ef --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -0,0 +1,232 @@ +/* + * 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.systemui.statusbar.phone; + +import android.app.ActivityManagerNative; +import android.app.admin.DevicePolicyManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.PowerManager; +import android.os.RemoteException; +import android.os.UserHandle; +import android.provider.MediaStore; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityManager; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; +import android.widget.FrameLayout; + +import com.android.systemui.R; + +/** + * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status + * text. + */ +public class KeyguardBottomAreaView extends FrameLayout { + + final static String TAG = "PhoneStatusBar/KeyguardBottomAreaView"; + + private View mCameraButton; + private float mCameraDragDistance; + private PowerManager mPowerManager; + private int mScaledTouchSlop; + + public KeyguardBottomAreaView(Context context) { + super(context); + } + + public KeyguardBottomAreaView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public KeyguardBottomAreaView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public KeyguardBottomAreaView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mCameraButton = findViewById(R.id.camera_button); + watchForDevicePolicyChanges(); + watchForAccessibilityChanges(); + updateCameraVisibility(); + mCameraDragDistance = getResources().getDimension(R.dimen.camera_drag_distance); + mScaledTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + } + + private void updateCameraVisibility() { + boolean visible = !isCameraDisabledByDpm(); + mCameraButton.setVisibility(visible ? View.VISIBLE : View.GONE); + } + + private boolean isCameraDisabledByDpm() { + final DevicePolicyManager dpm = + (DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); + if (dpm != null) { + try { + final int userId = ActivityManagerNative.getDefault().getCurrentUser().id; + final int disabledFlags = dpm.getKeyguardDisabledFeatures(null, userId); + final boolean disabledBecauseKeyguardSecure = + (disabledFlags & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0 + && KeyguardTouchDelegate.getInstance(getContext()).isSecure(); + return dpm.getCameraDisabled(null) || disabledBecauseKeyguardSecure; + } catch (RemoteException e) { + Log.e(TAG, "Can't get userId", e); + } + } + return false; + } + + private void watchForDevicePolicyChanges() { + final IntentFilter filter = new IntentFilter(); + filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); + getContext().registerReceiver(new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + post(new Runnable() { + @Override + public void run() { + updateCameraVisibility(); + } + }); + } + }, filter); + } + + private void watchForAccessibilityChanges() { + final AccessibilityManager am = + (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); + + // Set the initial state + enableAccessibility(am.isTouchExplorationEnabled()); + + // Watch for changes + am.addTouchExplorationStateChangeListener( + new AccessibilityManager.TouchExplorationStateChangeListener() { + @Override + public void onTouchExplorationStateChanged(boolean enabled) { + enableAccessibility(enabled); + } + }); + } + + private void enableAccessibility(boolean touchExplorationEnabled) { + + // Add a touch handler or accessibility click listener for camera button. + if (touchExplorationEnabled) { + mCameraButton.setOnTouchListener(null); + mCameraButton.setOnClickListener(mCameraClickListener); + } else { + mCameraButton.setOnTouchListener(mCameraTouchListener); + mCameraButton.setOnClickListener(null); + } + } + + private void launchCamera() { + mContext.startActivityAsUser( + new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), + UserHandle.CURRENT); + } + + private final OnClickListener mCameraClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + launchCamera(); + } + }; + + private final OnTouchListener mCameraTouchListener = new OnTouchListener() { + private float mStartX; + private boolean mTouchSlopReached; + private boolean mSkipCancelAnimation; + + @Override + public boolean onTouch(final View cameraButtonView, MotionEvent event) { + float realX = event.getRawX(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mStartX = realX; + mTouchSlopReached = false; + mSkipCancelAnimation = false; + break; + case MotionEvent.ACTION_MOVE: + if (realX > mStartX) { + realX = mStartX; + } + if (realX < mStartX - mCameraDragDistance) { + cameraButtonView.setPressed(true); + mPowerManager.userActivity(event.getEventTime(), false); + } else { + cameraButtonView.setPressed(false); + } + if (realX < mStartX - mScaledTouchSlop) { + mTouchSlopReached = true; + } + cameraButtonView.setTranslationX(Math.max(realX - mStartX, + -mCameraDragDistance)); + break; + case MotionEvent.ACTION_UP: + if (realX < mStartX - mCameraDragDistance) { + launchCamera(); + cameraButtonView.animate().x(-cameraButtonView.getWidth()) + .setInterpolator(new AccelerateInterpolator(2f)).withEndAction( + new Runnable() { + @Override + public void run() { + cameraButtonView.setTranslationX(0); + } + }); + mSkipCancelAnimation = true; + } + if (realX < mStartX - mScaledTouchSlop) { + mTouchSlopReached = true; + } + if (!mTouchSlopReached) { + mSkipCancelAnimation = true; + cameraButtonView.animate().translationX(-mCameraDragDistance / 2). + setInterpolator(new DecelerateInterpolator()).withEndAction( + new Runnable() { + @Override + public void run() { + cameraButtonView.animate().translationX(0). + setInterpolator(new AccelerateInterpolator()); + } + }); + } + case MotionEvent.ACTION_CANCEL: + cameraButtonView.setPressed(false); + if (!mSkipCancelAnimation) { + cameraButtonView.animate().translationX(0) + .setInterpolator(new AccelerateInterpolator(2f)); + } + break; + } + return true; + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index f2054a2..cf31b44 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -83,7 +83,7 @@ public class KeyguardBouncer { } public void onScreenTurnedOff() { - if (mKeyguardView != null && mRoot.getVisibility() == View.VISIBLE) { + if (mKeyguardView != null && mRoot != null && mRoot.getVisibility() == View.VISIBLE) { mKeyguardView.onPause(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index d26b32f..a0582ee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -82,7 +82,6 @@ public final class NavigationBarTransitions extends BarTransitions { setKeyButtonViewQuiescentAlpha(mView.getMenuButton(), alpha, animate); setKeyButtonViewQuiescentAlpha(mView.getSearchLight(), KEYGUARD_QUIESCENT_ALPHA, animate); - setKeyButtonViewQuiescentAlpha(mView.getCameraButton(), KEYGUARD_QUIESCENT_ALPHA, animate); applyBackButtonQuiescentAlpha(mode, animate); @@ -98,7 +97,6 @@ public final class NavigationBarTransitions extends BarTransitions { public void applyBackButtonQuiescentAlpha(int mode, boolean animate) { float backAlpha = 0; backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getSearchLight()); - backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getCameraButton()); backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getHomeButton()); backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getRecentsButton()); backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getMenuButton()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 7ca672d..3fae3f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -21,36 +21,24 @@ import android.animation.LayoutTransition.TransitionListener; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; -import android.app.ActivityManagerNative; import android.app.StatusBarManager; -import android.app.admin.DevicePolicyManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; -import android.os.PowerManager; -import android.os.RemoteException; -import android.os.UserHandle; -import android.provider.MediaStore; import android.util.AttributeSet; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.Surface; import android.view.View; -import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; @@ -63,8 +51,6 @@ import com.android.systemui.statusbar.policy.KeyButtonView; import java.io.FileDescriptor; import java.io.PrintWriter; -import static com.android.systemui.statusbar.phone.KeyguardTouchDelegate.OnKeyguardConnectionListener; - public class NavigationBarView extends LinearLayout { final static boolean DEBUG = false; final static String TAG = "PhoneStatusBar/NavigationBarView"; @@ -98,16 +84,9 @@ public class NavigationBarView extends LinearLayout { final static boolean WORKAROUND_INVALID_LAYOUT = true; final static int MSG_CHECK_INVALID_LAYOUT = 8686; - private final float mCameraDragDistance; - - // used to disable the camera icon in navbar when disabled by DPM - private boolean mCameraDisabledByDpm; - // performs manual animation in sync with layout transitions private final NavTransitionListener mTransitionListener = new NavTransitionListener(); - private final PowerManager mPowerManager; - private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; private boolean mHomeAppearing; @@ -157,112 +136,12 @@ public class NavigationBarView extends LinearLayout { private final OnClickListener mAccessibilityClickListener = new OnClickListener() { @Override public void onClick(View v) { - if (v.getId() == R.id.camera_button) { - KeyguardTouchDelegate.getInstance(getContext()).launchCamera(); - } else if (v.getId() == R.id.search_light) { + if (v.getId() == R.id.search_light) { KeyguardTouchDelegate.getInstance(getContext()).showAssistant(); } } }; - private final int mScaledTouchSlop; - - private final OnTouchListener mCameraTouchListener = new OnTouchListener() { - private float mStartX; - private boolean mTouchSlopReached; - private boolean mSkipCancelAnimation; - - @Override - public boolean onTouch(final View cameraButtonView, MotionEvent event) { - float realX = event.getRawX(); - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - // disable search gesture while interacting with camera - mDelegateHelper.setDisabled(true); - mBarTransitions.setContentVisible(false); - mStartX = realX; - mTouchSlopReached = false; - mSkipCancelAnimation = false; - break; - case MotionEvent.ACTION_MOVE: - if (realX > mStartX) { - realX = mStartX; - } - if (realX < mStartX - mCameraDragDistance) { - ((KeyButtonView) cameraButtonView).setPressed(true); - mPowerManager.userActivity(event.getEventTime(), false); - } else { - ((KeyButtonView) cameraButtonView).setPressed(false); - } - if (realX < mStartX - mScaledTouchSlop) { - mTouchSlopReached = true; - } - cameraButtonView.setTranslationX(Math.max(realX - mStartX, - -mCameraDragDistance)); - break; - case MotionEvent.ACTION_UP: - if (realX < mStartX - mCameraDragDistance) { - mContext.startActivityAsUser( - new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), - UserHandle.CURRENT); - cameraButtonView.animate().x(-cameraButtonView.getWidth()) - .setInterpolator(new AccelerateInterpolator(2f)).withEndAction( - new Runnable() { - @Override - public void run() { - cameraButtonView.setTranslationX(0); - } - }); - mSkipCancelAnimation = true; - } - if (realX < mStartX - mScaledTouchSlop) { - mTouchSlopReached = true; - } - if (!mTouchSlopReached) { - mSkipCancelAnimation = true; - cameraButtonView.animate().translationX(-mCameraDragDistance / 2). - setInterpolator(new DecelerateInterpolator()).withEndAction( - new Runnable() { - @Override - public void run() { - cameraButtonView.animate().translationX(0). - setInterpolator(new AccelerateInterpolator()); - } - }); - } - case MotionEvent.ACTION_CANCEL: - ((KeyButtonView) cameraButtonView).setPressed(false); - mDelegateHelper.setDisabled(false); - mBarTransitions.setContentVisible(true); - if (!mSkipCancelAnimation) { - cameraButtonView.animate().translationX(0) - .setInterpolator(new AccelerateInterpolator(2f)); - } - break; - } - return true; - } - }; - - private final OnKeyguardConnectionListener mKeyguardConnectionListener = - new OnKeyguardConnectionListener() { - @Override - public void onKeyguardServiceConnected( - KeyguardTouchDelegate keyguardTouchDelegate) { - post(new Runnable() { - @Override - public void run() { - mCameraDisabledByDpm = isCameraDisabledByDpm(); - } - }); - } - - @Override - public void onKeyguardServiceDisconnected( - KeyguardTouchDelegate keyguardTouchDelegate) { - } - }; - private class H extends Handler { public void handleMessage(Message m) { switch (m.what) { @@ -301,28 +180,6 @@ public class NavigationBarView extends LinearLayout { getIcons(res); mBarTransitions = new NavigationBarTransitions(this); - - KeyguardTouchDelegate.addListener(mKeyguardConnectionListener); - mCameraDisabledByDpm = isCameraDisabledByDpm(); - watchForDevicePolicyChanges(); - mCameraDragDistance = res.getDimension(R.dimen.camera_drag_distance); - mScaledTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); - mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - } - - private void watchForDevicePolicyChanges() { - final IntentFilter filter = new IntentFilter(); - filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); - getContext().registerReceiver(new BroadcastReceiver() { - public void onReceive(Context context, Intent intent) { - post(new Runnable() { - @Override - public void run() { - mCameraDisabledByDpm = isCameraDisabledByDpm(); - } - }); - } - }, filter); } public BarTransitions getBarTransitions() { @@ -381,11 +238,6 @@ public class NavigationBarView extends LinearLayout { return mCurrentView.findViewById(R.id.search_light); } - // shown when keyguard is visible and camera is available - public View getCameraButton() { - return mCurrentView.findViewById(R.id.camera_button); - } - private void getIcons(Resources res) { mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back); mBackLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_land); @@ -475,9 +327,7 @@ public class NavigationBarView extends LinearLayout { getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE); final boolean showSearch = disableHome && !disableSearch; - final boolean showCamera = showSearch && !mCameraDisabledByDpm; setVisibleOrGone(getSearchLight(), showSearch); - setVisibleOrGone(getCameraButton(), showCamera); mBarTransitions.applyBackButtonQuiescentAlpha(mBarTransitions.getMode(), true /*animate*/); } @@ -488,24 +338,6 @@ public class NavigationBarView extends LinearLayout { } } - private boolean isCameraDisabledByDpm() { - final DevicePolicyManager dpm = - (DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); - if (dpm != null) { - try { - final int userId = ActivityManagerNative.getDefault().getCurrentUser().id; - final int disabledFlags = dpm.getKeyguardDisabledFeatures(null, userId); - final boolean disabledBecauseKeyguardSecure = - (disabledFlags & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0 - && KeyguardTouchDelegate.getInstance(getContext()).isSecure(); - return dpm.getCameraDisabled(null) || disabledBecauseKeyguardSecure; - } catch (RemoteException e) { - Log.e(TAG, "Can't get userId", e); - } - } - return false; - } - public void setSlippery(boolean newSlippery) { WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); if (lp != null) { @@ -572,25 +404,12 @@ public class NavigationBarView extends LinearLayout { // Add a touch handler or accessibility click listener for camera and search buttons // for all view orientations. final OnClickListener onClickListener = touchEnabled ? mAccessibilityClickListener : null; - final OnTouchListener onTouchListener = touchEnabled ? null : mCameraTouchListener; - boolean hasCamera = false; for (int i = 0; i < mRotatedViews.length; i++) { - final View cameraButton = mRotatedViews[i].findViewById(R.id.camera_button); final View searchLight = mRotatedViews[i].findViewById(R.id.search_light); - if (cameraButton != null) { - hasCamera = true; - cameraButton.setOnTouchListener(onTouchListener); - cameraButton.setOnClickListener(onClickListener); - } if (searchLight != null) { searchLight.setOnClickListener(onClickListener); } } - if (hasCamera) { - // Warm up KeyguardTouchDelegate so it's ready by the time the camera button is touched. - // This will connect to KeyguardService so that touch events are processed. - KeyguardTouchDelegate.getInstance(getContext()); - } } public boolean isVertical() { @@ -727,7 +546,6 @@ public class NavigationBarView extends LinearLayout { dumpButton(pw, "rcnt", getRecentsButton()); dumpButton(pw, "menu", getMenuButton()); dumpButton(pw, "srch", getSearchLight()); - dumpButton(pw, "cmra", getCameraButton()); pw.println(" }"); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 45ac50b..5d75801 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -38,6 +38,7 @@ public class NotificationPanelView extends PanelView { private int[] mTempChildLocation = new int[2]; private View mNotificationParent; private boolean mTrackingSettings; + private float mExpandedHeight = -1; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -173,6 +174,8 @@ public class NotificationPanelView extends PanelView { * @param expandedHeight the new expanded height */ private void updateNotificationStackHeight(float expandedHeight) { + if (mExpandedHeight == expandedHeight) return; + mExpandedHeight = expandedHeight; mNotificationStackScroller.setIsExpanded(expandedHeight > 0.0f); float childOffset = getRelativeTop(mNotificationStackScroller) - mNotificationParent.getTranslationY(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 0266144..328a172 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -46,7 +46,6 @@ public class PanelView extends FrameLayout { } public static final boolean BRAKES = false; - private boolean mRubberbandingEnabled = true; private float mSelfExpandVelocityPx; // classic value: 2000px/s private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up") @@ -68,14 +67,12 @@ public class PanelView extends FrameLayout { private float mExpandBrakingDistancePx = 150; // XXX Resource private float mBrakingSpeedPx = 150; // XXX Resource - private View mHandleView; private float mPeekHeight; private float mInitialOffsetOnTouch; private float mExpandedFraction = 0; private float mExpandedHeight = 0; private boolean mJustPeeked; private boolean mClosing; - private boolean mRubberbanding; private boolean mTracking; private int mTrackingPointer; private int mTouchSlop; @@ -214,7 +211,6 @@ public class PanelView extends FrameLayout { public void run() { if (mTimeAnimator != null && mTimeAnimator.isStarted()) { mTimeAnimator.end(); - mRubberbanding = false; mClosing = false; onExpandingFinished(); } @@ -225,12 +221,9 @@ public class PanelView extends FrameLayout { protected int mMaxPanelHeight = 0; private String mViewName; protected float mInitialTouchY; + protected float mInitialTouchX; protected float mFinalTouchY; - public void setRubberbandingEnabled(boolean enable) { - mRubberbandingEnabled = enable; - } - protected void onExpandingFinished() { } @@ -260,12 +253,7 @@ public class PanelView extends FrameLayout { mTimeAnimator.start(); - mRubberbanding = mRubberbandingEnabled // is it enabled at all? - && mExpandedHeight > getMaxPanelHeight() // are we past the end? - && mVel >= -mFlingGestureMinDistPx; // was this not possibly a "close" gesture? - if (mRubberbanding) { - mClosing = true; - } else if (mVel == 0) { + if (mVel == 0) { // if the panel is less than halfway open, close it mClosing = (mFinalTouchY / getMaxPanelHeight()) < 0.5f; } else { @@ -308,10 +296,6 @@ public class PanelView extends FrameLayout { float h = mExpandedHeight + mVel * dt; - if (mRubberbanding && h < fh) { - h = fh; - } - if (DEBUG) logf("tick: new h=%d closing=%s", (int) h, mClosing?"true":"false"); setExpandedHeightInternal(h); @@ -320,7 +304,7 @@ public class PanelView extends FrameLayout { if (mVel == 0 || (mClosing && mExpandedHeight == 0) - || ((mRubberbanding || !mClosing) && mExpandedHeight == fh)) { + || (!mClosing && mExpandedHeight == fh)) { post(mStopAnimator); } } else { @@ -358,8 +342,7 @@ public class PanelView extends FrameLayout { mFlingGestureMaxOutputVelocityPx = res.getDimension(R.dimen.fling_gesture_max_output_velocity); mPeekHeight = res.getDimension(R.dimen.peek_height) - + getPaddingBottom() // our window might have a dropshadow - - (mHandleView == null ? 0 : mHandleView.getPaddingTop()); // the handle might have a topshadow + + getPaddingBottom(); // our window might have a dropshadow final ViewConfiguration configuration = ViewConfiguration.get(getContext()); mTouchSlop = configuration.getScaledTouchSlop(); @@ -393,16 +376,14 @@ public class PanelView extends FrameLayout { mTrackingPointer = event.getPointerId(pointerIndex); } final float y = event.getY(pointerIndex); + final float x = event.getX(pointerIndex); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mTracking = true; - if (mHandleView != null) { - mHandleView.setPressed(true); - postInvalidate(); // catch the press state change - } mInitialTouchY = y; + mInitialTouchX = x; initVelocityTracker(); trackMovement(event); mTimeAnimator.cancel(); // end any outstanding animations @@ -420,9 +401,11 @@ public class PanelView extends FrameLayout { // gesture is ongoing, find a new pointer to track final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1; final float newY = event.getY(newIndex); + final float newX = event.getX(newIndex); mTrackingPointer = event.getPointerId(newIndex); mInitialOffsetOnTouch = mExpandedHeight; mInitialTouchY = newY; + mInitialTouchX = newX; } break; @@ -447,10 +430,6 @@ public class PanelView extends FrameLayout { mFinalTouchY = y; mTracking = false; mTrackingPointer = -1; - if (mHandleView != null) { - mHandleView.setPressed(false); - postInvalidate(); // catch the press state change - } onTrackingStopped(); trackMovement(event); @@ -541,23 +520,17 @@ public class PanelView extends FrameLayout { pointerIndex = 0; mTrackingPointer = event.getPointerId(pointerIndex); } + final float x = event.getX(pointerIndex); final float y = event.getY(pointerIndex); boolean scrolledToBottom = isScrolledToBottom(); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: - if (mHandleView != null) { - mHandleView.setPressed(true); - // catch the press state change - postInvalidate(); - } mInitialTouchY = y; + mInitialTouchX = x; initVelocityTracker(); trackMovement(event); mTimeAnimator.cancel(); // end any outstanding animations - if (mExpandedHeight == 0 || y > getContentHeight()) { - return true; - } break; case MotionEvent.ACTION_POINTER_UP: final int upPointer = event.getPointerId(event.getActionIndex()); @@ -565,8 +538,8 @@ public class PanelView extends FrameLayout { // gesture is ongoing, find a new pointer to track final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1; mTrackingPointer = event.getPointerId(newIndex); - final float newY = event.getY(newIndex); - mInitialTouchY = newY; + mInitialTouchX = event.getX(newIndex); + mInitialTouchY = event.getY(newIndex); } break; @@ -574,9 +547,10 @@ public class PanelView extends FrameLayout { final float h = y - mInitialTouchY; trackMovement(event); if (scrolledToBottom) { - if (h < -mTouchSlop) { + if (h < -mTouchSlop && h < -Math.abs(x - mInitialTouchX)) { mInitialOffsetOnTouch = mExpandedHeight; mInitialTouchY = y; + mInitialTouchX = x; mTracking = true; onTrackingStarted(); return true; @@ -605,7 +579,6 @@ public class PanelView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mHandleView = findViewById(R.id.handle); loadDimens(); } @@ -631,10 +604,6 @@ public class PanelView extends FrameLayout { return mViewName; } - public View getHandle() { - return mHandleView; - } - // Rubberbands the panel to hold its contents. @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @@ -648,14 +617,14 @@ public class PanelView extends FrameLayout { if (newHeight != mMaxPanelHeight) { mMaxPanelHeight = newHeight; // If the user isn't actively poking us, let's rubberband to the content - if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() + if (!mTracking && !mTimeAnimator.isStarted() && mExpandedHeight > 0 && mExpandedHeight != mMaxPanelHeight && mMaxPanelHeight > 0) { mExpandedHeight = mMaxPanelHeight; } } heightMeasureSpec = MeasureSpec.makeMeasureSpec( - getDesiredMeasureHeight(), MeasureSpec.AT_MOST); + getDesiredMeasureHeight(), MeasureSpec.AT_MOST); setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); } @@ -666,7 +635,6 @@ public class PanelView extends FrameLayout { public void setExpandedHeight(float height) { if (DEBUG) logf("setExpandedHeight(%.1f)", height); - mRubberbanding = false; if (mTimeAnimator.isStarted()) { post(mStopAnimator); } @@ -686,7 +654,7 @@ public class PanelView extends FrameLayout { float currentMaxPanelHeight = getMaxPanelHeight(); // If the user isn't actively poking us, let's update the height - if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() + if (!mTracking && !mTimeAnimator.isStarted() && mExpandedHeight > 0 && currentMaxPanelHeight != mExpandedHeight) { setExpandedHeightInternal(currentMaxPanelHeight); } @@ -708,13 +676,13 @@ public class PanelView extends FrameLayout { } if (h < 0) h = 0; - if (!(mRubberbandingEnabled && (mTracking || mRubberbanding)) && h > fh) h = fh; + if (h > fh) h = fh; mExpandedHeight = h; if (DEBUG) { - logf("setExpansion: height=%.1f fh=%.1f tracking=%s rubber=%s", h, fh, - mTracking ? "T" : "f", mRubberbanding ? "T" : "f"); + logf("setExpansion: height=%.1f fh=%.1f tracking=%s", h, fh, + mTracking ? "T" : "f"); } onHeightUpdated(mExpandedHeight); @@ -793,7 +761,6 @@ public class PanelView extends FrameLayout { mClosing = true; onExpandingStarted(); // collapse() should never be a rubberband, even if an animation is already running - mRubberbanding = false; fling(-mSelfCollapseVelocityPx, /*always=*/ true); } } @@ -817,14 +784,13 @@ public class PanelView extends FrameLayout { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(String.format("[PanelView(%s): expandedHeight=%f maxPanelHeight=%d closing=%s" - + " tracking=%s rubberbanding=%s justPeeked=%s peekAnim=%s%s timeAnim=%s%s" + + " tracking=%s justPeeked=%s peekAnim=%s%s timeAnim=%s%s" + "]", this.getClass().getSimpleName(), getExpandedHeight(), getMaxPanelHeight(), mClosing?"T":"f", mTracking?"T":"f", - mRubberbanding?"T":"f", mJustPeeked?"T":"f", mPeekAnimator, ((mPeekAnimator!=null && mPeekAnimator.isStarted())?" (started)":""), mTimeAnimator, ((mTimeAnimator!=null && mTimeAnimator.isStarted())?" (started)":"") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index d577070..2d96c5e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -78,6 +78,7 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewPropertyAnimator; import android.view.ViewStub; +import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; @@ -220,15 +221,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // settings QuickSettings mQS; - boolean mHasSettingsPanel, mHasFlipSettings; - SettingsPanelView mSettingsPanel; + boolean mHasQuickSettings; View mFlipSettingsView; QuickSettingsContainerView mSettingsContainer; - int mSettingsPanelGravity; // top bar View mNotificationPanelHeader; View mKeyguardStatusView; + View mKeyguardBottomArea; int mKeyguardMaxNotificationCount; View mDateTimeView; View mClearButton; @@ -315,9 +315,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mHeaderFlipper.userSetup(userSetup); mKeyguardFlipper.userSetup(userSetup); - if (mSettingsPanel != null) { - mSettingsPanel.setEnabled(userSetup); - } if (userSetup != mUserSetup) { mUserSetup = userSetup; if (!mUserSetup && mStatusBarView != null) @@ -617,6 +614,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mNotificationPanelHeader = mStatusBarWindow.findViewById(R.id.header); mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view); + mKeyguardBottomArea = mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); mClearButton = mStatusBarWindow.findViewById(R.id.clear_all_button); mClearButton.setOnClickListener(mClearButtonListener); @@ -625,8 +623,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mClearButton.setEnabled(false); mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date); - mHasSettingsPanel = res.getBoolean(R.bool.config_hasSettingsPanel); - mHasFlipSettings = res.getBoolean(R.bool.config_hasFlipSettingsPanel); + mHasQuickSettings = res.getBoolean(R.bool.config_hasQuickSettings); mDateTimeView = mNotificationPanelHeader.findViewById(R.id.datetime); if (mDateTimeView != null) { @@ -634,10 +631,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mDateTimeView.setEnabled(true); } - mHeaderFlipper = new FlipperButton(mNotificationPanelHeader - .findViewById(R.id.settings_button_holder)); - ViewStub flipStub = (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_flip_stub); - mKeyguardFlipper = new FlipperButton(flipStub.inflate()); + mHeaderFlipper = new FlipperButton(mStatusBarWindow.findViewById(R.id.header_flipper)); + mKeyguardFlipper =new FlipperButton(mStatusBarWindow.findViewById(R.id.keyguard_flipper)); if (!mNotificationPanelIsFullScreenWidth) { mNotificationPanel.setSystemUiVisibility( @@ -715,37 +710,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // Quick Settings (where available, some restrictions apply) mNotificationPadding = mContext.getResources() .getDimensionPixelSize(R.dimen.notification_side_padding); - if (mHasSettingsPanel) { - // first, figure out where quick settings should be inflated - final View settings_stub; - if (mHasFlipSettings) { - // a version of quick settings that flips around behind the notifications - settings_stub = mStatusBarWindow.findViewById(R.id.flip_settings_stub); - if (settings_stub != null) { - mFlipSettingsView = ((ViewStub)settings_stub).inflate(); - mFlipSettingsView.setVisibility(View.GONE); - mFlipSettingsView.setVerticalScrollBarEnabled(false); - } - } else { - // full quick settings panel - settings_stub = mStatusBarWindow.findViewById(R.id.quick_settings_stub); - if (settings_stub != null) { - mSettingsPanel = (SettingsPanelView) ((ViewStub)settings_stub).inflate(); - } else { - mSettingsPanel = (SettingsPanelView) mStatusBarWindow.findViewById(R.id.settings_panel); - } - - if (mSettingsPanel != null) { - if (!ActivityManager.isHighEndGfx()) { - mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor( - R.color.notification_panel_solid_background))); - } - } - } - - // wherever you find it, Quick Settings needs a container to survive + if (mHasQuickSettings) { + // Quick Settings needs a container to survive mSettingsContainer = (QuickSettingsContainerView) mStatusBarWindow.findViewById(R.id.quick_settings_container); + mFlipSettingsView = mSettingsContainer; if (mSettingsContainer != null) { mQS = new QuickSettings(mContext, mSettingsContainer); if (!mNotificationPanelIsFullScreenWidth) { @@ -753,9 +722,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS | View.STATUS_BAR_DISABLE_SYSTEM_INFO); } - if (mSettingsPanel != null) { - mSettingsPanel.setQuickSettings(mQS); - } mQS.setService(this); mQS.setBar(mStatusBarView); mQS.setup(mNetworkController, mBluetoothController, mBatteryController, @@ -784,6 +750,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } public boolean onSettingsEvent(MotionEvent event) { + userActivity(); + if (mSettingsClosing + && mFlipSettingsViewAnim != null && mFlipSettingsViewAnim.isRunning()) { + return true; + } if (mSettingsTracker != null) { mSettingsTracker.addMovement(event); } @@ -851,15 +822,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } private void positionSettings(float dy) { - final int h = mFlipSettingsView.getMeasuredHeight(); - final int ph = mNotificationPanel.getMeasuredHeight(); if (mSettingsClosing) { + final int ph = mNotificationPanel.getMeasuredHeight(); dy = Math.min(Math.max(-ph, dy), 0); mFlipSettingsView.setTranslationY(dy); mStackScroller.setTranslationY(ph + dy); } else { - dy = Math.min(Math.max(0, dy), ph); - mFlipSettingsView.setTranslationY(-h + dy - mNotificationPadding * 2); + final int h = mFlipSettingsView.getBottom(); + dy = Math.min(Math.max(0, dy), h); + mFlipSettingsView.setTranslationY(-h + dy); mStackScroller.setTranslationY(dy); } } @@ -1397,8 +1368,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { + " any=" + any + " clearable=" + clearable); } - if (mHasFlipSettings - && mFlipSettingsView != null + if (mFlipSettingsView != null && mFlipSettingsView.getVisibility() == View.VISIBLE && mStackScroller.getVisibility() != View.VISIBLE) { // the flip settings panel is unequivocally showing; we should not be shown @@ -1758,7 +1728,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } mNotificationPanel.expand(); - if (mHasFlipSettings && mStackScroller.getVisibility() != View.VISIBLE) { + if (mStackScroller.getVisibility() != View.VISIBLE) { flipToNotifications(); } @@ -1771,17 +1741,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mHeaderFlipper.cancel(); mKeyguardFlipper.cancel(); if (mClearButtonAnim != null) mClearButtonAnim.cancel(); - mStackScroller.setVisibility(View.VISIBLE); final int h = mNotificationPanel.getMeasuredHeight(); final float settingsY = mSettingsTracker != null ? mFlipSettingsView.getTranslationY() : 0; final float scrollerY = mSettingsTracker != null ? mStackScroller.getTranslationY() : h; mScrollViewAnim = start( - startDelay(0, interpolator(mDecelerateInterpolator, ObjectAnimator.ofFloat(mStackScroller, View.TRANSLATION_Y, scrollerY, 0) .setDuration(FLIP_DURATION) - ))); + )); mFlipSettingsViewAnim = start( setVisibilityWhenDone( interpolator(mDecelerateInterpolator, @@ -1814,14 +1782,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // Settings are not available in setup if (!mUserSetup) return; - if (mHasFlipSettings) { - mNotificationPanel.expand(); - if (mFlipSettingsView.getVisibility() != View.VISIBLE - || mFlipSettingsView.getTranslationY() < 0) { - flipToSettings(); - } - } else if (mSettingsPanel != null) { - mSettingsPanel.expand(); + mNotificationPanel.expand(); + if (mFlipSettingsView.getVisibility() != View.VISIBLE + || mFlipSettingsView.getTranslationY() < 0) { + flipToSettings(); } if (false) postStartTracing(); @@ -1879,12 +1843,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } public void flipPanels() { - if (mHasFlipSettings) { - if (mFlipSettingsView.getVisibility() != View.VISIBLE) { - flipToSettings(); - } else { - flipToNotifications(); - } + if (mFlipSettingsView.getVisibility() != View.VISIBLE) { + flipToSettings(); + } else { + flipToNotifications(); } } @@ -1907,21 +1869,19 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868) mStatusBarView.collapseAllPanels(/*animate=*/ false); - if (mHasFlipSettings) { - // reset things to their proper state - if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); - if (mScrollViewAnim != null) mScrollViewAnim.cancel(); - if (mClearButtonAnim != null) mClearButtonAnim.cancel(); + // reset things to their proper state + if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); + if (mScrollViewAnim != null) mScrollViewAnim.cancel(); + if (mClearButtonAnim != null) mClearButtonAnim.cancel(); - mStackScroller.setVisibility(View.VISIBLE); - mNotificationPanel.setVisibility(View.GONE); - mFlipSettingsView.setVisibility(View.GONE); + mStackScroller.setVisibility(View.VISIBLE); + mNotificationPanel.setVisibility(View.GONE); + mFlipSettingsView.setVisibility(View.GONE); - setAreThereNotifications(); // show the clear button + setAreThereNotifications(); // show the clear button - mHeaderFlipper.reset(); - mKeyguardFlipper.reset(); - } + mHeaderFlipper.reset(); + mKeyguardFlipper.reset(); mExpandedVisible = false; if (mNavigationBarView != null) @@ -2111,7 +2071,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { private void checkBarModes() { if (mDemoMode) return; int sbMode = mStatusBarMode; - if (panelsEnabled() && (mInteractingWindows & StatusBarManager.WINDOW_STATUS_BAR) != 0) { + if (panelsEnabled() && (mInteractingWindows & StatusBarManager.WINDOW_STATUS_BAR) != 0 + && !mOnKeyguard) { // if panels are expandable, force the status bar opaque on any interaction sbMode = MODE_OPAQUE; } @@ -2366,12 +2327,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { pw.print (" "); mNotificationPanel.dump(fd, pw, args); } - if (mSettingsPanel != null) { - pw.println(" mSettingsPanel=" + - mSettingsPanel + " params=" + mSettingsPanel.getLayoutParams().debug("")); - pw.print (" "); - mSettingsPanel.dump(fd, pw, args); - } if (DUMPTRUCK) { synchronized (mNotificationData) { @@ -2474,13 +2429,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { lp.setMarginStart(mNotificationPanelMarginPx); mNotificationPanel.setLayoutParams(lp); - if (mSettingsPanel != null) { - lp = (FrameLayout.LayoutParams) mSettingsPanel.getLayoutParams(); - lp.gravity = mSettingsPanelGravity; - lp.setMarginEnd(mNotificationPanelMarginPx); - mSettingsPanel.setLayoutParams(lp); - } - if (ENABLE_HEADS_UP && mHeadsUpNotificationView != null) { mHeadsUpNotificationView.setMargin(mNotificationPanelMarginPx); mStackScroller.getLocationOnScreen(mStackScrollerPosition); @@ -2536,7 +2484,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { private View.OnClickListener mSettingsButtonListener = new View.OnClickListener() { public void onClick(View v) { - if (mHasSettingsPanel) { + if (mHasQuickSettings) { animateExpandSettingsPanel(); } else { startActivityDismissingKeyguard( @@ -2734,11 +2682,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (mNotificationPanelGravity <= 0) { mNotificationPanelGravity = Gravity.START | Gravity.TOP; } - mSettingsPanelGravity = res.getInteger(R.integer.settings_panel_layout_gravity); - Log.d(TAG, "mSettingsPanelGravity = " + mSettingsPanelGravity); - if (mSettingsPanelGravity <= 0) { - mSettingsPanelGravity = Gravity.END | Gravity.TOP; - } mCarrierLabelHeight = res.getDimensionPixelSize(R.dimen.carrier_label_height); mNotificationHeaderHeight = res.getDimensionPixelSize(R.dimen.notification_panel_header_height); @@ -2972,22 +2915,26 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { flipToNotifications(); } mKeyguardStatusView.setVisibility(View.VISIBLE); + mKeyguardBottomArea.setVisibility(View.VISIBLE); mNotificationPanelHeader.setVisibility(View.GONE); mKeyguardFlipper.setVisibility(View.VISIBLE); mSettingsContainer.setKeyguardShowing(true); updateRowStates(); + checkBarModes(); } public void hideKeyguard() { mOnKeyguard = false; mKeyguardStatusView.setVisibility(View.GONE); + mKeyguardBottomArea.setVisibility(View.GONE); mNotificationPanelHeader.setVisibility(View.VISIBLE); mKeyguardFlipper.setVisibility(View.GONE); mSettingsContainer.setKeyguardShowing(false); updateRowStates(); instantCollapseNotificationPanel(); + checkBarModes(); } public void userActivity() { @@ -3016,8 +2963,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } private void instantExpandNotificationsPanel() { - mExpandedVisible = true; - mNotificationPanel.setExpandedFraction(1); + mNotificationPanel.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + mNotificationPanel.getViewTreeObserver().removeOnGlobalLayoutListener(this); + mNotificationPanel.setExpandedFraction(1); + } + }); } private void instantCollapseNotificationPanel() { @@ -3035,16 +2988,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { return mKeyguardMaxNotificationCount; } + public NavigationBarView getNavigationBarView() { + return mNavigationBarView; + } + /** * @return a ViewGroup that spans the entire panel which contains the quick settings */ public ViewGroup getQuickSettingsOverlayParent() { - if (mHasSettingsPanel) { - if (mHasFlipSettings) { - return mNotificationPanel; - } else { - return mSettingsPanel; - } + if (mHasQuickSettings) { + return mNotificationPanel; } else { return null; } @@ -3070,7 +3023,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mSettingsButton = (ImageView) holder.findViewById(R.id.settings_button); if (mSettingsButton != null) { mSettingsButton.setOnClickListener(mSettingsButtonListener); - if (mHasSettingsPanel) { + if (mHasQuickSettings) { // the settings panel is hiding behind this button mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings); mSettingsButton.setVisibility(View.VISIBLE); @@ -3080,11 +3033,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mSettingsButton.setImageResource(R.drawable.ic_notify_settings); } } - if (mHasFlipSettings) { - mNotificationButton = (ImageView) holder.findViewById(R.id.notification_button); - if (mNotificationButton != null) { - mNotificationButton.setOnClickListener(mNotificationButtonListener); - } + mNotificationButton = (ImageView) holder.findViewById(R.id.notification_button); + if (mNotificationButton != null) { + mNotificationButton.setOnClickListener(mNotificationButtonListener); } } @@ -3099,7 +3050,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } public void userSetup(boolean userSetup) { - if (mSettingsButton != null && mHasFlipSettings) { + if (mSettingsButton != null) { mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE); } } @@ -3128,25 +3079,27 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mSettingsButtonAnim = start( setVisibilityWhenDone( ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f) - .setDuration(FLIP_DURATION), + .setDuration(FLIP_DURATION_OUT), mStackScroller, View.INVISIBLE)); mNotificationButton.setVisibility(View.VISIBLE); mNotificationButtonAnim = start( - ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f) - .setDuration(FLIP_DURATION)); + startDelay(FLIP_DURATION_OUT, + ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION_IN))); } public void flipToNotifications() { mNotificationButtonAnim = start( setVisibilityWhenDone( ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f) - .setDuration(FLIP_DURATION), + .setDuration(FLIP_DURATION_OUT), mNotificationButton, View.INVISIBLE)); mSettingsButton.setVisibility(View.VISIBLE); mSettingsButtonAnim = start( - ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f) - .setDuration(FLIP_DURATION)); + startDelay(FLIP_DURATION_OUT, + ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION_IN))); } public void cancel() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 583fc3e..6ba18b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -38,13 +38,10 @@ public class PhoneStatusBarView extends PanelBar { PhoneStatusBar mBar; int mScrimColor; int mScrimColorKeyguard; - float mSettingsPanelDragzoneFrac; - float mSettingsPanelDragzoneMin; - boolean mFullWidthNotifications; PanelView mFadingPanel = null; PanelView mLastFullyOpenedPanel = null; - PanelView mNotificationPanel, mSettingsPanel; + PanelView mNotificationPanel; private boolean mShouldFade; private final PhoneStatusBarTransitions mBarTransitions; @@ -54,13 +51,6 @@ public class PhoneStatusBarView extends PanelBar { Resources res = getContext().getResources(); mScrimColor = res.getColor(R.color.notification_panel_scrim_color); mScrimColorKeyguard = res.getColor(R.color.notification_panel_scrim_color_keyguard); - mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min); - try { - mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1); - } catch (NotFoundException ex) { - mSettingsPanelDragzoneFrac = 0f; - } - mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f; mBarTransitions = new PhoneStatusBarTransitions(this); } @@ -72,15 +62,8 @@ public class PhoneStatusBarView extends PanelBar { mBar = bar; } - public boolean hasFullWidthNotifications() { - return mFullWidthNotifications; - } - @Override public void onAttachedToWindow() { - for (PanelView pv : mPanels) { - pv.setRubberbandingEnabled(!mFullWidthNotifications); - } mBarTransitions.init(); } @@ -89,10 +72,7 @@ public class PhoneStatusBarView extends PanelBar { super.addPanel(pv); if (pv.getId() == R.id.notification_panel) { mNotificationPanel = pv; - } else if (pv.getId() == R.id.settings_panel){ - mSettingsPanel = pv; } - pv.setRubberbandingEnabled(!mFullWidthNotifications); } @Override @@ -117,34 +97,10 @@ public class PhoneStatusBarView extends PanelBar { @Override public PanelView selectPanelForTouch(MotionEvent touch) { - final float x = touch.getX(); - final boolean isLayoutRtl = isLayoutRtl(); - - if (mFullWidthNotifications) { - // No double swiping. If either panel is open, nothing else can be pulled down. - return ((mSettingsPanel == null ? 0 : mSettingsPanel.getExpandedHeight()) - + mNotificationPanel.getExpandedHeight() > 0) - ? null - : mNotificationPanel; - } - - // We split the status bar into thirds: the left 2/3 are for notifications, and the - // right 1/3 for quick settings. If you pull the status bar down a second time you'll - // toggle panels no matter where you pull it down. - - final float w = getMeasuredWidth(); - float region = (w * mSettingsPanelDragzoneFrac); - - if (DEBUG) { - Log.v(TAG, String.format( - "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f", - w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x))); - } - - if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin; - - final boolean showSettings = isLayoutRtl ? (x < region) : (w - region < x); - return showSettings ? mSettingsPanel : mNotificationPanel; + // No double swiping. If either panel is open, nothing else can be pulled down. + return mNotificationPanel.getExpandedHeight() > 0 + ? null + : mNotificationPanel; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java index 02e9c0d..c44cb0c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java @@ -62,18 +62,19 @@ class QuickSettingsContainerView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mScrim = new ScrimView(mContext); - addView(mScrim); - mScrim.setAlpha(sShowScrim ? 1 : 0); + if (sShowScrim) { + mScrim = new ScrimView(mContext); + addView(mScrim); + } // TODO: Setup the layout transitions LayoutTransition transitions = getLayoutTransition(); } @Override public boolean onTouchEvent(MotionEvent event) { - if (mScrim.getAlpha() == 1) { - mScrim.animate().alpha(0).setDuration(1000).start(); + if (mScrim != null) { sShowScrim = false; + removeView(mScrim); } return super.onTouchEvent(event); } @@ -144,7 +145,9 @@ class QuickSettingsContainerView extends FrameLayout { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - mScrim.bringToFront(); + if (mScrim != null) { + mScrim.bringToFront(); + } final int N = getChildCount(); final boolean isLayoutRtl = isLayoutRtl(); final int width = getWidth(); @@ -206,6 +209,7 @@ class QuickSettingsContainerView extends FrameLayout { } private static final class ScrimView extends View { + private static final int SCRIM = 0x4f000000; private static final int COLOR = 0xaf4285f4; private final Paint mLinePaint; @@ -240,6 +244,7 @@ class QuickSettingsContainerView extends FrameLayout { final int h = getMeasuredHeight(); final int f = mStrokeWidth * 3 / 4; + canvas.drawColor(SCRIM); canvas.drawPath(line(f, h / 2, w - f, h / 2), mLinePaint); canvas.drawPath(line(w / 2, f, w / 2, h - f), mLinePaint); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index 9b25046..e1ef83a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -608,7 +608,7 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); mZenModeState.enabled = mode != Settings.Global.ZEN_MODE_OFF; mZenModeState.zenMode = mode; - mZenModeState.label = ZenModeView.MODE_LABEL; + mZenModeState.label = mContext.getString(R.string.zen_mode_title); mZenModeState.iconId = R.drawable.stat_sys_zen_limited; mZenModeCallback.refreshView(mZenModeTile, mZenModeState); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java deleted file mode 100644 index c10a0d4..0000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2012 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.systemui.statusbar.phone; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.util.EventLog; -import android.view.MotionEvent; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; - -import com.android.systemui.EventLogTags; -import com.android.systemui.R; -import com.android.systemui.statusbar.GestureRecorder; -import com.android.systemui.statusbar.policy.BatteryController; -import com.android.systemui.statusbar.policy.BluetoothController; -import com.android.systemui.statusbar.policy.LocationController; -import com.android.systemui.statusbar.policy.NetworkController; -import com.android.systemui.statusbar.policy.RotationLockController; - -public class SettingsPanelView extends PanelView { - public static final boolean DEBUG_GESTURES = true; - - private QuickSettings mQS; - private QuickSettingsContainerView mQSContainer; - - Drawable mHandleBar; - int mHandleBarHeight; - View mHandleView; - - public SettingsPanelView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - mQSContainer = (QuickSettingsContainerView) findViewById(R.id.quick_settings_container); - - Resources resources = getContext().getResources(); - mHandleBar = resources.getDrawable(R.drawable.status_bar_close); - mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); - mHandleView = findViewById(R.id.handle); - } - - public void setQuickSettings(QuickSettings qs) { - mQS = qs; - } - - @Override - public void setBar(PanelBar panelBar) { - super.setBar(panelBar); - - if (mQS != null) { - mQS.setBar(panelBar); - } - } - - public void setImeWindowStatus(boolean visible) { - if (mQS != null) { - mQS.setImeWindowStatus(visible); - } - } - - public void setup(NetworkController networkController, BluetoothController bluetoothController, - BatteryController batteryController, LocationController locationController, - RotationLockController rotationLockController) { - if (mQS != null) { - mQS.setup(networkController, bluetoothController, batteryController, - locationController, rotationLockController); - } - } - - void updateResources() { - if (mQS != null) { - mQS.updateResources(); - } - if (mQSContainer != null) { - mQSContainer.updateResources(); - } - requestLayout(); - } - - @Override - public void fling(float vel, boolean always) { - GestureRecorder gr = ((PhoneStatusBarView) mBar).mBar.getGestureRecorder(); - if (gr != null) { - gr.tag( - "fling " + ((vel > 0) ? "open" : "closed"), - "settings,v=" + vel); - } - super.fling(vel, always); - } - - public void setService(PhoneStatusBar phoneStatusBar) { - if (mQS != null) { - mQS.setService(phoneStatusBar); - } - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { - event.getText() - .add(getContext().getString(R.string.accessibility_desc_quick_settings)); - return true; - } - - return super.dispatchPopulateAccessibilityEvent(event); - } - - // We draw the handle ourselves so that it's always glued to the bottom of the window. - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - if (changed) { - final int pl = getPaddingLeft(); - final int pr = getPaddingRight(); - mHandleBar.setBounds(pl, 0, getWidth() - pr, (int) mHandleBarHeight); - } - } - - @Override - public void draw(Canvas canvas) { - super.draw(canvas); - final int off = (int) (getHeight() - mHandleBarHeight - getPaddingBottom()); - canvas.translate(0, off); - mHandleBar.setState(mHandleView.getDrawableState()); - mHandleBar.draw(canvas); - canvas.translate(0, -off); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (DEBUG_GESTURES) { - if (event.getActionMasked() != MotionEvent.ACTION_MOVE) { - EventLog.writeEvent(EventLogTags.SYSUI_QUICKPANEL_TOUCH, - event.getActionMasked(), (int) event.getX(), (int) event.getY()); - } - } - return super.onTouchEvent(event); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 41b5b7c..501d3f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -56,6 +56,7 @@ public class StatusBarKeyguardViewManager { private boolean mScreenOn = false; private KeyguardBouncer mBouncer; private boolean mShowing; + private boolean mOccluded; public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils) { @@ -152,7 +153,9 @@ public class StatusBarKeyguardViewManager { } public void setOccluded(boolean occluded) { + mOccluded = occluded; mStatusBarWindowManager.setKeyguardOccluded(occluded); + updateBackButtonState(); } /** @@ -164,6 +167,7 @@ public class StatusBarKeyguardViewManager { mStatusBarWindowManager.setKeyguardShowing(false); mBouncer.hide(); mViewMediatorCallback.keyguardGone(); + updateBackButtonState(); } /** @@ -205,6 +209,11 @@ public class StatusBarKeyguardViewManager { } else { mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); } + if (!(mShowing && !mOccluded) || mBouncer.isShowing()) { + mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE); + } else { + mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE); + } } public boolean onMenuPressed() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 1d675bd..c5dae85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -20,6 +20,7 @@ import android.app.StatusBarManager; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Rect; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; @@ -52,6 +53,16 @@ public class StatusBarWindowView extends FrameLayout } @Override + protected boolean fitSystemWindows(Rect insets) { + if (getFitsSystemWindows()) { + setPadding(insets.left, insets.top, insets.right, insets.bottom); + } else { + setPadding(0, 0, 0, 0); + } + return true; + } + + @Override protected void onAttachedToWindow () { super.onAttachedToWindow(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java index 49cf78b..c1662ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java @@ -42,13 +42,13 @@ import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; +import com.android.systemui.R; import com.android.systemui.statusbar.phone.ZenModeView.Adapter.ExitCondition; public class ZenModeView extends RelativeLayout { private static final String TAG = ZenModeView.class.getSimpleName(); private static final boolean DEBUG = false; - public static final String MODE_LABEL = "Limited interruptions"; public static final int BACKGROUND = 0xff282828; private static final Typeface CONDENSED = @@ -91,7 +91,7 @@ public class ZenModeView extends RelativeLayout { LayoutParams lp = null; mModeText = new TextView(mContext); - mModeText.setText(MODE_LABEL); + mModeText.setText(R.string.zen_mode_title); mModeText.setId(android.R.id.title); mModeText.setTextColor(GRAY); mModeText.setTypeface(CONDENSED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 9800bc9..36d94a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -20,7 +20,6 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; -import android.graphics.Outline; import android.graphics.Paint; import android.util.AttributeSet; @@ -31,6 +30,7 @@ import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.OverScroller; import com.android.systemui.ExpandHelper; @@ -55,7 +55,7 @@ public class NotificationStackScrollLayout extends ViewGroup private static final int INVALID_POINTER = -1; private SwipeHelper mSwipeHelper; - private boolean mSwipingInProgress = true; + private boolean mSwipingInProgress; private int mCurrentStackHeight = Integer.MAX_VALUE; private int mOwnScrollY; private int mMaxLayoutHeight; @@ -73,7 +73,6 @@ public class NotificationStackScrollLayout extends ViewGroup private int mSidePaddings; private Paint mDebugPaint; - private int mBackgroundRoundedRectCornerRadius; private int mContentHeight; private int mCollapsedSize; private int mBottomStackPeekSize; @@ -145,9 +144,6 @@ public class NotificationStackScrollLayout extends ViewGroup mSidePaddings = context.getResources() .getDimensionPixelSize(R.dimen.notification_side_padding); - mBackgroundRoundedRectCornerRadius = context.getResources() - .getDimensionPixelSize( - com.android.internal.R.dimen.notification_quantum_rounded_rect_radius); mCollapsedSize = context.getResources() .getDimensionPixelSize(R.dimen.notification_row_min_height); mBottomStackPeekSize = context.getResources() @@ -177,18 +173,23 @@ public class NotificationStackScrollLayout extends ViewGroup View child = getChildAt(i); float width = child.getMeasuredWidth(); float height = child.getMeasuredHeight(); - int oldWidth = child.getWidth(); - int oldHeight = child.getHeight(); child.layout((int) (centerX - width / 2.0f), 0, (int) (centerX + width / 2.0f), (int) height); - updateChildOutline(child, width, height, oldWidth, oldHeight); } setMaxLayoutHeight(getHeight() - mEmptyMarginBottom); - updateScrollPositionIfNecessary(); - updateChildren(); updateContentHeight(); + getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + updateScrollPositionIfNecessary(); + updateChildren(); + getViewTreeObserver().removeOnPreDrawListener(this); + return true; + } + }); + } public void setChildLocationsChangedListener(OnChildLocationsChangedListener listener) { @@ -227,7 +228,6 @@ public class NotificationStackScrollLayout extends ViewGroup mCurrentStackScrollState.setScrollY(mOwnScrollY); mStackScrollAlgorithm.getStackScrollState(mCurrentStackScrollState); mCurrentStackScrollState.apply(); - mOwnScrollY = mCurrentStackScrollState.getScrollY(); if (mListener != null) { mListener.onChildLocationsChanged(this); } @@ -240,31 +240,6 @@ public class NotificationStackScrollLayout extends ViewGroup return false; } - private void updateChildOutline(View child, - float width, - float height, - int oldWidth, - int oldHeight) { - // The children currently have paddings inside themselfs because of the expansion - // visualization. In order for the shadows to work correctly we have to set the correct - // outline. - View container = child.findViewById(R.id.container); - if (container != null && (oldWidth != width || oldHeight != height)) { - Outline outline = getOutlineForSize(container.getLeft(), - container.getTop(), - container.getWidth(), - container.getHeight()); - child.setOutline(outline); - } - } - - private Outline getOutlineForSize(int leftInset, int topInset, int width, int height) { - Outline result = new Outline(); - result.setRoundRect(leftInset, topInset, leftInset + width, topInset + height, - mBackgroundRoundedRectCornerRadius); - return result; - } - private void updateScrollPositionIfNecessary() { int scrollRange = getScrollRange(); if (scrollRange < mOwnScrollY) { @@ -284,7 +259,7 @@ public class NotificationStackScrollLayout extends ViewGroup * * @return either the layout height or the externally defined height, whichever is smaller */ - private float getLayoutHeight() { + private int getLayoutHeight() { return Math.min(mMaxLayoutHeight, mCurrentStackHeight); } @@ -640,14 +615,48 @@ public class NotificationStackScrollLayout extends ViewGroup private int getScrollRange() { int scrollRange = 0; - if (getChildCount() > 0) { + View firstChild = getFirstChildNotGone(); + if (firstChild != null) { int contentHeight = getContentHeight(); - scrollRange = Math.max(0, - contentHeight - mMaxLayoutHeight + mBottomStackPeekSize); + int firstChildMaxExpandHeight = getMaxExpandHeight(firstChild); + int firstChildExpandPotential = firstChildMaxExpandHeight - firstChild.getHeight(); + + // If we already scrolled in, the first child is layouted smaller than it actually + // could be when expanded. We have to compensate for this loss of the contentHeight + // by adding the expand potential again. + contentHeight += firstChildExpandPotential; + scrollRange = Math.max(0, contentHeight - mMaxLayoutHeight + mBottomStackPeekSize); + if (scrollRange > 0 && getChildCount() > 0) { + // We want to at least be able collapse the first item and not ending in a weird + // end state. + scrollRange = Math.max(scrollRange, firstChildMaxExpandHeight - mCollapsedSize); + } } return scrollRange; } + /** + * @return the first child which has visibility unequal to GONE + */ + private View getFirstChildNotGone() { + int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = getChildAt(i); + if (child.getVisibility() != View.GONE) { + return child; + } + } + return null; + } + + private int getMaxExpandHeight(View view) { + if (view instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) view; + return row.getMaximumAllowedExpandHeight(); + } + return view.getHeight(); + } + private int getContentHeight() { return mContentHeight; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index 431f6fe..a7363f4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -20,6 +20,7 @@ import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; + import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableNotificationRow; @@ -47,13 +48,14 @@ public class StackScrollAlgorithm { private StackIndentationFunctor mTopStackIndentationFunctor; private StackIndentationFunctor mBottomStackIndentationFunctor; - private float mLayoutHeight; + private int mLayoutHeight; private StackScrollAlgorithmState mTempAlgorithmState = new StackScrollAlgorithmState(); private boolean mIsExpansionChanging; private int mFirstChildMaxHeight; private boolean mIsExpanded; private View mFirstChildWhileExpanding; private boolean mExpandedOnStart; + private int mTopStackTotalSize; public StackScrollAlgorithm(Context context) { initConstants(context); @@ -72,16 +74,16 @@ public class StackScrollAlgorithm { mZDistanceBetweenElements = context.getResources() .getDimensionPixelSize(R.dimen.z_distance_between_notifications); mZBasicHeight = (MAX_ITEMS_IN_BOTTOM_STACK + 1) * mZDistanceBetweenElements; - + mTopStackTotalSize = mCollapsedSize + mPaddingBetweenElements; mTopStackIndentationFunctor = new PiecewiseLinearIndentationFunctor( MAX_ITEMS_IN_TOP_STACK, mTopStackPeekSize, - mCollapsedSize + mPaddingBetweenElements, + mTopStackTotalSize, 0.5f); mBottomStackIndentationFunctor = new PiecewiseLinearIndentationFunctor( MAX_ITEMS_IN_BOTTOM_STACK, mBottomStackPeekSize, - mBottomStackPeekSize, + mCollapsedSize + mPaddingBetweenElements + mBottomStackPeekSize, 0.5f); } @@ -94,14 +96,17 @@ public class StackScrollAlgorithm { // First we reset the view states to their default values. resultState.resetViewStates(); - // The first element is always in there so it's initialized with 1.0f; - algorithmState.itemsInTopStack = 1.0f; + algorithmState.itemsInTopStack = 0.0f; algorithmState.partialInTop = 0.0f; algorithmState.lastTopStackIndex = 0; - algorithmState.scrollY = resultState.getScrollY(); + algorithmState.scrolledPixelsTop = 0; algorithmState.itemsInBottomStack = 0.0f; + algorithmState.partialInBottom = 0.0f; + updateVisibleChildren(resultState, algorithmState); + algorithmState.scrollY = getAlgorithmScrollPosition(resultState, algorithmState); + // Phase 1: findNumberOfItemsInTopStackAndUpdateState(resultState, algorithmState); @@ -110,9 +115,42 @@ public class StackScrollAlgorithm { // Phase 3: updateZValuesForState(resultState, algorithmState); + } + + /** + * Calculates the scroll offset of the algorithm, based on the resultState. + * + * @param resultState the state to base the calculation on + * @param algorithmState The state in which the current pass of the algorithm is currently in + * @return the scroll offset used for the algorithm + */ + private int getAlgorithmScrollPosition(StackScrollState resultState, + StackScrollAlgorithmState algorithmState) { - // write the algorithm state to the result - resultState.setScrollY(algorithmState.scrollY); + int resultScroll = resultState.getScrollY() + mCollapsedSize; + + // If the first child was collapsed in an earlier pass, we have to decrease the scroll + // position to get into the same state again. + if (algorithmState.visibleChildren.size() > 0) { + View firstView = algorithmState.visibleChildren.get(0); + if (firstView instanceof ExpandableNotificationRow) { + ExpandableNotificationRow firstRow = (ExpandableNotificationRow) firstView; + if (firstRow.isUserLocked()) { + // User is currently modifying this height. + return resultScroll; + } + int scrolledInAmount = 0; + // If the child size was not decreased due to scrolling, we don't substract it, + if (!mIsExpansionChanging) { + scrolledInAmount = firstRow.getExpandPotential(); + } else if (mExpandedOnStart && mFirstChildWhileExpanding == firstView) { + scrolledInAmount = firstRow.getMaximumAllowedExpandHeight() - + mFirstChildMaxHeight; + } + resultScroll -= scrolledInAmount; + } + } + return resultScroll; } /** @@ -141,13 +179,12 @@ public class StackScrollAlgorithm { */ private void updatePositionsForState(StackScrollState resultState, StackScrollAlgorithmState algorithmState) { - float stackHeight = getLayoutHeight(); // The starting position of the bottom stack peek - float bottomPeekStart = stackHeight - mBottomStackPeekSize; + float bottomPeekStart = mLayoutHeight - mBottomStackPeekSize; // The position where the bottom stack starts. - float transitioningPositionStart = bottomPeekStart - mCollapsedSize; + float bottomStackStart = bottomPeekStart - mCollapsedSize; // The y coordinate of the current child. float currentYPosition = 0.0f; @@ -160,76 +197,110 @@ public class StackScrollAlgorithm { for (int i = 0; i < childCount; i++) { View child = algorithmState.visibleChildren.get(i); StackScrollState.ViewState childViewState = resultState.getViewStateForView(child); - childViewState.yTranslation = currentYPosition; childViewState.location = StackScrollState.ViewState.LOCATION_UNKNOWN; int childHeight = child.getHeight(); - // The y position after this element - float nextYPosition = currentYPosition + childHeight + mPaddingBetweenElements; float yPositionInScrollViewAfterElement = yPositionInScrollView + childHeight + mPaddingBetweenElements; - float scrollOffset = yPositionInScrollViewAfterElement - algorithmState.scrollY; - if (i < algorithmState.lastTopStackIndex) { + float scrollOffset = yPositionInScrollView - algorithmState.scrollY + mCollapsedSize; + + if (i == algorithmState.lastTopStackIndex + 1) { + // Normally the position of this child is the position in the regular scrollview, + // but if the two stacks are very close to each other, + // then have have to push it even more upwards to the position of the bottom + // stack start. + currentYPosition = Math.min(scrollOffset, bottomStackStart); + } + childViewState.yTranslation = currentYPosition; + + // The y position after this element + float nextYPosition = currentYPosition + childHeight + + mPaddingBetweenElements; + + if (i <= algorithmState.lastTopStackIndex) { // Case 1: // We are in the top Stack - nextYPosition = updateStateForTopStackChild(algorithmState, - numberOfElementsCompletelyIn, - i, childViewState); - } else if (i == algorithmState.lastTopStackIndex) { + updateStateForTopStackChild(algorithmState, + numberOfElementsCompletelyIn, i, childHeight, childViewState, scrollOffset); + clampYTranslation(childViewState, childHeight); + // check if we are overlapping with the bottom stack + if (childViewState.yTranslation + childHeight + mPaddingBetweenElements + >= bottomStackStart && !mIsExpansionChanging) { + // TODO: handle overlapping sizes with end stack better + // we just collapse this element + childViewState.height = mCollapsedSize; + } + } else if (nextYPosition >= bottomStackStart) { // Case 2: - // First element of regular scrollview comes next, so the position is just the - // scrolling position - nextYPosition = updateStateForFirstScrollingChild(transitioningPositionStart, - childViewState, scrollOffset); - } else if (nextYPosition >= transitioningPositionStart) { - if (currentYPosition >= transitioningPositionStart) { - // Case 3: + // We are in the bottom stack. + if (currentYPosition >= bottomStackStart) { // According to the regular scroll view we are fully translated out of the // bottom of the screen so we are fully in the bottom stack - nextYPosition = updateStateForChildFullyInBottomStack(algorithmState, - transitioningPositionStart, childViewState, childHeight); + updateStateForChildFullyInBottomStack(algorithmState, + bottomStackStart, childViewState, childHeight); } else { - // Case 4: // According to the regular scroll view we are currently translating out of / // into the bottom of the screen - nextYPosition = updateStateForChildTransitioningInBottom( - algorithmState, stackHeight, transitioningPositionStart, - currentYPosition, childViewState, - childHeight, nextYPosition); + updateStateForChildTransitioningInBottom(algorithmState, + bottomStackStart, bottomPeekStart, currentYPosition, + childViewState, childHeight); } } else { + // Case 3: + // We are in the regular scroll area. childViewState.location = StackScrollState.ViewState.LOCATION_MAIN_AREA; + clampYTranslation(childViewState, childHeight); } + // The first card is always rendered. if (i == 0) { childViewState.alpha = 1.0f; + childViewState.yTranslation = 0; childViewState.location = StackScrollState.ViewState.LOCATION_FIRST_CARD; } if (childViewState.location == StackScrollState.ViewState.LOCATION_UNKNOWN) { Log.wtf(LOG_TAG, "Failed to assign location for child " + i); } - nextYPosition = Math.max(0, nextYPosition); - currentYPosition = nextYPosition; + currentYPosition = childViewState.yTranslation + childHeight + mPaddingBetweenElements; yPositionInScrollView = yPositionInScrollViewAfterElement; } } /** - * Update the state for the first child which is in the regular scrolling area. + * Clamp the yTranslation both up and down to valid positions. * - * @param transitioningPositionStart the transition starting position of the bottom stack * @param childViewState the view state of the child - * @param scrollOffset the position in the regular scroll view after this child - * @return the next child position + * @param childHeight the height of this child */ - private float updateStateForFirstScrollingChild(float transitioningPositionStart, - StackScrollState.ViewState childViewState, float scrollOffset) { - childViewState.location = StackScrollState.ViewState.LOCATION_TOP_STACK_PEEKING; - if (scrollOffset < transitioningPositionStart) { - return scrollOffset; - } else { - return transitioningPositionStart; - } + private void clampYTranslation(StackScrollState.ViewState childViewState, int childHeight) { + clampPositionToBottomStackStart(childViewState, childHeight); + clampPositionToTopStackEnd(childViewState, childHeight); + } + + /** + * Clamp the yTranslation of the child down such that its end is at most on the beginning of + * the bottom stack. + * + * @param childViewState the view state of the child + * @param childHeight the height of this child + */ + private void clampPositionToBottomStackStart(StackScrollState.ViewState childViewState, + int childHeight) { + childViewState.yTranslation = Math.min(childViewState.yTranslation, + mLayoutHeight - mBottomStackPeekSize - childHeight); + } + + /** + * Clamp the yTranslation of the child up such that its end is at lest on the end of the top + * stack. + * + * @param childViewState the view state of the child + * @param childHeight the height of this child + */ + private void clampPositionToTopStackEnd(StackScrollState.ViewState childViewState, + int childHeight) { + childViewState.yTranslation = Math.max(childViewState.yTranslation, + mCollapsedSize - childHeight); } private int getMaxAllowedChildHeight(View child) { @@ -240,41 +311,35 @@ public class StackScrollAlgorithm { return child.getHeight(); } - private float updateStateForChildTransitioningInBottom(StackScrollAlgorithmState algorithmState, - float stackHeight, float transitioningPositionStart, float currentYPosition, - StackScrollState.ViewState childViewState, int childHeight, float nextYPosition) { - float newSize = transitioningPositionStart + mCollapsedSize - currentYPosition; - newSize = Math.min(childHeight, newSize); - // Transitioning element on top of bottom stack: + private void updateStateForChildTransitioningInBottom(StackScrollAlgorithmState algorithmState, + float transitioningPositionStart, float bottomPeakStart, float currentYPosition, + StackScrollState.ViewState childViewState, int childHeight) { + + // This is the transitioning element on top of bottom stack, calculate how far we are in. algorithmState.partialInBottom = 1.0f - ( - (stackHeight - mBottomStackPeekSize - nextYPosition) / mCollapsedSize); - // Our element can be expanded, so we might even have to scroll further than - // mCollapsedSize - algorithmState.partialInBottom = Math.min(1.0f, algorithmState.partialInBottom); - float offset = mBottomStackIndentationFunctor.getValue( - algorithmState.partialInBottom); - nextYPosition = transitioningPositionStart + offset; + (transitioningPositionStart - currentYPosition) / (childHeight + + mPaddingBetweenElements)); + + // the offset starting at the transitionPosition of the bottom stack + float offset = mBottomStackIndentationFunctor.getValue(algorithmState.partialInBottom); algorithmState.itemsInBottomStack += algorithmState.partialInBottom; - // TODO: only temporarily collapse - if (childHeight != (int) newSize) { - childViewState.height = (int) newSize; - } - childViewState.location = StackScrollState.ViewState.LOCATION_MAIN_AREA; + childViewState.yTranslation = transitioningPositionStart + offset - childHeight; - return nextYPosition; + // We want at least to be at the end of the top stack when collapsing + clampPositionToTopStackEnd(childViewState, childHeight); + childViewState.location = StackScrollState.ViewState.LOCATION_MAIN_AREA; } - private float updateStateForChildFullyInBottomStack(StackScrollAlgorithmState algorithmState, + private void updateStateForChildFullyInBottomStack(StackScrollAlgorithmState algorithmState, float transitioningPositionStart, StackScrollState.ViewState childViewState, int childHeight) { - float nextYPosition; + float currentYPosition; algorithmState.itemsInBottomStack += 1.0f; if (algorithmState.itemsInBottomStack < MAX_ITEMS_IN_BOTTOM_STACK) { // We are visually entering the bottom stack - nextYPosition = transitioningPositionStart - + mBottomStackIndentationFunctor.getValue( - algorithmState.itemsInBottomStack); + currentYPosition = transitioningPositionStart + + mBottomStackIndentationFunctor.getValue(algorithmState.itemsInBottomStack); childViewState.location = StackScrollState.ViewState.LOCATION_BOTTOM_STACK_PEEKING; } else { // we are fully inside the stack @@ -285,43 +350,56 @@ public class StackScrollAlgorithm { childViewState.alpha = 1.0f - algorithmState.partialInBottom; } childViewState.location = StackScrollState.ViewState.LOCATION_BOTTOM_STACK_HIDDEN; - nextYPosition = transitioningPositionStart + mBottomStackPeekSize; - } - // TODO: only temporarily collapse - if (childHeight != mCollapsedSize) { - childViewState.height = mCollapsedSize; + currentYPosition = mLayoutHeight; } - return nextYPosition; + childViewState.yTranslation = currentYPosition - childHeight; + clampPositionToTopStackEnd(childViewState, childHeight); } - private float updateStateForTopStackChild(StackScrollAlgorithmState algorithmState, - int numberOfElementsCompletelyIn, int i, StackScrollState.ViewState childViewState) { + private void updateStateForTopStackChild(StackScrollAlgorithmState algorithmState, + int numberOfElementsCompletelyIn, int i, int childHeight, + StackScrollState.ViewState childViewState, float scrollOffset) { - float nextYPosition = 0; // First we calculate the index relative to the current stack window of size at most // {@link #MAX_ITEMS_IN_TOP_STACK} - int paddedIndex = i + int paddedIndex = i - 1 - Math.max(numberOfElementsCompletelyIn - MAX_ITEMS_IN_TOP_STACK, 0); if (paddedIndex >= 0) { + // We are currently visually entering the top stack - nextYPosition = mCollapsedSize + mPaddingBetweenElements - - mTopStackIndentationFunctor.getValue( - algorithmState.itemsInTopStack - i - 1); - nextYPosition = Math.min(nextYPosition, mLayoutHeight - mCollapsedSize - - mBottomStackPeekSize); - if (paddedIndex == 0) { - childViewState.alpha = 1.0f - algorithmState.partialInTop; - childViewState.location = StackScrollState.ViewState.LOCATION_TOP_STACK_HIDDEN; + float distanceToStack = childHeight - algorithmState.scrolledPixelsTop; + if (i == algorithmState.lastTopStackIndex && distanceToStack > mTopStackTotalSize) { + + // Child is currently translating into stack but not yet inside slow down zone. + // Handle it like the regular scrollview. + childViewState.yTranslation = scrollOffset; } else { - childViewState.location = StackScrollState.ViewState.LOCATION_TOP_STACK_PEEKING; + // Apply stacking logic. + float numItemsBefore; + if (i == algorithmState.lastTopStackIndex) { + numItemsBefore = 1.0f - (distanceToStack / mTopStackTotalSize); + } else { + numItemsBefore = algorithmState.itemsInTopStack - i; + } + // The end position of the current child + float currentChildEndY = mCollapsedSize + mTopStackTotalSize - + mTopStackIndentationFunctor.getValue(numItemsBefore); + childViewState.yTranslation = currentChildEndY - childHeight; } + childViewState.location = StackScrollState.ViewState.LOCATION_TOP_STACK_PEEKING; } else { - // We are hidden behind the top card and faded out, so we can hide ourselves. - childViewState.alpha = 0.0f; + if (paddedIndex == -1) { + childViewState.alpha = 1.0f - algorithmState.partialInTop; + } else { + // We are hidden behind the top card and faded out, so we can hide ourselves. + childViewState.alpha = 0.0f; + } + childViewState.yTranslation = mCollapsedSize - childHeight; childViewState.location = StackScrollState.ViewState.LOCATION_TOP_STACK_HIDDEN; } - return nextYPosition; + + } /** @@ -347,10 +425,22 @@ public class StackScrollAlgorithm { + childHeight + mPaddingBetweenElements; if (yPositionInScrollView < algorithmState.scrollY) { - if (yPositionInScrollViewAfterElement <= algorithmState.scrollY) { + if (i == 0 && algorithmState.scrollY == mCollapsedSize) { + + // The starting position of the bottom stack peek + int bottomPeekStart = mLayoutHeight - mBottomStackPeekSize; + // Collapse and expand the first child while the shade is being expanded + float maxHeight = mIsExpansionChanging && child == mFirstChildWhileExpanding + ? mFirstChildMaxHeight + : childHeight; + childViewState.height = (int) Math.max(Math.min(bottomPeekStart, maxHeight), + mCollapsedSize); + algorithmState.itemsInTopStack = 1.0f; + + } else if (yPositionInScrollViewAfterElement < algorithmState.scrollY) { // According to the regular scroll view we are fully off screen algorithmState.itemsInTopStack += 1.0f; - if (childHeight != mCollapsedSize) { + if (i == 0) { childViewState.height = mCollapsedSize; } } else { @@ -360,45 +450,27 @@ public class StackScrollAlgorithm { - mPaddingBetweenElements - algorithmState.scrollY; + if (i == 0) { + newSize += mCollapsedSize; + } + // How much did we scroll into this child - algorithmState.partialInTop = (mCollapsedSize - newSize) / (mCollapsedSize + algorithmState.scrolledPixelsTop = childHeight - newSize; + algorithmState.partialInTop = (algorithmState.scrolledPixelsTop) / (childHeight + mPaddingBetweenElements); // Our element can be expanded, so this can get negative algorithmState.partialInTop = Math.max(0.0f, algorithmState.partialInTop); algorithmState.itemsInTopStack += algorithmState.partialInTop; - // TODO: handle overlapping sizes with end stack newSize = Math.max(mCollapsedSize, newSize); - // TODO: only temporarily collapse - if (newSize != childHeight) { + if (i == 0) { childViewState.height = (int) newSize; - - // We decrease scrollY by the same amount we made this child smaller. - // The new scroll position is therefore the start of the element - algorithmState.scrollY = (int) yPositionInScrollView; - resultState.setScrollY(algorithmState.scrollY); - } - if (childHeight > mCollapsedSize) { - // If we are just resizing this child, this element is not treated to be - // transitioning into the stack and therefore it is the last element in - // the stack. - algorithmState.lastTopStackIndex = i; - break; } + algorithmState.lastTopStackIndex = i; + break; } } else { - algorithmState.lastTopStackIndex = i; - if (i == 0) { - - // The starting position of the bottom stack peek - float bottomPeekStart = getLayoutHeight() - mBottomStackPeekSize; - // Collapse and expand the first child while the shade is being expanded - float maxHeight = mIsExpansionChanging && child == mFirstChildWhileExpanding - ? mFirstChildMaxHeight - : childHeight; - childViewState.height = (int) Math.max(Math.min(bottomPeekStart, maxHeight), - mCollapsedSize); - } + algorithmState.lastTopStackIndex = i - 1; // We are already past the stack so we can end the loop break; } @@ -435,11 +507,11 @@ public class StackScrollAlgorithm { } } - public float getLayoutHeight() { + public int getLayoutHeight() { return mLayoutHeight; } - public void setLayoutHeight(float layoutHeight) { + public void setLayoutHeight(int layoutHeight) { this.mLayoutHeight = layoutHeight; } @@ -512,10 +584,12 @@ public class StackScrollAlgorithm { public float partialInTop; /** + * The number of pixels the last child in the top stack has scrolled in to the stack + */ + public float scrolledPixelsTop; + + /** * The last item index which is in the top stack. - * NOTE: In the top stack the item after the transitioning element is also in the stack! - * This is needed to ensure a smooth transition between the y position in the regular - * scrollview and the one in the stack. */ public int lastTopStackIndex; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java index 06a08f3..9742e65 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java @@ -16,10 +16,14 @@ package com.android.systemui.statusbar.stack; +import android.graphics.Outline; +import android.graphics.Rect; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import com.android.systemui.R; + import java.util.HashMap; import java.util.Map; @@ -34,6 +38,10 @@ public class StackScrollState { private final ViewGroup mHostView; private Map<View, ViewState> mStateMap; private int mScrollY; + private final Rect mClipRect = new Rect(); + private int mBackgroundRoundedRectCornerRadius; + private final Outline mChildOutline = new Outline(); + private final int mChildDividerHeight; public int getScrollY() { return mScrollY; @@ -46,6 +54,10 @@ public class StackScrollState { public StackScrollState(ViewGroup hostView) { mHostView = hostView; mStateMap = new HashMap<View, ViewState>(); + mBackgroundRoundedRectCornerRadius = hostView.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_quantum_rounded_rect_radius); + mChildDividerHeight = hostView.getResources().getDimensionPixelSize(R.dimen + .notification_divider_height); } public ViewGroup getHostView() { @@ -83,10 +95,17 @@ public class StackScrollState { */ public void apply() { int numChildren = mHostView.getChildCount(); + float previousNotificationEnd = 0; + float previousNotificationStart = 0; for (int i = 0; i < numChildren; i++) { View child = mHostView.getChildAt(i); ViewState state = mStateMap.get(child); - if (state != null) { + if (state == null) { + Log.wtf(CHILD_NOT_FOUND_TAG, "No child state was found when applying this state " + + "to the hostView"); + continue; + } + if (!state.gone) { float alpha = child.getAlpha(); float yTranslation = child.getTranslationY(); float zTranslation = child.getTranslationZ(); @@ -117,7 +136,7 @@ public class StackScrollState { // apply visibility int oldVisibility = child.getVisibility(); int newVisibility = becomesInvisible ? View.INVISIBLE : View.VISIBLE; - if (newVisibility != oldVisibility && !state.gone) { + if (newVisibility != oldVisibility) { child.setVisibility(newVisibility); } @@ -135,13 +154,94 @@ public class StackScrollState { if (height != newHeight) { applyNewHeight(child, newHeight); } - } else { - Log.wtf(CHILD_NOT_FOUND_TAG, "No child state was found when applying this state " + - "to the hostView"); + + // apply clipping and shadow + float newNotificationEnd = newYTranslation + newHeight; + updateChildClippingAndShadow(child, newHeight, + newNotificationEnd - (previousNotificationEnd - mChildDividerHeight), + newHeight - (previousNotificationStart - newYTranslation)); + + previousNotificationStart = newYTranslation; + previousNotificationEnd = newNotificationEnd; } } } + /** + * Updates the shadow outline and the clipping for a view. + * + * @param child the view to update + * @param realHeight the currently applied height of the view + * @param clipHeight the desired clip height, the rest of the view will be clipped from the top + * @param shadowHeight the desired height of the shadow, the shadow ends on the bottom + */ + private void updateChildClippingAndShadow(View child, int realHeight, float clipHeight, + float shadowHeight) { + if (realHeight > shadowHeight) { + updateChildOutline(child, realHeight, shadowHeight); + } else { + updateChildOutline(child, realHeight, realHeight); + } + if (realHeight > clipHeight) { + updateChildClip(child, realHeight, clipHeight); + } else { + child.setClipBounds(null); + } + } + + /** + * Updates the clipping of a view + * + * @param child the view to update + * @param height the currently applied height of the view + * @param clipHeight the desired clip height, the rest of the view will be clipped from the top + */ + private void updateChildClip(View child, int height, float clipHeight) { + // The children currently have paddings inside themselfs because of the expansion + // visualization. In order for the clipping to work correctly we have to set the correct + // clip rect on the child. + View container = child.findViewById(R.id.container); + if (container != null) { + int clipInset = (int) (height - clipHeight); + mClipRect.set(0, + clipInset, + child.getWidth(), + height); + child.setClipBounds(mClipRect); + } + } + + /** + * Updates the outline of a view + * + * @param child the view to update + * @param height the currently applied height of the view + * @param outlineHeight the desired height of the outline, the outline ends on the bottom + */ + private void updateChildOutline(View child, + int height, + float outlineHeight) { + // The children currently have paddings inside themselfs because of the expansion + // visualization. In order for the shadows to work correctly we have to set the correct + // outline on the child. + View container = child.findViewById(R.id.container); + if (container != null) { + int shadowInset = (int) (height - outlineHeight); + getOutlineForSize(container.getLeft(), + container.getTop() + shadowInset, + container.getWidth(), + container.getHeight() - shadowInset, + mChildOutline); + child.setOutline(mChildOutline); + } + } + + private void getOutlineForSize(int leftInset, int topInset, int width, int height, + Outline result) { + result.setRoundRect(leftInset, topInset, leftInset + width, topInset + height, + mBackgroundRoundedRectCornerRadius); + } + private void applyNewHeight(View child, int newHeight) { ViewGroup.LayoutParams lp = child.getLayoutParams(); lp.height = newHeight; diff --git a/packages/services/PacProcessor/Android.mk b/packages/services/PacProcessor/Android.mk index 3c4e951..79f8a1f 100644 --- a/packages/services/PacProcessor/Android.mk +++ b/packages/services/PacProcessor/Android.mk @@ -27,6 +27,8 @@ LOCAL_CERTIFICATE := platform LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor +LOCAL_MULTILIB := 32 + include $(BUILD_PACKAGE) include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/services/core/java/com/android/server/BootReceiver.java b/services/core/java/com/android/server/BootReceiver.java index bce85ce..7249985 100644 --- a/services/core/java/com/android/server/BootReceiver.java +++ b/services/core/java/com/android/server/BootReceiver.java @@ -106,22 +106,33 @@ public class BootReceiver extends BroadcastReceiver { .append("Kernel: ") .append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n")) .append("\n").toString(); + final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(); if (recovery != null && db != null) { db.addText("SYSTEM_RECOVERY_LOG", headers + recovery); } + String lastKmsgFooter = ""; + if (bootReason != null) { + lastKmsgFooter = new StringBuilder(512) + .append("\n") + .append("Boot info:\n") + .append("Last boot reason: ").append(bootReason).append("\n") + .toString(); + } + if (SystemProperties.getLong("ro.runtime.firstboot", 0) == 0) { String now = Long.toString(System.currentTimeMillis()); SystemProperties.set("ro.runtime.firstboot", now); if (db != null) db.addText("SYSTEM_BOOT", headers); // Negative sizes mean to take the *tail* of the file (see FileUtils.readTextFile()) - addFileToDropBox(db, prefs, headers, "/proc/last_kmsg", - -LOG_SIZE, "SYSTEM_LAST_KMSG"); - addFileToDropBox(db, prefs, headers, "/sys/fs/pstore/console-ramoops", - -LOG_SIZE, "SYSTEM_LAST_KMSG"); + addFileWithFootersToDropBox(db, prefs, headers, lastKmsgFooter, + "/proc/last_kmsg", -LOG_SIZE, "SYSTEM_LAST_KMSG"); + addFileWithFootersToDropBox(db, prefs, headers, lastKmsgFooter, + "/sys/fs/pstore/console-ramoops", -LOG_SIZE, + "SYSTEM_LAST_KMSG"); addFileToDropBox(db, prefs, headers, "/cache/recovery/log", -LOG_SIZE, "SYSTEM_RECOVERY_LOG"); addFileToDropBox(db, prefs, headers, "/data/dontpanic/apanic_console", @@ -161,6 +172,14 @@ public class BootReceiver extends BroadcastReceiver { private static void addFileToDropBox( DropBoxManager db, SharedPreferences prefs, String headers, String filename, int maxSize, String tag) throws IOException { + addFileWithFootersToDropBox(db, prefs, headers, "", filename, maxSize, + tag); + } + + private static void addFileWithFootersToDropBox( + DropBoxManager db, SharedPreferences prefs, + String headers, String footers, String filename, int maxSize, + String tag) throws IOException { if (db == null || !db.isTagEnabled(tag)) return; // Logging disabled File file = new File(filename); @@ -176,7 +195,7 @@ public class BootReceiver extends BroadcastReceiver { } Slog.i(TAG, "Copying " + filename + " to DropBox (" + tag + ")"); - db.addText(tag, headers + FileUtils.readTextFile(file, maxSize, "[[TRUNCATED]]\n")); + db.addText(tag, headers + FileUtils.readTextFile(file, maxSize, "[[TRUNCATED]]\n") + footers); } private static void addAuditErrorsToDropBox(DropBoxManager db, SharedPreferences prefs, diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index e6163bd..62deec2 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -450,6 +450,27 @@ public class LocationManagerService extends ILocationManager.Stub { if (provider == null) { Slog.e(TAG, "no geofence provider found"); } + + String[] testProviderStrings = resources.getStringArray( + com.android.internal.R.array.config_testLocationProviders); + for (String testProviderString : testProviderStrings) { + String fragments[] = testProviderString.split(","); + String name = fragments[0].trim(); + if (mProvidersByName.get(name) != null) { + throw new IllegalArgumentException("Provider \"" + name + "\" already exists"); + } + ProviderProperties properties = new ProviderProperties( + Boolean.parseBoolean(fragments[1]) /* requiresNetwork */, + Boolean.parseBoolean(fragments[2]) /* requiresSatellite */, + Boolean.parseBoolean(fragments[3]) /* requiresCell */, + Boolean.parseBoolean(fragments[4]) /* hasMonetaryCost */, + Boolean.parseBoolean(fragments[5]) /* supportsAltitude */, + Boolean.parseBoolean(fragments[6]) /* supportsSpeed */, + Boolean.parseBoolean(fragments[7]) /* supportsBearing */, + Integer.parseInt(fragments[8]) /* powerRequirement */, + Integer.parseInt(fragments[9]) /* accuracy */); + addTestProviderLocked(name, properties); + } } /** @@ -2204,7 +2225,6 @@ public class LocationManagerService extends ILocationManager.Stub { long identity = Binder.clearCallingIdentity(); synchronized (mLock) { - MockProvider provider = new MockProvider(name, this, properties); // remove the real provider if we are replacing GPS or network provider if (LocationManager.GPS_PROVIDER.equals(name) || LocationManager.NETWORK_PROVIDER.equals(name) @@ -2214,18 +2234,23 @@ public class LocationManagerService extends ILocationManager.Stub { removeProviderLocked(p); } } - if (mProvidersByName.get(name) != null) { - throw new IllegalArgumentException("Provider \"" + name + "\" already exists"); - } - addProviderLocked(provider); - mMockProviders.put(name, provider); - mLastLocation.put(name, null); - mLastLocationCoarseInterval.put(name, null); + addTestProviderLocked(name, properties); updateProvidersLocked(); } Binder.restoreCallingIdentity(identity); } + private void addTestProviderLocked(String name, ProviderProperties properties) { + if (mProvidersByName.get(name) != null) { + throw new IllegalArgumentException("Provider \"" + name + "\" already exists"); + } + MockProvider provider = new MockProvider(name, this, properties); + addProviderLocked(provider); + mMockProviders.put(name, provider); + mLastLocation.put(name, null); + mLastLocationCoarseInterval.put(name, null); + } + @Override public void removeTestProvider(String provider) { checkMockPermissionsSafe(); diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index 9629bd1..705862a 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -153,7 +153,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private NativeDaemonConnector mConnector; - private final Handler mMainHandler = new Handler(); + private final Handler mFgHandler; private IBatteryStats mBatteryStats; @@ -203,6 +203,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub private NetworkManagementService(Context context, String socket) { mContext = context; + // make sure this is on the same looper as our NativeDaemonConnector for sync purposes + mFgHandler = new Handler(FgThread.get().getLooper()); + if ("simulator".equals(SystemProperties.get("ro.product.device"))) { return; } @@ -271,14 +274,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyInterfaceStatusChanged(String iface, boolean up) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceStatusChanged(iface, up); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceStatusChanged(iface, up); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -287,14 +293,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyInterfaceLinkStateChanged(String iface, boolean up) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -302,14 +311,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyInterfaceAdded(String iface) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceAdded(iface); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceAdded(iface); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -322,14 +334,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub mActiveQuotas.remove(iface); final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceRemoved(iface); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceRemoved(iface); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -337,14 +352,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyLimitReached(String limitName, String iface) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).limitReached(limitName, iface); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).limitReached(limitName, iface); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -357,15 +375,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub } final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceClassDataActivityChanged( - Integer.toString(type), active, tsNanos); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceClassDataActivityChanged( + Integer.toString(type), active, tsNanos); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); boolean report = false; synchronized (mIdleTimerLock) { @@ -456,14 +477,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyAddressUpdated(String iface, LinkAddress address) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).addressUpdated(iface, address); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).addressUpdated(iface, address); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -471,14 +495,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyAddressRemoved(String iface, LinkAddress address) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).addressRemoved(iface, address); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).addressRemoved(iface, address); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } /** @@ -486,14 +513,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private void notifyInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) { final int length = mObservers.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mObservers.getBroadcastItem(i).interfaceDnsServerInfo(iface, lifetime, addresses); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).interfaceDnsServerInfo(iface, lifetime, + addresses); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mObservers.finishBroadcast(); } - mObservers.finishBroadcast(); } // @@ -509,7 +540,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub mConnectedSignal.countDown(); mConnectedSignal = null; } else { - mMainHandler.post(new Runnable() { + mFgHandler.post(new Runnable() { @Override public void run() { prepareNativeDaemon(); @@ -1270,7 +1301,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub if (ConnectivityManager.isNetworkTypeMobile(type)) { mNetworkActive = false; } - mMainHandler.post(new Runnable() { + mFgHandler.post(new Runnable() { @Override public void run() { notifyInterfaceClassActivity(type, true, SystemClock.elapsedRealtimeNanos()); } @@ -1297,7 +1328,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub throw e.rethrowAsParcelableException(); } mActiveIdleTimers.remove(iface); - mMainHandler.post(new Runnable() { + mFgHandler.post(new Runnable() { @Override public void run() { notifyInterfaceClassActivity(params.type, false, SystemClock.elapsedRealtimeNanos()); @@ -1880,14 +1911,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub private void reportNetworkActive() { final int length = mNetworkActivityListeners.beginBroadcast(); - for (int i = 0; i < length; i++) { - try { - mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive(); - } catch (RemoteException e) { - } catch (RuntimeException e) { + try { + for (int i = 0; i < length; i++) { + try { + mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive(); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } } + } finally { + mNetworkActivityListeners.finishBroadcast(); } - mNetworkActivityListeners.finishBroadcast(); } /** {@inheritDoc} */ diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java new file mode 100644 index 0000000..8a30e50 --- /dev/null +++ b/services/core/java/com/android/server/NetworkScoreService.java @@ -0,0 +1,136 @@ +/* + * 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.server; + +import android.Manifest.permission; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.INetworkScoreService; +import android.net.NetworkKey; +import android.net.NetworkScorerAppManager; +import android.net.RssiCurve; +import android.net.ScoredNetwork; +import android.text.TextUtils; + +import com.android.internal.R; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * Backing service for {@link android.net.NetworkScoreManager}. + * @hide + */ +public class NetworkScoreService extends INetworkScoreService.Stub { + private static final String TAG = "NetworkScoreService"; + + /** SharedPreference bit set to true after the service is first initialized. */ + private static final String PREF_SCORING_PROVISIONED = "is_provisioned"; + + private final Context mContext; + + // TODO: Delete this temporary class once we have a real place for scores. + private final Map<NetworkKey, RssiCurve> mScoredNetworks; + + public NetworkScoreService(Context context) { + mContext = context; + mScoredNetworks = new HashMap<>(); + } + + /** Called when the system is ready to run third-party code but before it actually does so. */ + void systemReady() { + SharedPreferences prefs = mContext.getSharedPreferences(TAG, Context.MODE_PRIVATE); + if (!prefs.getBoolean(PREF_SCORING_PROVISIONED, false)) { + // On first run, we try to initialize the scorer to the one configured at build time. + // This will be a no-op if the scorer isn't actually valid. + String defaultPackage = mContext.getResources().getString( + R.string.config_defaultNetworkScorerPackageName); + if (!TextUtils.isEmpty(defaultPackage)) { + NetworkScorerAppManager.setActiveScorer(mContext, defaultPackage); + } + prefs.edit().putBoolean(PREF_SCORING_PROVISIONED, true).apply(); + } + } + + @Override + public boolean updateScores(ScoredNetwork[] networks) { + if (!NetworkScorerAppManager.isCallerActiveScorer(mContext, getCallingUid())) { + throw new SecurityException("Caller with UID " + getCallingUid() + + " is not the active scorer."); + } + + // TODO: Propagate these scores down to the network subsystem layer instead of just holding + // them in memory. + for (ScoredNetwork network : networks) { + mScoredNetworks.put(network.networkKey, network.rssiCurve); + } + + return true; + } + + @Override + public boolean clearScores() { + // Only the active scorer or the system (who can broadcast BROADCAST_SCORE_NETWORKS) should + // be allowed to flush all scores. + if (NetworkScorerAppManager.isCallerActiveScorer(mContext, getCallingUid()) || + mContext.checkCallingOrSelfPermission(permission.BROADCAST_SCORE_NETWORKS) == + PackageManager.PERMISSION_GRANTED) { + clearInternal(); + return true; + } else { + throw new SecurityException( + "Caller is neither the active scorer nor the scorer manager."); + } + } + + @Override + public boolean setActiveScorer(String packageName) { + mContext.enforceCallingOrSelfPermission(permission.BROADCAST_SCORE_NETWORKS, TAG); + // Preemptively clear scores even though the set operation could fail. We do this for safety + // as scores should never be compared across apps; in practice, Settings should only be + // allowing valid apps to be set as scorers, so failure here should be rare. + clearInternal(); + return NetworkScorerAppManager.setActiveScorer(mContext, packageName); + } + + /** Clear scores. Callers are responsible for checking permissions as appropriate. */ + private void clearInternal() { + // TODO: Propagate the flush down to the network subsystem layer. + mScoredNetworks.clear(); + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + mContext.enforceCallingOrSelfPermission(permission.DUMP, TAG); + String currentScorer = NetworkScorerAppManager.getActiveScorer(mContext); + if (currentScorer == null) { + writer.println("Scoring is disabled."); + return; + } + writer.println("Current scorer: " + currentScorer); + if (mScoredNetworks.isEmpty()) { + writer.println("No networks scored."); + } else { + for (Map.Entry<NetworkKey, RssiCurve> entry : mScoredNetworks.entrySet()) { + writer.println(entry.getKey() + ": " + entry.getValue()); + } + } + } +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7607419..ecbb0d9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7240,6 +7240,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (r == null) { return null; } + if (callback == null) { + throw new IllegalArgumentException("callback must not be null"); + } return mStackSupervisor.createActivityContainer(r, callback); } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index d596472..60adfb0 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -139,7 +139,7 @@ final class ActivityRecord { boolean forceNewConfig; // force re-create with new config next time int launchCount; // count of launches since last state long lastLaunchTime; // time of last lauch of this activity - ArrayList<ActivityStack> mChildContainers = new ArrayList<ActivityStack>(); + ArrayList<ActivityContainer> mChildContainers = new ArrayList<ActivityContainer>(); String stringName; // for caching of toString(). diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 8dd4317..0acde09 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -36,6 +36,8 @@ import static com.android.server.am.ActivityStackSupervisor.DEBUG_SAVED_STATE; import static com.android.server.am.ActivityStackSupervisor.DEBUG_STATES; import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; +import static com.android.server.am.ActivityStackSupervisor.ActivityContainer.CONTAINER_STATE_HAS_SURFACE; + import com.android.internal.os.BatteryStatsImpl; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerService.ItemMatcher; @@ -1066,9 +1068,9 @@ final class ActivityStack { private void setVisibile(ActivityRecord r, boolean visible) { r.visible = visible; mWindowManager.setAppVisibility(r.appToken, visible); - final ArrayList<ActivityStack> containers = r.mChildContainers; + final ArrayList<ActivityContainer> containers = r.mChildContainers; for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) { - ActivityContainer container = containers.get(containerNdx).mActivityContainer; + ActivityContainer container = containers.get(containerNdx); container.setVisible(visible); } } @@ -1270,6 +1272,7 @@ final class ActivityStack { * occurred and the activity will be notified immediately. */ void notifyActivityDrawnLocked(ActivityRecord r) { + mActivityContainer.setDrawn(); if ((r == null) || (mUndrawnActivitiesBelowTopTranslucent.remove(r) && mUndrawnActivitiesBelowTopTranslucent.isEmpty())) { @@ -1336,7 +1339,8 @@ final class ActivityStack { if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(""); ActivityRecord parent = mActivityContainer.mParentActivity; - if (parent != null && parent.state != ActivityState.RESUMED) { + if ((parent != null && parent.state != ActivityState.RESUMED) || + !mActivityContainer.isAttached()) { // Do not resume this stack if its parent is not resumed. // TODO: If in a loop, make sure that parent stack resumeTopActivity is called 1st. return false; @@ -2624,6 +2628,20 @@ final class ActivityStack { return r; } + void finishAllActivitiesLocked() { + for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { + final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities; + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + final ActivityRecord r = activities.get(activityNdx); + if (r.finishing) { + continue; + } + Slog.d(TAG, "finishAllActivitiesLocked: finishing " + r); + finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, false); + } + } + } + final boolean navigateUpToLocked(IBinder token, Intent destIntent, int resultCode, Intent resultData) { final ActivityRecord srec = ActivityRecord.forToken(token); @@ -2862,7 +2880,6 @@ final class ActivityStack { } if (activityRemoved) { mStackSupervisor.resumeTopActivitiesLocked(); - } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 63f9d09..111f010 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -96,7 +96,6 @@ import com.android.server.wm.WindowManagerService; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -225,11 +224,11 @@ public final class ActivityStackSupervisor implements DisplayListener { // TODO: Add listener for removal of references. /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ - SparseArray<WeakReference<ActivityContainer>> mActivityContainers = - new SparseArray<WeakReference<ActivityContainer>>(); + SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>(); /** Mapping from displayId to display current state */ - private SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<ActivityDisplay>(); + private final SparseArray<ActivityDisplay> mActivityDisplays = + new SparseArray<ActivityDisplay>(); InputManagerInternal mInputManagerInternal; @@ -265,7 +264,7 @@ public final class ActivityStackSupervisor implements DisplayListener { mActivityDisplays.put(displayId, activityDisplay); } - createStackOnDisplay(null, HOME_STACK_ID, Display.DEFAULT_DISPLAY); + createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY); mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); @@ -1386,7 +1385,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } // Need to create an app stack for this user. - int stackId = createStackOnDisplay(null, getNextStackId(), Display.DEFAULT_DISPLAY); + int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + " stackId=" + stackId); mFocusedStack = getStack(stackId); @@ -2154,14 +2153,9 @@ public final class ActivityStackSupervisor implements DisplayListener { } ActivityStack getStack(int stackId) { - WeakReference<ActivityContainer> weakReference = mActivityContainers.get(stackId); - if (weakReference != null) { - ActivityContainer activityContainer = weakReference.get(); - if (activityContainer != null) { - return activityContainer.mStack; - } else { - mActivityContainers.remove(stackId); - } + ActivityContainer activityContainer = mActivityContainers.get(stackId); + if (activityContainer != null) { + return activityContainer.mStack; } return null; } @@ -2191,49 +2185,26 @@ public final class ActivityStackSupervisor implements DisplayListener { return null; } - ActivityContainer createActivityContainer(ActivityRecord parentActivity, int stackId, - IActivityContainerCallback callback) { - ActivityContainer activityContainer = new ActivityContainer(parentActivity, stackId, - callback); - mActivityContainers.put(stackId, new WeakReference<ActivityContainer>(activityContainer)); - if (parentActivity != null) { - parentActivity.mChildContainers.add(activityContainer.mStack); - } - return activityContainer; - } - ActivityContainer createActivityContainer(ActivityRecord parentActivity, IActivityContainerCallback callback) { - return createActivityContainer(parentActivity, getNextStackId(), callback); + ActivityContainer activityContainer = new VirtualActivityContainer(parentActivity, callback); + mActivityContainers.put(activityContainer.mStackId, activityContainer); + parentActivity.mChildContainers.add(activityContainer); + return activityContainer; } void removeChildActivityContainers(ActivityRecord parentActivity) { - for (int ndx = mActivityContainers.size() - 1; ndx >= 0; --ndx) { - final ActivityContainer container = mActivityContainers.valueAt(ndx).get(); - if (container == null) { - mActivityContainers.removeAt(ndx); - continue; - } - if (container.mParentActivity != parentActivity) { - continue; - } - - ActivityStack stack = container.mStack; - ActivityRecord top = stack.topRunningNonDelayedActivityLocked(null); - if (top != null) { - // TODO: Make sure the next activity doesn't start up when top is destroyed. - stack.destroyActivityLocked(top, true, true, "stack parent destroyed"); - } - mActivityContainers.removeAt(ndx); - container.detachLocked(); + final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; + for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { + ActivityContainer container = childStacks.remove(containerNdx); + container.release(); } } void deleteActivityContainer(IActivityContainer container) { ActivityContainer activityContainer = (ActivityContainer)container; if (activityContainer != null) { - activityContainer.mStack.destroyActivitiesLocked(null, true, - "deleteActivityContainer"); + activityContainer.mStack.finishAllActivitiesLocked(); final ActivityRecord parent = activityContainer.mParentActivity; if (parent != null) { parent.mChildContainers.remove(activityContainer); @@ -2244,14 +2215,14 @@ public final class ActivityStackSupervisor implements DisplayListener { } } - private int createStackOnDisplay(ActivityRecord parentActivity, int stackId, int displayId) { + private int createStackOnDisplay(int stackId, int displayId) { ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); if (activityDisplay == null) { return -1; } - ActivityContainer activityContainer = - createActivityContainer(parentActivity, stackId, null); + ActivityContainer activityContainer = new ActivityContainer(stackId); + mActivityContainers.put(stackId, activityContainer); activityContainer.attachToDisplayLocked(activityDisplay); return stackId; } @@ -2334,9 +2305,9 @@ public final class ActivityStackSupervisor implements DisplayListener { } boolean shutdownLocked(int timeout) { - boolean timedout = false; goingToSleepLocked(); + boolean timedout = false; final long endTime = System.currentTimeMillis() + timeout; while (true) { boolean cantShutdown = false; @@ -3030,24 +3001,26 @@ public final class ActivityStackSupervisor implements DisplayListener { class ActivityContainer extends IActivityContainer.Stub { final int mStackId; - final IActivityContainerCallback mCallback; + IActivityContainerCallback mCallback = null; final ActivityStack mStack; - final ActivityRecord mParentActivity; - final String mIdString; + ActivityRecord mParentActivity = null; + String mIdString; boolean mVisible = true; /** Display this ActivityStack is currently on. Null if not attached to a Display. */ ActivityDisplay mActivityDisplay; - ActivityContainer(ActivityRecord parentActivity, int stackId, - IActivityContainerCallback callback) { + final static int CONTAINER_STATE_HAS_SURFACE = 0; + final static int CONTAINER_STATE_NO_SURFACE = 1; + final static int CONTAINER_STATE_FINISHING = 2; + int mContainerState = CONTAINER_STATE_HAS_SURFACE; + + ActivityContainer(int stackId) { synchronized (mService) { mStackId = stackId; mStack = new ActivityStack(this); - mParentActivity = parentActivity; - mCallback = callback; - mIdString = "ActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}"; + mIdString = "ActivtyContainer{" + mStackId + "}"; if (DEBUG_STACK) Slog.d(TAG, "Creating " + this); } } @@ -3097,6 +3070,14 @@ public final class ActivityStackSupervisor implements DisplayListener { } } + @Override + public void release() { + mContainerState = CONTAINER_STATE_FINISHING; + mStack.finishAllActivitiesLocked(); + detachLocked(); + mWindowManager.removeStack(mStackId); + } + private void detachLocked() { if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display=" + mActivityDisplay + " Callers=" + Debug.getCallers(2)); @@ -3110,13 +3091,6 @@ public final class ActivityStackSupervisor implements DisplayListener { } @Override - public void detachFromDisplay() { - synchronized (mService) { - detachLocked(); - } - } - - @Override public final int startActivity(Intent intent) { mService.enforceNotIsolatedCaller("ActivityContainer.startActivity"); int userId = mService.handleIncomingUser(Binder.getCallingPid(), @@ -3149,23 +3123,8 @@ public final class ActivityStackSupervisor implements DisplayListener { } @Override - public void attachToSurface(Surface surface, int width, int height, int density) { + public void setSurface(Surface surface, int width, int height, int density) { mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface"); - - final long origId = Binder.clearCallingIdentity(); - try { - synchronized (mService) { - ActivityDisplay activityDisplay = - new ActivityDisplay(surface, width, height, density); - mActivityDisplays.put(activityDisplay.mDisplayId, activityDisplay); - attachToDisplayLocked(activityDisplay); - mStack.resumeTopActivityLocked(null); - } - if (DEBUG_STACK) Slog.d(TAG, "attachToSurface: " + this + " to display=" - + mActivityDisplay); - } finally { - Binder.restoreCallingIdentity(origId); - } } ActivityStackSupervisor getOuter() { @@ -3184,6 +3143,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } } + // TODO: Make sure every change to ActivityRecord.visible results in a call to this. void setVisible(boolean visible) { if (mVisible != visible) { mVisible = visible; @@ -3194,52 +3154,114 @@ public final class ActivityStackSupervisor implements DisplayListener { } } + void setDrawn() { + } + @Override public String toString() { return mIdString + (mActivityDisplay == null ? "N" : "A"); } } + private class VirtualActivityContainer extends ActivityContainer { + Surface mSurface; + boolean mDrawn = false; + + VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) { + super(getNextStackId()); + mParentActivity = parent; + mCallback = callback; + mContainerState = CONTAINER_STATE_NO_SURFACE; + mIdString = "VirtualActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}"; + } + + @Override + public void setSurface(Surface surface, int width, int height, int density) { + super.setSurface(surface, width, height, density); + + synchronized (mService) { + final long origId = Binder.clearCallingIdentity(); + try { + setSurfaceLocked(surface, width, height, density); + } finally { + Binder.restoreCallingIdentity(origId); + } + } + } + + private void setSurfaceLocked(Surface surface, int width, int height, int density) { + if (mContainerState == CONTAINER_STATE_FINISHING) { + return; + } + VirtualActivityDisplay virtualActivityDisplay = + (VirtualActivityDisplay) mActivityDisplay; + if (virtualActivityDisplay == null) { + virtualActivityDisplay = + new VirtualActivityDisplay(width, height, density); + mActivityDisplay = virtualActivityDisplay; + mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay); + attachToDisplayLocked(virtualActivityDisplay); + } + + if (mSurface != null) { + mSurface.release(); + } + + mSurface = surface; + if (surface != null) { + mStack.resumeTopActivityLocked(null); + } else { + mContainerState = CONTAINER_STATE_NO_SURFACE; + ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); +// if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { +// mStack.startPausingLocked(false, true); +// } + } + + setSurfaceIfReady(); + + if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" + + virtualActivityDisplay); + } + + @Override + void setDrawn() { + synchronized (mService) { + mDrawn = true; + setSurfaceIfReady(); + } + } + + private void setSurfaceIfReady() { + if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn + + " mContainerState=" + mContainerState + " mSurface=" + mSurface); + if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { + ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); + mContainerState = CONTAINER_STATE_HAS_SURFACE; + } + } + } + /** Exactly one of these classes per Display in the system. Capable of holding zero or more * attached {@link ActivityStack}s */ - final class ActivityDisplay { + class ActivityDisplay { /** Actual Display this object tracks. */ int mDisplayId; Display mDisplay; DisplayInfo mDisplayInfo = new DisplayInfo(); - Surface mSurface; /** All of the stacks on this display. Order matters, topmost stack is in front of all other * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); - /** If this display is for an ActivityView then the VirtualDisplay created for it is stored - * here. */ - VirtualDisplay mVirtualDisplay; + ActivityDisplay() { + } ActivityDisplay(int displayId) { init(mDisplayManager.getDisplay(displayId)); } - ActivityDisplay(Surface surface, int width, int height, int density) { - DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); - long ident = Binder.clearCallingIdentity(); - try { - mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, - VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface, - DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | - DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); - } finally { - Binder.restoreCallingIdentity(ident); - } - - init(mVirtualDisplay.getDisplay()); - mSurface = surface; - - mWindowManager.handleDisplayAdded(mDisplayId); - } - - private void init(Display display) { + void init(Display display) { mDisplay = display; mDisplayId = display.getDisplayId(); mDisplay.getDisplayInfo(mDisplayInfo); @@ -3255,11 +3277,6 @@ public final class ActivityStackSupervisor implements DisplayListener { if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack + " from displayId=" + mDisplayId); mStacks.remove(stack); - if (mStacks.isEmpty() && mVirtualDisplay != null) { - mVirtualDisplay.release(); - mVirtualDisplay = null; - } - mSurface.release(); } void getBounds(Point bounds) { @@ -3270,8 +3287,42 @@ public final class ActivityStackSupervisor implements DisplayListener { @Override public String toString() { - return "ActivityDisplay={" + mDisplayId + (mVirtualDisplay == null ? "" : "V") - + " numStacks=" + mStacks.size() + "}"; + return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}"; + } + } + + class VirtualActivityDisplay extends ActivityDisplay { + VirtualDisplay mVirtualDisplay; + + VirtualActivityDisplay(int width, int height, int density) { + DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); + mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, VIRTUAL_DISPLAY_BASE_NAME, + width, height, density, null, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | + DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); + + init(mVirtualDisplay.getDisplay()); + + mWindowManager.handleDisplayAdded(mDisplayId); + } + + void setSurface(Surface surface) { + if (mVirtualDisplay != null) { + mVirtualDisplay.setSurface(surface); + } + } + + @Override + void detachActivitiesLocked(ActivityStack stack) { + super.detachActivitiesLocked(stack); + if (mVirtualDisplay != null) { + mVirtualDisplay.release(); + mVirtualDisplay = null; + } + } + + @Override + public String toString() { + return "VirtualActivityDisplay={" + mDisplayId + "}"; } } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 5b597a3..c8bdb4c 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -52,6 +52,7 @@ import android.media.IRingtonePlayer; import android.net.Uri; import android.os.Binder; import android.os.Build; +import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -64,6 +65,7 @@ import android.provider.Settings; import android.service.notification.INotificationListener; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; +import android.service.notification.ZenModeConfig; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; @@ -78,6 +80,7 @@ import android.widget.Toast; import com.android.internal.R; import com.android.internal.notification.NotificationScorer; +import com.android.internal.util.FastXmlSerializer; import com.android.server.EventLogTags; import com.android.server.notification.NotificationUsageStats.SingleNotificationStats; import com.android.server.statusbar.StatusBarManagerInternal; @@ -87,11 +90,13 @@ import com.android.server.lights.LightsManager; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Array; @@ -115,6 +120,7 @@ public class NotificationManagerService extends SystemService { // message codes static final int MESSAGE_TIMEOUT = 2; + static final int MESSAGE_SAVE_POLICY_FILE = 3; static final int LONG_DELAY = 3500; // 3.5 seconds static final int SHORT_DELAY = 2000; // 2 seconds @@ -209,15 +215,6 @@ public class NotificationManagerService extends SystemService { private final NotificationUsageStats mUsageStats = new NotificationUsageStats(); - private int mZenMode; - // temporary, until we update apps to provide metadata - private static final Set<String> CALL_PACKAGES = new HashSet<String>(Arrays.asList( - "com.google.android.dialer", - "com.android.phone" - )); - private static final Set<String> ALARM_PACKAGES = new HashSet<String>(Arrays.asList( - "com.google.android.deskclock" - )); private static final String EXTRA_INTERCEPT = "android.intercept"; // Profiles of the current user. @@ -421,53 +418,82 @@ public class NotificationManagerService extends SystemService { Archive mArchive = new Archive(); - private void loadBlockDb() { - synchronized(mBlockedPackages) { - if (mPolicyFile == null) { - File dir = new File("/data/system"); - mPolicyFile = new AtomicFile(new File(dir, "notification_policy.xml")); + private void loadPolicyFile() { + synchronized(mPolicyFile) { + mBlockedPackages.clear(); - mBlockedPackages.clear(); - - FileInputStream infile = null; - try { - infile = mPolicyFile.openRead(); - final XmlPullParser parser = Xml.newPullParser(); - parser.setInput(infile, null); - - int type; - String tag; - int version = DB_VERSION; - while ((type = parser.next()) != END_DOCUMENT) { - tag = parser.getName(); - if (type == START_TAG) { - if (TAG_BODY.equals(tag)) { - version = Integer.parseInt( - parser.getAttributeValue(null, ATTR_VERSION)); - } else if (TAG_BLOCKED_PKGS.equals(tag)) { - while ((type = parser.next()) != END_DOCUMENT) { - tag = parser.getName(); - if (TAG_PACKAGE.equals(tag)) { - mBlockedPackages.add( - parser.getAttributeValue(null, ATTR_NAME)); - } else if (TAG_BLOCKED_PKGS.equals(tag) && type == END_TAG) { - break; - } + FileInputStream infile = null; + try { + infile = mPolicyFile.openRead(); + final XmlPullParser parser = Xml.newPullParser(); + parser.setInput(infile, null); + + int type; + String tag; + int version = DB_VERSION; + while ((type = parser.next()) != END_DOCUMENT) { + tag = parser.getName(); + if (type == START_TAG) { + if (TAG_BODY.equals(tag)) { + version = Integer.parseInt( + parser.getAttributeValue(null, ATTR_VERSION)); + } else if (TAG_BLOCKED_PKGS.equals(tag)) { + while ((type = parser.next()) != END_DOCUMENT) { + tag = parser.getName(); + if (TAG_PACKAGE.equals(tag)) { + mBlockedPackages.add( + parser.getAttributeValue(null, ATTR_NAME)); + } else if (TAG_BLOCKED_PKGS.equals(tag) && type == END_TAG) { + break; } } } } - } catch (FileNotFoundException e) { - // No data yet - } catch (IOException e) { - Log.wtf(TAG, "Unable to read blocked notifications database", e); - } catch (NumberFormatException e) { - Log.wtf(TAG, "Unable to parse blocked notifications database", e); - } catch (XmlPullParserException e) { - Log.wtf(TAG, "Unable to parse blocked notifications database", e); - } finally { - IoUtils.closeQuietly(infile); + mZenModeHelper.readXml(parser); } + } catch (FileNotFoundException e) { + // No data yet + } catch (IOException e) { + Log.wtf(TAG, "Unable to read notification policy", e); + } catch (NumberFormatException e) { + Log.wtf(TAG, "Unable to parse notification policy", e); + } catch (XmlPullParserException e) { + Log.wtf(TAG, "Unable to parse notification policy", e); + } finally { + IoUtils.closeQuietly(infile); + } + } + } + + public void savePolicyFile() { + mHandler.removeMessages(MESSAGE_SAVE_POLICY_FILE); + mHandler.sendEmptyMessage(MESSAGE_SAVE_POLICY_FILE); + } + + private void handleSavePolicyFile() { + Slog.d(TAG, "handleSavePolicyFile"); + synchronized (mPolicyFile) { + final FileOutputStream stream; + try { + stream = mPolicyFile.startWrite(); + } catch (IOException e) { + Slog.w(TAG, "Failed to save policy file", e); + return; + } + + try { + final XmlSerializer out = new FastXmlSerializer(); + out.setOutput(stream, "utf-8"); + out.startDocument(null, true); + out.startTag(null, TAG_BODY); + out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION)); + mZenModeHelper.writeXml(out); + out.endTag(null, TAG_BODY); + out.endDocument(); + mPolicyFile.finishWrite(stream); + } catch (IOException e) { + Slog.w(TAG, "Failed to save policy file, restoring backup", e); + mPolicyFile.failWrite(stream); } } } @@ -1066,10 +1092,7 @@ public class NotificationManagerService extends SystemService { @Override public boolean allowDisable(int what, IBinder token, String pkg) { - if (isCall(pkg, null)) { - return mZenMode == Settings.Global.ZEN_MODE_OFF; - } - return true; + return mZenModeHelper.allowDisable(what, token, pkg); } @Override @@ -1194,9 +1217,6 @@ public class NotificationManagerService extends SystemService { private final Uri ENABLED_NOTIFICATION_LISTENERS_URI = Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); - private final Uri ZEN_MODE - = Settings.Global.getUriFor(Settings.Global.ZEN_MODE); - SettingsObserver(Handler handler) { super(handler); } @@ -1207,8 +1227,6 @@ public class NotificationManagerService extends SystemService { false, this, UserHandle.USER_ALL); resolver.registerContentObserver(ENABLED_NOTIFICATION_LISTENERS_URI, false, this, UserHandle.USER_ALL); - resolver.registerContentObserver(ZEN_MODE, - false, this); update(null); } @@ -1229,13 +1247,11 @@ public class NotificationManagerService extends SystemService { if (uri == null || ENABLED_NOTIFICATION_LISTENERS_URI.equals(uri)) { rebindListenerServices(); } - if (ZEN_MODE.equals(uri)) { - updateZenMode(); - } } } private SettingsObserver mSettingsObserver; + private ZenModeHelper mZenModeHelper; static long[] getLongArray(Resources r, int resid, int maxlen, long[] def) { int[] ar = r.getIntArray(resid); @@ -1261,6 +1277,15 @@ public class NotificationManagerService extends SystemService { mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); mHandler = new WorkerHandler(); + mZenModeHelper = new ZenModeHelper(getContext(), mHandler); + mZenModeHelper.setCallback(new ZenModeHelper.Callback() { + @Override + public void onConfigChanged() { + savePolicyFile(); + } + }); + final File systemDir = new File(Environment.getDataDirectory(), "system"); + mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml")); importOldBlockDb(); @@ -1297,7 +1322,7 @@ public class NotificationManagerService extends SystemService { Settings.Global.DEVICE_PROVISIONED, 0)) { mDisableNotificationAlerts = true; } - updateZenMode(); + mZenModeHelper.updateZenMode(); updateCurrentProfilesCache(getContext()); @@ -1350,7 +1375,7 @@ public class NotificationManagerService extends SystemService { * Read the old XML-based app block database and import those blockages into the AppOps system. */ private void importOldBlockDb() { - loadBlockDb(); + loadPolicyFile(); PackageManager pm = getContext().getPackageManager(); for (String pkg : mBlockedPackages) { @@ -1363,9 +1388,6 @@ public class NotificationManagerService extends SystemService { } } mBlockedPackages.clear(); - if (mPolicyFile != null) { - mPolicyFile.delete(); - } } @Override @@ -1745,6 +1767,18 @@ public class NotificationManagerService extends SystemService { } @Override + public ZenModeConfig getZenModeConfig() { + checkCallerIsSystem(); + return mZenModeHelper.getConfig(); + } + + @Override + public boolean setZenModeConfig(ZenModeConfig config) { + checkCallerIsSystem(); + return mZenModeHelper.setConfig(config); + } + + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { @@ -1825,7 +1859,6 @@ public class NotificationManagerService extends SystemService { pw.println(" mSoundNotification=" + mSoundNotification); pw.println(" mVibrateNotification=" + mVibrateNotification); pw.println(" mDisableNotificationAlerts=" + mDisableNotificationAlerts); - pw.println(" mZenMode=" + Settings.Global.zenModeToString(mZenMode)); pw.println(" mSystemReady=" + mSystemReady); pw.println(" mArchive=" + mArchive.toString()); Iterator<StatusBarNotification> iter = mArchive.descendingIterator(); @@ -1841,6 +1874,8 @@ public class NotificationManagerService extends SystemService { pw.println("\n Usage Stats:"); mUsageStats.dump(pw, " "); + pw.println("\n Zen Mode:"); + mZenModeHelper.dump(pw, " "); } } @@ -1973,7 +2008,7 @@ public class NotificationManagerService extends SystemService { } // Is this notification intercepted by zen mode? - final boolean intercept = shouldIntercept(pkg, notification); + final boolean intercept = mZenModeHelper.shouldIntercept(pkg, notification); notification.extras.putBoolean(EXTRA_INTERCEPT, intercept); // Should this notification make noise, vibe, or use the LED? @@ -2358,6 +2393,9 @@ public class NotificationManagerService extends SystemService { case MESSAGE_TIMEOUT: handleTimeout((ToastRecord)msg.obj); break; + case MESSAGE_SAVE_POLICY_FILE: + handleSavePolicyFile(); + break; } } } @@ -2722,42 +2760,6 @@ public class NotificationManagerService extends SystemService { } } - private void updateZenMode() { - final int mode = Settings.Global.getInt(getContext().getContentResolver(), - Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); - if (mode != mZenMode) { - Slog.d(TAG, String.format("updateZenMode: %s -> %s", - Settings.Global.zenModeToString(mZenMode), - Settings.Global.zenModeToString(mode))); - } - mZenMode = mode; - - final String[] exceptionPackages = null; // none (for now) - - // call restrictions - final boolean muteCalls = mZenMode != Settings.Global.ZEN_MODE_OFF; - mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_RING, - muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, - exceptionPackages); - mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, AudioManager.STREAM_RING, - muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, - exceptionPackages); - - // alarm restrictions - final boolean muteAlarms = false; // TODO until we save user config - mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_ALARM, - muteAlarms ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, - exceptionPackages); - mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, AudioManager.STREAM_ALARM, - muteAlarms ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, - exceptionPackages); - - // restrict vibrations with no hints - mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.USE_DEFAULT_STREAM_TYPE, - (muteAlarms || muteCalls) ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, - exceptionPackages); - } - private void updateCurrentProfilesCache(Context context) { UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); if (userManager != null) { @@ -2788,19 +2790,4 @@ public class NotificationManagerService extends SystemService { return mCurrentProfiles.get(userId) != null; } } - - private boolean isCall(String pkg, Notification n) { - return CALL_PACKAGES.contains(pkg); - } - - private boolean isAlarm(String pkg, Notification n) { - return ALARM_PACKAGES.contains(pkg); - } - - private boolean shouldIntercept(String pkg, Notification n) { - if (mZenMode != Settings.Global.ZEN_MODE_OFF) { - return !isAlarm(pkg, n); - } - return false; - } } diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java new file mode 100644 index 0000000..80f5b5c --- /dev/null +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -0,0 +1,312 @@ +/** + * 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.server.notification; + +import android.app.AlarmManager; +import android.app.AppOpsManager; +import android.app.Notification; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.content.res.XmlResourceParser; +import android.database.ContentObserver; +import android.media.AudioManager; +import android.net.Uri; +import android.os.Handler; +import android.os.IBinder; +import android.provider.Settings.Global; +import android.service.notification.ZenModeConfig; +import android.util.Slog; + +import com.android.internal.R; + +import libcore.io.IoUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +/** + * NotificationManagerService helper for functionality related to zen mode. + */ +public class ZenModeHelper { + private static final String TAG = "ZenModeHelper"; + + private static final String ACTION_ENTER_ZEN = "enter_zen"; + private static final int REQUEST_CODE_ENTER = 100; + private static final String ACTION_EXIT_ZEN = "exit_zen"; + private static final int REQUEST_CODE_EXIT = 101; + private static final String EXTRA_TIME = "time"; + + private final Context mContext; + private final Handler mHandler; + private final SettingsObserver mSettingsObserver; + private final AppOpsManager mAppOps; + private final ZenModeConfig mDefaultConfig; + + private Callback mCallback; + private int mZenMode; + private ZenModeConfig mConfig; + + // temporary, until we update apps to provide metadata + private static final Set<String> CALL_PACKAGES = new HashSet<String>(Arrays.asList( + "com.google.android.dialer", + "com.android.phone" + )); + private static final Set<String> MESSAGE_PACKAGES = new HashSet<String>(Arrays.asList( + "com.google.android.talk", + "com.android.mms" + )); + + public ZenModeHelper(Context context, Handler handler) { + mContext = context; + mHandler = handler; + mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + mDefaultConfig = readDefaultConfig(context.getResources()); + mConfig = mDefaultConfig; + mSettingsObserver = new SettingsObserver(mHandler); + mSettingsObserver.observe(); + + final IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_ENTER_ZEN); + filter.addAction(ACTION_EXIT_ZEN); + mContext.registerReceiver(new ZenBroadcastReceiver(), filter); + } + + public static ZenModeConfig readDefaultConfig(Resources resources) { + XmlResourceParser parser = null; + try { + parser = resources.getXml(R.xml.default_zen_mode_config); + while (parser.next() != XmlPullParser.END_DOCUMENT) { + final ZenModeConfig config = ZenModeConfig.readXml(parser); + if (config != null) return config; + } + } catch (Exception e) { + Slog.w(TAG, "Error reading default zen mode config from resource", e); + } finally { + IoUtils.closeQuietly(parser); + } + return new ZenModeConfig(); + } + + public void setCallback(Callback callback) { + mCallback = callback; + } + + public boolean shouldIntercept(String pkg, Notification n) { + if (mZenMode != Global.ZEN_MODE_OFF) { + if (isCall(pkg, n)) { + return !mConfig.allowCalls; + } + if (isMessage(pkg, n)) { + return !mConfig.allowMessages; + } + return true; + } + return false; + } + + public void updateZenMode() { + final int mode = Global.getInt(mContext.getContentResolver(), + Global.ZEN_MODE, Global.ZEN_MODE_OFF); + if (mode != mZenMode) { + Slog.d(TAG, String.format("updateZenMode: %s -> %s", + Global.zenModeToString(mZenMode), + Global.zenModeToString(mode))); + } + mZenMode = mode; + final boolean zen = mZenMode != Global.ZEN_MODE_OFF; + final String[] exceptionPackages = null; // none (for now) + + // call restrictions + final boolean muteCalls = zen && !mConfig.allowCalls; + mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_RING, + muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, + exceptionPackages); + mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, AudioManager.STREAM_RING, + muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, + exceptionPackages); + + // restrict vibrations with no hints + mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.USE_DEFAULT_STREAM_TYPE, + zen ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, + exceptionPackages); + } + + public boolean allowDisable(int what, IBinder token, String pkg) { + if (isCall(pkg, null)) { + return mZenMode == Global.ZEN_MODE_OFF || mConfig.allowCalls; + } + return true; + } + + public void dump(PrintWriter pw, String prefix) { + pw.print(prefix); pw.print("mZenMode="); + pw.println(Global.zenModeToString(mZenMode)); + pw.print(prefix); pw.print("mConfig="); pw.println(mConfig); + pw.print(prefix); pw.print("mDefaultConfig="); pw.println(mDefaultConfig); + } + + public void readXml(XmlPullParser parser) throws XmlPullParserException, IOException { + final ZenModeConfig config = ZenModeConfig.readXml(parser); + if (config != null) { + setConfig(config); + } + } + + public void writeXml(XmlSerializer out) throws IOException { + mConfig.writeXml(out); + } + + public ZenModeConfig getConfig() { + return mConfig; + } + + public boolean setConfig(ZenModeConfig config) { + if (config == null || !config.isValid()) return false; + if (config.equals(mConfig)) return true; + mConfig = config; + Slog.d(TAG, "mConfig=" + mConfig); + if (mCallback != null) mCallback.onConfigChanged(); + final String val = Integer.toString(mConfig.hashCode()); + Global.putString(mContext.getContentResolver(), Global.ZEN_MODE_CONFIG_ETAG, val); + updateAlarms(); + updateZenMode(); + return true; + } + + private boolean isCall(String pkg, Notification n) { + return CALL_PACKAGES.contains(pkg); + } + + private boolean isMessage(String pkg, Notification n) { + return MESSAGE_PACKAGES.contains(pkg); + } + + private void updateAlarms() { + updateAlarm(ACTION_ENTER_ZEN, REQUEST_CODE_ENTER, + mConfig.sleepStartHour, mConfig.sleepStartMinute); + updateAlarm(ACTION_EXIT_ZEN, REQUEST_CODE_EXIT, + mConfig.sleepEndHour, mConfig.sleepEndMinute); + } + + private void updateAlarm(String action, int requestCode, int hr, int min) { + final AlarmManager alarms = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); + final long now = System.currentTimeMillis(); + final Calendar c = Calendar.getInstance(); + c.setTimeInMillis(now); + c.set(Calendar.HOUR_OF_DAY, hr); + c.set(Calendar.MINUTE, min); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + if (c.getTimeInMillis() <= now) { + c.add(Calendar.DATE, 1); + } + final long time = c.getTimeInMillis(); + final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, + new Intent(action).putExtra(EXTRA_TIME, time), PendingIntent.FLAG_UPDATE_CURRENT); + alarms.cancel(pendingIntent); + if (mConfig.sleepMode != null) { + Slog.d(TAG, String.format("Scheduling %s for %s, %s in the future, now=%s", + action, ts(time), time - now, ts(now))); + alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent); + } + } + + private static String ts(long time) { + return new Date(time) + " (" + time + ")"; + } + + public static boolean isWeekend(long time, int offsetDays) { + final Calendar c = Calendar.getInstance(); + c.setTimeInMillis(time); + if (offsetDays != 0) { + c.add(Calendar.DATE, offsetDays); + } + final int day = c.get(Calendar.DAY_OF_WEEK); + return day == Calendar.SATURDAY || day == Calendar.SUNDAY; + } + + private class SettingsObserver extends ContentObserver { + private final Uri ZEN_MODE = Global.getUriFor(Global.ZEN_MODE); + + public SettingsObserver(Handler handler) { + super(handler); + } + + public void observe() { + final ContentResolver resolver = mContext.getContentResolver(); + resolver.registerContentObserver(ZEN_MODE, false /*notifyForDescendents*/, this); + update(null); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + update(uri); + } + + public void update(Uri uri) { + if (ZEN_MODE.equals(uri)) { + updateZenMode(); + } + } + } + + private class ZenBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (ACTION_ENTER_ZEN.equals(intent.getAction())) { + setZenMode(intent, 1, Global.ZEN_MODE_ON); + } else if (ACTION_EXIT_ZEN.equals(intent.getAction())) { + setZenMode(intent, 0, Global.ZEN_MODE_OFF); + } + } + + private void setZenMode(Intent intent, int wkendOffsetDays, int zenModeValue) { + final long schTime = intent.getLongExtra(EXTRA_TIME, 0); + final long now = System.currentTimeMillis(); + Slog.d(TAG, String.format("%s scheduled for %s, fired at %s, delta=%s", + intent.getAction(), ts(schTime), ts(now), now - schTime)); + + final boolean skip = ZenModeConfig.SLEEP_MODE_WEEKNIGHTS.equals(mConfig.sleepMode) && + isWeekend(schTime, wkendOffsetDays); + + if (skip) { + Slog.d(TAG, "Skipping zen mode update for the weekend"); + } else { + Global.putInt(mContext.getContentResolver(), Global.ZEN_MODE, zenModeValue); + } + updateAlarms(); + } + } + + public interface Callback { + void onConfigChanged(); + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index df69a6e..702d9d2 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4492,17 +4492,6 @@ public class PackageManagerService extends IPackageManager.Stub { // writer synchronized (mPackages) { - if ((parseFlags&PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { - // Check all shared libraries and map to their actual file path. - // We only do this here for apps not on a system dir, because those - // are the only ones that can fail an install due to this. We - // will take care of the system apps by updating all of their - // library paths after the scan is done. - if (!updateSharedLibrariesLPw(pkg, null)) { - return null; - } - } - if (pkg.mSharedUserId != null) { suid = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0, true); if (suid == null) { @@ -4613,6 +4602,17 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; } + if ((parseFlags&PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { + // Check all shared libraries and map to their actual file path. + // We only do this here for apps not on a system dir, because those + // are the only ones that can fail an install due to this. We + // will take care of the system apps by updating all of their + // library paths after the scan is done. + if (!updateSharedLibrariesLPw(pkg, null)) { + return null; + } + } + if (mFoundPolicyFile) { SELinuxMMAC.assignSeinfoValue(pkg); } @@ -5420,6 +5420,37 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private String calculateApkRoot(final File codePath) { + final File codeRoot; + if (FileUtils.contains(Environment.getRootDirectory(), codePath)) { + codeRoot = Environment.getRootDirectory(); + } else if (FileUtils.contains(Environment.getOemDirectory(), codePath)) { + codeRoot = Environment.getRootDirectory(); + } else if (FileUtils.contains(Environment.getVendorDirectory(), codePath)) { + codeRoot = Environment.getVendorDirectory(); + } else { + // Unrecognized code path; take its top real segment as the apk root: + // e.g. /something/app/blah.apk => /something + try { + File f = codePath.getCanonicalFile(); + File parent = f.getParentFile(); // non-null because codePath is a file + File tmp; + while ((tmp = parent.getParentFile()) != null) { + f = parent; + parent = tmp; + } + codeRoot = f; + Slog.w(TAG, "Unrecognized code path " + + codePath + " - using " + codeRoot); + } catch (IOException e) { + // Can't canonicalize the lib path -- shenanigans? + Slog.w(TAG, "Can't canonicalize code path " + codePath); + return Environment.getRootDirectory().getPath(); + } + } + return codeRoot.getPath(); + } + // This is the initial scan-time determination of how to handle a given // package for purposes of native library location. private void setInternalAppNativeLibraryPath(PackageParser.Package pkg, @@ -5431,11 +5462,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (bundledApk) { // If "/system/lib64/apkname" exists, assume that is the per-package // native library directory to use; otherwise use "/system/lib/apkname". - File lib64 = new File(Environment.getRootDirectory(), LIB64_DIR_NAME); + String apkRoot = calculateApkRoot(pkgSetting.codePath); + File lib64 = new File(apkRoot, LIB64_DIR_NAME); File packLib64 = new File(lib64, apkName); - libDir = (packLib64.exists()) - ? lib64 - : new File(Environment.getRootDirectory(), LIB_DIR_NAME); + libDir = (packLib64.exists()) ? lib64 : new File(apkRoot, LIB_DIR_NAME); } else { libDir = mAppLibInstallDir; } diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 75e5857..6700895 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -26,6 +26,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.graphics.Rect; import android.net.Uri; import android.os.Binder; import android.os.IBinder; @@ -42,6 +43,7 @@ import android.tv.TvInputInfo; import android.tv.TvInputService; import android.util.ArrayMap; import android.util.Log; +import android.util.Slog; import android.util.SparseArray; import android.view.Surface; @@ -116,17 +118,19 @@ public final class TvInputManagerService extends SystemService { UserState userState = getUserStateLocked(userId); userState.inputList.clear(); + if (DEBUG) Slog.d(TAG, "buildTvInputList"); PackageManager pm = mContext.getPackageManager(); List<ResolveInfo> services = pm.queryIntentServices( new Intent(TvInputService.SERVICE_INTERFACE), PackageManager.GET_SERVICES); for (ResolveInfo ri : services) { ServiceInfo si = ri.serviceInfo; if (!android.Manifest.permission.BIND_TV_INPUT.equals(si.permission)) { - Log.w(TAG, "Skipping TV input " + si.name + ": it does not require the permission " + Slog.w(TAG, "Skipping TV input " + si.name + ": it does not require the permission " + android.Manifest.permission.BIND_TV_INPUT); continue; } TvInputInfo info = new TvInputInfo(ri); + if (DEBUG) Slog.d(TAG, "add " + info.getId()); userState.inputList.add(info); } } @@ -161,7 +165,7 @@ public final class TvInputManagerService extends SystemService { try { state.session.release(); } catch (RemoteException e) { - Log.e(TAG, "error in release", e); + Slog.e(TAG, "error in release", e); } } } @@ -173,7 +177,7 @@ public final class TvInputManagerService extends SystemService { try { serviceState.service.unregisterCallback(serviceState.callback); } catch (RemoteException e) { - Log.e(TAG, "error in unregisterCallback", e); + Slog.e(TAG, "error in unregisterCallback", e); } } serviceState.clients.clear(); @@ -244,7 +248,7 @@ public final class TvInputManagerService extends SystemService { return; } if (DEBUG) { - Log.i(TAG, "bindServiceAsUser(name=" + name.getClassName() + ", userId=" + userId + Slog.d(TAG, "bindServiceAsUser(name=" + name.getClassName() + ", userId=" + userId + ")"); } Intent i = new Intent(TvInputService.SERVICE_INTERFACE).setComponent(name); @@ -255,7 +259,7 @@ public final class TvInputManagerService extends SystemService { // This means that the service is already connected but its state indicates that we have // nothing to do with it. Then, disconnect the service. if (DEBUG) { - Log.i(TAG, "unbindService(name=" + name.getClassName() + ")"); + Slog.d(TAG, "unbindService(name=" + name.getClassName() + ")"); } mContext.unbindService(serviceState.connection); userState.serviceStateMap.remove(name); @@ -267,7 +271,7 @@ public final class TvInputManagerService extends SystemService { final SessionState sessionState = getUserStateLocked(userId).sessionStateMap.get(sessionToken); if (DEBUG) { - Log.d(TAG, "createSessionInternalLocked(name=" + sessionState.name.getClassName() + Slog.d(TAG, "createSessionInternalLocked(name=" + sessionState.name.getClassName() + ")"); } // Set up a callback to send the session token. @@ -275,7 +279,7 @@ public final class TvInputManagerService extends SystemService { @Override public void onSessionCreated(ITvInputSession session) { if (DEBUG) { - Log.d(TAG, "onSessionCreated(name=" + sessionState.name.getClassName() + ")"); + Slog.d(TAG, "onSessionCreated(name=" + sessionState.name.getClassName() + ")"); } synchronized (mLock) { sessionState.session = session; @@ -295,7 +299,7 @@ public final class TvInputManagerService extends SystemService { try { service.createSession(callback); } catch (RemoteException e) { - Log.e(TAG, "error in createSession", e); + Slog.e(TAG, "error in createSession", e); removeSessionStateLocked(sessionToken, userId); sendSessionTokenToClientLocked(sessionState.client, sessionState.name, null, sessionState.seq, userId); @@ -307,7 +311,7 @@ public final class TvInputManagerService extends SystemService { try { client.onSessionCreated(name, sessionToken, seq); } catch (RemoteException exception) { - Log.e(TAG, "error in onSessionCreated", exception); + Slog.e(TAG, "error in onSessionCreated", exception); } if (sessionToken == null) { @@ -396,7 +400,7 @@ public final class TvInputManagerService extends SystemService { try { serviceState.service.registerCallback(serviceState.callback); } catch (RemoteException e) { - Log.e(TAG, "error in registerCallback", e); + Slog.e(TAG, "error in registerCallback", e); } } else { updateServiceConnectionLocked(name, resolvedUserId); @@ -432,7 +436,7 @@ public final class TvInputManagerService extends SystemService { try { serviceState.service.unregisterCallback(serviceState.callback); } catch (RemoteException e) { - Log.e(TAG, "error in unregisterCallback", e); + Slog.e(TAG, "error in unregisterCallback", e); } finally { serviceState.callback = null; updateServiceConnectionLocked(name, resolvedUserId); @@ -493,7 +497,7 @@ public final class TvInputManagerService extends SystemService { try { getSessionLocked(sessionToken, callingUid, resolvedUserId).release(); } catch (RemoteException e) { - Log.e(TAG, "error in release", e); + Slog.e(TAG, "error in release", e); } removeSessionStateLocked(sessionToken, resolvedUserId); @@ -515,7 +519,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId).setSurface( surface); } catch (RemoteException e) { - Log.e(TAG, "error in setSurface", e); + Slog.e(TAG, "error in setSurface", e); } } } finally { @@ -535,7 +539,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId).setVolume( volume); } catch (RemoteException e) { - Log.e(TAG, "error in setVolume", e); + Slog.e(TAG, "error in setVolume", e); } } } finally { @@ -551,13 +555,10 @@ public final class TvInputManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { synchronized (mLock) { - SessionState sessionState = getUserStateLocked(resolvedUserId) - .sessionStateMap.get(sessionToken); - final String serviceName = sessionState.name.getClassName(); try { getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(channelUri); } catch (RemoteException e) { - Log.e(TAG, "error in tune", e); + Slog.e(TAG, "error in tune", e); return; } } @@ -565,6 +566,67 @@ public final class TvInputManagerService extends SystemService { Binder.restoreCallingIdentity(identity); } } + + @Override + public void createOverlayView(IBinder sessionToken, IBinder windowToken, Rect frame, + int userId) { + final int callingUid = Binder.getCallingUid(); + final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, + userId, "createOverlayView"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + try { + getSessionLocked(sessionToken, callingUid, resolvedUserId) + .createOverlayView(windowToken, frame); + } catch (RemoteException e) { + Slog.e(TAG, "error in createOverlayView", e); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public void relayoutOverlayView(IBinder sessionToken, Rect frame, int userId) { + final int callingUid = Binder.getCallingUid(); + final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, + userId, "relayoutOverlayView"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + try { + getSessionLocked(sessionToken, callingUid, resolvedUserId) + .relayoutOverlayView(frame); + } catch (RemoteException e) { + Slog.e(TAG, "error in relayoutOverlayView", e); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public void removeOverlayView(IBinder sessionToken, int userId) { + final int callingUid = Binder.getCallingUid(); + final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, + userId, "removeOverlayView"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + try { + getSessionLocked(sessionToken, callingUid, resolvedUserId) + .removeOverlayView(); + } catch (RemoteException e) { + Slog.e(TAG, "error in removeOverlayView", e); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } } private static final class UserState { @@ -621,7 +683,7 @@ public final class TvInputManagerService extends SystemService { @Override public void onServiceConnected(ComponentName name, IBinder service) { if (DEBUG) { - Log.d(TAG, "onServiceConnected(name=" + name.getClassName() + ")"); + Slog.d(TAG, "onServiceConnected(name=" + name.getClassName() + ")"); } synchronized (mLock) { ServiceState serviceState = getServiceStateLocked(name, mUserId); @@ -633,7 +695,7 @@ public final class TvInputManagerService extends SystemService { try { serviceState.service.registerCallback(serviceState.callback); } catch (RemoteException e) { - Log.e(TAG, "error in registerCallback", e); + Slog.e(TAG, "error in registerCallback", e); } } @@ -647,7 +709,7 @@ public final class TvInputManagerService extends SystemService { @Override public void onServiceDisconnected(ComponentName name) { if (DEBUG) { - Log.d(TAG, "onServiceDisconnected(name=" + name.getClassName() + ")"); + Slog.d(TAG, "onServiceDisconnected(name=" + name.getClassName() + ")"); } } } @@ -663,7 +725,7 @@ public final class TvInputManagerService extends SystemService { public void onAvailabilityChanged(ComponentName name, boolean isAvailable) throws RemoteException { if (DEBUG) { - Log.d(TAG, "onAvailabilityChanged(name=" + name.getClassName() + ", isAvailable=" + Slog.d(TAG, "onAvailabilityChanged(name=" + name.getClassName() + ", isAvailable=" + isAvailable + ")"); } synchronized (mLock) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 912ac4d..f08d69f 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -311,6 +311,7 @@ public final class SystemServer { NetworkStatsService networkStats = null; NetworkPolicyManagerService networkPolicy = null; ConnectivityService connectivity = null; + NetworkScoreService networkScore = null; NsdService serviceDiscovery= null; IPackageManager pm = null; WindowManagerService wm = null; @@ -643,6 +644,14 @@ public final class SystemServer { } try { + Slog.i(TAG, "Network Score Service"); + networkScore = new NetworkScoreService(context); + ServiceManager.addService(Context.NETWORK_SCORE_SERVICE, networkScore); + } catch (Throwable e) { + reportWtf("starting Network Score Service", e); + } + + try { Slog.i(TAG, "Network Service Discovery Service"); serviceDiscovery = NsdService.create(context); ServiceManager.addService( @@ -1021,6 +1030,7 @@ public final class SystemServer { final NetworkStatsService networkStatsF = networkStats; final NetworkPolicyManagerService networkPolicyF = networkPolicy; final ConnectivityService connectivityF = connectivity; + final NetworkScoreService networkScoreF = networkScore; final DockObserver dockF = dock; final WallpaperManagerService wallpaperF = wallpaper; final InputMethodManagerService immF = imm; @@ -1069,6 +1079,11 @@ public final class SystemServer { reportWtf("making Battery Service ready", e); } try { + if (networkScoreF != null) networkScoreF.systemReady(); + } catch (Throwable e) { + reportWtf("making Network Score Service ready", e); + } + try { if (networkManagementF != null) networkManagementF.systemReady(); } catch (Throwable e) { reportWtf("making Network Managment Service ready", e); diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h index d2eccbe..ebe1bed 100644 --- a/tools/aapt/Bundle.h +++ b/tools/aapt/Bundle.h @@ -42,6 +42,15 @@ typedef enum Command { } Command; /* + * Pseudolocalization methods + */ +typedef enum PseudolocalizationMethod { + NO_PSEUDOLOCALIZATION = 0, + PSEUDO_ACCENTED, + PSEUDO_BIDI, +} PseudolocalizationMethod; + +/* * Bundle of goodies, including everything specified on the command line. */ class Bundle { @@ -50,7 +59,7 @@ public: : mCmd(kCommandUnknown), mVerbose(false), mAndroidList(false), mForce(false), mGrayscaleTolerance(0), mMakePackageDirs(false), mUpdate(false), mExtending(false), - mRequireLocalization(false), mPseudolocalize(false), + mRequireLocalization(false), mPseudolocalize(NO_PSEUDOLOCALIZATION), mWantUTF16(false), mValues(false), mIncludeMetaData(false), mCompressionMethod(0), mJunkPath(false), mOutputAPKFile(NULL), mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL), @@ -95,8 +104,8 @@ public: void setExtending(bool val) { mExtending = val; } bool getRequireLocalization(void) const { return mRequireLocalization; } void setRequireLocalization(bool val) { mRequireLocalization = val; } - bool getPseudolocalize(void) const { return mPseudolocalize; } - void setPseudolocalize(bool val) { mPseudolocalize = val; } + short getPseudolocalize(void) const { return mPseudolocalize; } + void setPseudolocalize(short val) { mPseudolocalize = val; } void setWantUTF16(bool val) { mWantUTF16 = val; } bool getValues(void) const { return mValues; } void setValues(bool val) { mValues = val; } @@ -259,7 +268,7 @@ private: bool mUpdate; bool mExtending; bool mRequireLocalization; - bool mPseudolocalize; + short mPseudolocalize; bool mWantUTF16; bool mValues; bool mIncludeMetaData; diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index 44b8340..0af1ce1 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -2048,14 +2048,17 @@ int doPackage(Bundle* bundle) FILE* fp; String8 dependencyFile; - // -c zz_ZZ means do pseudolocalization + // -c en_XA or/and ar_XB means do pseudolocalization ResourceFilter filter; err = filter.parse(bundle->getConfigurations()); if (err != NO_ERROR) { goto bail; } if (filter.containsPseudo()) { - bundle->setPseudolocalize(true); + bundle->setPseudolocalize(bundle->getPseudolocalize() | PSEUDO_ACCENTED); + } + if (filter.containsPseudoBidi()) { + bundle->setPseudolocalize(bundle->getPseudolocalize() | PSEUDO_BIDI); } N = bundle->getFileSpecCount(); diff --git a/tools/aapt/ResourceFilter.cpp b/tools/aapt/ResourceFilter.cpp index e8a2be4..8ca852e 100644 --- a/tools/aapt/ResourceFilter.cpp +++ b/tools/aapt/ResourceFilter.cpp @@ -24,8 +24,10 @@ ResourceFilter::parse(const char* arg) String8 part(p, q-p); - if (part == "zz_ZZ") { - mContainsPseudo = true; + if (part == "en_XA") { + mContainsPseudoAccented = true; + } else if (part == "ar_XB") { + mContainsPseudoBidi = true; } int axis; AxisValue value; diff --git a/tools/aapt/ResourceFilter.h b/tools/aapt/ResourceFilter.h index 0d127ba..c57770e 100644 --- a/tools/aapt/ResourceFilter.h +++ b/tools/aapt/ResourceFilter.h @@ -16,19 +16,22 @@ class ResourceFilter { public: - ResourceFilter() : mData(), mContainsPseudo(false) {} + ResourceFilter() : mData(), mContainsPseudoAccented(false), + mContainsPseudoBidi(false) {} status_t parse(const char* arg); bool isEmpty() const; bool match(int axis, const ResTable_config& config) const; bool match(const ResTable_config& config) const; const SortedVector<AxisValue>* configsForAxis(int axis) const; - inline bool containsPseudo() const { return mContainsPseudo; } + inline bool containsPseudo() const { return mContainsPseudoAccented; } + inline bool containsPseudoBidi() const { return mContainsPseudoBidi; } private: bool match(int axis, const AxisValue& value) const; KeyedVector<int,SortedVector<AxisValue> > mData; - bool mContainsPseudo; + bool mContainsPseudoAccented; + bool mContainsPseudoBidi; }; #endif diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 0fb2606..25bb26e 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -25,7 +25,7 @@ status_t compileXmlFile(const sp<AaptAssets>& assets, if (root == NULL) { return UNKNOWN_ERROR; } - + return compileXmlFile(assets, root, target, table, options); } @@ -577,13 +577,13 @@ status_t parseAndAddBag(Bundle* bundle, int32_t curFormat, bool isFormatted, const String16& product, - bool pseudolocalize, + PseudolocalizationMethod pseudolocalize, const bool overwrite, ResourceTable* outTable) { status_t err; const String16 item16("item"); - + String16 str; Vector<StringPool::entry_style_span> spans; err = parseStyledString(bundle, in->getPrintableSource().string(), @@ -672,7 +672,7 @@ status_t parseAndAddEntry(Bundle* bundle, int32_t curFormat, bool isFormatted, const String16& product, - bool pseudolocalize, + PseudolocalizationMethod pseudolocalize, const bool overwrite, KeyedVector<type_ident_pair_t, bool>* skippedResourceNames, ResourceTable* outTable) @@ -854,10 +854,16 @@ status_t compileResourceFile(Bundle* bundle, ResTable_config curParams(defParams); ResTable_config pseudoParams(curParams); - pseudoParams.language[0] = 'z'; - pseudoParams.language[1] = 'z'; - pseudoParams.country[0] = 'Z'; - pseudoParams.country[1] = 'Z'; + pseudoParams.language[0] = 'e'; + pseudoParams.language[1] = 'n'; + pseudoParams.country[0] = 'X'; + pseudoParams.country[1] = 'A'; + + ResTable_config pseudoBidiParams(curParams); + pseudoBidiParams.language[0] = 'a'; + pseudoBidiParams.language[1] = 'r'; + pseudoBidiParams.country[0] = 'X'; + pseudoBidiParams.country[1] = 'B'; while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { @@ -1334,6 +1340,7 @@ status_t compileResourceFile(Bundle* bundle, name, locale, SourcePos(in->getPrintableSource(), block.getLineNumber())); + curIsPseudolocalizable = fileIsTranslatable; } if (formatted == false16) { @@ -1389,6 +1396,7 @@ status_t compileResourceFile(Bundle* bundle, curTag = &plurals16; curType = plurals16; curIsBag = true; + curIsPseudolocalizable = fileIsTranslatable; } else if (strcmp16(block.getElementName(&len), array16.string()) == 0) { curTag = &array16; curType = array16; @@ -1410,25 +1418,23 @@ status_t compileResourceFile(Bundle* bundle, } else if (strcmp16(block.getElementName(&len), string_array16.string()) == 0) { // Check whether these strings need valid formats. // (simplified form of what string16 does above) + bool isTranslatable = false; size_t n = block.getAttributeCount(); // Pseudolocalizable by default, unless this string array isn't // translatable. - curIsPseudolocalizable = true; for (size_t i = 0; i < n; i++) { size_t length; const uint16_t* attr = block.getAttributeName(i, &length); - if (strcmp16(attr, translatable16.string()) == 0) { + if (strcmp16(attr, formatted16.string()) == 0) { const uint16_t* value = block.getAttributeStringValue(i, &length); if (strcmp16(value, false16.string()) == 0) { - curIsPseudolocalizable = false; + curIsFormatted = false; } - } - - if (strcmp16(attr, formatted16.string()) == 0) { + } else if (strcmp16(attr, translatable16.string()) == 0) { const uint16_t* value = block.getAttributeStringValue(i, &length); if (strcmp16(value, false16.string()) == 0) { - curIsFormatted = false; + isTranslatable = false; } } } @@ -1438,6 +1444,7 @@ status_t compileResourceFile(Bundle* bundle, curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; curIsBag = true; curIsBagReplaceOnOverwrite = true; + curIsPseudolocalizable = isTranslatable && fileIsTranslatable; } else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) { curTag = &integer_array16; curType = array16; @@ -1559,19 +1566,29 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType, ident, parentIdent, itemIdent, curFormat, curIsFormatted, - product, false, overwrite, outTable); + product, NO_PSEUDOLOCALIZATION, overwrite, outTable); if (err == NO_ERROR) { if (curIsPseudolocalizable && localeIsDefined(curParams) - && bundle->getPseudolocalize()) { + && bundle->getPseudolocalize() > 0) { // pseudolocalize here -#if 1 - block.setPosition(parserPosition); - err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage, - curType, ident, parentIdent, itemIdent, curFormat, - curIsFormatted, product, true, overwrite, outTable); -#endif + if ((PSEUDO_ACCENTED & bundle->getPseudolocalize()) == + PSEUDO_ACCENTED) { + block.setPosition(parserPosition); + err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage, + curType, ident, parentIdent, itemIdent, curFormat, + curIsFormatted, product, PSEUDO_ACCENTED, + overwrite, outTable); + } + if ((PSEUDO_BIDI & bundle->getPseudolocalize()) == + PSEUDO_BIDI) { + block.setPosition(parserPosition); + err = parseAndAddBag(bundle, in, &block, pseudoBidiParams, myPackage, + curType, ident, parentIdent, itemIdent, curFormat, + curIsFormatted, product, PSEUDO_BIDI, + overwrite, outTable); + } } - } + } if (err != NO_ERROR) { hasErrors = localHasErrors = true; } @@ -1592,20 +1609,31 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, - product, false, overwrite, &skippedResourceNames, outTable); + product, NO_PSEUDOLOCALIZATION, overwrite, &skippedResourceNames, outTable); if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR? hasErrors = localHasErrors = true; } else if (err == NO_ERROR) { if (curIsPseudolocalizable && localeIsDefined(curParams) - && bundle->getPseudolocalize()) { + && bundle->getPseudolocalize() > 0) { // pseudolocalize here - block.setPosition(parserPosition); - err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, - ident, *curTag, curIsStyled, curFormat, - curIsFormatted, product, - true, overwrite, &skippedResourceNames, outTable); + if ((PSEUDO_ACCENTED & bundle->getPseudolocalize()) == + PSEUDO_ACCENTED) { + block.setPosition(parserPosition); + err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, + ident, *curTag, curIsStyled, curFormat, + curIsFormatted, product, + PSEUDO_ACCENTED, overwrite, &skippedResourceNames, outTable); + } + if ((PSEUDO_BIDI & bundle->getPseudolocalize()) == + PSEUDO_BIDI) { + block.setPosition(parserPosition); + err = parseAndAddEntry(bundle, in, &block, pseudoBidiParams, + myPackage, curType, ident, *curTag, curIsStyled, curFormat, + curIsFormatted, product, + PSEUDO_BIDI, overwrite, &skippedResourceNames, outTable); + } if (err != NO_ERROR) { hasErrors = localHasErrors = true; } @@ -2637,8 +2665,8 @@ ResourceTable::validateLocalizations(void) continue; } - // don't bother with the pseudolocale "zz_ZZ" - if (config != "zz_ZZ") { + // don't bother with the pseudolocale "en_XA" or "ar_XB" + if (config != "en_XA" && config != "ar_XB") { if (configSrcMap.find(config) == configSrcMap.end()) { // okay, no specific localization found. it's possible that we are // requiring a specific regional localization [e.g. de_DE] but there is an diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp index a663ad5..607d419 100644 --- a/tools/aapt/XMLNode.cpp +++ b/tools/aapt/XMLNode.cpp @@ -187,7 +187,7 @@ status_t parseStyledString(Bundle* bundle, String16* outString, Vector<StringPool::entry_style_span>* outSpans, bool isFormatted, - bool pseudolocalize) + PseudolocalizationMethod pseudolocalize) { Vector<StringPool::entry_style_span> spanStack; String16 curString; @@ -198,21 +198,30 @@ status_t parseStyledString(Bundle* bundle, size_t len; ResXMLTree::event_code_t code; + // Bracketing if pseudolocalization accented method specified. + if (pseudolocalize == PSEUDO_ACCENTED) { + curString.append(String16(String8("["))); + } while ((code=inXml->next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { - if (code == ResXMLTree::TEXT) { String16 text(inXml->getText(&len)); if (firstTime && text.size() > 0) { firstTime = false; if (text.string()[0] == '@') { // If this is a resource reference, don't do the pseudoloc. - pseudolocalize = false; + pseudolocalize = NO_PSEUDOLOCALIZATION; } } - if (xliffDepth == 0 && pseudolocalize) { - std::string orig(String8(text).string()); - std::string pseudo = pseudolocalize_string(orig); - curString.append(String16(String8(pseudo.c_str()))); + if (xliffDepth == 0 && pseudolocalize > 0) { + String16 pseudo; + if (pseudolocalize == PSEUDO_ACCENTED) { + pseudo = pseudolocalize_string(text); + } else if (pseudolocalize == PSEUDO_BIDI) { + pseudo = pseudobidi_string(text); + } else { + pseudo = text; + } + curString.append(pseudo); } else { if (isFormatted && hasSubstitutionErrors(fileName, inXml, text) != NO_ERROR) { return UNKNOWN_ERROR; @@ -352,6 +361,25 @@ moveon: } } + // Bracketing if pseudolocalization accented method specified. + if (pseudolocalize == PSEUDO_ACCENTED) { + const char16_t* str = outString->string(); + const char16_t* p = str; + const char16_t* e = p + outString->size(); + int words_cnt = 0; + while (p < e) { + if (isspace(*p)) { + words_cnt++; + } + p++; + } + unsigned int length = words_cnt > 3 ? outString->size() : + outString->size() / 2; + curString.append(String16(String8(" "))); + curString.append(pseudo_generate_expansion(length)); + curString.append(String16(String8("]"))); + } + if (code == ResXMLTree::BAD_DOCUMENT) { SourcePos(String8(fileName), inXml->getLineNumber()).error( "Error parsing XML\n"); diff --git a/tools/aapt/XMLNode.h b/tools/aapt/XMLNode.h index 05624b7..ccbf9f4 100644 --- a/tools/aapt/XMLNode.h +++ b/tools/aapt/XMLNode.h @@ -26,7 +26,7 @@ status_t parseStyledString(Bundle* bundle, String16* outString, Vector<StringPool::entry_style_span>* outSpans, bool isFormatted, - bool isPseudolocalizable); + PseudolocalizationMethod isPseudolocalizable); void printXMLBlock(ResXMLTree* block); diff --git a/tools/aapt/pseudolocalize.cpp b/tools/aapt/pseudolocalize.cpp index 9e50c5a..60aa2b2 100644 --- a/tools/aapt/pseudolocalize.cpp +++ b/tools/aapt/pseudolocalize.cpp @@ -2,89 +2,155 @@ using namespace std; +// String basis to generate expansion +static const String16 k_expansion_string = String16("one two three " + "four five six seven eight nine ten eleven twelve thirteen " + "fourteen fiveteen sixteen seventeen nineteen twenty"); + +// Special unicode characters to override directionality of the words +static const String16 k_rlm = String16("\xe2\x80\x8f"); +static const String16 k_rlo = String16("\xE2\x80\xae"); +static const String16 k_pdf = String16("\xE2\x80\xac"); + +// Placeholder marks +static const String16 k_placeholder_open = String16("\xc2\xbb"); +static const String16 k_placeholder_close = String16("\xc2\xab"); + static const char* -pseudolocalize_char(char c) +pseudolocalize_char(const char16_t c) { switch (c) { - case 'a': return "\xc4\x83"; - case 'b': return "\xcf\x84"; - case 'c': return "\xc4\x8b"; - case 'd': return "\xc4\x8f"; - case 'e': return "\xc4\x99"; + case 'a': return "\xc3\xa5"; + case 'b': return "\xc9\x93"; + case 'c': return "\xc3\xa7"; + case 'd': return "\xc3\xb0"; + case 'e': return "\xc3\xa9"; case 'f': return "\xc6\x92"; case 'g': return "\xc4\x9d"; - case 'h': return "\xd1\x9b"; - case 'i': return "\xcf\x8a"; + case 'h': return "\xc4\xa5"; + case 'i': return "\xc3\xae"; case 'j': return "\xc4\xb5"; - case 'k': return "\xc4\xb8"; - case 'l': return "\xc4\xba"; + case 'k': return "\xc4\xb7"; + case 'l': return "\xc4\xbc"; case 'm': return "\xe1\xb8\xbf"; - case 'n': return "\xd0\xb8"; - case 'o': return "\xcf\x8c"; - case 'p': return "\xcf\x81"; + case 'n': return "\xc3\xb1"; + case 'o': return "\xc3\xb6"; + case 'p': return "\xc3\xbe"; case 'q': return "\x51"; - case 'r': return "\xd2\x91"; + case 'r': return "\xc5\x95"; case 's': return "\xc5\xa1"; - case 't': return "\xd1\x82"; - case 'u': return "\xce\xb0"; + case 't': return "\xc5\xa3"; + case 'u': return "\xc3\xbb"; case 'v': return "\x56"; - case 'w': return "\xe1\xba\x85"; + case 'w': return "\xc5\xb5"; case 'x': return "\xd1\x85"; - case 'y': return "\xe1\xbb\xb3"; - case 'z': return "\xc5\xba"; + case 'y': return "\xc3\xbd"; + case 'z': return "\xc5\xbe"; case 'A': return "\xc3\x85"; case 'B': return "\xce\xb2"; - case 'C': return "\xc4\x88"; - case 'D': return "\xc4\x90"; - case 'E': return "\xd0\x84"; - case 'F': return "\xce\x93"; - case 'G': return "\xc4\x9e"; - case 'H': return "\xc4\xa6"; - case 'I': return "\xd0\x87"; - case 'J': return "\xc4\xb5"; + case 'C': return "\xc3\x87"; + case 'D': return "\xc3\x90"; + case 'E': return "\xc3\x89"; + case 'G': return "\xc4\x9c"; + case 'H': return "\xc4\xa4"; + case 'I': return "\xc3\x8e"; + case 'J': return "\xc4\xb4"; case 'K': return "\xc4\xb6"; - case 'L': return "\xc5\x81"; + case 'L': return "\xc4\xbb"; case 'M': return "\xe1\xb8\xbe"; - case 'N': return "\xc5\x83"; - case 'O': return "\xce\x98"; - case 'P': return "\xcf\x81"; + case 'N': return "\xc3\x91"; + case 'O': return "\xc3\x96"; + case 'P': return "\xc3\x9e"; case 'Q': return "\x71"; - case 'R': return "\xd0\xaf"; - case 'S': return "\xc8\x98"; - case 'T': return "\xc5\xa6"; - case 'U': return "\xc5\xa8"; + case 'R': return "\xc5\x94"; + case 'S': return "\xc5\xa0"; + case 'T': return "\xc5\xa2"; + case 'U': return "\xc3\x9b"; case 'V': return "\xce\xbd"; - case 'W': return "\xe1\xba\x84"; + case 'W': return "\xc5\xb4"; case 'X': return "\xc3\x97"; - case 'Y': return "\xc2\xa5"; + case 'Y': return "\xc3\x9d"; case 'Z': return "\xc5\xbd"; + case '!': return "\xc2\xa1"; + case '?': return "\xc2\xbf"; + case '$': return "\xe2\x82\xac"; default: return NULL; } } +static bool +is_possible_normal_placeholder_end(const char16_t c) { + switch (c) { + case 's': return true; + case 'S': return true; + case 'c': return true; + case 'C': return true; + case 'd': return true; + case 'o': return true; + case 'x': return true; + case 'X': return true; + case 'f': return true; + case 'e': return true; + case 'E': return true; + case 'g': return true; + case 'G': return true; + case 'a': return true; + case 'A': return true; + case 'b': return true; + case 'B': return true; + case 'h': return true; + case 'H': return true; + case '%': return true; + case 'n': return true; + default: return false; + } +} + +String16 +pseudo_generate_expansion(const unsigned int length) { + String16 result = k_expansion_string; + const char16_t* s = result.string(); + if (result.size() < length) { + result += String16(" "); + result += pseudo_generate_expansion(length - result.size()); + } else { + int ext = 0; + // Should contain only whole words, so looking for a space + for (unsigned int i = length + 1; i < result.size(); ++i) { + ++ext; + if (s[i] == ' ') { + break; + } + } + result.remove(length + ext, 0); + } + return result; +} + /** * Converts characters so they look like they've been localized. * * Note: This leaves escape sequences untouched so they can later be * processed by ResTable::collectString in the normal way. */ -string -pseudolocalize_string(const string& source) +String16 +pseudolocalize_string(const String16& source) { - const char* s = source.c_str(); - string result; - const size_t I = source.length(); + const char16_t* s = source.string(); + String16 result; + const size_t I = source.size(); for (size_t i=0; i<I; i++) { - char c = s[i]; + char16_t c = s[i]; if (c == '\\') { + // Escape syntax, no need to pseudolocalize if (i<I-1) { - result += '\\'; + result += String16("\\"); i++; c = s[i]; switch (c) { case 'u': // this one takes up 5 chars - result += string(s+i, 5); + result += String16(s+i, 5); i += 4; break; case 't': @@ -96,24 +162,107 @@ pseudolocalize_string(const string& source) case '\'': case '\\': default: - result += c; + result.append(&c, 1); break; } } else { - result += c; + result.append(&c, 1); + } + } else if (c == '%') { + // Placeholder syntax, no need to pseudolocalize + result += k_placeholder_open; + bool end = false; + result.append(&c, 1); + while (!end && i < I) { + ++i; + c = s[i]; + result.append(&c, 1); + if (is_possible_normal_placeholder_end(c)) { + end = true; + } else if (c == 't') { + ++i; + c = s[i]; + result.append(&c, 1); + end = true; + } + } + result += k_placeholder_close; + } else if (c == '<' || c == '&') { + // html syntax, no need to pseudolocalize + bool tag_closed = false; + while (!tag_closed && i < I) { + if (c == '&') { + String16 escape_text; + escape_text.append(&c, 1); + bool end = false; + size_t htmlCodePos = i; + while (!end && htmlCodePos < I) { + ++htmlCodePos; + c = s[htmlCodePos]; + escape_text.append(&c, 1); + // Valid html code + if (c == ';') { + end = true; + i = htmlCodePos; + } + // Wrong html code + else if (!((c == '#' || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9')))) { + end = true; + } + } + result += escape_text; + if (escape_text != String16("<")) { + tag_closed = true; + } + continue; + } + if (c == '>') { + tag_closed = true; + result.append(&c, 1); + continue; + } + result.append(&c, 1); + i++; + c = s[i]; } } else { + // This is a pure text that should be pseudolocalized const char* p = pseudolocalize_char(c); if (p != NULL) { - result += p; + result += String16(p); } else { - result += c; + result.append(&c, 1); } } } - - //printf("result=\'%s\'\n", result.c_str()); return result; } +String16 +pseudobidi_string(const String16& source) +{ + const char16_t* s = source.string(); + String16 result; + result += k_rlm; + result += k_rlo; + for (size_t i=0; i<source.size(); i++) { + char16_t c = s[i]; + switch(c) { + case ' ': result += k_pdf; + result += k_rlm; + result.append(&c, 1); + result += k_rlm; + result += k_rlo; + break; + default: result.append(&c, 1); + break; + } + } + result += k_pdf; + result += k_rlm; + return result; +} diff --git a/tools/aapt/pseudolocalize.h b/tools/aapt/pseudolocalize.h index 94cb034..e6ab18e 100644 --- a/tools/aapt/pseudolocalize.h +++ b/tools/aapt/pseudolocalize.h @@ -1,9 +1,18 @@ #ifndef HOST_PSEUDOLOCALIZE_H #define HOST_PSEUDOLOCALIZE_H +#include "StringPool.h" + #include <string> -std::string pseudolocalize_string(const std::string& source); +String16 pseudolocalize_string(const String16& source); +// Surrounds every word in the sentance with specific characters that makes +// the word directionality RTL. +String16 pseudobidi_string(const String16& source); +// Generates expansion string based on the specified lenght. +// Generated string could not be shorter that length, but it could be slightly +// longer. +String16 pseudo_generate_expansion(const unsigned int length); #endif // HOST_PSEUDOLOCALIZE_H diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java index de2e592..25eaaf5 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java @@ -428,6 +428,16 @@ public class Paint_Delegate { } @LayoutlibDelegate + /*package*/ static boolean isElegantTextHeight(Paint thisPaint) { + return false; + } + + @LayoutlibDelegate + /*package*/ static void setElegantTextHeight(Paint thisPaint, boolean elegant) { + // TODO + } + + @LayoutlibDelegate /*package*/ static float getTextSize(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 6595ce1..08e9d99 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -58,6 +58,7 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.hardware.display.DisplayManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -101,6 +102,7 @@ public final class BridgeContext extends Context { private final ApplicationInfo mApplicationInfo; private final IProjectCallback mProjectCallback; private final WindowManager mWindowManager; + private final DisplayManager mDisplayManager; private Resources.Theme mTheme; @@ -149,6 +151,7 @@ public final class BridgeContext extends Context { } mWindowManager = new WindowManagerImpl(mMetrics); + mDisplayManager = new DisplayManager(this); } /** @@ -455,6 +458,10 @@ public final class BridgeContext extends Context { return new PowerManager(this, new BridgePowerManager(), new Handler()); } + if (DISPLAY_SERVICE.equals(service)) { + return mDisplayManager; + } + throw new UnsupportedOperationException("Unsupported Service: " + service); } |