diff options
244 files changed, 4132 insertions, 1533 deletions
diff --git a/api/11.xml b/api/11.xml index 6ed9d225e336..d17325f4e63f 100644 --- a/api/11.xml +++ b/api/11.xml @@ -199955,6 +199955,25 @@ > </field> </class> +<class name="Base64DataException" + extends="java.io.IOException" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="Base64DataException" + type="android.util.Base64DataException" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="detailMessage" type="java.lang.String"> +</parameter> +</constructor> +</class> <class name="Base64InputStream" extends="java.io.FilterInputStream" abstract="false" @@ -214823,6 +214842,19 @@ <parameter name="selected" type="boolean"> </parameter> </method> +<method name="dispatchSystemUiVisibilityChanged" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="visibility" type="int"> +</parameter> +</method> <method name="dispatchTouchEvent" return="boolean" abstract="false" @@ -215876,6 +215908,17 @@ visibility="protected" > </method> +<method name="getSystemUiVisibility" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getTag" return="java.lang.Object" abstract="false" @@ -218126,6 +218169,19 @@ <parameter name="l" type="android.view.View.OnLongClickListener"> </parameter> </method> +<method name="setOnSystemUiVisibilityChangeListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="l" type="android.view.View.OnSystemUiVisibilityChangeListener"> +</parameter> +</method> <method name="setOnTouchListener" return="void" abstract="false" @@ -218379,6 +218435,19 @@ <parameter name="soundEffectsEnabled" type="boolean"> </parameter> </method> +<method name="setSystemUiVisibility" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="visibility" type="int"> +</parameter> +</method> <method name="setTag" return="void" abstract="false" @@ -219386,6 +219455,28 @@ visibility="public" > </field> +<field name="STATUS_BAR_HIDDEN" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_BAR_VISIBLE" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="VIEW_LOG_TAG" type="java.lang.String" transient="false" @@ -219804,6 +219895,27 @@ </parameter> </method> </interface> +<interface name="View.OnSystemUiVisibilityChangeListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onSystemUiVisibilityChange" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="visibility" type="int"> +</parameter> +</method> +</interface> <interface name="View.OnTouchListener" abstract="true" static="true" diff --git a/api/current.xml b/api/current.xml index b3f03a6cc7be..b7d7b3a31950 100644 --- a/api/current.xml +++ b/api/current.xml @@ -29889,6 +29889,17 @@ visibility="public" > </method> +<method name="isRemoving" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="isResumed" return="boolean" abstract="false" @@ -199955,6 +199966,25 @@ > </field> </class> +<class name="Base64DataException" + extends="java.io.IOException" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="Base64DataException" + type="android.util.Base64DataException" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="detailMessage" type="java.lang.String"> +</parameter> +</constructor> +</class> <class name="Base64InputStream" extends="java.io.FilterInputStream" abstract="false" @@ -215899,8 +215929,6 @@ deprecated="not deprecated" visibility="public" > -<parameter name="visibility" type="int"> -</parameter> </method> <method name="getTag" return="java.lang.Object" diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java index 83e4fd9085a1..89eee6d4d36a 100644 --- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -51,9 +51,9 @@ public class GrantCredentialsPermissionActivity extends Activity implements View private final AccountManagerService accountManagerService = AccountManagerService.getSingleton(); protected void onCreate(Bundle savedInstanceState) { - requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.grant_credentials_permission); + setTitle(R.string.grant_permissions_header_text); mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java index e405df5d513a..f13d940df354 100644 --- a/core/java/android/animation/LayoutTransition.java +++ b/core/java/android/animation/LayoutTransition.java @@ -34,15 +34,16 @@ import java.util.List; * custom animations, use the {@link LayoutTransition#setAnimator(int, Animator) * setAnimator()} method. * - * <p>One of the core concepts of these transition animations is that there are two core + * <p>One of the core concepts of these transition animations is that there are two types of * changes that cause the transition and four different animations that run because of * those changes. The changes that trigger the transition are items being added to a container * (referred to as an "appearing" transition) or removed from a container (also known as - * "disappearing"). The animations that run due to those events are one that animates + * "disappearing"). Setting the visibility of views (between GONE and VISIBLE) will trigger + * the same add/remove logic. The animations that run due to those events are one that animates * items being added, one that animates items being removed, and two that animate the other * items in the container that change due to the add/remove occurrence. Users of * the transition may want different animations for the changing items depending on whether - * they are changing due to anappearing or disappearing event, so there is one animation for + * they are changing due to an appearing or disappearing event, so there is one animation for * each of these variations of the changing event. Most of the API of this class is concerned * with setting up the basic properties of the animations used in these four situations, * or with setting up custom animations for any or all of the four.</p> @@ -62,6 +63,18 @@ import java.util.List; * values when the transition begins. Custom animations will be similarly populated with * the target and values being animated, assuming they use ObjectAnimator objects with * property names that are known on the target object.</p> + * + * <p>This class, and the associated XML flag for containers, animateLayoutChanges="true", + * provides a simple utility meant for automating changes in straightforward situations. + * Using LayoutTransition at multiple levels of a nested view hierarchy may not work due to the + * interrelationship of the various levels of layout. Also, a container that is being scrolled + * at the same time as items are being added or removed is probably not a good candidate for + * this utility, because the before/after locations calculated by LayoutTransition + * may not match the actual locations when the animations finish due to the container + * being scrolled as the animations are running. You can work around that + * particular issue by disabling the 'changing' animations by setting the CHANGE_APPEARING + * and CHANGE_DISAPPEARING animations to null, and setting the startDelay of the + * other animations appropriately.</p> */ public class LayoutTransition { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 511ddc1ce9ec..960b943e433d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2385,7 +2385,9 @@ public final class ActivityThread { performPauseActivity(token, finished, r.isPreHoneycomb()); // Make sure any pending writes are now committed. - QueuedWork.waitToFinish(); + if (r.isPreHoneycomb()) { + QueuedWork.waitToFinish(); + } // Tell the activity manager we have paused. try { @@ -2583,6 +2585,11 @@ public final class ActivityThread { updateVisibility(r, show); + // Make sure any pending writes are now committed. + if (!r.isPreHoneycomb()) { + QueuedWork.waitToFinish(); + } + // Tell activity manager we have been stopped. try { ActivityManagerNative.getDefault().activityStopped( @@ -2647,6 +2654,12 @@ public final class ActivityThread { } r.stopped = true; } + + // Make sure any pending writes are now committed. + if (!r.isPreHoneycomb()) { + QueuedWork.waitToFinish(); + } + // Tell activity manager we slept. try { ActivityManagerNative.getDefault().activitySlept(r.token); diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 3280b221d47c..b3d111aeb3e3 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -357,6 +357,9 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener // True if the fragment is in the list of added fragments. boolean mAdded; + // If set this fragment is being removed from its activity. + boolean mRemoving; + // True if the fragment is in the resumed state. boolean mResumed; @@ -638,6 +641,9 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener * Return <code>getActivity().getResources()</code>. */ final public Resources getResources() { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } return mActivity.getResources(); } @@ -689,7 +695,16 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener * Return true if the fragment is currently added to its activity. */ final public boolean isAdded() { - return mActivity != null && mActivity.mFragments.mAdded.contains(this); + return mActivity != null && mAdded; + } + + /** + * Return true if this fragment is currently being removed from its + * activity. This is <em>not</em> whether its activity is finishing, but + * rather whether it is in the process of being removed from its activity. + */ + final public boolean isRemoving() { + return mRemoving; } /** @@ -787,6 +802,9 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener if (mLoaderManager != null) { return mLoaderManager; } + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } mCheckedForLoaderManager = true; mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true); return mLoaderManager; @@ -797,6 +815,9 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener * containing Activity. */ public void startActivity(Intent intent) { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } mActivity.startActivityFromFragment(this, intent, -1); } @@ -805,6 +826,9 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener * containing Activity. */ public void startActivityForResult(Intent intent, int requestCode) { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } mActivity.startActivityFromFragment(this, intent, requestCode); } @@ -1217,6 +1241,7 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener writer.print(" mWho="); writer.print(mWho); writer.print(" mBackStackNesting="); writer.println(mBackStackNesting); writer.print(prefix); writer.print("mAdded="); writer.print(mAdded); + writer.print(" mRemoving="); writer.print(mRemoving); writer.print(" mResumed="); writer.print(mResumed); writer.print(" mFromLayout="); writer.print(mFromLayout); writer.print(" mInLayout="); writer.println(mInLayout); diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index e729805502b4..2c9c85b11df9 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -28,6 +28,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.DebugUtils; import android.util.Log; +import android.util.LogWriter; +import android.util.Slog; import android.util.SparseArray; import android.view.Menu; import android.view.MenuInflater; @@ -968,6 +970,7 @@ final class FragmentManagerImpl extends FragmentManager { makeActive(fragment); if (DEBUG) Log.v(TAG, "add: " + fragment); fragment.mAdded = true; + fragment.mRemoving = false; if (fragment.mHasMenu) { mNeedMenuInvalidate = true; } @@ -984,6 +987,7 @@ final class FragmentManagerImpl extends FragmentManager { mNeedMenuInvalidate = true; } fragment.mAdded = false; + fragment.mRemoving = true; moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, transition, transitionStyle); if (inactive) { @@ -1376,6 +1380,14 @@ final class FragmentManagerImpl extends FragmentManager { } if (f.mTarget != null) { + if (f.mTarget.mIndex < 0) { + String msg = "Failure saving state: " + f + + " has target not in fragment manager: " + f.mTarget; + Slog.e(TAG, msg); + dump(" ", null, new PrintWriter(new LogWriter( + Log.ERROR, TAG, Log.LOG_ID_SYSTEM)), new String[] { }); + throw new IllegalStateException(msg); + } if (fs.mSavedFragmentState == null) { fs.mSavedFragmentState = new Bundle(); } diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 60213f81e316..c406524439a7 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -567,6 +567,7 @@ final class LoadedApk { } else { rd.validate(context, handler); } + rd.mForgotten = false; return rd.getIIntentReceiver(); } } @@ -596,6 +597,7 @@ final class LoadedApk { rd.setUnregisterLocation(ex); holder.put(r, rd); } + rd.mForgotten = true; return rd.getIIntentReceiver(); } } @@ -666,6 +668,7 @@ final class LoadedApk { final boolean mRegistered; final IntentReceiverLeaked mLocation; RuntimeException mUnregisterLocation; + boolean mForgotten; final class Args extends BroadcastReceiver.PendingResult implements Runnable { private Intent mCurIntent; @@ -696,7 +699,7 @@ final class LoadedApk { final Intent intent = mCurIntent; mCurIntent = null; - if (receiver == null || !mRegistered) { + if (receiver == null || mForgotten) { if (mRegistered && ordered) { if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, "Finishing null broadcast to " + mReceiver); diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index 2959fc02d57c..a7e45182aa4f 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -626,18 +626,21 @@ public final class BluetoothHeadset implements BluetoothProfile { } /** - * Initiates a Virtual Voice Call to the handsfree device (if connected). - * Allows the handsfree device to be used for routing non-cellular call audio + * Initiates a SCO channel connection with the headset (if connected). + * Also initiates a virtual voice call for Handsfree devices as many devices + * do not accept SCO audio without a call. + * This API allows the handsfree device to be used for routing non-cellular + * call audio. * * @param device Remote Bluetooth Device * @return true if successful, false if there was some error. * @hide */ - public boolean startVirtualVoiceCall(BluetoothDevice device) { - if (DBG) log("startVirtualVoiceCall()"); + public boolean startScoUsingVirtualVoiceCall(BluetoothDevice device) { + if (DBG) log("startScoUsingVirtualVoiceCall()"); if (mService != null && isEnabled() && isValidDevice(device)) { try { - return mService.startVirtualVoiceCall(device); + return mService.startScoUsingVirtualVoiceCall(device); } catch (RemoteException e) { Log.e(TAG, e.toString()); } @@ -649,17 +652,18 @@ public final class BluetoothHeadset implements BluetoothProfile { } /** - * Terminates an ongoing Virtual Voice Call to the handsfree device (if connected). + * Terminates an ongoing SCO connection and the associated virtual + * call. * * @param device Remote Bluetooth Device * @return true if successful, false if there was some error. * @hide */ - public boolean stopVirtualVoiceCall(BluetoothDevice device) { - if (DBG) log("stopVirtualVoiceCall()"); + public boolean stopScoUsingVirtualVoiceCall(BluetoothDevice device) { + if (DBG) log("stopScoUsingVirtualVoiceCall()"); if (mService != null && isEnabled() && isValidDevice(device)) { try { - return mService.stopVirtualVoiceCall(device); + return mService.stopScoUsingVirtualVoiceCall(device); } catch (RemoteException e) { Log.e(TAG, e.toString()); } diff --git a/core/java/android/bluetooth/IBluetoothHeadset.aidl b/core/java/android/bluetooth/IBluetoothHeadset.aidl index 3c6cf7711333..41f63b27721e 100644 --- a/core/java/android/bluetooth/IBluetoothHeadset.aidl +++ b/core/java/android/bluetooth/IBluetoothHeadset.aidl @@ -48,8 +48,8 @@ interface IBluetoothHeadset { boolean setAudioState(in BluetoothDevice device, int state); int getAudioState(in BluetoothDevice device); - boolean startVirtualVoiceCall(in BluetoothDevice device); - boolean stopVirtualVoiceCall(in BluetoothDevice device); + boolean startScoUsingVirtualVoiceCall(in BluetoothDevice device); + boolean stopScoUsingVirtualVoiceCall(in BluetoothDevice device); void sendAtCommand(in BluetoothDevice device, String urc); } diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java index 3d6182b9fe7f..a7dd5fbfb3d1 100644 --- a/core/java/android/content/AsyncTaskLoader.java +++ b/core/java/android/content/AsyncTaskLoader.java @@ -195,7 +195,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> { } } if (DEBUG) Slog.v(TAG, "Executing: " + mTask); - mTask.execute((Void[]) null); + mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); } } diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 5467a30bb135..1764e113d3d0 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -899,7 +899,7 @@ public abstract class ContentProvider implements ComponentCallbacks { return null; } }; - task.execute((Object[])null); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null); return fds[0]; } catch (IOException e) { diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index 01fc010b5550..df8cf9a8164f 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -76,6 +76,8 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub } public void executeMessage(Message msg) { + if (mInputMethodSession == null) return; + switch (msg.what) { case DO_FINISH_INPUT: mInputMethodSession.finishInput(); diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index f35a43863457..255eb6c67db4 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -49,6 +49,7 @@ import android.view.Window; import android.view.WindowManager; import android.view.animation.AnimationUtils; import android.view.inputmethod.CompletionInfo; +import android.view.inputmethod.EditorInfo; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputBinding; @@ -56,7 +57,6 @@ import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethod; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; -import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; @@ -1024,7 +1024,7 @@ public class InputMethodService extends AbstractInputMethodService { * there is no hard keyboard or the keyboard is hidden. If you change what * this returns, you will need to call {@link #updateInputViewShown()} * yourself whenever the returned value may have changed to have it - * re-evalauted and applied. + * re-evaluated and applied. */ public boolean onEvaluateInputViewShown() { Configuration config = getResources().getConfiguration(); diff --git a/core/java/android/inputmethodservice/SoftInputWindow.java b/core/java/android/inputmethodservice/SoftInputWindow.java index 6a54846fddbe..343242ec39aa 100644 --- a/core/java/android/inputmethodservice/SoftInputWindow.java +++ b/core/java/android/inputmethodservice/SoftInputWindow.java @@ -19,11 +19,16 @@ package android.inputmethodservice; import android.app.Dialog; import android.content.Context; import android.content.pm.ActivityInfo; +import android.graphics.Rect; import android.os.IBinder; import android.view.Gravity; import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; import android.view.WindowManager; +import java.lang.Math; + /** * A SoftInputWindow is a Dialog that is intended to be used for a top-level input * method window. It will be displayed along the edge of the screen, moving @@ -32,6 +37,7 @@ import android.view.WindowManager; */ class SoftInputWindow extends Dialog { final KeyEvent.DispatcherState mDispatcherState; + private final Rect mBounds = new Rect(); public void setToken(IBinder token) { WindowManager.LayoutParams lp = getWindow().getAttributes(); @@ -64,6 +70,13 @@ class SoftInputWindow extends Dialog { mDispatcherState.reset(); } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + getWindow().getDecorView().getHitRect(mBounds); + final MotionEvent event = clipMotionEvent(ev, mBounds); + return super.dispatchTouchEvent(event); + } + /** * Get the size of the DockWindow. * @@ -150,4 +163,48 @@ class SoftInputWindow extends Dialog { WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_DIM_BEHIND); } + + private static MotionEvent clipMotionEvent(MotionEvent me, Rect bounds) { + final int pointerCount = me.getPointerCount(); + boolean shouldClip = false; + for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { + final int x = (int)me.getX(pointerIndex); + final int y = (int)me.getY(pointerIndex); + if (!bounds.contains(x, y)) { + shouldClip = true; + break; + } + } + if (!shouldClip) + return me; + + if (pointerCount == 1) { + final int x = (int)me.getX(); + final int y = (int)me.getY(); + me.setLocation( + Math.max(bounds.left, Math.min(x, bounds.right - 1)), + Math.max(bounds.top, Math.min(y, bounds.bottom - 1))); + return me; + } + + final int[] pointerIds = new int[pointerCount]; + final MotionEvent.PointerCoords[] pointerCoords = + new MotionEvent.PointerCoords[pointerCount]; + for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { + pointerIds[pointerIndex] = me.getPointerId(pointerIndex); + final MotionEvent.PointerCoords coords = new MotionEvent.PointerCoords(); + me.getPointerCoords(pointerIndex, coords); + pointerCoords[pointerIndex] = coords; + final int x = (int)coords.x; + final int y = (int)coords.y; + if (!bounds.contains(x, y)) { + coords.x = Math.max(bounds.left, Math.min(x, bounds.right - 1)); + coords.y = Math.max(bounds.top, Math.min(y, bounds.bottom - 1)); + } + } + return MotionEvent.obtain( + me.getDownTime(), me.getEventTime(), me.getAction(), pointerCount, pointerIds, + pointerCoords, me.getMetaState(), me.getXPrecision(), me.getYPrecision(), + me.getDeviceId(), me.getEdgeFlags(), me.getSource(), me.getFlags()); + } } diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java index 30f25a2cd309..bba11b004f3e 100644 --- a/core/java/android/net/http/SslCertificate.java +++ b/core/java/android/net/http/SslCertificate.java @@ -25,8 +25,8 @@ import java.util.Vector; import java.security.cert.X509Certificate; -import org.bouncycastle.asn1.DERObjectIdentifier; -import org.bouncycastle.asn1.x509.X509Name; +import com.android.org.bouncycastle.asn1.DERObjectIdentifier; +import com.android.org.bouncycastle.asn1.x509.X509Name; /** * SSL certificate info (certificate details) class diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 4f212655b310..257f275b2c1e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1680,6 +1680,16 @@ public final class Settings { public static final String POINTER_LOCATION = "pointer_location"; /** + * Log raw orientation data from {@link WindowOrientationListener} for use with the + * orientationplot.py tool. + * 0 = no + * 1 = yes + * @hide + */ + public static final String WINDOW_ORIENTATION_LISTENER_LOG = + "window_orientation_listener_log"; + + /** * Whether to play a sound for low-battery alerts. * @hide */ diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java index b6aa03ab7124..403f20e2a1c6 100644 --- a/core/java/android/text/DynamicLayout.java +++ b/core/java/android/text/DynamicLayout.java @@ -341,55 +341,47 @@ extends Layout } } - private void dump(boolean show) { - int n = getLineCount(); - - for (int i = 0; i < n; i++) { - System.out.print("line " + i + ": " + getLineStart(i) + " to " + getLineEnd(i) + " "); - - if (show) { - System.out.print(getText().subSequence(getLineStart(i), - getLineEnd(i))); - } - - System.out.println(""); - } - - System.out.println(""); - } - + @Override public int getLineCount() { return mInts.size() - 1; } + @Override public int getLineTop(int line) { return mInts.getValue(line, TOP); } + @Override public int getLineDescent(int line) { return mInts.getValue(line, DESCENT); } + @Override public int getLineStart(int line) { return mInts.getValue(line, START) & START_MASK; } + @Override public boolean getLineContainsTab(int line) { return (mInts.getValue(line, TAB) & TAB_MASK) != 0; } + @Override public int getParagraphDirection(int line) { return mInts.getValue(line, DIR) >> DIR_SHIFT; } + @Override public final Directions getLineDirections(int line) { return mObjects.getValue(line, 0); } + @Override public int getTopPadding() { return mTopPadding; } + @Override public int getBottomPadding() { return mBottomPadding; } @@ -403,11 +395,11 @@ extends Layout implements TextWatcher, SpanWatcher { public ChangeWatcher(DynamicLayout layout) { - mLayout = new WeakReference(layout); + mLayout = new WeakReference<DynamicLayout>(layout); } private void reflow(CharSequence s, int where, int before, int after) { - DynamicLayout ml = (DynamicLayout) mLayout.get(); + DynamicLayout ml = mLayout.get(); if (ml != null) ml.reflow(s, where, before, after); @@ -417,7 +409,6 @@ extends Layout public void beforeTextChanged(CharSequence s, int where, int before, int after) { - ; } public void onTextChanged(CharSequence s, @@ -426,7 +417,6 @@ extends Layout } public void afterTextChanged(Editable s) { - ; } public void onSpanAdded(Spannable s, Object o, int start, int end) { @@ -447,9 +437,10 @@ extends Layout } } - private WeakReference mLayout; + private WeakReference<DynamicLayout> mLayout; } + @Override public int getEllipsisStart(int line) { if (mEllipsizeAt == null) { return 0; @@ -458,6 +449,7 @@ extends Layout return mInts.getValue(line, ELLIPSIS_START); } + @Override public int getEllipsisCount(int line) { if (mEllipsizeAt == null) { return 0; @@ -494,7 +486,6 @@ extends Layout private static final int COLUMNS_ELLIPSIZE = 5; private static final int START_MASK = 0x1FFFFFFF; - private static final int DIR_MASK = 0xC0000000; private static final int DIR_SHIFT = 30; private static final int TAB_MASK = 0x20000000; diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index a6fd2f11ab38..90279d1f63c9 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -90,13 +90,11 @@ class TextLine { tl.mText = null; tl.mPaint = null; tl.mDirections = null; - if (tl.mLen < 250) { - synchronized(cached) { - for (int i = 0; i < cached.length; ++i) { - if (cached[i] == null) { - cached[i] = tl; - break; - } + synchronized(cached) { + for (int i = 0; i < cached.length; ++i) { + if (cached[i] == null) { + cached[i] = tl; + break; } } } diff --git a/core/java/android/util/Base64DataException.java b/core/java/android/util/Base64DataException.java new file mode 100644 index 000000000000..de12ee1c01e5 --- /dev/null +++ b/core/java/android/util/Base64DataException.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2011 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.util; + +import java.io.IOException; + +/** + * This exception is thrown by {@link Base64InputStream} or {@link Base64OutputStream} + * when an error is detected in the data being decoded. This allows problems with the base64 data + * to be disambiguated from errors in the underlying streams (e.g. actual connection errors.) + */ +public class Base64DataException extends IOException { + public Base64DataException(String detailMessage) { + super(detailMessage); + } +} diff --git a/core/java/android/util/Base64InputStream.java b/core/java/android/util/Base64InputStream.java index e9dac243c026..9eba5b5891be 100644 --- a/core/java/android/util/Base64InputStream.java +++ b/core/java/android/util/Base64InputStream.java @@ -145,7 +145,7 @@ public class Base64InputStream extends FilterInputStream { success = coder.process(inputBuffer, 0, bytesRead, false); } if (!success) { - throw new IOException("bad base-64"); + throw new Base64DataException("bad base-64"); } outputEnd = coder.op; outputStart = 0; diff --git a/core/java/android/util/Base64OutputStream.java b/core/java/android/util/Base64OutputStream.java index 30d632dfa157..4535d1cea7a2 100644 --- a/core/java/android/util/Base64OutputStream.java +++ b/core/java/android/util/Base64OutputStream.java @@ -136,7 +136,7 @@ public class Base64OutputStream extends FilterOutputStream { private void internalWrite(byte[] b, int off, int len, boolean finish) throws IOException { coder.output = embiggen(coder.output, coder.maxOutputSize(len)); if (!coder.process(b, off, len, finish)) { - throw new IOException("bad base-64"); + throw new Base64DataException("bad base-64"); } out.write(coder.output, 0, coder.op); } diff --git a/core/java/android/util/LogWriter.java b/core/java/android/util/LogWriter.java new file mode 100644 index 000000000000..ce30631bac09 --- /dev/null +++ b/core/java/android/util/LogWriter.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2011 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.util; + +import java.io.Writer; + +/** @hide */ +public class LogWriter extends Writer { + private final int mPriority; + private final String mTag; + private final int mBuffer; + private StringBuilder mBuilder = new StringBuilder(128); + + /** + * Create a new Writer that sends to the log with the given priority + * and tag. + * + * @param priority The desired log priority: + * {@link android.util.Log#VERBOSE Log.VERBOSE}, + * {@link android.util.Log#DEBUG Log.DEBUG}, + * {@link android.util.Log#INFO Log.INFO}, + * {@link android.util.Log#WARN Log.WARN}, or + * {@link android.util.Log#ERROR Log.ERROR}. + * @param tag A string tag to associate with each printed log statement. + */ + public LogWriter(int priority, String tag) { + mPriority = priority; + mTag = tag; + mBuffer = Log.LOG_ID_MAIN; + } + + /** + * @hide + * Same as above, but buffer is one of the LOG_ID_ constants from android.util.Log. + */ + public LogWriter(int priority, String tag, int buffer) { + mPriority = priority; + mTag = tag; + mBuffer = buffer; + } + + @Override public void close() { + flushBuilder(); + } + + @Override public void flush() { + flushBuilder(); + } + + @Override public void write(char[] buf, int offset, int count) { + for(int i = 0; i < count; i++) { + char c = buf[offset + i]; + if ( c == '\n') { + flushBuilder(); + } + else { + mBuilder.append(c); + } + } + } + + private void flushBuilder() { + if (mBuilder.length() > 0) { + Log.println_native(mBuffer, mPriority, mTag, mBuilder.toString()); + mBuilder.delete(0, mBuilder.length()); + } + } +} diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index 959fae401923..4484d59a3ce4 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -21,9 +21,11 @@ package android.view; * them later. Display lists are usually built by recording operations on a * {@link android.graphics.Canvas}. Replaying the operations from a display list * avoids executing views drawing code on every frame, and is thus much more - * efficient. + * efficient. + * + * @hide */ -abstract class DisplayList { +public abstract class DisplayList { /** * Starts recording the display list. All operations performed on the * returned canvas are recorded and stored in this display list. diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index f6c5e0bc2ad3..dac3135dc322 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -192,21 +192,36 @@ class GLES20Canvas extends HardwareCanvas { nSetViewport(mRenderer, width, height); } - private native void nSetViewport(int renderer, int width, int height); + private static native void nSetViewport(int renderer, int width, int height); + /** + * @hide + */ + public static boolean preserveBackBuffer() { + return nPreserveBackBuffer(); + } + + private static native boolean nPreserveBackBuffer(); + @Override - void onPreDraw() { - nPrepare(mRenderer, mOpaque); + void onPreDraw(Rect dirty) { + if (dirty != null) { + nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom, mOpaque); + } else { + nPrepare(mRenderer, mOpaque); + } } - private native void nPrepare(int renderer, boolean opaque); + private static native void nPrepare(int renderer, boolean opaque); + private static native void nPrepareDirty(int renderer, int left, int top, int right, int bottom, + boolean opaque); @Override void onPostDraw() { nFinish(mRenderer); } - private native void nFinish(int renderer); + private static native void nFinish(int renderer); @Override public boolean acquireContext() { @@ -217,7 +232,14 @@ class GLES20Canvas extends HardwareCanvas { return mContextLocked; } - private native void nAcquireContext(int renderer); + private static native void nAcquireContext(int renderer); + + @Override + public boolean callDrawGLFunction(int drawGLFunction) { + return nCallDrawGLFunction(mRenderer, drawGLFunction); + } + + private static native boolean nCallDrawGLFunction(int renderer, int drawGLFunction); @Override public void releaseContext() { @@ -227,7 +249,7 @@ class GLES20Canvas extends HardwareCanvas { } } - private native void nReleaseContext(int renderer); + private static native void nReleaseContext(int renderer); /////////////////////////////////////////////////////////////////////////// // Display list @@ -237,7 +259,7 @@ class GLES20Canvas extends HardwareCanvas { return nGetDisplayList(mRenderer); } - private native int nGetDisplayList(int renderer); + private static native int nGetDisplayList(int renderer); static void destroyDisplayList(int displayList) { nDestroyDisplayList(displayList); @@ -246,11 +268,11 @@ class GLES20Canvas extends HardwareCanvas { private static native void nDestroyDisplayList(int displayList); @Override - public void drawDisplayList(DisplayList displayList) { - nDrawDisplayList(mRenderer, ((GLES20DisplayList) displayList).mNativeDisplayList); + public boolean drawDisplayList(DisplayList displayList) { + return nDrawDisplayList(mRenderer, ((GLES20DisplayList) displayList).mNativeDisplayList); } - private native void nDrawDisplayList(int renderer, int displayList); + private static native boolean nDrawDisplayList(int renderer, int displayList); /////////////////////////////////////////////////////////////////////////// // Hardware layer @@ -264,7 +286,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawLayer(int renderer, int layer, float x, float y, int paint); + private static native void nDrawLayer(int renderer, int layer, float x, float y, int paint); void interrupt() { nInterrupt(mRenderer); @@ -274,8 +296,8 @@ class GLES20Canvas extends HardwareCanvas { nResume(mRenderer); } - private native void nInterrupt(int renderer); - private native void nResume(int renderer); + private static native void nInterrupt(int renderer); + private static native void nResume(int renderer); /////////////////////////////////////////////////////////////////////////// // Clipping @@ -296,7 +318,7 @@ class GLES20Canvas extends HardwareCanvas { return nClipRect(mRenderer, left, top, right, bottom, Region.Op.INTERSECT.nativeInt); } - private native boolean nClipRect(int renderer, float left, float top, + private static native boolean nClipRect(int renderer, float left, float top, float right, float bottom, int op); @Override @@ -306,10 +328,11 @@ class GLES20Canvas extends HardwareCanvas { @Override public boolean clipRect(int left, int top, int right, int bottom) { - return nClipRect(mRenderer, left, top, right, bottom, Region.Op.INTERSECT.nativeInt); + return nClipRect(mRenderer, left, top, right, bottom, Region.Op.INTERSECT.nativeInt); } - private native boolean nClipRect(int renderer, int left, int top, int right, int bottom, int op); + private static native boolean nClipRect(int renderer, int left, int top, int right, int bottom, + int op); @Override public boolean clipRect(Rect rect) { @@ -348,14 +371,14 @@ class GLES20Canvas extends HardwareCanvas { return nGetClipBounds(mRenderer, bounds); } - private native boolean nGetClipBounds(int renderer, Rect bounds); + private static native boolean nGetClipBounds(int renderer, Rect bounds); @Override public boolean quickReject(float left, float top, float right, float bottom, EdgeType type) { return nQuickReject(mRenderer, left, top, right, bottom, type.nativeInt); } - private native boolean nQuickReject(int renderer, float left, float top, + private static native boolean nQuickReject(int renderer, float left, float top, float right, float bottom, int edge); @Override @@ -377,56 +400,56 @@ class GLES20Canvas extends HardwareCanvas { if (dx != 0.0f || dy != 0.0f) nTranslate(mRenderer, dx, dy); } - private native void nTranslate(int renderer, float dx, float dy); + private static native void nTranslate(int renderer, float dx, float dy); @Override public void skew(float sx, float sy) { nSkew(mRenderer, sx, sy); } - private native void nSkew(int renderer, float sx, float sy); + private static native void nSkew(int renderer, float sx, float sy); @Override public void rotate(float degrees) { nRotate(mRenderer, degrees); } - private native void nRotate(int renderer, float degrees); + private static native void nRotate(int renderer, float degrees); @Override public void scale(float sx, float sy) { nScale(mRenderer, sx, sy); } - private native void nScale(int renderer, float sx, float sy); + private static native void nScale(int renderer, float sx, float sy); @Override public void setMatrix(Matrix matrix) { nSetMatrix(mRenderer, matrix.native_instance); } - private native void nSetMatrix(int renderer, int matrix); + private static native void nSetMatrix(int renderer, int matrix); @Override public int getNativeMatrix() { return nGetMatrix(mRenderer); } - private native int nGetMatrix(int renderer); + private static native int nGetMatrix(int renderer); @Override public void getMatrix(Matrix matrix) { nGetMatrix(mRenderer, matrix.native_instance); } - private native void nGetMatrix(int renderer, int matrix); + private static native void nGetMatrix(int renderer, int matrix); @Override public void concat(Matrix matrix) { nConcatMatrix(mRenderer, matrix.native_instance); } - private native void nConcatMatrix(int renderer, int matrix); + private static native void nConcatMatrix(int renderer, int matrix); /////////////////////////////////////////////////////////////////////////// // State management @@ -442,7 +465,7 @@ class GLES20Canvas extends HardwareCanvas { return nSave(mRenderer, saveFlags); } - private native int nSave(int renderer, int flags); + private static native int nSave(int renderer, int flags); @Override public int saveLayer(RectF bounds, Paint paint, int saveFlags) { @@ -462,8 +485,8 @@ class GLES20Canvas extends HardwareCanvas { return save(saveFlags); } - private native int nSaveLayer(int renderer, float left, float top, float right, float bottom, - int paint, int saveFlags); + private static native int nSaveLayer(int renderer, float left, float top, + float right, float bottom, int paint, int saveFlags); @Override public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags) { @@ -480,7 +503,7 @@ class GLES20Canvas extends HardwareCanvas { return save(saveFlags); } - private native int nSaveLayerAlpha(int renderer, float left, float top, float right, + private static native int nSaveLayerAlpha(int renderer, float left, float top, float right, float bottom, int alpha, int saveFlags); @Override @@ -488,21 +511,21 @@ class GLES20Canvas extends HardwareCanvas { nRestore(mRenderer); } - private native void nRestore(int renderer); + private static native void nRestore(int renderer); @Override public void restoreToCount(int saveCount) { nRestoreToCount(mRenderer, saveCount); } - private native void nRestoreToCount(int renderer, int saveCount); + private static native void nRestoreToCount(int renderer, int saveCount); @Override public int getSaveCount() { return nGetSaveCount(mRenderer); } - private native int nGetSaveCount(int renderer); + private static native int nGetSaveCount(int renderer); /////////////////////////////////////////////////////////////////////////// // Filtering @@ -531,8 +554,9 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawArc(int renderer, float left, float top, float right, float bottom, - float startAngle, float sweepAngle, boolean useCenter, int paint); + private static native void nDrawArc(int renderer, float left, float top, + float right, float bottom, float startAngle, float sweepAngle, + boolean useCenter, int paint); @Override public void drawARGB(int a, int r, int g, int b) { @@ -549,7 +573,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawPatch(int renderer, int bitmap, byte[] buffer, byte[] chunks, + private static native void nDrawPatch(int renderer, int bitmap, byte[] buffer, byte[] chunks, float left, float top, float right, float bottom, int paint); @Override @@ -561,7 +585,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawBitmap( + private static native void nDrawBitmap( int renderer, int bitmap, byte[] buffer, float left, float top, int paint); @Override @@ -574,7 +598,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawBitmap(int renderer, int bitmap, byte[] buff, int matrix, int paint); + private static native void nDrawBitmap(int renderer, int bitmap, byte[] buff, + int matrix, int paint); @Override public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) { @@ -609,7 +634,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawBitmap(int renderer, int bitmap, byte[] buffer, + private static native void nDrawBitmap(int renderer, int bitmap, byte[] buffer, float srcLeft, float srcTop, float srcRight, float srcBottom, float left, float top, float right, float bottom, int paint); @@ -658,7 +683,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasColorFilter) nResetModifiers(mRenderer); } - private native void nDrawBitmapMesh(int renderer, int bitmap, byte[] buffer, + private static native void nDrawBitmapMesh(int renderer, int bitmap, byte[] buffer, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, int paint); @@ -669,7 +694,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawCircle(int renderer, float cx, float cy, float radius, int paint); + private static native void nDrawCircle(int renderer, float cx, float cy, + float radius, int paint); @Override public void drawColor(int color) { @@ -681,7 +707,7 @@ class GLES20Canvas extends HardwareCanvas { nDrawColor(mRenderer, color, mode.nativeInt); } - private native void nDrawColor(int renderer, int color, int mode); + private static native void nDrawColor(int renderer, int color, int mode); @Override public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) { @@ -702,7 +728,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawLines(int renderer, float[] points, int offset, int count, int paint); + private static native void nDrawLines(int renderer, float[] points, + int offset, int count, int paint); @Override public void drawLines(float[] pts, Paint paint) { @@ -716,8 +743,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawOval(int renderer, float left, float top, float right, float bottom, - int paint); + private static native void nDrawOval(int renderer, float left, float top, + float right, float bottom, int paint); @Override public void drawPaint(Paint paint) { @@ -739,8 +766,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawPath(int renderer, int path, int paint); - private native void nDrawRects(int renderer, int region, int paint); + private static native void nDrawPath(int renderer, int path, int paint); + private static native void nDrawRects(int renderer, int region, int paint); @Override public void drawPicture(Picture picture) { @@ -791,8 +818,8 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawRect(int renderer, float left, float top, float right, float bottom, - int paint); + private static native void nDrawRect(int renderer, float left, float top, + float right, float bottom, int paint); @Override public void drawRect(Rect r, Paint paint) { @@ -817,7 +844,7 @@ class GLES20Canvas extends HardwareCanvas { if (hasModifier) nResetModifiers(mRenderer); } - private native void nDrawRoundRect(int renderer, float left, float top, + private static native void nDrawRoundRect(int renderer, float left, float top, float right, float bottom, float rx, float y, int paint); @Override @@ -834,8 +861,8 @@ class GLES20Canvas extends HardwareCanvas { } } - private native void nDrawText(int renderer, char[] text, int index, int count, float x, float y, - int bidiFlags, int paint); + private static native void nDrawText(int renderer, char[] text, int index, int count, + float x, float y, int bidiFlags, int paint); @Override public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) { @@ -851,7 +878,8 @@ class GLES20Canvas extends HardwareCanvas { } else { char[] buf = TemporaryBuffer.obtain(end - start); TextUtils.getChars(text, start, end, buf, 0); - nDrawText(mRenderer, buf, 0, end - start, x, y, paint.mBidiFlags, paint.mNativePaint); + nDrawText(mRenderer, buf, 0, end - start, x, y, + paint.mBidiFlags, paint.mNativePaint); TemporaryBuffer.recycle(buf); } } finally { @@ -873,8 +901,8 @@ class GLES20Canvas extends HardwareCanvas { } } - private native void nDrawText(int renderer, String text, int start, int end, float x, float y, - int bidiFlags, int paint); + private static native void nDrawText(int renderer, String text, int start, int end, + float x, float y, int bidiFlags, int paint); @Override public void drawText(String text, float x, float y, Paint paint) { @@ -917,7 +945,7 @@ class GLES20Canvas extends HardwareCanvas { } } - private native void nDrawTextRun(int renderer, char[] text, int index, int count, + private static native void nDrawTextRun(int renderer, char[] text, int index, int count, int contextIndex, int contextCount, float x, float y, int dir, int nativePaint); @Override @@ -951,7 +979,7 @@ class GLES20Canvas extends HardwareCanvas { } } - private native void nDrawTextRun(int renderer, String text, int start, int end, + private static native void nDrawTextRun(int renderer, String text, int start, int end, int contextStart, int contextEnd, float x, float y, int flags, int nativePaint); @Override @@ -994,9 +1022,10 @@ class GLES20Canvas extends HardwareCanvas { return false; } - private native void nSetupShader(int renderer, int shader); - private native void nSetupColorFilter(int renderer, int colorFilter); - private native void nSetupShadow(int renderer, float radius, float dx, float dy, int color); + private static native void nSetupShader(int renderer, int shader); + private static native void nSetupColorFilter(int renderer, int colorFilter); + private static native void nSetupShadow(int renderer, float radius, + float dx, float dy, int color); - private native void nResetModifiers(int renderer); + private static native void nResetModifiers(int renderer); } diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index e813bc9aebaf..262eb813bf41 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -16,6 +16,8 @@ package android.view; +import java.lang.ref.WeakReference; + /** * An implementation of display list for OpenGL ES 2.0. */ @@ -27,12 +29,24 @@ class GLES20DisplayList extends DisplayList { private boolean mValid = false; int mNativeDisplayList; + WeakReference<View> hostView; // The native display list will be destroyed when this object dies. // DO NOT overwrite this reference once it is set. @SuppressWarnings("unused") private DisplayListFinalizer mFinalizer; + public GLES20DisplayList(View view) { + hostView = new WeakReference<View>(view); + } + + public void invalidateView() { + View v = hostView.get(); + if (v != null) { + v.invalidate(); + } + } + @Override HardwareCanvas start() { if (mStarted) { diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index 2273238e66e9..e6fecc8fac05 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -19,11 +19,14 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Rect; /** - * Hardware accelerated canvas. + * Hardware accelerated canvas. + * + * @hide */ -abstract class HardwareCanvas extends Canvas { +public abstract class HardwareCanvas extends Canvas { @Override public boolean isHardwareAccelerated() { return true; @@ -36,8 +39,10 @@ abstract class HardwareCanvas extends Canvas { /** * Invoked before any drawing operation is performed in this canvas. + * + * @param dirty The dirty rectangle to update, can be null. */ - abstract void onPreDraw(); + abstract void onPreDraw(Rect dirty); /** * Invoked after all drawing operation have been performed. @@ -49,7 +54,7 @@ abstract class HardwareCanvas extends Canvas { * * @param displayList The display list to replay. */ - abstract void drawDisplayList(DisplayList displayList); + abstract boolean drawDisplayList(DisplayList displayList); /** * Draws the specified layer onto this canvas. @@ -59,5 +64,18 @@ abstract class HardwareCanvas extends Canvas { * @param y The top coordinate of the layer * @param paint The paint used to draw the layer */ - abstract void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint); + abstract void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint); + + /** + * Calls the function specified with the drawGLFunction function pointer. This is + * functionality used by webkit for calling into their renderer from our display lists. + * This function may return true if an invalidation is needed after the call. + * + * @param drawGLFunction A native function pointer + * @return true if an invalidate is needed after the call, false otherwise + */ + public boolean callDrawGLFunction(int drawGLFunction) { + // Noop - this is done in the display list recorder subclass + return false; + } } diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index addd1b342d5f..48f40c304307 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -18,6 +18,8 @@ package android.view; import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; import android.os.SystemClock; import android.util.EventLog; import android.util.Log; @@ -39,6 +41,16 @@ public abstract class HardwareRenderer { static final String LOG_TAG = "HardwareRenderer"; /** + * Turn on to only refresh the parts of the screen that need updating. + */ + public static final boolean RENDER_DIRTY_REGIONS = true; + + /** + * Turn on to draw dirty regions every other frame. + */ + private static final boolean DEBUG_DIRTY_REGION = false; + + /** * A process can set this flag to false to prevent the use of hardware * rendering. * @@ -108,11 +120,14 @@ public abstract class HardwareRenderer { /** * Draws the specified view. - * + * * @param view The view to draw. * @param attachInfo AttachInfo tied to the specified view. + * @param callbacks Callbacks invoked when drawing happens. + * @param dirty The dirty rectangle to update, can be null. */ - abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks); + abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks, + Rect dirty); /** * Creates a new display list that can be used to record batches of @@ -120,7 +135,7 @@ public abstract class HardwareRenderer { * * @return A new display list. */ - abstract DisplayList createDisplayList(); + abstract DisplayList createDisplayList(View v); /** * Creates a new hardware layer. @@ -214,7 +229,13 @@ public abstract class HardwareRenderer { @SuppressWarnings({"deprecation"}) static abstract class GlRenderer extends HardwareRenderer { private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + private static final int EGL_SURFACE_TYPE = 0x3033; + private static final int EGL_SWAP_BEHAVIOR_PRESERVED_BIT = 0x0400; + private static final int SURFACE_STATE_ERROR = 0; + private static final int SURFACE_STATE_SUCCESS = 1; + private static final int SURFACE_STATE_UPDATED = 2; + static EGLContext sEglContext; static EGL10 sEgl; static EGLDisplay sEglDisplay; @@ -226,6 +247,9 @@ public abstract class HardwareRenderer { GL mGl; HardwareCanvas mCanvas; + int mFrameCount; + Paint mDebugPaint; + final int mGlVersion; final boolean mTranslucent; @@ -412,7 +436,7 @@ public abstract class HardwareRenderer { if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) { int error = sEgl.eglGetError(); if (error == EGL10.EGL_BAD_NATIVE_WINDOW) { - Log.e("EglHelper", "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); + Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); return null; } throw new RuntimeException("createWindowSurface failed " @@ -427,6 +451,12 @@ public abstract class HardwareRenderer { throw new RuntimeException("eglMakeCurrent failed " + getEGLErrorString(sEgl.eglGetError())); } + + if (RENDER_DIRTY_REGIONS) { + if (!GLES20Canvas.preserveBackBuffer()) { + Log.w(LOG_TAG, "Backbuffer cannot be preserved"); + } + } return sEglContext.getGL(); } @@ -471,12 +501,12 @@ public abstract class HardwareRenderer { void setup(int width, int height) { mCanvas.setViewport(width, height); } - + boolean canDraw() { return mGl != null && mCanvas != null; } - void onPreDraw() { + void onPreDraw(Rect dirty) { } void onPostDraw() { @@ -492,8 +522,14 @@ public abstract class HardwareRenderer { } @Override - void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks) { + void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks, + Rect dirty) { if (canDraw()) { + //noinspection PointlessBooleanExpression,ConstantConditions + if (!HardwareRenderer.RENDER_DIRTY_REGIONS) { + dirty = null; + } + attachInfo.mDrawingTime = SystemClock.uptimeMillis(); attachInfo.mIgnoreDirtyState = true; view.mPrivateFlags |= View.DRAWN; @@ -503,22 +539,53 @@ public abstract class HardwareRenderer { startTime = SystemClock.elapsedRealtime(); } - if (checkCurrent()) { - onPreDraw(); + final int surfaceState = checkCurrent(); + if (surfaceState != SURFACE_STATE_ERROR) { + // We had to change the current surface and/or context, redraw everything + if (surfaceState == SURFACE_STATE_UPDATED) { + dirty = null; + } + + onPreDraw(dirty); - Canvas canvas = mCanvas; + HardwareCanvas canvas = mCanvas; + attachInfo.mHardwareCanvas = canvas; + int saveCount = canvas.save(); callbacks.onHardwarePreDraw(canvas); - + try { - view.draw(canvas); + view.mRecreateDisplayList = + (view.mPrivateFlags & View.INVALIDATED) == View.INVALIDATED; + view.mPrivateFlags &= ~View.INVALIDATED; + + DisplayList displayList = view.getDisplayList(); + if (displayList != null) { + if (canvas.drawDisplayList(displayList)) { + view.invalidate(); + } + } else { + // Shouldn't reach here + view.draw(canvas); + } + + if (DEBUG_DIRTY_REGION) { + if (mDebugPaint == null) { + mDebugPaint = new Paint(); + mDebugPaint.setColor(0x7fff0000); + } + if (dirty != null && (mFrameCount++ & 1) == 0) { + canvas.drawRect(dirty, mDebugPaint); + } + } } finally { callbacks.onHardwarePostDraw(canvas); canvas.restoreToCount(saveCount); + view.mRecreateDisplayList = false; } - + onPostDraw(); - + if (ViewDebug.DEBUG_PROFILE_DRAWING) { EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime); } @@ -530,8 +597,8 @@ public abstract class HardwareRenderer { } } } - - private boolean checkCurrent() { + + private int checkCurrent() { // TODO: Don't check the current context when we have one per UI thread // TODO: Use a threadlocal flag to know whether the surface has changed if (sEgl.eglGetCurrentContext() != sEglContext || @@ -540,10 +607,12 @@ public abstract class HardwareRenderer { fallback(true); Log.e(LOG_TAG, "eglMakeCurrent failed " + getEGLErrorString(sEgl.eglGetError())); - return false; + return SURFACE_STATE_ERROR; + } else { + return SURFACE_STATE_UPDATED; } } - return true; + return SURFACE_STATE_SUCCESS; } static abstract class EglConfigChooser { @@ -616,6 +685,7 @@ public abstract class HardwareRenderer { ComponentSizeChooser(int glVersion, int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) { + //noinspection PointlessBitwiseExpression super(glVersion, new int[] { EGL10.EGL_RED_SIZE, redSize, EGL10.EGL_GREEN_SIZE, greenSize, @@ -623,6 +693,8 @@ public abstract class HardwareRenderer { EGL10.EGL_ALPHA_SIZE, alphaSize, EGL10.EGL_DEPTH_SIZE, depthSize, EGL10.EGL_STENCIL_SIZE, stencilSize, + EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT | + (RENDER_DIRTY_REGIONS ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0), EGL10.EGL_NONE }); mValue = new int[1]; mRedSize = redSize; @@ -643,7 +715,16 @@ public abstract class HardwareRenderer { int g = findConfigAttrib(egl, display, config, EGL10.EGL_GREEN_SIZE, 0); int b = findConfigAttrib(egl, display, config, EGL10.EGL_BLUE_SIZE, 0); int a = findConfigAttrib(egl, display, config, EGL10.EGL_ALPHA_SIZE, 0); - if (r >= mRedSize && g >= mGreenSize && b >= mBlueSize && a >= mAlphaSize) { + boolean backBuffer; + if (RENDER_DIRTY_REGIONS) { + int surfaceType = findConfigAttrib(egl, display, config, + EGL_SURFACE_TYPE, 0); + backBuffer = (surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT) != 0; + } else { + backBuffer = true; + } + if (r >= mRedSize && g >= mGreenSize && b >= mBlueSize && a >= mAlphaSize + && backBuffer) { return config; } } @@ -683,8 +764,8 @@ public abstract class HardwareRenderer { } @Override - void onPreDraw() { - mGlCanvas.onPreDraw(); + void onPreDraw(Rect dirty) { + mGlCanvas.onPreDraw(dirty); } @Override @@ -704,8 +785,8 @@ public abstract class HardwareRenderer { } @Override - DisplayList createDisplayList() { - return new GLES20DisplayList(); + DisplayList createDisplayList(View v) { + return new GLES20DisplayList(v); } @Override diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index db2cd5056252..b95de64aa4df 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -1569,7 +1569,7 @@ public final class MotionEvent extends InputEvent implements Parcelable { + " device=" + mDeviceId + " source=0x" + Integer.toHexString(mSource) + (getPointerCount() > 1 ? - " pointerId2=" + getPointerId(1) + " x2=" + getX(2) + " y2=" + getY(2) : "") + " pointerId2=" + getPointerId(1) + " x2=" + getX(1) + " y2=" + getY(1) : "") + "}"; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6d5fd2c3e853..65d2e11ae0e6 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1509,6 +1509,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility /*package*/ int mMeasuredHeight; /** + * Flag to indicate that this view was marked INVALIDATED, or had its display list + * invalidated, prior to the current drawing iteration. If true, the view must re-draw + * its display list. This flag, used only when hw accelerated, allows us to clear the + * flag while retaining this information until it's needed (at getDisplayList() time and + * in drawChild(), when we decide to draw a view's children's display lists into our own). + * + * {@hide} + */ + boolean mRecreateDisplayList = false; + + /** * The view's identifier. * {@hide} * @@ -1672,6 +1683,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility static final int ACTIVATED = 0x40000000; /** + * Indicates that this view was specifically invalidated, not just dirtied because some + * child view was invalidated. The flag is used to determine when we need to recreate + * a view's display list (as opposed to just returning a reference to its existing + * display list). + * + * @hide + */ + static final int INVALIDATED = 0x80000000; + + /** * Always allow a user to over-scroll this view, provided it is a * view that can scroll. * @@ -5295,6 +5316,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((changed & VISIBILITY_MASK) != 0) { if (mParent instanceof ViewGroup) { ((ViewGroup)mParent).onChildVisibilityChanged(this, (flags & VISIBILITY_MASK)); + ((View) mParent).invalidate(); } dispatchVisibilityChanged(this, (flags & VISIBILITY_MASK)); } @@ -5306,6 +5328,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((changed & DRAWING_CACHE_ENABLED) != 0) { destroyDrawingCache(); mPrivateFlags &= ~DRAWING_CACHE_VALID; + invalidateParentIfAccelerated(); } if ((changed & DRAWING_CACHE_QUALITY_MASK) != 0) { @@ -5666,6 +5689,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5699,6 +5723,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5732,6 +5757,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5767,6 +5793,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5802,6 +5829,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5843,6 +5871,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5883,6 +5912,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -5922,6 +5952,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags &= ~ALPHA_SET; invalidate(false); } + invalidateParentIfAccelerated(); } /** @@ -6241,6 +6272,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -6274,6 +6306,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); + invalidateParentIfAccelerated(); } } @@ -6490,6 +6523,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int oldY = mScrollY; mScrollX = x; mScrollY = y; + invalidateParentIfAccelerated(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { invalidate(); @@ -6690,15 +6724,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) || - (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) { + (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID || + (mPrivateFlags & INVALIDATED) != INVALIDATED) { mPrivateFlags &= ~DRAWING_CACHE_VALID; + mPrivateFlags |= INVALIDATED; final ViewParent p = mParent; final AttachInfo ai = mAttachInfo; - if (p != null && ai != null && ai.mHardwareAccelerated) { - // fast-track for GL-enabled applications; just invalidate the whole hierarchy - // with a null dirty rect, which tells the ViewRoot to redraw everything - p.invalidateChild(this, null); - return; + //noinspection PointlessBooleanExpression,ConstantConditions + if (!HardwareRenderer.RENDER_DIRTY_REGIONS) { + if (p != null && ai != null && ai.mHardwareAccelerated) { + // fast-track for GL-enabled applications; just invalidate the whole hierarchy + // with a null dirty rect, which tells the ViewRoot to redraw everything + p.invalidateChild(this, null); + return; + } } if (p != null && ai != null) { final int scrollX = mScrollX; @@ -6728,15 +6767,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) || - (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) { + (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID || + (mPrivateFlags & INVALIDATED) != INVALIDATED) { mPrivateFlags &= ~DRAWING_CACHE_VALID; + mPrivateFlags |= INVALIDATED; final ViewParent p = mParent; final AttachInfo ai = mAttachInfo; - if (p != null && ai != null && ai.mHardwareAccelerated) { - // fast-track for GL-enabled applications; just invalidate the whole hierarchy - // with a null dirty rect, which tells the ViewRoot to redraw everything - p.invalidateChild(this, null); - return; + //noinspection PointlessBooleanExpression,ConstantConditions + if (!HardwareRenderer.RENDER_DIRTY_REGIONS) { + if (p != null && ai != null && ai.mHardwareAccelerated) { + // fast-track for GL-enabled applications; just invalidate the whole hierarchy + // with a null dirty rect, which tells the ViewRoot to redraw everything + p.invalidateChild(this, null); + return; + } } if (p != null && ai != null && l < r && t < b) { final int scrollX = mScrollX; @@ -6776,19 +6820,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean opaque = isOpaque(); if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) || (invalidateCache && (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) || - opaque != mLastIsOpaque) { + opaque != mLastIsOpaque || (mPrivateFlags & INVALIDATED) != INVALIDATED) { mLastIsOpaque = opaque; mPrivateFlags &= ~DRAWN; if (invalidateCache) { + mPrivateFlags |= INVALIDATED; mPrivateFlags &= ~DRAWING_CACHE_VALID; } final AttachInfo ai = mAttachInfo; final ViewParent p = mParent; - if (p != null && ai != null && ai.mHardwareAccelerated) { - // fast-track for GL-enabled applications; just invalidate the whole hierarchy - // with a null dirty rect, which tells the ViewRoot to redraw everything - p.invalidateChild(this, null); - return; + //noinspection PointlessBooleanExpression,ConstantConditions + if (!HardwareRenderer.RENDER_DIRTY_REGIONS) { + if (p != null && ai != null && ai.mHardwareAccelerated) { + // fast-track for GL-enabled applications; just invalidate the whole hierarchy + // with a null dirty rect, which tells the ViewRoot to redraw everything + p.invalidateChild(this, null); + return; + } } if (p != null && ai != null) { @@ -6802,6 +6850,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** + * Used to indicate that the parent of this view should be invalidated. This functionality + * is used to force the parent to rebuild its display list (when hardware-accelerated), + * which is necessary when various parent-managed properties of the view change, such as + * alpha, translationX/Y, scrollX/Y, scaleX/Y, and rotation/X/Y. + * + * @hide + */ + protected void invalidateParentIfAccelerated() { + if (isHardwareAccelerated() && mParent instanceof View) { + ((View) mParent).invalidate(); + } + } + + /** * Indicates whether this View is opaque. An opaque View guarantees that it will * draw all the pixels overlapping its bounds using a fully opaque color. * @@ -7630,6 +7692,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mHardwareLayer = null; } + if (mDisplayList != null) { + mDisplayList.invalidate(); + } + if (mAttachInfo != null) { mAttachInfo.mHandler.removeMessages(AttachInfo.INVALIDATE_MSG, this); mAttachInfo.mHandler.removeMessages(AttachInfo.INVALIDATE_RECT_MSG, this); @@ -7953,7 +8019,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility throw new IllegalArgumentException("Layer type can only be one of: LAYER_TYPE_NONE, " + "LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE"); } - + if (layerType == mLayerType) { if (layerType != LAYER_TYPE_NONE && paint != mLayerPaint) { mLayerPaint = paint == null ? new Paint() : paint; @@ -8021,7 +8087,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * * @return A HardwareLayer ready to render, or null if an error occurred. */ - HardwareLayer getHardwareLayer(Canvas currentCanvas) { + HardwareLayer getHardwareLayer() { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; } @@ -8041,10 +8107,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mHardwareLayer.resize(width, height); } + Canvas currentCanvas = mAttachInfo.mHardwareCanvas; final HardwareCanvas canvas = mHardwareLayer.start(currentCanvas); + mAttachInfo.mHardwareCanvas = canvas; try { canvas.setViewport(width, height); - canvas.onPreDraw(); + // TODO: We should pass the dirty rect + canvas.onPreDraw(null); computeScroll(); canvas.translate(-mScrollX, -mScrollY); @@ -8065,6 +8134,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } finally { canvas.onPostDraw(); mHardwareLayer.end(currentCanvas); + mAttachInfo.mHardwareCanvas = currentCanvas; } } @@ -8081,9 +8151,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * * <p>Enabling the drawing cache is similar to * {@link #setLayerType(int, android.graphics.Paint) setting a layer} when hardware - * acceleration is turned off. When hardware acceleration is turned on enabling the - * drawing cache has either no effect or the cache used at drawing time is not a bitmap. - * This API can however be used to manually generate a bitmap copy of this view.</p> + * acceleration is turned off. When hardware acceleration is turned on, enabling the + * drawing cache has no effect on rendering because the system uses a different mechanism + * for acceleration which ignores the flag. If you want to use a Bitmap for the view, even + * when hardware acceleration is enabled, see {@link #setLayerType(int, android.graphics.Paint)} + * for information on how to enable software and hardware layers.</p> + * + * <p>This API can be used to manually generate + * a bitmap copy of this view, by setting the flag to <code>true</code> and calling + * {@link #getDrawingCache()}.</p> * * @param enabled true to enable the drawing cache, false otherwise * @@ -8110,25 +8186,76 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** + * Debugging utility which recursively outputs the dirty state of a view and its + * descendants. + * + * @hide + */ + public void outputDirtyFlags(String indent, boolean clear, int clearMask) { + Log.d("View", indent + this + " DIRTY(" + (mPrivateFlags & View.DIRTY_MASK) + + ") DRAWN(" + (mPrivateFlags & DRAWN) + ")" + " CACHE_VALID(" + + (mPrivateFlags & View.DRAWING_CACHE_VALID) + + ") INVALIDATED(" + (mPrivateFlags & INVALIDATED) + ")"); + if (clear) { + mPrivateFlags &= clearMask; + } + if (this instanceof ViewGroup) { + ViewGroup parent = (ViewGroup) this; + final int count = parent.getChildCount(); + for (int i = 0; i < count; i++) { + final View child = parent.getChildAt(i); + child.outputDirtyFlags(indent + " ", clear, clearMask); + } + } + } + + /** + * This method is used by ViewGroup to cause its children to restore or recreate their + * display lists. It is called by getDisplayList() when the parent ViewGroup does not need + * to recreate its own display list, which would happen if it went through the normal + * draw/dispatchDraw mechanisms. + * + * @hide + */ + protected void dispatchGetDisplayList() {} + + /** * <p>Returns a display list that can be used to draw this view again * without executing its draw method.</p> * * @return A DisplayList ready to replay, or null if caching is not enabled. + * + * @hide */ - DisplayList getDisplayList() { - if ((mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING) { - return null; - } + public DisplayList getDisplayList() { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; } - if ((mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED && - ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || - mDisplayList == null || !mDisplayList.isValid())) { + if (((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || + mDisplayList == null || !mDisplayList.isValid() || + mRecreateDisplayList)) { + // Don't need to recreate the display list, just need to tell our + // children to restore/recreate theirs + if (mDisplayList != null && mDisplayList.isValid() && + !mRecreateDisplayList) { + mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID; + mPrivateFlags &= ~DIRTY_MASK; + dispatchGetDisplayList(); + + return mDisplayList; + } + + // If we got here, we're recreating it. Mark it as such to ensure that + // we copy in child display lists into ours in drawChild() + mRecreateDisplayList = true; if (mDisplayList == null) { - mDisplayList = mAttachInfo.mHardwareRenderer.createDisplayList(); + mDisplayList = mAttachInfo.mHardwareRenderer.createDisplayList(this); + // If we're creating a new display list, make sure our parent gets invalidated + // since they will need to recreate their display list to account for this + // new child display list. + invalidateParentIfAccelerated(); } final HardwareCanvas canvas = mDisplayList.start(); @@ -8137,10 +8264,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int height = mBottom - mTop; canvas.setViewport(width, height); - canvas.onPreDraw(); + // The dirty rect should always be null for a display list + canvas.onPreDraw(null); final int restoreCount = canvas.save(); + computeScroll(); + canvas.translate(-mScrollX, -mScrollY); mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID; // Fast path for layouts with no backgrounds @@ -8229,9 +8359,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mUnscaledDrawingCache.recycle(); mUnscaledDrawingCache = null; } - if (mDisplayList != null) { - mDisplayList.invalidate(); - } } /** @@ -10175,6 +10302,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } mPrivateFlags |= FORCE_LAYOUT; + mPrivateFlags |= INVALIDATED; if (mParent != null && !mParent.isLayoutRequested()) { mParent.requestLayout(); @@ -10188,6 +10316,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void forceLayout() { mPrivateFlags |= FORCE_LAYOUT; + mPrivateFlags |= INVALIDATED; } /** @@ -10480,6 +10609,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility animation.setStartTime(Animation.START_ON_FIRST_FRAME); setAnimation(animation); invalidate(); + invalidateParentIfAccelerated(); } /** @@ -10490,6 +10620,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mCurrentAnimation.detach(); } mCurrentAnimation = null; + invalidateParentIfAccelerated(); } /** @@ -10660,7 +10791,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility /** * Returns the status bar visibility that this view has requested. */ - public int getSystemUiVisibility(int visibility) { + public int getSystemUiVisibility() { return mSystemUiVisibility; } @@ -11495,6 +11626,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility final Callbacks mRootCallbacks; + Canvas mHardwareCanvas; + /** * The top view of the hierarchy. */ diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index edad4943fcf5..0444496c5d17 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -167,7 +167,7 @@ public class ViewConfiguration { /** * Max distance to overfling for edge effects */ - private static final int OVERFLING_DISTANCE = 12; + private static final int OVERFLING_DISTANCE = 6; private final int mEdgeSlop; private final int mFadingEdgeLength; diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index d5c440c482be..c19a107ec749 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -998,22 +998,27 @@ public class ViewDebug { new ViewOperation<Object>() { public Object[] pre() { final DisplayMetrics metrics = - view.getResources().getDisplayMetrics(); - final Bitmap bitmap = + (view != null && view.getResources() != null) ? + view.getResources().getDisplayMetrics() : null; + final Bitmap bitmap = metrics != null ? Bitmap.createBitmap(metrics.widthPixels, - metrics.heightPixels, Bitmap.Config.RGB_565); - final Canvas canvas = new Canvas(bitmap); + metrics.heightPixels, Bitmap.Config.RGB_565) : null; + final Canvas canvas = bitmap != null ? new Canvas(bitmap) : null; return new Object[] { bitmap, canvas }; } public void run(Object... data) { - view.draw((Canvas) data[1]); + if (data[1] != null) { + view.draw((Canvas) data[1]); + } } public void post(Object... data) { - ((Bitmap) data[0]).recycle(); + if (data[0] != null) { + ((Bitmap) data[0]).recycle(); + } } }) : 0; out.write(String.valueOf(durationMeasure)); diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d6c8ad655afe..f198c4678dae 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2206,6 +2206,27 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } /** + * This method is used to cause children of this ViewGroup to restore or recreate their + * display lists. It is called by getDisplayList() when the parent ViewGroup does not need + * to recreate its own display list, which would happen if it went through the normal + * draw/dispatchDraw mechanisms. + * + * @hide + */ + @Override + protected void dispatchGetDisplayList() { + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + final View child = children[i]; + child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED; + child.mPrivateFlags &= ~INVALIDATED; + child.getDisplayList(); + child.mRecreateDisplayList = false; + } + } + + /** * Draw one child of this View Group. This method is responsible for getting * the canvas in the right state. This includes clipping, translating so * that the child's scrolled origin is at 0, 0, and applying any animation @@ -2247,7 +2268,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager caching = true; if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired; } else { - caching = layerType != LAYER_TYPE_NONE; + caching = (layerType != LAYER_TYPE_NONE) || canvas.isHardwareAccelerated(); } if (a != null) { @@ -2329,6 +2350,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return more; } + if (canvas.isHardwareAccelerated()) { + // Clear INVALIDATED flag to allow invalidation to occur during rendering, but + // retain the flag's value temporarily in the mRecreateDisplayList flag + child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED; + child.mPrivateFlags &= ~INVALIDATED; + } + child.computeScroll(); final int sx = child.mScrollX; @@ -2347,7 +2375,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (layerType == LAYER_TYPE_SOFTWARE) { child.buildDrawingCache(true); cache = child.getDrawingCache(true); - } else { + } else if (layerType == LAYER_TYPE_NONE) { displayList = child.getDisplayList(); } } @@ -2357,7 +2385,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final boolean hasNoCache = cache == null || hasDisplayList; final int restoreTo = canvas.save(); - if (hasNoCache) { + if (cache == null && !hasDisplayList) { canvas.translate(cl - sx, ct - sy); } else { canvas.translate(cl, ct); @@ -2367,15 +2395,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager canvas.scale(scale, scale); } } - - boolean layerSaved = false; if (transformToApply != null || alpha < 1.0f || !child.hasIdentityMatrix()) { if (transformToApply != null || !childHasIdentityMatrix) { int transX = 0; int transY = 0; - if (hasNoCache) { + if (cache == null && !hasDisplayList) { transX = -sx; transY = -sy; } @@ -2435,10 +2461,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } if ((flags & FLAG_CLIP_CHILDREN) == FLAG_CLIP_CHILDREN) { - if (hasNoCache) { + if (cache == null && !hasDisplayList) { canvas.clipRect(sx, sy, sx + (cr - cl), sy + (cb - ct)); } else { - if (!scalingRequired) { + if (!scalingRequired || cache == null) { canvas.clipRect(0, 0, cr - cl, cb - ct); } else { canvas.clipRect(0, 0, cache.getWidth(), cache.getHeight()); @@ -2449,7 +2475,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (hasNoCache) { boolean layerRendered = false; if (layerType == LAYER_TYPE_HARDWARE) { - final HardwareLayer layer = child.getHardwareLayer(canvas); + final HardwareLayer layer = child.getHardwareLayer(); if (layer != null && layer.isValid()) { ((HardwareCanvas) canvas).drawHardwareLayer(layer, 0, 0, child.mLayerPaint); layerRendered = true; @@ -2473,7 +2499,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } else { child.mPrivateFlags &= ~DIRTY_MASK; - ((HardwareCanvas) canvas).drawDisplayList(displayList); + // Skip drawing the display list into ours if we were just refreshing + // it's content; we already have a reference to it in our display list + if (mRecreateDisplayList || mLayerType != LAYER_TYPE_NONE) { + ((HardwareCanvas) canvas).drawDisplayList(displayList); + } } } } else if (cache != null) { @@ -2503,6 +2533,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager finishAnimatingView(child, a); } + if (more && canvas.isHardwareAccelerated()) { + // invalidation is the trigger to recreate display lists, so if we're using + // display lists to render, force an invalidate to allow the animation to + // continue drawing another frame + invalidate(); + } + + child.mRecreateDisplayList = false; + return more; } @@ -2743,7 +2782,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // addViewInner() will call child.requestLayout() when setting the new LayoutParams // therefore, we call requestLayout() on ourselves before, so that the child's request // will be blocked at our level - child.mPrivateFlags &= ~DIRTY_MASK; requestLayout(); invalidate(); addViewInner(child, index, params, false); @@ -3317,7 +3355,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager addInArray(child, index); child.mParent = this; - child.mPrivateFlags = (child.mPrivateFlags & ~DIRTY_MASK & ~DRAWING_CACHE_VALID) | DRAWN; + child.mPrivateFlags = (child.mPrivateFlags & ~DIRTY_MASK & ~DRAWING_CACHE_VALID) | + DRAWN | INVALIDATED; + this.mPrivateFlags |= INVALIDATED; if (child.hasFocus()) { requestChildFocus(child, child.findFocus()); @@ -3425,10 +3465,20 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final boolean drawAnimation = (child.mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION; if (dirty == null) { + if (child.mLayerType != LAYER_TYPE_NONE) { + mPrivateFlags |= INVALIDATED; + mPrivateFlags &= ~DRAWING_CACHE_VALID; + } do { View view = null; if (parent instanceof View) { view = (View) parent; + if (view.mLayerType != LAYER_TYPE_NONE && + view.getParent() instanceof View) { + final View grandParent = (View) view.getParent(); + grandParent.mPrivateFlags |= INVALIDATED; + grandParent.mPrivateFlags &= ~DRAWING_CACHE_VALID; + } if ((view.mPrivateFlags & DIRTY_MASK) != 0) { // already marked dirty - we're done break; @@ -3477,10 +3527,20 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager (int) (boundingRect.bottom + 0.5f)); } + if (child.mLayerType != LAYER_TYPE_NONE) { + mPrivateFlags |= INVALIDATED; + mPrivateFlags &= ~DRAWING_CACHE_VALID; + } do { View view = null; if (parent instanceof View) { view = (View) parent; + if (view.mLayerType != LAYER_TYPE_NONE && + view.getParent() instanceof View) { + final View grandParent = (View) view.getParent(); + grandParent.mPrivateFlags |= INVALIDATED; + grandParent.mPrivateFlags &= ~DRAWING_CACHE_VALID; + } } if (drawAnimation) { diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index d9321416ab97..68b6a8a87a7d 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -160,7 +160,9 @@ public final class ViewRoot extends Handler implements ViewParent, int mWidth; int mHeight; - Rect mDirty; // will be a graphics.Region soon + Rect mDirty; + final Rect mCurrentDirty = new Rect(); + final Rect mPreviousDirty = new Rect(); boolean mIsAnimating; CompatibilityInfo.Translator mTranslator; @@ -597,7 +599,7 @@ public final class ViewRoot extends Handler implements ViewParent, dirty.inset(-1, -1); } } - if (!mDirty.isEmpty()) { + if (!mDirty.isEmpty() && !mDirty.contains(dirty)) { mAttachInfo.mIgnoreDirtyState = true; } mDirty.union(dirty); @@ -891,7 +893,7 @@ public final class ViewRoot extends Handler implements ViewParent, } } - if (attachInfo.mRecomputeGlobalAttributes) { + if (attachInfo.mRecomputeGlobalAttributes && host.mAttachInfo != null) { //Log.i(TAG, "Computing view hierarchy attributes!"); attachInfo.mRecomputeGlobalAttributes = false; boolean oldScreenOn = attachInfo.mKeepScreenOn; @@ -1055,6 +1057,7 @@ public final class ViewRoot extends Handler implements ViewParent, disposeResizeBitmap(); } else if (surfaceGenerationId != mSurface.getGenerationId() && mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) { + fullRedrawNeeded = true; mAttachInfo.mHardwareRenderer.updateSurface(mHolder); } } catch (RemoteException e) { @@ -1488,10 +1491,15 @@ public final class ViewRoot extends Handler implements ViewParent, if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { if (!dirty.isEmpty() || mIsAnimating) { mIsAnimating = false; - dirty.setEmpty(); mHardwareYOffset = yoff; mResizeAlpha = resizeAlpha; - mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this); + + mCurrentDirty.set(dirty); + mCurrentDirty.union(mPreviousDirty); + mPreviousDirty.set(dirty); + dirty.setEmpty(); + + mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, mCurrentDirty); } if (animating) { @@ -1986,6 +1994,7 @@ public final class ViewRoot extends Handler implements ViewParent, if (mAttachInfo.mHardwareRenderer != null && mSurface != null && mSurface.isValid()) { + mFullRedrawNeeded = true; mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight, mAttachInfo, mHolder); } diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java index 6095a64d634a..62d3e6af7797 100755 --- a/core/java/android/view/WindowOrientationListener.java +++ b/core/java/android/view/WindowOrientationListener.java @@ -23,6 +23,7 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Config; import android.util.Log; +import android.util.Slog; /** * A special helper class used by the WindowManager @@ -33,17 +34,27 @@ import android.util.Log; * "App/Activity/Screen Orientation" to ensure that all orientation * modes still work correctly. * + * You can also visualize the behavior of the WindowOrientationListener by + * enabling the window orientation listener log using the Development Settings + * in the Dev Tools application (Development.apk) + * and running frameworks/base/tools/orientationplot/orientationplot.py. + * + * More information about how to tune this algorithm in + * frameworks/base/tools/orientationplot/README.txt. + * * @hide */ public abstract class WindowOrientationListener { private static final String TAG = "WindowOrientationListener"; private static final boolean DEBUG = false; private static final boolean localLOGV = DEBUG || Config.DEBUG; + private SensorManager mSensorManager; - private boolean mEnabled = false; + private boolean mEnabled; private int mRate; private Sensor mSensor; private SensorEventListenerImpl mSensorEventListener; + boolean mLogEnabled; /** * Creates a new WindowOrientationListener. @@ -51,7 +62,7 @@ public abstract class WindowOrientationListener { * @param context for the WindowOrientationListener. */ public WindowOrientationListener(Context context) { - this(context, SensorManager.SENSOR_DELAY_NORMAL); + this(context, SensorManager.SENSOR_DELAY_UI); } /** @@ -63,9 +74,7 @@ public abstract class WindowOrientationListener { * value of {@link android.hardware.SensorManager#SENSOR_DELAY_NORMAL * SENSOR_DELAY_NORMAL} for simple screen orientation change detection. * - * This constructor is private since no one uses it and making it public would complicate - * things, since the lowpass filtering code depends on the actual sampling period, and there's - * no way to get the period from SensorManager based on the rate constant. + * This constructor is private since no one uses it. */ private WindowOrientationListener(Context context, int rate) { mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); @@ -108,12 +117,11 @@ public abstract class WindowOrientationListener { } } - public void setAllow180Rotation(boolean allowed) { - if (mSensorEventListener != null) { - mSensorEventListener.setAllow180Rotation(allowed); - } - } - + /** + * Gets the current orientation. + * @param lastRotation + * @return + */ public int getCurrentRotation(int lastRotation) { if (mEnabled) { return mSensorEventListener.getCurrentRotation(lastRotation); @@ -122,375 +130,493 @@ public abstract class WindowOrientationListener { } /** + * Returns true if sensor is enabled and false otherwise + */ + public boolean canDetectOrientation() { + return mSensor != null; + } + + /** + * Called when the rotation view of the device has changed. + * + * @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants. + * @see Surface + */ + public abstract void onOrientationChanged(int rotation); + + /** + * Enables or disables the window orientation listener logging for use with + * the orientationplot.py tool. + * Logging is usually enabled via Development Settings. (See class comments.) + * @param enable True to enable logging. + */ + public void setLogEnabled(boolean enable) { + mLogEnabled = enable; + } + + /** * This class filters the raw accelerometer data and tries to detect actual changes in * orientation. This is a very ill-defined problem so there are a lot of tweakable parameters, * but here's the outline: * - * - Convert the acceleromter vector from cartesian to spherical coordinates. Since we're - * dealing with rotation of the device, this is the sensible coordinate system to work in. The - * zenith direction is the Z-axis, i.e. the direction the screen is facing. The radial distance - * is referred to as the magnitude below. The elevation angle is referred to as the "tilt" - * below. The azimuth angle is referred to as the "orientation" below (and the azimuth axis is - * the Y-axis). See http://en.wikipedia.org/wiki/Spherical_coordinate_system for reference. + * - Low-pass filter the accelerometer vector in cartesian coordinates. We do it in + * cartesian space because the orientation calculations are sensitive to the + * absolute magnitude of the acceleration. In particular, there are singularities + * in the calculation as the magnitude approaches 0. By performing the low-pass + * filtering early, we can eliminate high-frequency impulses systematically. + * + * - Convert the acceleromter vector from cartesian to spherical coordinates. + * Since we're dealing with rotation of the device, this is the sensible coordinate + * system to work in. The zenith direction is the Z-axis, the direction the screen + * is facing. The radial distance is referred to as the magnitude below. + * The elevation angle is referred to as the "tilt" below. + * The azimuth angle is referred to as the "orientation" below (and the azimuth axis is + * the Y-axis). + * See http://en.wikipedia.org/wiki/Spherical_coordinate_system for reference. + * + * - If the tilt angle is too close to horizontal (near 90 or -90 degrees), do nothing. + * The orientation angle is not meaningful when the device is nearly horizontal. + * The tilt angle thresholds are set differently for each orientation and different + * limits are applied when the device is facing down as opposed to when it is facing + * forward or facing up. * - * - Low-pass filter the tilt and orientation angles to avoid "twitchy" behavior. + * - When the orientation angle reaches a certain threshold, consider transitioning + * to the corresponding orientation. These thresholds have some hysteresis built-in + * to avoid oscillations between adjacent orientations. * - * - When the orientation angle reaches a certain threshold, transition to the corresponding - * orientation. These thresholds have some hysteresis built-in to avoid oscillation. + * - Use the magnitude to judge the confidence of the orientation. + * Under ideal conditions, the magnitude should equal to that of gravity. When it + * differs significantly, we know the device is under external acceleration and + * we can't trust the data. * - * - Use the magnitude to judge the accuracy of the data. Under ideal conditions, the magnitude - * should equal to that of gravity. When it differs significantly, we know the device is under - * external acceleration and we can't trust the data. + * - Use the tilt angle to judge the confidence of the orientation. + * When the tilt angle is high in absolute value then the device is nearly flat + * so small physical movements produce large changes in orientation angle. + * This can be the case when the device is being picked up from a table. * - * - Use the tilt angle to judge the accuracy of orientation data. When the tilt angle is high - * in magnitude, we distrust the orientation data, because when the device is nearly flat, small - * physical movements produce large changes in orientation angle. + * - Use the orientation angle to judge the confidence of the orientation. + * The close the orientation angle is to the canonical orientation angle, the better. * - * Details are explained below. + * - Based on the aggregate confidence, we determine how long we want to wait for + * the new orientation to settle. This is accomplished by integrating the confidence + * for each orientation over time. When a threshold integration sum is reached + * then we actually change orientations. + * + * Details are explained inline. */ - static class SensorEventListenerImpl implements SensorEventListener { + static final class SensorEventListenerImpl implements SensorEventListener { // We work with all angles in degrees in this class. private static final float RADIANS_TO_DEGREES = (float) (180 / Math.PI); - // Indices into SensorEvent.values - private static final int _DATA_X = 0; - private static final int _DATA_Y = 1; - private static final int _DATA_Z = 2; - - // Internal aliases for the four orientation states. ROTATION_0 = default portrait mode, - // ROTATION_90 = right side of device facing the sky, etc. - private static final int ROTATION_0 = 0; - private static final int ROTATION_90 = 1; - private static final int ROTATION_270 = 2; - private static final int ROTATION_180 = 3; - - // Mapping our internal aliases into actual Surface rotation values - private static final int[] INTERNAL_TO_SURFACE_ROTATION = new int[] { - Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_270, - Surface.ROTATION_180}; - - // Mapping Surface rotation values to internal aliases. - private static final int[] SURFACE_TO_INTERNAL_ROTATION = new int[] { - ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270}; - - // Threshold ranges of orientation angle to transition into other orientation states. - // The first list is for transitions from ROTATION_0, ROTATION_90, ROTATION_270, - // and then ROTATION_180. - // ROTATE_TO defines the orientation each threshold range transitions to, and must be kept - // in sync with this. - // We generally transition about the halfway point between two states with a swing of 30 - // degrees for hysteresis. - private static final int[][][] THRESHOLDS = new int[][][] { - {{60, 180}, {180, 300}}, - {{0, 30}, {195, 315}, {315, 360}}, - {{0, 45}, {45, 165}, {330, 360}}, - - // Handle situation where we are currently doing 180 rotation - // but that is no longer allowed. - {{0, 45}, {45, 135}, {135, 225}, {225, 315}, {315, 360}}, - }; - // See THRESHOLDS - private static final int[][] ROTATE_TO = new int[][] { - {ROTATION_90, ROTATION_270}, - {ROTATION_0, ROTATION_270, ROTATION_0}, - {ROTATION_0, ROTATION_90, ROTATION_0}, - {ROTATION_0, ROTATION_90, ROTATION_0, ROTATION_270, ROTATION_0}, - }; + // Indices into SensorEvent.values for the accelerometer sensor. + private static final int ACCELEROMETER_DATA_X = 0; + private static final int ACCELEROMETER_DATA_Y = 1; + private static final int ACCELEROMETER_DATA_Z = 2; + + // Rotation constants. + // These are the same as Surface rotation constants with the addition of a 5th + // unknown state when we are not confident about the proporsed orientation. + // One important property of these constants is that they are equal to the + // orientation angle itself divided by 90. We use this fact to map + // back and forth between orientation angles and rotation values. + private static final int ROTATION_UNKNOWN = -1; + //private static final int ROTATION_0 = Surface.ROTATION_0; // 0 + //private static final int ROTATION_90 = Surface.ROTATION_90; // 1 + //private static final int ROTATION_180 = Surface.ROTATION_180; // 2 + //private static final int ROTATION_270 = Surface.ROTATION_270; // 3 + + private final WindowOrientationListener mOrientationListener; + + private int mRotation = ROTATION_UNKNOWN; + + /* State for first order low-pass filtering of accelerometer data. + * See http://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization for + * signal processing background. + */ - // Thresholds that allow all 4 orientations. - private static final int[][][] THRESHOLDS_WITH_180 = new int[][][] { - {{60, 165}, {165, 195}, {195, 300}}, - {{0, 30}, {165, 195}, {195, 315}, {315, 360}}, - {{0, 45}, {45, 165}, {165, 195}, {330, 360}}, - {{0, 45}, {45, 135}, {225, 315}, {315, 360}}, - }; - // See THRESHOLDS_WITH_180 - private static final int[][] ROTATE_TO_WITH_180 = new int[][] { - {ROTATION_90, ROTATION_180, ROTATION_270}, - {ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0}, - {ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0}, - {ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0}, - }; + private long mLastTimestamp = Long.MAX_VALUE; // in nanoseconds + private float mLastFilteredX, mLastFilteredY, mLastFilteredZ; + + // The maximum sample inter-arrival time in milliseconds. + // If the acceleration samples are further apart than this amount in time, we reset the + // state of the low-pass filter and orientation properties. This helps to handle + // boundary conditions when the device is turned on, wakes from suspend or there is + // a significant gap in samples. + private static final float MAX_FILTER_DELTA_TIME_MS = 1000; + + // The acceleration filter cutoff frequency. + // This is the frequency at which signals are attenuated by 3dB (half the passband power). + // Each successive octave beyond this frequency is attenuated by an additional 6dB. + // + // We choose the cutoff frequency such that impulses and vibrational noise + // (think car dock) is suppressed. However, this filtering does not eliminate + // all possible sources of orientation ambiguity so we also rely on a dynamic + // settle time for establishing a new orientation. Filtering adds latency + // inversely proportional to the cutoff frequency so we don't want to make + // it too small or we can lose hundreds of milliseconds of responsiveness. + private static final float FILTER_CUTOFF_FREQUENCY_HZ = 1f; + private static final float FILTER_TIME_CONSTANT_MS = (float)(500.0f + / (Math.PI * FILTER_CUTOFF_FREQUENCY_HZ)); // t = 1 / (2pi * Fc) * 1000ms + + // The filter gain. + // We choose a value slightly less than unity to avoid numerical instabilities due + // to floating-point error accumulation. + private static final float FILTER_GAIN = 0.999f; + + /* State for orientation detection. */ + + // Thresholds for minimum and maximum allowable deviation from gravity. + // + // If the device is undergoing external acceleration (being bumped, in a car + // that is turning around a corner or a plane taking off) then the magnitude + // may be substantially more or less than gravity. This can skew our orientation + // detection by making us think that up is pointed in a different direction. + // + // Conversely, if the device is in freefall, then there will be no gravity to + // measure at all. This is problematic because we cannot detect the orientation + // without gravity to tell us which way is up. A magnitude near 0 produces + // singularities in the tilt and orientation calculations. + // + // In both cases, we postpone choosing an orientation. + private static final float MIN_ACCELERATION_MAGNITUDE = + SensorManager.STANDARD_GRAVITY * 0.5f; + private static final float MAX_ACCELERATION_MAGNITUDE = + SensorManager.STANDARD_GRAVITY * 1.5f; // Maximum absolute tilt angle at which to consider orientation data. Beyond this (i.e. // when screen is facing the sky or ground), we completely ignore orientation data. private static final int MAX_TILT = 75; - // Additional limits on tilt angle to transition to each new orientation. We ignore all - // data with tilt beyond MAX_TILT, but we can set stricter limits on transitions to a - // particular orientation here. - private static final int[] MAX_TRANSITION_TILT = new int[] {MAX_TILT, 65, 65, 40}; - - // Between this tilt angle and MAX_TILT, we'll allow orientation changes, but we'll filter - // with a higher time constant, making us less sensitive to change. This primarily helps - // prevent momentary orientation changes when placing a device on a table from the side (or - // picking one up). - private static final int PARTIAL_TILT = 50; - - // Maximum allowable deviation of the magnitude of the sensor vector from that of gravity, - // in m/s^2. Beyond this, we assume the phone is under external forces and we can't trust - // the sensor data. However, under constantly vibrating conditions (think car mount), we - // still want to pick up changes, so rather than ignore the data, we filter it with a very - // high time constant. - private static final float MAX_DEVIATION_FROM_GRAVITY = 1.5f; - - // Minimum acceleration considered, in m/s^2. Below this threshold sensor noise will have - // significant impact on the calculations and in case of the vector (0, 0, 0) there is no - // defined rotation or tilt at all. Low or zero readings can happen when space travelling - // or free falling, but more commonly when shaking or getting bad readings from the sensor. - // The accelerometer is turned off when not used and polling it too soon after it is - // turned on may result in (0, 0, 0). - private static final float MIN_ABS_ACCELERATION = 1.5f; - - // Actual sampling period corresponding to SensorManager.SENSOR_DELAY_NORMAL. There's no - // way to get this information from SensorManager. - // Note the actual period is generally 3-30ms larger than this depending on the device, but - // that's not enough to significantly skew our results. - private static final int SAMPLING_PERIOD_MS = 200; - - // The following time constants are all used in low-pass filtering the accelerometer output. - // See http://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization for - // background. - - // When device is near-vertical (screen approximately facing the horizon) - private static final int DEFAULT_TIME_CONSTANT_MS = 100; - // When device is partially tilted towards the sky or ground - private static final int TILTED_TIME_CONSTANT_MS = 500; - // When device is under external acceleration, i.e. not just gravity. We heavily distrust - // such readings. - private static final int ACCELERATING_TIME_CONSTANT_MS = 2000; - - private static final float DEFAULT_LOWPASS_ALPHA = - computeLowpassAlpha(DEFAULT_TIME_CONSTANT_MS); - private static final float TILTED_LOWPASS_ALPHA = - computeLowpassAlpha(TILTED_TIME_CONSTANT_MS); - private static final float ACCELERATING_LOWPASS_ALPHA = - computeLowpassAlpha(ACCELERATING_TIME_CONSTANT_MS); - - private boolean mAllow180Rotation = false; - - private WindowOrientationListener mOrientationListener; - private int mRotation = ROTATION_0; // Current orientation state - private float mTiltAngle = 0; // low-pass filtered - private float mOrientationAngle = 0; // low-pass filtered - - /* - * Each "distrust" counter represents our current level of distrust in the data based on - * a certain signal. For each data point that is deemed unreliable based on that signal, - * the counter increases; otherwise, the counter decreases. Exact rules vary. - */ - private int mAccelerationDistrust = 0; // based on magnitude != gravity - private int mTiltDistrust = 0; // based on tilt close to +/- 90 degrees + // The tilt angle range in degrees for each orientation. + // Beyond these tilt angles, we don't even consider transitioning into the + // specified orientation. We place more stringent requirements on unnatural + // orientations than natural ones to make it less likely to accidentally transition + // into those states. + // The first value of each pair is negative so it applies a limit when the device is + // facing down (overhead reading in bed). + // The second value of each pair is positive so it applies a limit when the device is + // facing up (resting on a table). + // The ideal tilt angle is 0 (when the device is vertical) so the limits establish + // how close to vertical the device must be in order to change orientation. + private static final int[][] TILT_TOLERANCE = new int[][] { + /* ROTATION_0 */ { -20, 75 }, + /* ROTATION_90 */ { -20, 70 }, + /* ROTATION_180 */ { -20, 65 }, + /* ROTATION_270 */ { -20, 70 } + }; - public SensorEventListenerImpl(WindowOrientationListener orientationListener) { - mOrientationListener = orientationListener; - } + // The gap angle in degrees between adjacent orientation angles for hysteresis. + // This creates a "dead zone" between the current orientation and a proposed + // adjacent orientation. No orientation proposal is made when the orientation + // angle is within the gap between the current orientation and the adjacent + // orientation. + private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 30; - private static float computeLowpassAlpha(int timeConstantMs) { - return (float) SAMPLING_PERIOD_MS / (timeConstantMs + SAMPLING_PERIOD_MS); - } + // The confidence scale factors for angle, tilt and magnitude. + // When the distance between the actual value and the ideal value is the + // specified delta, orientation transitions will take twice as long as they would + // in the ideal case. Increasing or decreasing the delta has an exponential effect + // on each factor's influence over the transition time. - void setAllow180Rotation(boolean allowed) { - mAllow180Rotation = allowed; - } + // Transition takes 2x longer when angle is 30 degrees from ideal orientation angle. + private static final float ORIENTATION_ANGLE_CONFIDENCE_SCALE = + confidenceScaleFromDelta(30); - int getCurrentRotation(int lastRotation) { - if (mTiltDistrust > 0) { - // we really don't know the current orientation, so trust what's currently displayed - mRotation = SURFACE_TO_INTERNAL_ROTATION[lastRotation]; - } - return INTERNAL_TO_SURFACE_ROTATION[mRotation]; - } + // Transition takes 2x longer when tilt is 45 degrees from vertical. + private static final float TILT_ANGLE_CONFIDENCE_SCALE = confidenceScaleFromDelta(45); - private void calculateNewRotation(float orientation, float tiltAngle) { - if (localLOGV) Log.i(TAG, orientation + ", " + tiltAngle + ", " + mRotation); - final boolean allow180Rotation = mAllow180Rotation; - int thresholdRanges[][] = allow180Rotation - ? THRESHOLDS_WITH_180[mRotation] : THRESHOLDS[mRotation]; - int row = -1; - for (int i = 0; i < thresholdRanges.length; i++) { - if (orientation >= thresholdRanges[i][0] && orientation < thresholdRanges[i][1]) { - row = i; - break; - } - } - if (row == -1) return; // no matching transition + // Transition takes 2x longer when acceleration is 0.25 Gs. + private static final float MAGNITUDE_CONFIDENCE_SCALE = confidenceScaleFromDelta( + SensorManager.STANDARD_GRAVITY * 0.25f); - int rotation = allow180Rotation - ? ROTATE_TO_WITH_180[mRotation][row] : ROTATE_TO[mRotation][row]; - if (tiltAngle > MAX_TRANSITION_TILT[rotation]) { - // tilted too far flat to go to this rotation - return; - } + // The number of milliseconds for which a new orientation must be stable before + // we perform an orientation change under ideal conditions. It will take + // proportionally longer than this to effect an orientation change when + // the proposed orientation confidence is low. + private static final float ORIENTATION_SETTLE_TIME_MS = 250; - if (localLOGV) Log.i(TAG, "orientation " + orientation + " gives new rotation = " - + rotation); - mRotation = rotation; - mOrientationListener.onOrientationChanged(INTERNAL_TO_SURFACE_ROTATION[mRotation]); - } + // The confidence that we have abount effecting each orientation change. + // When one of these values exceeds 1.0, we have determined our new orientation! + private float mConfidence[] = new float[4]; - private float lowpassFilter(float newValue, float oldValue, float alpha) { - return alpha * newValue + (1 - alpha) * oldValue; + public SensorEventListenerImpl(WindowOrientationListener orientationListener) { + mOrientationListener = orientationListener; } - private float vectorMagnitude(float x, float y, float z) { - return (float) Math.sqrt(x*x + y*y + z*z); + public int getCurrentRotation(int lastRotation) { + return mRotation != ROTATION_UNKNOWN ? mRotation : lastRotation; } - /** - * Angle between upVector and the x-y plane (the plane of the screen), in [-90, 90]. - * +/- 90 degrees = screen facing the sky or ground. - */ - private float tiltAngle(float z, float magnitude) { - return (float) Math.asin(z / magnitude) * RADIANS_TO_DEGREES; + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { } + @Override public void onSensorChanged(SensorEvent event) { - // the vector given in the SensorEvent points straight up (towards the sky) under ideal - // conditions (the phone is not accelerating). i'll call this upVector elsewhere. - float x = event.values[_DATA_X]; - float y = event.values[_DATA_Y]; - float z = event.values[_DATA_Z]; - float magnitude = vectorMagnitude(x, y, z); - float deviation = Math.abs(magnitude - SensorManager.STANDARD_GRAVITY); - - handleAccelerationDistrust(deviation); - if (magnitude < MIN_ABS_ACCELERATION) { - return; // Ignore tilt and orientation when (0, 0, 0) or low reading + final boolean log = mOrientationListener.mLogEnabled; + + // The vector given in the SensorEvent points straight up (towards the sky) under ideal + // conditions (the phone is not accelerating). I'll call this up vector elsewhere. + float x = event.values[ACCELEROMETER_DATA_X]; + float y = event.values[ACCELEROMETER_DATA_Y]; + float z = event.values[ACCELEROMETER_DATA_Z]; + + if (log) { + Slog.v(TAG, "Raw acceleration vector: " + + "x=" + x + ", y=" + y + ", z=" + z); } - // only filter tilt when we're accelerating - float alpha = 1; - if (mAccelerationDistrust > 0) { - alpha = ACCELERATING_LOWPASS_ALPHA; + // Apply a low-pass filter to the acceleration up vector in cartesian space. + // Reset the orientation listener state if the samples are too far apart in time + // or when we see values of (0, 0, 0) which indicates that we polled the + // accelerometer too soon after turning it on and we don't have any data yet. + final float timeDeltaMS = (event.timestamp - mLastTimestamp) * 0.000001f; + boolean skipSample; + if (timeDeltaMS <= 0 || timeDeltaMS > MAX_FILTER_DELTA_TIME_MS + || (x == 0 && y == 0 && z == 0)) { + if (log) { + Slog.v(TAG, "Resetting orientation listener."); + } + for (int i = 0; i < 4; i++) { + mConfidence[i] = 0; + } + skipSample = true; + } else { + final float alpha = timeDeltaMS + / (FILTER_TIME_CONSTANT_MS + timeDeltaMS) * FILTER_GAIN; + x = alpha * (x - mLastFilteredX) + mLastFilteredX; + y = alpha * (y - mLastFilteredY) + mLastFilteredY; + z = alpha * (z - mLastFilteredZ) + mLastFilteredZ; + if (log) { + Slog.v(TAG, "Filtered acceleration vector: " + + "x=" + x + ", y=" + y + ", z=" + z); + } + skipSample = false; } - float newTiltAngle = tiltAngle(z, magnitude); - mTiltAngle = lowpassFilter(newTiltAngle, mTiltAngle, alpha); + mLastTimestamp = event.timestamp; + mLastFilteredX = x; + mLastFilteredY = y; + mLastFilteredZ = z; + + boolean orientationChanged = false; + if (!skipSample) { + // Determine a proposed orientation based on the currently available data. + int proposedOrientation = ROTATION_UNKNOWN; + float combinedConfidence = 1.0f; + + // Calculate the magnitude of the acceleration vector. + final float magnitude = (float) Math.sqrt(x * x + y * y + z * z); + if (magnitude < MIN_ACCELERATION_MAGNITUDE + || magnitude > MAX_ACCELERATION_MAGNITUDE) { + if (log) { + Slog.v(TAG, "Ignoring sensor data, magnitude out of range: " + + "magnitude=" + magnitude); + } + } else { + // Calculate the tilt angle. + // This is the angle between the up vector and the x-y plane (the plane of + // the screen) in a range of [-90, 90] degrees. + // -90 degrees: screen horizontal and facing the ground (overhead) + // 0 degrees: screen vertical + // 90 degrees: screen horizontal and facing the sky (on table) + final int tiltAngle = (int) Math.round( + Math.asin(z / magnitude) * RADIANS_TO_DEGREES); + + // If the tilt angle is too close to horizontal then we cannot determine + // the orientation angle of the screen. + if (Math.abs(tiltAngle) > MAX_TILT) { + if (log) { + Slog.v(TAG, "Ignoring sensor data, tilt angle too high: " + + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle); + } + } else { + // Calculate the orientation angle. + // This is the angle between the x-y projection of the up vector onto + // the +y-axis, increasing clockwise in a range of [0, 360] degrees. + int orientationAngle = (int) Math.round( + -Math.atan2(-x, y) * RADIANS_TO_DEGREES); + if (orientationAngle < 0) { + // atan2 returns [-180, 180]; normalize to [0, 360] + orientationAngle += 360; + } + + // Find the nearest orientation. + // An orientation of 0 can have a nearest angle of 0 or 360 depending + // on which is closer to the measured orientation angle. We leave the + // nearest angle at 360 in that case since it makes the delta calculation + // for orientation angle confidence easier below. + int nearestOrientation = (orientationAngle + 45) / 90; + int nearestOrientationAngle = nearestOrientation * 90; + if (nearestOrientation == 4) { + nearestOrientation = 0; + } + + // Determine the proposed orientation. + // The confidence of the proposal is 1.0 when it is ideal and it + // decays exponentially as the proposal moves further from the ideal + // angle, tilt and magnitude of the proposed orientation. + if (isTiltAngleAcceptable(nearestOrientation, tiltAngle) + && isOrientationAngleAcceptable(nearestOrientation, + orientationAngle)) { + proposedOrientation = nearestOrientation; + + final float idealOrientationAngle = nearestOrientationAngle; + final float orientationConfidence = confidence(orientationAngle, + idealOrientationAngle, ORIENTATION_ANGLE_CONFIDENCE_SCALE); + + final float idealTiltAngle = 0; + final float tiltConfidence = confidence(tiltAngle, + idealTiltAngle, TILT_ANGLE_CONFIDENCE_SCALE); + + final float idealMagnitude = SensorManager.STANDARD_GRAVITY; + final float magnitudeConfidence = confidence(magnitude, + idealMagnitude, MAGNITUDE_CONFIDENCE_SCALE); + + combinedConfidence = orientationConfidence + * tiltConfidence * magnitudeConfidence; + + if (log) { + Slog.v(TAG, "Proposal: " + + "magnitude=" + magnitude + + ", tiltAngle=" + tiltAngle + + ", orientationAngle=" + orientationAngle + + ", proposedOrientation=" + proposedOrientation + + ", combinedConfidence=" + combinedConfidence + + ", orientationConfidence=" + orientationConfidence + + ", tiltConfidence=" + tiltConfidence + + ", magnitudeConfidence=" + magnitudeConfidence); + } + } else { + if (log) { + Slog.v(TAG, "Ignoring sensor data, no proposal: " + + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle + + ", orientationAngle=" + orientationAngle); + } + } + } + } - float absoluteTilt = Math.abs(mTiltAngle); - checkFullyTilted(absoluteTilt); - if (mTiltDistrust > 0) { - return; // when fully tilted, ignore orientation entirely + // Sum up the orientation confidence weights. + // Detect an orientation change when the sum reaches 1.0. + final float confidenceAmount = combinedConfidence * timeDeltaMS + / ORIENTATION_SETTLE_TIME_MS; + for (int i = 0; i < 4; i++) { + if (i == proposedOrientation) { + mConfidence[i] += confidenceAmount; + if (mConfidence[i] >= 1.0f) { + mConfidence[i] = 1.0f; + + if (i != mRotation) { + if (log) { + Slog.v(TAG, "Orientation changed! rotation=" + i); + } + mRotation = i; + orientationChanged = true; + } + } + } else { + mConfidence[i] -= confidenceAmount; + if (mConfidence[i] < 0.0f) { + mConfidence[i] = 0.0f; + } + } + } } - float newOrientationAngle = computeNewOrientation(x, y); - filterOrientation(absoluteTilt, newOrientationAngle); - calculateNewRotation(mOrientationAngle, absoluteTilt); + // Write final statistics about where we are in the orientation detection process. + if (log) { + Slog.v(TAG, "Result: rotation=" + mRotation + + ", confidence=[" + + mConfidence[0] + ", " + + mConfidence[1] + ", " + + mConfidence[2] + ", " + + mConfidence[3] + "], timeDeltaMS=" + timeDeltaMS); + } + + // Tell the listener. + if (orientationChanged) { + mOrientationListener.onOrientationChanged(mRotation); + } } /** - * When accelerating, increment distrust; otherwise, decrement distrust. The idea is that - * if a single jolt happens among otherwise good data, we should keep trusting the good - * data. On the other hand, if a series of many bad readings comes in (as if the phone is - * being rapidly shaken), we should wait until things "settle down", i.e. we get a string - * of good readings. - * - * @param deviation absolute difference between the current magnitude and gravity + * Returns true if the tilt angle is acceptable for a proposed + * orientation transition. */ - private void handleAccelerationDistrust(float deviation) { - if (deviation > MAX_DEVIATION_FROM_GRAVITY) { - if (mAccelerationDistrust < 5) { - mAccelerationDistrust++; - } - } else if (mAccelerationDistrust > 0) { - mAccelerationDistrust--; - } + private boolean isTiltAngleAcceptable(int proposedOrientation, + int tiltAngle) { + return tiltAngle >= TILT_TOLERANCE[proposedOrientation][0] + && tiltAngle <= TILT_TOLERANCE[proposedOrientation][1]; } /** - * Check if the phone is tilted towards the sky or ground and handle that appropriately. - * When fully tilted, we automatically push the tilt up to a fixed value; otherwise we - * decrement it. The idea is to distrust the first few readings after the phone gets - * un-tilted, no matter what, i.e. preventing an accidental transition when the phone is - * picked up from a table. - * - * We also reset the orientation angle to the center of the current screen orientation. - * Since there is no real orientation of the phone, we want to ignore the most recent sensor - * data and reset it to this value to avoid a premature transition when the phone starts to - * get un-tilted. - * - * @param absoluteTilt the absolute value of the current tilt angle + * Returns true if the orientation angle is acceptable for a proposed + * orientation transition. + * This function takes into account the gap between adjacent orientations + * for hysteresis. */ - private void checkFullyTilted(float absoluteTilt) { - if (absoluteTilt > MAX_TILT) { - if (mRotation == ROTATION_0) { - mOrientationAngle = 0; - } else if (mRotation == ROTATION_90) { - mOrientationAngle = 90; - } else { // ROTATION_270 - mOrientationAngle = 270; + private boolean isOrientationAngleAcceptable(int proposedOrientation, + int orientationAngle) { + final int currentOrientation = mRotation; + + // If there is no current rotation, then there is no gap. + if (currentOrientation != ROTATION_UNKNOWN) { + // If the proposed orientation is the same or is counter-clockwise adjacent, + // then we set a lower bound on the orientation angle. + // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_90, + // then we want to check orientationAngle > 45 + GAP / 2. + if (proposedOrientation == currentOrientation + || proposedOrientation == (currentOrientation + 1) % 4) { + int lowerBound = proposedOrientation * 90 - 45 + + ADJACENT_ORIENTATION_ANGLE_GAP / 2; + if (proposedOrientation == 0) { + if (orientationAngle >= 315 && orientationAngle < lowerBound + 360) { + return false; + } + } else { + if (orientationAngle < lowerBound) { + return false; + } + } } - if (mTiltDistrust < 3) { - mTiltDistrust = 3; + // If the proposed orientation is the same or is clockwise adjacent, + // then we set an upper bound on the orientation angle. + // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_270, + // then we want to check orientationAngle < 315 - GAP / 2. + if (proposedOrientation == currentOrientation + || proposedOrientation == (currentOrientation + 3) % 4) { + int upperBound = proposedOrientation * 90 + 45 + - ADJACENT_ORIENTATION_ANGLE_GAP / 2; + if (proposedOrientation == 0) { + if (orientationAngle <= 45 && orientationAngle > upperBound) { + return false; + } + } else { + if (orientationAngle > upperBound) { + return false; + } + } } - } else if (mTiltDistrust > 0) { - mTiltDistrust--; } + return true; } /** - * Angle between the x-y projection of upVector and the +y-axis, increasing - * clockwise. - * 0 degrees = speaker end towards the sky - * 90 degrees = right edge of device towards the sky + * Calculate an exponentially weighted confidence value in the range [0.0, 1.0]. + * The further the value is from the target, the more the confidence trends to 0. */ - private float computeNewOrientation(float x, float y) { - float orientationAngle = (float) -Math.atan2(-x, y) * RADIANS_TO_DEGREES; - // atan2 returns [-180, 180]; normalize to [0, 360] - if (orientationAngle < 0) { - orientationAngle += 360; - } - return orientationAngle; + private static float confidence(float value, float target, float scale) { + return (float) Math.exp(-Math.abs(value - target) * scale); } /** - * Compute a new filtered orientation angle. + * Calculate a scale factor for the confidence weight exponent. + * The scale value is chosen such that confidence(value, target, scale) == 0.5 + * whenever abs(value - target) == cutoffDelta. */ - private void filterOrientation(float absoluteTilt, float orientationAngle) { - float alpha = DEFAULT_LOWPASS_ALPHA; - if (mAccelerationDistrust > 1) { - // when under more than a transient acceleration, distrust heavily - alpha = ACCELERATING_LOWPASS_ALPHA; - } else if (absoluteTilt > PARTIAL_TILT || mAccelerationDistrust == 1) { - // when tilted partway, or under transient acceleration, distrust lightly - alpha = TILTED_LOWPASS_ALPHA; - } - - // since we're lowpass filtering a value with periodic boundary conditions, we need to - // adjust the new value to filter in the right direction... - float deltaOrientation = orientationAngle - mOrientationAngle; - if (deltaOrientation > 180) { - orientationAngle -= 360; - } else if (deltaOrientation < -180) { - orientationAngle += 360; - } - mOrientationAngle = lowpassFilter(orientationAngle, mOrientationAngle, alpha); - // ...and then adjust back to ensure we're in the range [0, 360] - if (mOrientationAngle > 360) { - mOrientationAngle -= 360; - } else if (mOrientationAngle < 0) { - mOrientationAngle += 360; - } - } - - public void onAccuracyChanged(Sensor sensor, int accuracy) { - + private static float confidenceScaleFromDelta(float cutoffDelta) { + return (float) -Math.log(0.5) / cutoffDelta; } } - - /* - * Returns true if sensor is enabled and false otherwise - */ - public boolean canDetectOrientation() { - return mSensor != null; - } - - /** - * Called when the rotation view of the device has changed. - * - * @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants. - * @see Surface - */ - abstract public void onOrientationChanged(int rotation); } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index d310237d6563..7edfd7b095e7 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -16,6 +16,15 @@ package android.view.inputmethod; +import com.android.internal.os.HandlerCaller; +import com.android.internal.view.IInputConnectionWrapper; +import com.android.internal.view.IInputContext; +import com.android.internal.view.IInputMethodCallback; +import com.android.internal.view.IInputMethodClient; +import com.android.internal.view.IInputMethodManager; +import com.android.internal.view.IInputMethodSession; +import com.android.internal.view.InputBindResult; + import android.content.Context; import android.graphics.Rect; import android.os.Bundle; @@ -27,23 +36,12 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.util.Log; -import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Printer; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewRoot; -import android.view.inputmethod.InputMethodSubtype; - -import com.android.internal.os.HandlerCaller; -import com.android.internal.view.IInputConnectionWrapper; -import com.android.internal.view.IInputContext; -import com.android.internal.view.IInputMethodCallback; -import com.android.internal.view.IInputMethodClient; -import com.android.internal.view.IInputMethodManager; -import com.android.internal.view.IInputMethodSession; -import com.android.internal.view.InputBindResult; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -96,7 +94,7 @@ import java.util.concurrent.TimeUnit; * be aware of are:</p> * * <ul> - * <li> Properly set the {@link android.R.attr#inputType} if your editable + * <li> Properly set the {@link android.R.attr#inputType} in your editable * text views, so that the input method will have enough context to help the * user in entering text into them. * <li> Deal well with losing screen space when the input method is @@ -389,6 +387,7 @@ public final class InputMethodManager { super(mainLooper, conn); } + @Override public boolean isActive() { return mActive; } @@ -804,7 +803,7 @@ public final class InputMethodManager { public static final int HIDE_NOT_ALWAYS = 0x0002; /** - * Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver) + * Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)} * without a result: request to hide the soft input window from the * context of the window that is currently accepting input. * diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java index a553a4592720..e440eb90eef0 100644 --- a/core/java/android/webkit/CacheManager.java +++ b/core/java/android/webkit/CacheManager.java @@ -33,8 +33,8 @@ import java.util.List; import java.util.Map; -import org.bouncycastle.crypto.Digest; -import org.bouncycastle.crypto.digests.SHA1Digest; +import com.android.org.bouncycastle.crypto.Digest; +import com.android.org.bouncycastle.crypto.digests.SHA1Digest; /** * The class CacheManager provides the persistent cache of content that is diff --git a/core/java/android/webkit/CertTool.java b/core/java/android/webkit/CertTool.java index 99757d24f00a..d25d970eea88 100644 --- a/core/java/android/webkit/CertTool.java +++ b/core/java/android/webkit/CertTool.java @@ -16,10 +16,10 @@ package android.webkit; -import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; -import org.bouncycastle.asn1.x509.AlgorithmIdentifier; -import org.bouncycastle.jce.netscape.NetscapeCertRequest; -import org.bouncycastle.util.encoders.Base64; +import com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; +import com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier; +import com.android.org.bouncycastle.jce.netscape.NetscapeCertRequest; +import com.android.org.bouncycastle.util.encoders.Base64; import android.content.ActivityNotFoundException; import android.content.Context; diff --git a/core/java/android/webkit/WebStorage.java b/core/java/android/webkit/WebStorage.java index 257ed2a4011e..8eb15245baad 100644 --- a/core/java/android/webkit/WebStorage.java +++ b/core/java/android/webkit/WebStorage.java @@ -75,6 +75,9 @@ public final class WebStorage { private Handler mHandler = null; private Handler mUIHandler = null; + /** + * Class containing the HTML5 database quota and usage for an origin. + */ public static class Origin { private String mOrigin = null; private long mQuota = 0; @@ -95,14 +98,30 @@ public final class WebStorage { mOrigin = origin; } + /** + * An origin string is created using WebCore::SecurityOrigin::toString(). + * Note that WebCore::SecurityOrigin uses 0 (which is not printed) for + * the port if the port is the default for the protocol. Eg + * http://www.google.com and http://www.google.com:80 both record a port + * of 0 and hence toString() == 'http://www.google.com' for both. + * @return The origin string. + */ public String getOrigin() { return mOrigin; } + /** + * Returns the quota for this origin's HTML5 database. + * @return The quota in bytes. + */ public long getQuota() { return mQuota; } + /** + * Returns the usage for this origin's HTML5 database. + * @return The usage in bytes. + */ public long getUsage() { return mUsage; } @@ -229,7 +248,8 @@ public final class WebStorage { */ /** - * Returns a list of origins having a database + * Returns a list of origins having a database. The Map is of type + * Map<String, Origin>. */ public void getOrigins(ValueCallback<Map> callback) { if (callback != null) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 3102ee9cb9d0..ca45e68af64b 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,6 +16,7 @@ package android.webkit; +import android.view.HardwareCanvas; import com.android.internal.R; import android.annotation.Widget; @@ -353,7 +354,7 @@ public class WebView extends AbsoluteLayout private ZoomManager mZoomManager; - private Rect mGLRectViewport; + private Rect mGLRectViewport = new Rect(); /** * Transportation object for returning WebView across thread boundaries. @@ -497,9 +498,6 @@ public class WebView extends AbsoluteLayout // default is not set, the UI will continue handle them. private boolean mDeferTouchProcess; - // if true, multi-touch events will be passed to webkit directly before UI - private boolean mDeferMultitouch = false; - // Currently, multi-touch events are sent to WebKit first then back to // WebView while single-touch events are handled in WebView first. // So there is a chance that a single-touch move event is handled in WebView @@ -4079,20 +4077,8 @@ public class WebView extends AbsoluteLayout } if (canvas.isHardwareAccelerated()) { - try { - if (canvas.acquireContext()) { - Rect rect = new Rect(mGLRectViewport.left, - mGLRectViewport.top, - mGLRectViewport.right, - mGLRectViewport.bottom - - getVisibleTitleHeight()); - if (nativeDrawGL(rect, getScale(), extras)) { - invalidate(); - } - } - } finally { - canvas.releaseContext(); - } + int functor = nativeGetDrawGLFunction(mGLRectViewport, getScale(), extras); + ((HardwareCanvas) canvas).callDrawGLFunction(functor); } else { DrawFilter df = null; if (mZoomManager.isZoomAnimating() || UIAnimationsRunning) { @@ -5173,18 +5159,16 @@ public class WebView extends AbsoluteLayout void setGLRectViewport() { // Use the getGlobalVisibleRect() to get the intersection among the parents - Rect webViewRect = new Rect(); - boolean visible = getGlobalVisibleRect(webViewRect); + getGlobalVisibleRect(mGLRectViewport); // Then need to invert the Y axis, just for GL View rootView = getRootView(); int rootViewHeight = rootView.getHeight(); - int savedWebViewBottom = webViewRect.bottom; - webViewRect.bottom = rootViewHeight - webViewRect.top; - webViewRect.top = rootViewHeight - savedWebViewBottom; + int savedWebViewBottom = mGLRectViewport.bottom; + mGLRectViewport.bottom = rootViewHeight - mGLRectViewport.top - getVisibleTitleHeight(); + mGLRectViewport.top = rootViewHeight - savedWebViewBottom; - // Store the viewport - mGLRectViewport = webViewRect; + nativeUpdateDrawGLFunction(mGLRectViewport); } /** @@ -8179,17 +8163,6 @@ public class WebView extends AbsoluteLayout } /** - * Toggle whether multi touch events should be sent to webkit - * no matter if UI wants to handle it first. - * - * @hide This is only used by the webkit layout test. - */ - public void setDeferMultiTouch(boolean value) { - mDeferMultitouch = value; - Log.v(LOGTAG, "set mDeferMultitouch to " + value); - } - - /** * Update our cache with updatedText. * @param updatedText The new text to put in our cache. */ @@ -8239,6 +8212,8 @@ public class WebView extends AbsoluteLayout boolean splitIfNeeded); private native void nativeDumpDisplayTree(String urlOrNull); private native boolean nativeEvaluateLayersAnimations(); + private native int nativeGetDrawGLFunction(Rect rect, float scale, int extras); + private native void nativeUpdateDrawGLFunction(Rect rect); private native boolean nativeDrawGL(Rect rect, float scale, int extras); private native void nativeExtendSelection(int x, int y); private native int nativeFindAll(String findLower, String findUpper, diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index bb4441fa2969..0992079b464e 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -130,6 +130,7 @@ final class WebViewCore { private int mLowMemoryUsageThresholdMb; private int mHighMemoryUsageThresholdMb; + private int mHighUsageDeltaMb; // The thread name used to identify the WebCore thread and for use in // debugging other classes that require operation within the WebCore thread. @@ -186,12 +187,15 @@ final class WebViewCore { // Allow us to use up to our memory class value before V8's GC kicks in. // These values have been determined by experimentation. - mLowMemoryUsageThresholdMb = manager.getMemoryClass(); + mLowMemoryUsageThresholdMb = manager.getLargeMemoryClass(); // If things get crazy, allow V8 to use up to 3 times our memory class, or a third of the - // device's total available memory, whichever is smaller. At that point V8 will start - // attempting more aggressive garbage collection. - mHighMemoryUsageThresholdMb = Math.min(mLowMemoryUsageThresholdMb * 3, - (int) (memInfo.availMem / 3) >> 20); + // device's total available memory, whichever is smaller. This value must be no less + // than the low memory threshold. + // At that point V8 will start attempting more aggressive garbage collection. + mHighMemoryUsageThresholdMb = Math.max(Math.min(mLowMemoryUsageThresholdMb * 3, + (int) (memInfo.availMem / 3) >> 20), mLowMemoryUsageThresholdMb); + // Avoid constant V8 GC when memory usage equals to working set estimate. + mHighUsageDeltaMb = 1; // Send a message to initialize the WebViewCore. Message init = sWebCoreHandler.obtainMessage( diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 665f9e73b6db..6d66bbc96c7b 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1098,7 +1098,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (childCount == 0) return true; if (childCount != mItemCount) return false; - return getChildAt(0).getTop() >= 0 && getChildAt(childCount - 1).getBottom() <= mBottom; + return getChildAt(0).getTop() >= mListPadding.top && + getChildAt(childCount - 1).getBottom() <= getHeight() - mListPadding.bottom; } /** @@ -2357,6 +2358,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } if (mScrollY != 0) { mScrollY = 0; + invalidateParentIfAccelerated(); finishGlows(); invalidate(); } @@ -2733,6 +2735,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (mScrollY != 0) { mScrollY = 0; + invalidateParentIfAccelerated(); finishGlows(); invalidate(); } @@ -2951,6 +2954,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te // Coming back to 'real' list scrolling incrementalDeltaY = -newScroll; mScrollY = 0; + invalidateParentIfAccelerated(); // No need to do all this work if we're not going to move anyway if (incrementalDeltaY != 0) { @@ -3244,6 +3248,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { mScrollY = scrollY; + invalidateParentIfAccelerated(); if (clampedY) { // Velocity is broken by hitting the limit; don't start a fling off of this. diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 7ef61a8641c2..899e8726ca3e 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -440,11 +440,18 @@ public class CalendarView extends FrameLayout { return; } mMinDate.setTimeInMillis(minDate); + // make sure the current date is not earlier than + // the new min date since the latter is used for + // calculating the indices in the adapter thus + // avoiding out of bounds error + Calendar date = mAdapter.mSelectedDate; + if (date.before(mMinDate)) { + mAdapter.setSelectedDay(mMinDate); + } // reinitialize the adapter since its range depends on min date mAdapter.init(); - Calendar date = mAdapter.mSelectedDate; if (date.before(mMinDate)) { - setDate(mMinDate.getTimeInMillis()); + setDate(mTempDate.getTimeInMillis()); } else { // we go to the current date to force the ListView to query its // adapter for the shown views since we have changed the adapter @@ -753,7 +760,13 @@ public class CalendarView extends FrameLayout { mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1); setMonthDisplayed(mFirstDayOfMonth); - position = getWeeksSinceMinDate(mFirstDayOfMonth); + + // the earliest time we can scroll to is the min date + if (mFirstDayOfMonth.before(mMinDate)) { + position = 0; + } else { + position = getWeeksSinceMinDate(mFirstDayOfMonth); + } mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING; if (animate) { diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index f1786e28c501..ea868a634c0f 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -34,6 +34,7 @@ import android.widget.NumberPicker.OnValueChangeListener; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; @@ -156,8 +157,34 @@ public class DatePicker extends FrameLayout { OnValueChangeListener onChangeListener = new OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - updateDate(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner - .getValue()); + mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); + // take care of wrapping of days and months to update greater fields + if (picker == mDaySpinner) { + int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); + if (oldVal == maxDayOfMonth && newVal == 1) { + mTempDate.add(Calendar.DAY_OF_MONTH, 1); + } else if (oldVal == 1 && newVal == maxDayOfMonth) { + mTempDate.add(Calendar.DAY_OF_MONTH, -1); + } else { + mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); + } + } else if (picker == mMonthSpinner) { + if (oldVal == 11 && newVal == 0) { + mTempDate.add(Calendar.MONTH, 1); + } else if (oldVal == 0 && newVal == 11) { + mTempDate.add(Calendar.MONTH, -1); + } else { + mTempDate.add(Calendar.MONTH, newVal - oldVal); + } + } else if (picker == mYearSpinner) { + mTempDate.set(Calendar.YEAR, newVal); + } else { + throw new IllegalArgumentException(); + } + // now set the date to the adjusted one + setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), + mTempDate.get(Calendar.DAY_OF_MONTH)); + notifyDateChanged(); } }; @@ -167,7 +194,8 @@ public class DatePicker extends FrameLayout { mCalendarView = (CalendarView) findViewById(R.id.calendar_view); mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { - updateDate(year, month, monthDay); + setDate(year, month, monthDay); + notifyDateChanged(); } }); @@ -260,10 +288,12 @@ public class DatePicker extends FrameLayout { return; } mMinDate.setTimeInMillis(minDate); - mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); - mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); mCalendarView.setMinDate(minDate); - updateSpinners(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner.getValue()); + if (mCurrentDate.before(mMinDate)) { + mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); } /** @@ -294,10 +324,12 @@ public class DatePicker extends FrameLayout { return; } mMaxDate.setTimeInMillis(maxDate); - mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); - mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); mCalendarView.setMaxDate(maxDate); - updateSpinners(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner.getValue()); + if (mCurrentDate.after(mMaxDate)) { + mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); } @Override @@ -433,13 +465,11 @@ public class DatePicker extends FrameLayout { * @param dayOfMonth The day of the month. */ public void updateDate(int year, int month, int dayOfMonth) { - if (mCurrentDate.get(Calendar.YEAR) != year - || mCurrentDate.get(Calendar.MONTH) != dayOfMonth - || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month) { - updateSpinners(year, month, dayOfMonth); - updateCalendarView(); - notifyDateChanged(); + if (!isNewDate(year, month, dayOfMonth)) { + return; } + setDate(year, month, dayOfMonth); + notifyDateChanged(); } // Override so we are in complete control of save / restore for this widget. @@ -451,15 +481,14 @@ public class DatePicker extends FrameLayout { @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); - return new SavedState(superState, mYearSpinner.getValue(), mMonthSpinner.getValue(), - mDaySpinner.getValue()); + return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); } @Override protected void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); - updateSpinners(ss.mYear, ss.mMonth, ss.mDay); + setDate(ss.mYear, ss.mMonth, ss.mDay); } /** @@ -474,10 +503,7 @@ public class DatePicker extends FrameLayout { */ public void init(int year, int monthOfYear, int dayOfMonth, OnDateChangedListener onDateChangedListener) { - // make sure there is no callback - mOnDateChangedListener = null; - updateDate(year, monthOfYear, dayOfMonth); - // register the callback after updating the date + setDate(year, monthOfYear, dayOfMonth); mOnDateChangedListener = onDateChangedListener; } @@ -514,104 +540,94 @@ public class DatePicker extends FrameLayout { } } - /** - * Updates the spinners with the given <code>year</code>, <code>month</code> - * , and <code>dayOfMonth</code>. If the provided values designate an - * inconsistent date the values are normalized before updating the spinners. - */ - private void updateSpinners(int year, int month, int dayOfMonth) { - // compute the deltas before modifying the current date - int deltaMonths = getDelataMonth(month); - int deltaDays = getDelataDayOfMonth(dayOfMonth); - mCurrentDate.set(Calendar.YEAR, year); - mCurrentDate.add(Calendar.MONTH, deltaMonths); - mCurrentDate.add(Calendar.DAY_OF_MONTH, deltaDays); + private boolean isNewDate(int year, int month, int dayOfMonth) { + return (mCurrentDate.get(Calendar.YEAR) != year + || mCurrentDate.get(Calendar.MONTH) != dayOfMonth + || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month); + } + private void setDate(int year, int month, int dayOfMonth) { + mCurrentDate.set(year, month, dayOfMonth); if (mCurrentDate.before(mMinDate)) { mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); } else if (mCurrentDate.after(mMaxDate)) { mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); } - - mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); - mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); - mDaySpinner.setMinValue(1); - mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); - mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + updateSpinners(); + updateCalendarView(); } - /** - * @return The delta days of moth from the current date and the given - * <code>dayOfMonth</code>. - */ - private int getDelataDayOfMonth(int dayOfMonth) { - int prevDayOfMonth = mCurrentDate.get(Calendar.DAY_OF_MONTH); - if (prevDayOfMonth == dayOfMonth) { - return 0; - } - int maxDayOfMonth = mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH); - if (dayOfMonth == 1 && prevDayOfMonth == maxDayOfMonth) { - return 1; - } - if (dayOfMonth == maxDayOfMonth && prevDayOfMonth == 1) { - return -1; + private void updateSpinners() { + // set the spinner ranges respecting the min and max dates + if (mCurrentDate.equals(mMinDate)) { + mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(false); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); + mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); + mMonthSpinner.setWrapSelectorWheel(false); + } else if (mCurrentDate.equals(mMaxDate)) { + mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(false); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); + mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); + mMonthSpinner.setWrapSelectorWheel(false); + } else { + mDaySpinner.setMinValue(1); + mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(true); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(0); + mMonthSpinner.setMaxValue(11); + mMonthSpinner.setWrapSelectorWheel(true); } - return dayOfMonth - prevDayOfMonth; - } - /** - * @return The delta months from the current date and the given - * <code>month</code>. - */ - private int getDelataMonth(int month) { - int prevMonth = mCurrentDate.get(Calendar.MONTH); - if (prevMonth == month) { - return 0; - } - if (month == 0 && prevMonth == 11) { - return 1; - } - if (month == 11 && prevMonth == 0) { - return -1; - } - return month - prevMonth; + // make sure the month names are a zero based array + // with the months in the month spinner + String[] displayedValues = Arrays.copyOfRange(getShortMonths(), + mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); + mMonthSpinner.setDisplayedValues(displayedValues); + + // year spinner range does not change based on the current date + mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); + mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); + mYearSpinner.setWrapSelectorWheel(false); + + // set the spinner values + mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); + mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); + mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); } /** - * Updates the calendar view with the given year, month, and day selected by - * the number spinners. + * Updates the calendar view with the current date. */ private void updateCalendarView() { - mTempDate.setTimeInMillis(mCalendarView.getDate()); - if (mTempDate.get(Calendar.YEAR) != mYearSpinner.getValue() - || mTempDate.get(Calendar.MONTH) != mMonthSpinner.getValue() - || mTempDate.get(Calendar.DAY_OF_MONTH) != mDaySpinner.getValue()) { - mTempDate.clear(); - mTempDate.set(mYearSpinner.getValue(), mMonthSpinner.getValue(), - mDaySpinner.getValue()); - mCalendarView.setDate(mTempDate.getTimeInMillis(), false, false); - } + mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); } /** * @return The selected year. */ public int getYear() { - return mYearSpinner.getValue(); + return mCurrentDate.get(Calendar.YEAR); } /** * @return The selected month. */ public int getMonth() { - return mMonthSpinner.getValue(); + return mCurrentDate.get(Calendar.MONTH); } /** * @return The selected day of month. */ public int getDayOfMonth() { - return mDaySpinner.getValue(); + return mCurrentDate.get(Calendar.DAY_OF_MONTH); } /** @@ -619,8 +635,7 @@ public class DatePicker extends FrameLayout { */ private void notifyDateChanged() { if (mOnDateChangedListener != null) { - mOnDateChangedListener.onDateChanged(DatePicker.this, mYearSpinner.getValue(), - mMonthSpinner.getValue(), mDaySpinner.getValue()); + mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth()); } } diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index db22a0cb1e31..ff6677f5bcb5 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -647,6 +647,7 @@ public class HorizontalScrollView extends FrameLayout { if (!mScroller.isFinished()) { mScrollX = scrollX; mScrollY = scrollY; + invalidateParentIfAccelerated(); if (clampedX) { mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0); } diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 796af550981a..a107c600b62f 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -2706,7 +2706,7 @@ public class ListView extends AbsListView { int startPos = (mSelectedPosition != INVALID_POSITION) ? mSelectedPosition - 1 : firstPosition + getChildCount() - 1; - if (startPos < 0) { + if (startPos < 0 || startPos >= mAdapter.getCount()) { return INVALID_POSITION; } if (startPos > last) { diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 08db2071da44..c5161bcb6c1f 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -917,6 +917,8 @@ public class NumberPicker extends LinearLayout { // force the selector indices array to be reinitialized mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] = Integer.MAX_VALUE; mWrapSelectorWheel = wrapSelector; + // force redraw since we might look different + updateIncrementAndDecrementButtonsVisibilityState(); } } @@ -972,7 +974,6 @@ public class NumberPicker extends LinearLayout { setWrapSelectorWheel(wrapSelectorWheel); resetSelectorWheelIndices(); updateInputTextView(); - updateIncrementAndDecrementButtonsVisibilityState(); } /** @@ -1004,7 +1005,6 @@ public class NumberPicker extends LinearLayout { setWrapSelectorWheel(wrapSelectorWheel); resetSelectorWheelIndices(); updateInputTextView(); - updateIncrementAndDecrementButtonsVisibilityState(); } /** diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index ce6da72a2c98..fc049cc14d29 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -644,6 +644,7 @@ public class ScrollView extends FrameLayout { if (!mScroller.isFinished()) { mScrollX = scrollX; mScrollY = scrollY; + invalidateParentIfAccelerated(); if (clampedY) { mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange()); } diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index b86366c1ca92..a37f12ebed2b 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -214,6 +214,8 @@ public class SearchView extends LinearLayout { } }); + boolean focusable = true; + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchView, 0, 0); setIconifiedByDefault(a.getBoolean(R.styleable.SearchView_iconifiedByDefault, true)); int maxWidth = a.getDimensionPixelSize(R.styleable.SearchView_maxWidth, -1); @@ -226,6 +228,11 @@ public class SearchView extends LinearLayout { } a.recycle(); + a = context.obtainStyledAttributes(attrs, R.styleable.View, 0, 0); + focusable = a.getBoolean(R.styleable.View_focusable, focusable); + a.recycle(); + setFocusable(focusable); + // Save voice intent for later queries/launching mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -259,10 +266,18 @@ public class SearchView extends LinearLayout { /** @hide */ @Override public boolean requestFocus(int direction, Rect previouslyFocusedRect) { - if (mClearingFocus || isIconified()) return false; - boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect); - if (result) updateViewsVisibility(mIconifiedByDefault); - return result; + // Don't accept focus if in the middle of clearing focus + if (mClearingFocus) return false; + // Check if SearchView is focusable. + if (!isFocusable()) return false; + // If it is not iconified, then give the focus to the text field + if (!isIconified()) { + boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect); + if (result) updateViewsVisibility(false); + return result; + } else { + return super.requestFocus(direction, previouslyFocusedRect); + } } /** @hide */ @@ -527,7 +542,6 @@ public class SearchView extends LinearLayout { updateCloseButton(); updateVoiceButton(!hasText); updateSubmitArea(); - requestLayout(); } private boolean hasVoiceSearch() { @@ -580,7 +594,7 @@ public class SearchView extends LinearLayout { private void setImeVisibility(boolean visible) { InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); // We made sure the IME was displayed, so also make sure it is closed // when we go away. @@ -903,8 +917,8 @@ public class SearchView extends LinearLayout { } private void onSearchClicked() { - mQueryTextView.requestFocus(); updateViewsVisibility(false); + mQueryTextView.requestFocus(); setImeVisibility(true); if (mOnSearchClickListener != null) { mOnSearchClickListener.onClick(this); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index aac57edf7dff..ae6ecfbae90f 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -372,7 +372,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mTextPaint.density = getResources().getDisplayMetrics().density; mTextPaint.setCompatibilityScaling( getResources().getCompatibilityInfo().applicationScale); - + // If we get the paint from the skin, we should set it to left, since // the layout always wants it to be left. // mTextPaint.setTextAlign(Paint.Align.LEFT); @@ -4334,7 +4334,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener selStart = getSelectionStart(); selEnd = getSelectionEnd(); - if ((mCursorVisible || mTextIsSelectable) && selStart >= 0 && isEnabled()) { + if ((isCursorVisible() || mTextIsSelectable) && selStart >= 0 && isEnabled()) { if (mHighlightPath == null) mHighlightPath = new Path(); @@ -6272,6 +6272,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mScroller.computeScrollOffset()) { mScrollX = mScroller.getCurrX(); mScrollY = mScroller.getCurrY(); + invalidateParentIfAccelerated(); postInvalidate(); // So we draw again } } @@ -6490,6 +6491,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener prepareCursorControllers(); } + private boolean isCursorVisible() { + return mCursorVisible && isTextEditable(); + } + private boolean canMarquee() { int width = (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight()); return width > 0 && mLayout.getLineWidth(0) > width; @@ -6978,7 +6983,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } private void makeBlink() { - if (!mCursorVisible || !isTextEditable()) { + if (!isCursorVisible()) { if (mBlink != null) { mBlink.removeCallbacks(mBlink); } @@ -7125,11 +7130,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener super.onFocusChanged(focused, direction, previouslyFocusedRect); - // After super.onFocusChanged so that this TextView is registered and can ask for the IME - // Showing the IME while focus is moved using the D-Pad is a bad idea, however this does - // not happen in that case (using the arrows on a bluetooth keyboard). - if (focused) { - onTouchFinished(null); + // Performed after super.onFocusChanged so that this TextView is registered and can ask for + // the IME. Showing the IME while focus is moved using the D-Pad is a bad idea, however this + // does not happen in that case (using the arrows on a bluetooth keyboard). + if (focused && isTextEditable()) { + final InputMethodManager imm = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + + imm.showSoftInput(this, 0, null); } } @@ -7321,7 +7329,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener csr = new CommitSelectionReceiver(oldSelStart, oldSelEnd); } - handled = onTouchFinished(csr); + // Show the IME, except when selecting in read-only text. + if (!mTextIsSelectable) { + final InputMethodManager imm = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + + handled |= imm.showSoftInput(this, 0, csr) && (csr != null); + } + + stopSelectionActionMode(); + boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; + if (hasInsertionController() && !selectAllGotFocus) { + getInsertionController().show(); + } } } @@ -7333,35 +7353,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return superResult; } - /** Shows the IME if applicable, ends selection mode and displays the selection controller. - * - * This method is called at the end of a touch event, when the finger is lifted up. - * It is also called when the TextField gains focus indirectly through a dispatched event from - * one of its parents. We want to have the same behavior in that case. - * - * @param csr A (possibly null) callback called if the IME has been displayed - * @return true if the event was properly sent to the csr - */ - private boolean onTouchFinished(CommitSelectionReceiver csr) { - boolean handled = false; - - // Show the IME, except when selecting in read-only text. - if (!mTextIsSelectable) { - final InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - - handled = imm.showSoftInput(this, 0, csr) && (csr != null); - } - - stopSelectionActionMode(); - boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; - if (hasInsertionController() && !selectAllGotFocus) { - getInsertionController().show(); - } - - return handled; - } - private void prepareCursorControllers() { boolean windowSupportsHandles = false; @@ -7372,8 +7363,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener || windowParams.type > WindowManager.LayoutParams.LAST_SUB_WINDOW; } - mInsertionControllerEnabled = windowSupportsHandles && isTextEditable() && mCursorVisible && - mLayout != null; + mInsertionControllerEnabled = windowSupportsHandles && isCursorVisible() && mLayout != null; mSelectionControllerEnabled = windowSupportsHandles && textCanBeSelected() && mLayout != null; diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java index 45f8599bbee1..e7c394870920 100644 --- a/core/java/com/android/internal/backup/LocalTransport.java +++ b/core/java/com/android/internal/backup/LocalTransport.java @@ -29,7 +29,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Log; -import org.bouncycastle.util.encoders.Base64; +import com.android.org.bouncycastle.util.encoders.Base64; import java.io.File; import java.io.FileFilter; diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index 30d68784e0a0..ff15e44f7e50 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -53,7 +53,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo private Drawable mDivider; - private Runnable mShowOverflow = new Runnable() { + private final Runnable mShowOverflow = new Runnable() { public void run() { showOverflowMenu(); } @@ -128,6 +128,10 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo if (mOverflowPopup != null && mOverflowPopup.isShowing()) { mOverflowPopup.dismiss(); } + removeCallbacks(mShowOverflow); + if (mPostedOpenRunnable != null) { + removeCallbacks(mPostedOpenRunnable); + } } private int getMaxActionButtons() { diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index ff59950017c9..14d0ac5838f7 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -215,6 +215,11 @@ public class MenuBuilder implements Menu { private ViewGroup mMeasureActionButtonParent; + private final WeakReference<MenuAdapter>[] mAdapterCache = + new WeakReference[NUM_TYPES]; + private final WeakReference<OverflowMenuAdapter>[] mOverflowAdapterCache = + new WeakReference[NUM_TYPES]; + // Group IDs that have been added as actions - used temporarily, allocated here for reuse. private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); @@ -1004,6 +1009,12 @@ public class MenuBuilder implements Menu { MenuView menuView = menuTypes[i].mMenuView.get(); menuView.updateChildren(cleared); } + + MenuAdapter adapter = mAdapterCache[i] == null ? null : mAdapterCache[i].get(); + if (adapter != null) adapter.notifyDataSetChanged(); + + adapter = mOverflowAdapterCache[i] == null ? null : mOverflowAdapterCache[i].get(); + if (adapter != null) adapter.notifyDataSetChanged(); } } } @@ -1358,7 +1369,13 @@ public class MenuBuilder implements Menu { * @return A {@link MenuAdapter} for this menu with the given menu type. */ public MenuAdapter getMenuAdapter(int menuType) { - return new MenuAdapter(menuType); + MenuAdapter adapter = mAdapterCache[menuType] == null ? + null : mAdapterCache[menuType].get(); + if (adapter != null) return adapter; + + adapter = new MenuAdapter(menuType); + mAdapterCache[menuType] = new WeakReference<MenuAdapter>(adapter); + return adapter; } /** @@ -1368,7 +1385,13 @@ public class MenuBuilder implements Menu { * @return A {@link MenuAdapter} for this menu with the given menu type. */ public MenuAdapter getOverflowMenuAdapter(int menuType) { - return new OverflowMenuAdapter(menuType); + OverflowMenuAdapter adapter = mOverflowAdapterCache[menuType] == null ? + null : mOverflowAdapterCache[menuType].get(); + if (adapter != null) return adapter; + + adapter = new OverflowMenuAdapter(menuType); + mOverflowAdapterCache[menuType] = new WeakReference<OverflowMenuAdapter>(adapter); + return adapter; } void setOptionalIconsVisible(boolean visible) { @@ -1469,21 +1492,18 @@ public class MenuBuilder implements Menu { * source for overflow menu items that do not fit in the list of action items. */ private class OverflowMenuAdapter extends MenuAdapter { - private ArrayList<MenuItemImpl> mOverflowItems; - public OverflowMenuAdapter(int menuType) { super(menuType); - mOverflowItems = getNonActionItems(true); } @Override public MenuItemImpl getItem(int position) { - return mOverflowItems.get(position); + return getNonActionItems(true).get(position); } @Override public int getCount() { - return mOverflowItems.size(); + return getNonActionItems(true).size(); } } } diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index 6fbae9446f30..305115f9bc21 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -690,6 +690,7 @@ public final class MenuItemImpl implements MenuItem { public MenuItem setActionView(View view) { mActionView = view; + mMenu.onItemActionRequestChanged(this); return this; } diff --git a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java index a1a28acd554a..65973b6869c0 100644 --- a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java +++ b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java @@ -128,7 +128,8 @@ public class PasswordEntryKeyboardHelper implements OnKeyboardActionListener { final boolean visiblePassword = Settings.System.getInt( mContext.getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 1) != 0; - mKeyboardView.setPreviewEnabled(visiblePassword); + final boolean enablePreview = false; // TODO: grab from configuration + mKeyboardView.setPreviewEnabled(visiblePassword && enablePreview); break; case KEYBOARD_MODE_NUMERIC: mKeyboardView.setKeyboard(mNumericKeyboard); diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 8d074afb5dae..9de270dc4611 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -16,6 +16,8 @@ #define LOG_TAG "OpenGLRenderer" +#include <EGL/egl.h> + #include "jni.h" #include "GraphicsJNI.h" #include <nativehelper/JNIHelp.h> @@ -75,6 +77,23 @@ static struct { } gRectClassInfo; // ---------------------------------------------------------------------------- +// Misc +// ---------------------------------------------------------------------------- + +static jboolean android_view_GLES20Canvas_preserveBackBuffer(JNIEnv* env, jobject clazz) { + EGLDisplay display = eglGetCurrentDisplay(); + EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); + + eglGetError(); + eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); + + EGLint error = eglGetError(); + RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error); + + return error == EGL_SUCCESS; +} + +// ---------------------------------------------------------------------------- // Constructors // ---------------------------------------------------------------------------- @@ -97,27 +116,38 @@ static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz // Setup // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jint width, jint height) { renderer->setViewport(width, height); } -static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jboolean opaque) { renderer->prepare(opaque); } -static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom, + jboolean opaque) { + renderer->prepareDirty(left, top, right, bottom, opaque); +} + +static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->finish(); } -static void android_view_GLES20Canvas_acquireContext(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_acquireContext(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->acquireContext(); } -static void android_view_GLES20Canvas_releaseContext(JNIEnv* env, jobject canvas, +static bool android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer, Functor *functor) { + return renderer->callDrawGLFunction(functor); +} + +static void android_view_GLES20Canvas_releaseContext(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->releaseContext(); } @@ -126,22 +156,22 @@ static void android_view_GLES20Canvas_releaseContext(JNIEnv* env, jobject canvas // State // ---------------------------------------------------------------------------- -static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, +static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jint flags) { return renderer->save(flags); } -static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject canvas, +static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { return renderer->getSaveCount(); } -static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->restore(); } -static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jint saveCount) { renderer->restoreToCount(saveCount); } @@ -150,13 +180,13 @@ static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas // Layers // ---------------------------------------------------------------------------- -static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject canvas, +static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, SkPaint* paint, jint saveFlags) { return renderer->saveLayer(left, top, right, bottom, paint, saveFlags); } -static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas, +static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, jint alpha, jint saveFlags) { return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags); @@ -166,25 +196,25 @@ static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas // Clipping // ---------------------------------------------------------------------------- -static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject canvas, +static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, SkCanvas::EdgeType edge) { return renderer->quickReject(left, top, right, bottom); } -static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject canvas, +static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, SkRegion::Op op) { return renderer->clipRect(left, top, right, bottom, op); } -static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject canvas, +static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom, SkRegion::Op op) { return renderer->clipRect(float(left), float(top), float(right), float(bottom), op); } -static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas, +static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jobject rect) { const android::uirenderer::Rect& bounds(renderer->getClipBounds()); @@ -198,42 +228,42 @@ static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas, // Transforms // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat dx, jfloat dy) { renderer->translate(dx, dy); } -static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat degrees) { renderer->rotate(degrees); } -static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat sx, jfloat sy) { renderer->scale(sx, sy); } -static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat sx, jfloat sy) { renderer->skew(sx, sy); } -static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkMatrix* matrix) { renderer->setMatrix(matrix); } static const float* android_view_GLES20Canvas_getNativeMatrix(JNIEnv* env, - jobject canvas, OpenGLRenderer* renderer) { + jobject clazz, OpenGLRenderer* renderer) { return renderer->getMatrix(); } -static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkMatrix* matrix) { renderer->getMatrix(matrix); } -static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkMatrix* matrix) { renderer->concatMatrix(matrix); } @@ -242,7 +272,7 @@ static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas, // Drawing // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, float left, float top, SkPaint* paint) { // This object allows the renderer to allocate a global JNI ref to the buffer object. @@ -251,7 +281,7 @@ static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas, renderer->drawBitmap(bitmap, left, top, paint); } -static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, SkPaint* paint) { @@ -262,7 +292,7 @@ static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas dstLeft, dstTop, dstRight, dstBottom, paint); } -static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, SkMatrix* matrix, SkPaint* paint) { // This object allows the renderer to allocate a global JNI ref to the buffer object. @@ -271,7 +301,7 @@ static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canv renderer->drawBitmap(bitmap, matrix, paint); } -static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors, jint colorOffset, SkPaint* paint) { @@ -287,7 +317,7 @@ static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject canvas if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0); } -static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, jbyteArray chunks, float left, float top, float right, float bottom, SkPaint* paint) { // This object allows the renderer to allocate a global JNI ref to the buffer object. @@ -304,41 +334,41 @@ static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas, env->ReleaseByteArrayElements(chunks, storage, 0); } -static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) { renderer->drawColor(color, mode); } -static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, SkPaint* paint) { renderer->drawRect(left, top, right, bottom, paint); } -static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, jfloat rx, jfloat ry, SkPaint* paint) { renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint); } -static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat x, jfloat y, jfloat radius, SkPaint* paint) { renderer->drawCircle(x, y, radius, paint); } -static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, SkPaint* paint) { renderer->drawOval(left, top, right, bottom, paint); } -static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle, jboolean useCenter, SkPaint* paint) { renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint); } -static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkRegion* region, SkPaint* paint) { SkRegion::Iterator it(*region); while (!it.done()) { @@ -348,12 +378,12 @@ static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject canvas, } } -static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) { renderer->drawPath(path, paint); } -static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) { jfloat* storage = env->GetFloatArrayElements(points, NULL); @@ -366,24 +396,24 @@ static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject canvas, // Shaders and color filters // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->resetShader(); renderer->resetColorFilter(); renderer->resetShadow(); } -static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkiaShader* shader) { renderer->setupShader(shader); } -static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, SkiaColorFilter* filter) { renderer->setupColorFilter(filter); } -static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jfloat radius, jfloat dx, jfloat dy, jint color) { renderer->setupShadow(radius, dx, dy, color); } @@ -420,7 +450,7 @@ static void renderTextRun(OpenGLRenderer* renderer, const jchar* text, } } -static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, jfloat x, jfloat y, jint flags, SkPaint* paint) { jchar* textArray = env->GetCharArrayElements(text, NULL); @@ -428,7 +458,7 @@ static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas, env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); } -static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jstring text, jint start, jint end, jfloat x, jfloat y, jint flags, SkPaint* paint) { const jchar* textArray = env->GetStringChars(text, NULL); @@ -436,7 +466,7 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas, env->ReleaseStringChars(text, textArray); } -static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, SkPaint* paint) { @@ -446,7 +476,7 @@ static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject canv env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); } -static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jstring text, jint start, jint end, jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags, SkPaint* paint) { @@ -463,7 +493,7 @@ static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject canvas, // ---------------------------------------------------------------------------- static DisplayList* android_view_GLES20Canvas_getDisplayList(JNIEnv* env, - jobject canvas, DisplayListRenderer* renderer) { + jobject clazz, DisplayListRenderer* renderer) { return renderer->getDisplayList(); } @@ -482,21 +512,21 @@ static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, delete displayList; } -static void android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, - jobject canvas, OpenGLRenderer* renderer, DisplayList* displayList) { - renderer->drawDisplayList(displayList); +static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, + jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList) { + return renderer->drawDisplayList(displayList); } // ---------------------------------------------------------------------------- // Layers // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->interrupt(); } -static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer) { renderer->resume(); } @@ -542,7 +572,7 @@ static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env, LayerRenderer::destroyLayerDeferred(layer); } -static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject canvas, +static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, Layer* layer, jfloat x, jfloat y, SkPaint* paint) { renderer->drawLayer(layer, x, y, paint); } @@ -571,14 +601,20 @@ static JNINativeMethod gMethods[] = { { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, #ifdef USE_OPENGL_RENDERER + { "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer }, + { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer }, { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer }, { "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport }, { "nPrepare", "(IZ)V", (void*) android_view_GLES20Canvas_prepare }, + { "nPrepareDirty", "(IIIIIZ)V", (void*) android_view_GLES20Canvas_prepareDirty }, { "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish }, { "nAcquireContext", "(I)V", (void*) android_view_GLES20Canvas_acquireContext }, { "nReleaseContext", "(I)V", (void*) android_view_GLES20Canvas_releaseContext }, + { "nCallDrawGLFunction", "(II)Z", + (void*) android_view_GLES20Canvas_callDrawGLFunction }, + { "nSave", "(II)I", (void*) android_view_GLES20Canvas_save }, { "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore }, { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Canvas_restoreToCount }, @@ -639,7 +675,7 @@ static JNINativeMethod gMethods[] = { { "nGetDisplayList", "(I)I", (void*) android_view_GLES20Canvas_getDisplayList }, { "nDestroyDisplayList", "(I)V", (void*) android_view_GLES20Canvas_destroyDisplayList }, { "nGetDisplayListRenderer", "(I)I", (void*) android_view_GLES20Canvas_getDisplayListRenderer }, - { "nDrawDisplayList", "(II)V", (void*) android_view_GLES20Canvas_drawDisplayList }, + { "nDrawDisplayList", "(II)Z", (void*) android_view_GLES20Canvas_drawDisplayList }, { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt }, { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume }, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 25d3aca3b6c4..bd0cd3500429 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1348,7 +1348,8 @@ <activity android:name="android.accounts.GrantCredentialsPermissionActivity" android:excludeFromRecents="true" - android:exported="true"> + android:exported="true" + android:theme="@android:style/Theme.Holo.DialogWhenLarge"> </activity> <activity android:name="android.content.SyncActivityTooManyDeletes" diff --git a/core/res/res/drawable-hdpi/btn_check_off.png b/core/res/res/drawable-hdpi/btn_check_off.png Binary files differindex bb62e6fd9f08..3928b7df3b27 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_off.png +++ b/core/res/res/drawable-hdpi/btn_check_off.png diff --git a/core/res/res/drawable-hdpi/btn_check_off_disable.png b/core/res/res/drawable-hdpi/btn_check_off_disable.png Binary files differindex b346381b4b78..922737e6c095 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_off_disable.png +++ b/core/res/res/drawable-hdpi/btn_check_off_disable.png diff --git a/core/res/res/drawable-hdpi/btn_check_off_disable_focused.png b/core/res/res/drawable-hdpi/btn_check_off_disable_focused.png Binary files differindex 8663369cfa48..992f0feb8a78 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_off_disable_focused.png +++ b/core/res/res/drawable-hdpi/btn_check_off_disable_focused.png diff --git a/core/res/res/drawable-hdpi/btn_check_off_pressed.png b/core/res/res/drawable-hdpi/btn_check_off_pressed.png Binary files differindex 67e49dffbdce..c6195abf9721 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_off_pressed.png +++ b/core/res/res/drawable-hdpi/btn_check_off_pressed.png diff --git a/core/res/res/drawable-hdpi/btn_check_off_selected.png b/core/res/res/drawable-hdpi/btn_check_off_selected.png Binary files differindex 1791d1f86618..d4677699f3a3 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_off_selected.png +++ b/core/res/res/drawable-hdpi/btn_check_off_selected.png diff --git a/core/res/res/drawable-hdpi/btn_check_on.png b/core/res/res/drawable-hdpi/btn_check_on.png Binary files differindex 15cd25ee582f..91d8ba93b354 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_on.png +++ b/core/res/res/drawable-hdpi/btn_check_on.png diff --git a/core/res/res/drawable-hdpi/btn_check_on_disable.png b/core/res/res/drawable-hdpi/btn_check_on_disable.png Binary files differindex e3fe32303cd8..6472087e45a0 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_on_disable.png +++ b/core/res/res/drawable-hdpi/btn_check_on_disable.png diff --git a/core/res/res/drawable-hdpi/btn_check_on_disable_focused.png b/core/res/res/drawable-hdpi/btn_check_on_disable_focused.png Binary files differindex fa41bb7ce54a..58ba72d79576 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_on_disable_focused.png +++ b/core/res/res/drawable-hdpi/btn_check_on_disable_focused.png diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed.png b/core/res/res/drawable-hdpi/btn_check_on_pressed.png Binary files differindex 906e283d29ad..42b8edca9220 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_on_pressed.png +++ b/core/res/res/drawable-hdpi/btn_check_on_pressed.png diff --git a/core/res/res/drawable-hdpi/btn_check_on_selected.png b/core/res/res/drawable-hdpi/btn_check_on_selected.png Binary files differindex eb496a8dbd65..7c94adf035de 100755..100644 --- a/core/res/res/drawable-hdpi/btn_check_on_selected.png +++ b/core/res/res/drawable-hdpi/btn_check_on_selected.png diff --git a/core/res/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png Binary files differindex bd353ae5cd70..00e8f0688c0c 100644 --- a/core/res/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/btn_group_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/btn_group_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_disabled_holo_light.9.png Binary files differindex d127b3c863e2..997ccb237c8d 100644 --- a/core/res/res/drawable-hdpi/btn_group_disabled_holo_light.9.png +++ b/core/res/res/drawable-hdpi/btn_group_disabled_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/btn_group_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_holo_dark.9.png Binary files differdeleted file mode 100644 index b86c65abe760..000000000000 --- a/core/res/res/drawable-hdpi/btn_group_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/btn_group_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_holo_light.9.png Binary files differdeleted file mode 100644 index 1248e8855eb1..000000000000 --- a/core/res/res/drawable-hdpi/btn_group_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/btn_group_normal_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_normal_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..b2120f4d3cf1 --- /dev/null +++ b/core/res/res/drawable-hdpi/btn_group_normal_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/btn_group_normal_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_normal_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..782d36bd5e36 --- /dev/null +++ b/core/res/res/drawable-hdpi/btn_group_normal_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/cab_background_opaque_holo_dark.9.png b/core/res/res/drawable-hdpi/cab_background_dark.9.png Binary files differindex bc5db49b9a45..bc5db49b9a45 100644 --- a/core/res/res/drawable-hdpi/cab_background_opaque_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/cab_background_dark.9.png diff --git a/core/res/res/drawable-hdpi/cab_background_opaque_holo_light.9.png b/core/res/res/drawable-hdpi/cab_background_light.9.png Binary files differindex 1f45bc98ef18..1f45bc98ef18 100644 --- a/core/res/res/drawable-hdpi/cab_background_opaque_holo_light.9.png +++ b/core/res/res/drawable-hdpi/cab_background_light.9.png diff --git a/core/res/res/drawable-hdpi/overscroll_edge.png b/core/res/res/drawable-hdpi/overscroll_edge.png Binary files differindex 6d3c26d74d2b..7eb615bd58f7 100644 --- a/core/res/res/drawable-hdpi/overscroll_edge.png +++ b/core/res/res/drawable-hdpi/overscroll_edge.png diff --git a/core/res/res/drawable-hdpi/overscroll_glow.png b/core/res/res/drawable-hdpi/overscroll_glow.png Binary files differindex 0b0b936bc9d4..a800d8e34458 100644 --- a/core/res/res/drawable-hdpi/overscroll_glow.png +++ b/core/res/res/drawable-hdpi/overscroll_glow.png diff --git a/core/res/res/drawable-mdpi/btn_check_off.png b/core/res/res/drawable-mdpi/btn_check_off.png Binary files differindex 251ddff37b1a..b0541d9b8f05 100644 --- a/core/res/res/drawable-mdpi/btn_check_off.png +++ b/core/res/res/drawable-mdpi/btn_check_off.png diff --git a/core/res/res/drawable-mdpi/btn_check_off_disable.png b/core/res/res/drawable-mdpi/btn_check_off_disable.png Binary files differindex 45e6804ed7f5..5ec8d03361bd 100644 --- a/core/res/res/drawable-mdpi/btn_check_off_disable.png +++ b/core/res/res/drawable-mdpi/btn_check_off_disable.png diff --git a/core/res/res/drawable-mdpi/btn_check_off_disable_focused.png b/core/res/res/drawable-mdpi/btn_check_off_disable_focused.png Binary files differindex 193acd2f37b3..341ffb91a060 100644 --- a/core/res/res/drawable-mdpi/btn_check_off_disable_focused.png +++ b/core/res/res/drawable-mdpi/btn_check_off_disable_focused.png diff --git a/core/res/res/drawable-mdpi/btn_check_off_pressed.png b/core/res/res/drawable-mdpi/btn_check_off_pressed.png Binary files differindex 807901c772c3..5e77a77e67ff 100644 --- a/core/res/res/drawable-mdpi/btn_check_off_pressed.png +++ b/core/res/res/drawable-mdpi/btn_check_off_pressed.png diff --git a/core/res/res/drawable-mdpi/btn_check_off_selected.png b/core/res/res/drawable-mdpi/btn_check_off_selected.png Binary files differindex dbc3bebafcc7..4e40f207feb6 100644 --- a/core/res/res/drawable-mdpi/btn_check_off_selected.png +++ b/core/res/res/drawable-mdpi/btn_check_off_selected.png diff --git a/core/res/res/drawable-mdpi/btn_check_on.png b/core/res/res/drawable-mdpi/btn_check_on.png Binary files differindex 4c83e2eb4af0..23304a1f4b39 100644 --- a/core/res/res/drawable-mdpi/btn_check_on.png +++ b/core/res/res/drawable-mdpi/btn_check_on.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_disable.png b/core/res/res/drawable-mdpi/btn_check_on_disable.png Binary files differindex f1bf17844cef..817745c21955 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_disable.png +++ b/core/res/res/drawable-mdpi/btn_check_on_disable.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_disable_focused.png b/core/res/res/drawable-mdpi/btn_check_on_disable_focused.png Binary files differindex ea232eed8261..13d13b64ac8d 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_disable_focused.png +++ b/core/res/res/drawable-mdpi/btn_check_on_disable_focused.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed.png b/core/res/res/drawable-mdpi/btn_check_on_pressed.png Binary files differindex 0de8a4c50ced..9cdc796572b2 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_pressed.png +++ b/core/res/res/drawable-mdpi/btn_check_on_pressed.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_selected.png b/core/res/res/drawable-mdpi/btn_check_on_selected.png Binary files differindex 20294f3e7443..b2c37279b8b9 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_selected.png +++ b/core/res/res/drawable-mdpi/btn_check_on_selected.png diff --git a/core/res/res/drawable-mdpi/btn_group_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_disabled_holo_dark.9.png Binary files differindex aa04cc962259..5894afec5e3f 100644 --- a/core/res/res/drawable-mdpi/btn_group_disabled_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/btn_group_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/btn_group_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_disabled_holo_light.9.png Binary files differindex 25aefd2a282c..1dfc7d365faa 100644 --- a/core/res/res/drawable-mdpi/btn_group_disabled_holo_light.9.png +++ b/core/res/res/drawable-mdpi/btn_group_disabled_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/btn_group_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_holo_dark.9.png Binary files differdeleted file mode 100644 index 9541252db5fa..000000000000 --- a/core/res/res/drawable-mdpi/btn_group_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/btn_group_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_holo_light.9.png Binary files differdeleted file mode 100644 index bf4f9b2c0392..000000000000 --- a/core/res/res/drawable-mdpi/btn_group_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/btn_group_normal_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_normal_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..c6257bb5b5b1 --- /dev/null +++ b/core/res/res/drawable-mdpi/btn_group_normal_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/btn_group_normal_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_normal_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..7e25ad35d3e6 --- /dev/null +++ b/core/res/res/drawable-mdpi/btn_group_normal_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/cab_background_opaque_holo_dark.9.png b/core/res/res/drawable-mdpi/cab_background_dark.9.png Binary files differindex 253b12ce8be4..253b12ce8be4 100644 --- a/core/res/res/drawable-mdpi/cab_background_opaque_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/cab_background_dark.9.png diff --git a/core/res/res/drawable-mdpi/cab_background_opaque_holo_light.9.png b/core/res/res/drawable-mdpi/cab_background_light.9.png Binary files differindex aaccdfb5aec9..aaccdfb5aec9 100644 --- a/core/res/res/drawable-mdpi/cab_background_opaque_holo_light.9.png +++ b/core/res/res/drawable-mdpi/cab_background_light.9.png diff --git a/core/res/res/drawable-mdpi/overscroll_edge.png b/core/res/res/drawable-mdpi/overscroll_edge.png Binary files differindex 6d3c26d74d2b..86d9454795c0 100644 --- a/core/res/res/drawable-mdpi/overscroll_edge.png +++ b/core/res/res/drawable-mdpi/overscroll_edge.png diff --git a/core/res/res/drawable-mdpi/overscroll_glow.png b/core/res/res/drawable-mdpi/overscroll_glow.png Binary files differindex 0b0b936bc9d4..d96b9be306c3 100644 --- a/core/res/res/drawable-mdpi/overscroll_glow.png +++ b/core/res/res/drawable-mdpi/overscroll_glow.png diff --git a/core/res/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png Binary files differdeleted file mode 100644 index 137923b4a224..000000000000 --- a/core/res/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png Binary files differdeleted file mode 100644 index 62b1debdccec..000000000000 --- a/core/res/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png Binary files differdeleted file mode 100644 index ab30a7728bea..000000000000 --- a/core/res/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png Binary files differdeleted file mode 100644 index 9274bc720c2f..000000000000 --- a/core/res/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png Binary files differdeleted file mode 100644 index e46155e07064..000000000000 --- a/core/res/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_activated_holo_dark.9.png b/core/res/res/drawable-xlarge-mdpi/textfield_bg_activated_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..a233b0d7079c --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/textfield_bg_activated_holo_dark.9.png diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_default_holo_dark.9.png b/core/res/res/drawable-xlarge-mdpi/textfield_bg_default_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..403f5021163b --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/textfield_bg_default_holo_dark.9.png diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_focused_holo_dark.9.png b/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_focused_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..0ded801333d5 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_focused_holo_dark.9.png diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_holo_dark.9.png b/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..27237b8fe068 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_focused_holo_dark.9.png b/core/res/res/drawable-xlarge-mdpi/textfield_bg_focused_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..0e451f1733d6 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/textfield_bg_focused_holo_dark.9.png diff --git a/core/res/res/drawable/action_bar_context_background.xml b/core/res/res/drawable/btn_group_holo_dark.xml index 8789898186ec..553f023712ab 100644 --- a/core/res/res/drawable/action_bar_context_background.xml +++ b/core/res/res/drawable/btn_group_holo_dark.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project +<!-- Copyright (C) 2011 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. @@ -14,10 +14,9 @@ limitations under the License. --> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <gradient - android:startColor="#ff000000" - android:centerColor="#ffd1d2d4" - android:endColor="#ff85878a" - android:angle="270" /> -</shape> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_group_normal_holo_dark" /> + <item + android:drawable="@drawable/btn_group_disabled_holo_dark" /> +</selector> diff --git a/core/res/res/drawable/btn_group_holo_light.xml b/core/res/res/drawable/btn_group_holo_light.xml new file mode 100644 index 000000000000..9c89eef57ecb --- /dev/null +++ b/core/res/res/drawable/btn_group_holo_light.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 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="true" + android:drawable="@drawable/btn_group_normal_holo_light" /> + <item + android:drawable="@drawable/btn_group_disabled_holo_light" /> +</selector> diff --git a/core/res/res/drawable/group_button_background_holo_dark.xml b/core/res/res/drawable/group_button_background_holo_dark.xml deleted file mode 100644 index fa007851fe1e..000000000000 --- a/core/res/res/drawable/group_button_background_holo_dark.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 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_window_focused="false" android:drawable="@color/transparent" /> - - <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> - <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/btn_group_disabled_holo_dark" /> - <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/btn_group_disabled_holo_dark" /> - <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/btn_group_pressed_holo_dark" /> - <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/btn_group_pressed_holo_dark" /> - <item android:state_focused="true" android:drawable="@drawable/btn_group_focused_holo_dark" /> - <item android:drawable="@color/transparent" /> -</selector> diff --git a/core/res/res/drawable/group_button_background_holo_light.xml b/core/res/res/drawable/group_button_background_holo_light.xml deleted file mode 100644 index 1e74ec78c2b4..000000000000 --- a/core/res/res/drawable/group_button_background_holo_light.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 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_window_focused="false" android:drawable="@color/transparent" /> - - <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> - <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/btn_group_disabled_holo_light" /> - <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/btn_group_disabled_holo_light" /> - <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/btn_group_pressed_holo_light" /> - <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/btn_group_pressed_holo_light" /> - <item android:state_focused="true" android:drawable="@drawable/btn_group_focused_holo_light" /> - <item android:drawable="@color/transparent" /> -</selector> diff --git a/core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml b/core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml index fab69d857bab..e4a1b81e131d 100644 --- a/core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml +++ b/core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml @@ -74,6 +74,7 @@ android:layout_height="230dip" android:background="#00000000" android:keyBackground="@drawable/btn_keyboard_key_fulltrans" + android:visibility="gone" /> <!-- emergency call button --> diff --git a/core/res/res/layout/action_menu_item_layout.xml b/core/res/res/layout/action_menu_item_layout.xml index e0018945d7b4..4477df7aaf3e 100644 --- a/core/res/res/layout/action_menu_item_layout.xml +++ b/core/res/res/layout/action_menu_item_layout.xml @@ -42,6 +42,7 @@ android:visibility="gone" android:textAppearance="?attr/textAppearanceMedium" style="?attr/buttonStyleSmall" + android:textColor="?attr/textColorPrimary" android:background="@null" android:paddingLeft="4dip" android:paddingRight="4dip" /> diff --git a/core/res/res/layout/grant_credentials_permission.xml b/core/res/res/layout/grant_credentials_permission.xml index 0ffe8de6fbe0..8b18454eea01 100644 --- a/core/res/res/layout/grant_credentials_permission.xml +++ b/core/res/res/layout/grant_credentials_permission.xml @@ -21,24 +21,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"> - - <!-- The header --> - <TextView - android:id="@+id/header_text" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="@color/white" - android:textStyle="bold" - android:text="@string/grant_permissions_header_text" - android:shadowColor="@color/shadow" - android:shadowRadius="2" - android:singleLine="true" - android:background="@drawable/title_bar_medium" - android:gravity="left|center_vertical" - android:paddingLeft="19dip" - android:ellipsize="marquee" /> + android:layout_height="match_parent" + android:divider="?android:attr/dividerHorizontal" + android:showDividers="middle" + android:dividerPadding="16dip" > <!-- The list of packages that correspond to the requesting UID and the account/authtokenType that is being requested --> @@ -137,25 +123,24 @@ <LinearLayout android:id="@+id/buttons" android:layout_width="match_parent" - android:layout_height="52dip" - android:background="@drawable/bottom_bar" - android:paddingTop="4dip" - android:paddingLeft="2dip" - android:paddingRight="2dip"> + android:layout_height="54dip" + style="?android:attr/buttonBarStyle"> <Button android:id="@+id/allow_button" android:text="@string/allow" android:layout_width="0dip" android:layout_height="wrap_content" - android:layout_weight="2" /> + android:layout_weight="2" + style="?android:attr/buttonBarButtonStyle" /> <Button android:id="@+id/deny_button" android:text="@string/deny" android:layout_width="0dip" android:layout_height="wrap_content" - android:layout_weight="2" /> + android:layout_weight="2" + style="?android:attr/buttonBarButtonStyle" /> </LinearLayout> </LinearLayout> diff --git a/core/res/res/layout/popup_menu_item_layout.xml b/core/res/res/layout/popup_menu_item_layout.xml index d22f74a055b7..fef017d1f9eb 100644 --- a/core/res/res/layout/popup_menu_item_layout.xml +++ b/core/res/res/layout/popup_menu_item_layout.xml @@ -16,7 +16,7 @@ <com.android.internal.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="48dip" + android:layout_height="?android:attr/dropdownListPreferredItemHeight" android:minWidth="196dip" android:paddingLeft="16dip" android:paddingRight="16dip"> diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml index ccc6326630a6..9cf08eaf9699 100644 --- a/core/res/res/layout/search_bar.xml +++ b/core/res/res/layout/search_bar.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:focusable="true" - android:background="@drawable/cab_background_opaque_holo_light" + android:background="@drawable/cab_background_light" android:descendantFocusability="afterDescendants"> <RelativeLayout diff --git a/core/res/res/layout/search_view.xml b/core/res/res/layout/search_view.xml index 0a7cd3c8c191..c41c2decd35b 100644 --- a/core/res/res/layout/search_view.xml +++ b/core/res/res/layout/search_view.xml @@ -105,6 +105,7 @@ android:layout_gravity="center_vertical" android:background="?android:attr/selectableItemBackground" android:src="?android:attr/searchViewCloseIcon" + android:focusable="true" /> </LinearLayout> @@ -127,6 +128,7 @@ android:background="?android:attr/selectableItemBackground" android:src="?android:attr/searchViewGoIcon" android:visibility="gone" + android:focusable="true" /> <ImageView @@ -139,6 +141,7 @@ android:src="?android:attr/searchViewVoiceIcon" android:background="?android:attr/selectableItemBackground" android:visibility="gone" + android:focusable="true" /> </LinearLayout> </LinearLayout> diff --git a/core/res/res/layout/simple_spinner_dropdown_item.xml b/core/res/res/layout/simple_spinner_dropdown_item.xml index 5fd7a09aa1a6..cb999b665ed1 100644 --- a/core/res/res/layout/simple_spinner_dropdown_item.xml +++ b/core/res/res/layout/simple_spinner_dropdown_item.xml @@ -22,5 +22,5 @@ style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="match_parent" - android:layout_height="?android:attr/listPreferredItemHeight" + android:layout_height="?android:attr/dropdownListPreferredItemHeight" android:ellipsize="marquee" /> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 8a506a36b150..7b13a7517331 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"وضع الطائرة"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"وضع الطائرة قيد التشغيل"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقف"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"+100"</string> <string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string> <string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"الخدمات التي تكلفك المال"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لطريقة الإرسال. لا يجب استخدامه على الإطلاق للتطبيقات العادية."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"الالتزام بخلفية ما"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"للسماح للمالك بالالتزام بواجهة المستوى العلوي للخلفية. لا يجب استخدامه على الإطلاق للتطبيقات العادية."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"التفاعل مع مشرف الجهاز"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"للسماح للمالك بإرسال الأهداف إلى أحد مشرفي الجهاز. لا يجب استخدامه على الإطلاق للتطبيقات العادية."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"تغيير اتجاه الشاشة"</string> @@ -466,7 +469,7 @@ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"للسماح لتطبيق ما بالكتابة على وحدة تخزين USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"للسماح لتطبيق ما بالكتابة إلى بطاقة SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"تعديل/حذف محتويات وحدة تخزين الوسائط الداخلية"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"للسماح لتطبيق ما بتعديل محتويات وحدة تخزين الوسائط الداخلية."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"للسماح لأحد التطبيقات بتعديل محتويات وحدة تخزين الوسائط الداخلية."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"الدخول إلى نظام ملفات ذاكرة التخزين المؤقت"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"للسماح لتطبيق ما بقراءة نظام ملفات ذاكرة التخزين المؤقت والكتابة به."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"إجراء/تلقي مكالمات عبر الإنترنت"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"العمل"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"غير ذلك"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"أدخل رقم التعريف الشخصي"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"أدخل كلمة المرور لإلغاء التأمين"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"أدخل رقم التعريف الشخصي (PIN) لإلغاء القفل"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"كود PIN غير صحيح!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"كلمة المرور"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"تسجيل الدخول"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"اسم المستخدم غير صحيح أو كلمة المرور غير صحيحة."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"جارٍ التحقق..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"إلغاء تأمين"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"تشغيل الصوت"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 2736269c2292..7c8a7f578c1c 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Самолетен режим"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Самолетният режим е ВКЛЮЧЕН"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Самолетният режим е ИЗКЛЮЧЕН"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Системно от Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Услуги, които ви струват пари"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на метод на въвеждане. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"обвързване с тапет"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на тапет. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаимодействие с администратор на устройството"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Разрешава на притежателя да изпраща намерения до администратор на устройството. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"промяна на ориентацията на екрана"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"промяна/изтриване на съдържанието на SD картата"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Разрешава на приложението да записва в USB хранилището."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Разрешава на приложението да записва върху SD картата."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"промяна/изтриване на съдържанието на вътрешното мултимедийно хранилище"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"пром./изтр. на съдърж. на вътр. мултим. хранил."</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Разрешава на приложението да променя съдържанието на вътрешното мултимедийно хранилище."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"достъп до файловата система на кеша"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Разрешава на приложението да чете и записва във файловата система на кеша."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Служебен"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Друг"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Въведете PIN кода"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Въведете паролата, за да отключите"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Въведете PIN за отключване"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправилен PIN код!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Парола"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Вход"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Потребителското име или паролата са невалидни."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Проверява се…"</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Отключване"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Включване на звука"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index ba93303dc14a..1f2cde040216 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode d\'avió"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode d\'avió activat"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode d\'avió desactivat"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"+100"</string> <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serveis de pagament"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permet al titular vincular amb la interfície de nivell superior d\'un mètode d\'entrada. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vincular a un empaperat"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permet al titular vincular amb la interfície de nivell superior d\'un empaperat. No s\'hauria de necessitar mai per a les aplicacions normals."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar amb un administrador del dispositiu"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permet al titular enviar intencions a un administrador del sistema. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"canviar l\'orientació de la pantalla"</string> @@ -465,8 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/suprimir el contingut de les targetes SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permet que una aplicació gravii a l\'emmagatzematge USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permet a una aplicació escriure a la targeta SD."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modifica/suprimeix el contingut d\'emmagatzematge de mitjans interns"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permet que una aplicació modifiqui el contingut de l\'emmagatzematge de mitjans interns."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"mod./sup. cont. emm. mult. in."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permet que una aplicació modifiqui el contingut de l\'emmagatzematge multimèdia intern."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accedir al sistema de fitxers de la memòria cau"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permet a una aplicació llegir el sistema de fitxers de la memòria cau i escriure-hi."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"fes/rep trucades per Internet"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Feina"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Altres"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduïu el codi PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduïu la contrasenya per desbloquejar-lo"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introdueix el PIN per desbloquejar"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Codi PIN incorrecte."</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Contrasenya"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Inicia la sessió"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nom d\'usuari o contrasenya no vàlids."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"S\'està comprovant..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloqueja"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"So activat"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 7495a66275b6..22d335791094 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim V letadle"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim V letadle je ZAPNUTÝ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim V letadle je VYPNUTÝ"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Zpoplatněné služby"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Umožňuje držiteli vázat se na nejvyšší úroveň rozhraní pro zadávání dat. Běžné aplikace by toto nastavení nikdy neměly využívat."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vazba na tapetu"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní tapety. Běžné aplikace by toto oprávnění nikdy neměly potřebovat."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"komunikovat se správcem zařízení"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Umožňuje držiteli oprávnění odesílat informace správci zařízení. Běžné aplikace by toto oprávnění nikdy neměly požadovat."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"změna orientace obrazovky"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"změna/smazání obsahu karty SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Umožní zápis do úložiště USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Upravit/smazat interní úlož."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Povoluje aplikaci upravovat obsah interního úložiště médií."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"přistupovat do souborového systému mezipaměti"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Umožňuje aplikaci číst a zapisovat do souborového systému mezipaměti."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"uskutečňovat a přijímat internetové hovory"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Práce"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Jiné"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Zadejte kód PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Zadejte heslo pro odblokování"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Zadejte kód PIN pro odblokování"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávný kód PIN"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Heslo"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Přihlásit se"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Neplatné uživatelské jméno nebo heslo."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Probíhá kontrola..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odemknout"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zapnout zvuk"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 0c9aefd2a655..a9a26142978a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flytilstand"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tjenester, der koster dig penge"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tillader, at brugeren forpligter sig til en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"forpligt til et tapet"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Tillader, at brugeren forpligter sig til et tapets grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunikere med en enhedsadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillader brugeren at sende hensigter til en enhedsadministrator. Bør aldrig være nødvendigt for almindelige programmer."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"skift skærmretning"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"ret/slet indholdet på SD-kortet"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Tillad skriv til USB-lager."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Tillader, at et program skriver til SD-kortet."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Rediger/slet internt medielagringsindhold"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Tillader, at applikationen ændrer indholdet af det interne medielagringsindhold."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"få adgang til cache-filsystemet"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillader, at et program læser og skriver til cache-filsystemet."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"foretage/modtage internetopkald"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbejde"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Andre"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Indtast PIN-kode"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Indtast adgangskode for at låse op"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Indtast pinkode for at låse op"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Forkert PIN-kode!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Adgangskode"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Log ind"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ugyldigt brugernavn eller ugyldig adgangskode."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerer ..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås op"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd slået til"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 7856aaf78414..596affd8dab7 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -257,6 +257,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"An einen Hintergrund binden"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"Interaktion mit einem Geräteadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Ermöglicht dem Halter, Intents an einen Geräteadministrator zu senden. Sollte nie für normale Anwendungen benötigt werden."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"Bildschirmausrichtung ändern"</string> @@ -608,6 +612,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Geschäftlich"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Sonstige"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN-Code eingeben"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Passwort zum Entsperren eingeben"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"PIN zum Entsperren eingeben"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Falscher PIN-Code!"</string> @@ -651,6 +657,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Passwort"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Anmelden"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ungültiger Nutzername oder ungültiges Passwort."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Überprüfung..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Entsperren"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ton ein"</string> @@ -1030,4 +1038,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 7dc9747c0353..146e81f61b84 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Λειτουργία πτήσης"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Η λειτουργία πτήσης είναι απενεργοποιημένη"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string> <string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Υπηρεσίες επί πληρωμή"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας μεθόδου εισόδου. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"δέσμευση σε ταπετσαρία"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας ταπετσαρίας. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"επικοινωνία με έναν διαχειριστή συσκευής"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Επιτρέπει στον κάτοχο την αποστολή στόχων σε έναν διαχειριστή συσκευής. Δεν θα χρειαστεί ποτέ για κανονικές εφαρμογές."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"αλλαγή προσανατολισμού οθόνης"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"τροποποίηση/διαγραφή περιεχομένων κάρτας SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Επ. εγγρ. εφ. σε απ. χώρο USB"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"τροπ./διαγ. περ. απ. εσ. μνήμ."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Επιτρέπει σε μια εφαρμογή την τροποποίηση περιεχομένων της αποθήκευσης εσωτερικής μνήμης."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"πρόσβαση στο σύστημα αρχείων προσωρινής μνήμης"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Επιτρέπει σε μια εφαρμογή την ανάγνωση και την εγγραφή του συστήματος αρχείων προσωρινής μνήμης."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"πραγματοποίηση/λήψη κλήσεων μέσω Διαδικτύου"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Εργασία"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Άλλο"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Πληκτρολογήστε τον κωδικό αριθμό PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Εισαγάγετε τον κωδικό πρόσβασης για ξεκλείδωμα"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Εισαγάγετε το PIN για ξεκλείδωμα"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Εσφαλμένος κωδικός αριθμός PIN!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Κωδικός πρόσβασης"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Σύνδεση"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Έλεγχος..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ξεκλείδωμα"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ενεργοποίηση ήχου"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index a63e2c40b363..e7ed95f5dec9 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aiplane mode is ON"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Airplane mode is OFF"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services that cost you money"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Allows the holder to bind to the top-level interface of an input method. Should never be needed for normal applications."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bind to wallpaper"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Allows the holder to bind to the top-level interface of wallpaper. Should never be needed for normal applications."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interact with device admin"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Allows the holder to send intents to a device administrator. Should never be needed for normal applications."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"change screen orientation"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Work"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Other"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Enter PIN code"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Enter password to unlock"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Enter PIN to unlock"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Incorrect PIN code!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Password"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Sign in"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Invalid username or password."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Checking..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Unlock"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sound on"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-es-rUS-xlarge/strings.xml b/core/res/res/values-es-rUS-xlarge/strings.xml index 81b3f1a4425d..dc184b31a455 100644 --- a/core/res/res/values-es-rUS-xlarge/strings.xml +++ b/core/res/res/values-es-rUS-xlarge/strings.xml @@ -38,6 +38,8 @@ <!-- XL --> <string name="global_actions_airplane_mode_on_status" msgid="7272433204482202219">"El modo avión está ENCENDIDO"</string> <!-- XL --> + <string name="status_bar_notification_info_overflow" msgid="1081154808901480710">"100+"</string> + <!-- XL --> <string name="android_system_label" msgid="844561213652704593">"Sistema Androide"</string> <!-- XL --> <string name="permgroupdesc_costMoney" msgid="4836624191696189469">"Admitir que las aplicaciones realicen actividades que se cobran."</string> @@ -303,16 +305,10 @@ <!-- XL --> <string name="websearch" msgid="904596193450917688">"Búsqueda web"</string> <!-- XL --> - <string name="status_bar_notification_info_overflow" msgid="1081154808901480710">"100+"</string> - <!-- XL --> <string name="permlab_accessMtp" msgid="2385215229145694622">"implementar protocolo MTP"</string> <!-- XL --> <string name="permdesc_accessMtp" msgid="4707854877711083465">"Permite acceso al driver kernel MTP para implementar el protocolo MTP USB."</string> <!-- XL --> - <string name="permlab_mediaStorageWrite" product="default" msgid="5585262071354704256">"modificar/eliminar los contenidos del almacenamientos de medios internos"</string> - <!-- XL --> - <string name="permdesc_mediaStorageWrite" product="default" msgid="2372999661142345443">"Permite que una aplicación modifique los contenidos del almacenamiento interno de medios."</string> - <!-- XL --> <string name="policylab_encryptedStorage" msgid="488196329176602372">"Establecer la encriptación del almacenamiento"</string> <!-- XL --> <string name="policydesc_encryptedStorage" msgid="6111889605506443825">"Requiere que los datos almacenados de la aplicación estén encriptados"</string> @@ -321,6 +317,8 @@ <!-- XL --> <string name="autofill_address_summary_format" msgid="8398158823767723887">"$1$2$3"</string> <!-- XL --> + <string name="configure_input_methods" msgid="8093308517599282222">"Configurar métodos de entrada"</string> + <!-- XL --> <string name="gpsNotifTicker" msgid="6612390321359669319">"Solicitud de ubicación de <xliff:g id="NAME">%s</xliff:g>"</string> <!-- XL --> <string name="gpsNotifTitle" msgid="7533028619350196545">"Solicitud de ubicación"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5d1a25f69fb2..de964c1d3852 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Encendido"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Apagado"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100 +"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicios que te cuestan dinero"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite al propietario vincularse a la interfaz de nivel superior de un método de entrada. Se debe evitar utilizarlo en aplicaciones normales."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vincular a un fondo de pantalla"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite al propietario vincularse a la interfaz de nivel superior de un fondo de pantalla. Se debe evitar utilizarlo en aplicaciones normales."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con un administrador de dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite que el propietario envíe sus intentos a un administrador de dispositivos. No se necesita para las aplicaciones normales."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"cambiar la orientación de la pantalla"</string> @@ -465,10 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/suprimir el contenido de la tarjeta SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite que una aplicación escriba en el almacenamiento USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Admite que una aplicación escriba en la tarjeta SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/eliminar los contenidos del almacenamientos de medios internos"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite que una aplicación modifique los contenidos del almacenamiento interno de medios."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Acceder al sistema de archivos caché"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que una aplicación lea y escriba el sistema de archivos caché."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"realizar o recibir llamadas por Internet"</string> @@ -607,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Otro"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ingresar el código de PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ingresar la contraseña para desbloquear"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Ingresa el PIN para desbloquear"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"¡Código de PIN incorrecto!"</string> @@ -650,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Contraseña"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Inicia sesión"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nombre de usuario o contraseña incorrecta."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Comprobando..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sonido encendido"</string> @@ -1028,4 +1033,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a4d6545654ad..ccc7dabf3b51 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar."</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"+100"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicios por los que tienes que pagar"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite enlazar con la interfaz de nivel superior de un método de introducción de texto. No debe ser necesario para las aplicaciones normales."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"enlazar con un fondo de pantalla"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite enlazar con la interfaz de nivel superior de un fondo de pantalla. No debe ser necesario para las aplicaciones normales."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con el administrador de un dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite enviar intentos a un administrador de dispositivos. Este permiso nunca debería ser necesario para las aplicaciones normales."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"cambiar orientación de la pantalla"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/eliminar contenido de la tarjeta SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite escribir en USB"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permite que una aplicación escriba en la tarjeta SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Cambiar/borrar almac interno"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite que una aplicación modifique el contenido del almacenamiento interno de medios."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"acceder al sistema de archivos almacenado en caché"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que una aplicación lea y escriba el sistema de archivos almacenado en caché."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"realizar/recibir llamadas por Internet"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Otro"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduce el código PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introducir contraseña para desbloquear"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introducir PIN para desbloquear"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"El código PIN es incorrecto."</string> @@ -630,7 +633,7 @@ <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Falta la tarjeta SIM"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"No se ha insertado ninguna tarjeta SIM en la tableta."</string> <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"No se ha insertado ninguna tarjeta SIM en el teléfono."</string> - <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Inserta una tarjeta SIM."</string> + <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Inserta una tarjeta SIM"</string> <string name="emergency_calls_only" msgid="6733978304386365407">"Solo llamadas de emergencia"</string> <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Bloqueada para la red"</string> <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"La tarjeta SIM está bloqueada con el código PUK."</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Contraseña"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Acceder"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nombre de usuario o contraseña no válido"</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Comprobando..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Activar sonido"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 767655d200ae..d3eac2d13eb1 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"حالت هواپیما"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"حالت هواپیما روشن است"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"حالت هواپیما خاموش است"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string> <string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"سرویس های غیر رایگان"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"به نگهدارنده اجازه می دهد به رابط سطح بالای یک روش ورودی متصل شود. هرگز برای برنامه های معمولی مورد نیاز نیست."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"پیوند شده به تصویر زمینه"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"به نگهدارنده اجازه می دهد که به رابط سطح بالای تصویر زمینه متصل شود. هرگز برای برنامه های معمولی مورد نیاز نیست."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"تعامل با یک سرپرست دستگاه"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"به نگهدارنده اجازه می دهد مفاد را به یک سرپرست دستگاه ارسال کند. هرگز برای برنامه های معمولی مورد نیاز نیست."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"تغییر جهت صفحه"</string> @@ -465,8 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"اصلاح کردن/حذف محتویات کارت SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"به یک برنامه کاربردی اجازه می دهد تا دستگاه USB را بنویسید."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"به یک برنامه کاربردی اجازه می دهد در کارت SD رایت کند."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"اصلاح/حذف محتواهای ذخیره سازی رسانه داخلی"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"به یک برنامه کاربردی برای اصلاح محتواهای حافظه رسانه داخلی اجازه می دهد."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"تغییر/حذف محتواهای حافظه رسانه داخلی"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"به یک برنامه کاربردی برای تغییر محتواهای حافظه رسانه داخلی اجازه می دهد."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"دسترسی به سیستم فایل حافظه پنهان"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"به یک برنامه کاربردی امکان می دهد سیستم فایل حافظه پنهان را بخواند و بنویسد."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"علامتگذاری/دریافت تماس های اینترنتی"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"محل کار"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"سایر موارد"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"کد پین را وارد کنید"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"رمز ورود را برای بازگشایی قفل وارد کنید"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"کد پین را برای بازگشایی قفل وارد کنید"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"پین کد اشتباه است!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"رمز ورود"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ورود به سیستم"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"نام کاربر یا رمز ورود نامعتبر است."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"در حال بررسی..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"بازگشایی قفل"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"صدا روشن"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index d8d13efee5c8..0e12063eef16 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lentokonetila"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lentokonetila on KÄYTÖSSÄ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lentokonetila on POIS KÄYTÖSTÄ"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Maksulliset palvelut"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Antaa sovelluksen sitoutua syöttötavan ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sido taustakuvaan"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Antaa sovelluksen sitoutua taustakuvan ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunikoi laitteen järjestelmänvalvojan kanssa"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Antaa sovelluksen lähettää kyselyitä laitteen järjestelmänvalvojalle. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"muuta näytön suuntaa"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"muokkaa/poista SD-kortin sisältöä"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Antaa sovelluksen kirjoittaa USB-tallennustilaan."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Antaa sovelluksen kirjoittaa SD-kortille."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"muokkaa/poista säilytystilan sisältöä"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"muokkaa/poista sisäisen säilytystilan sisältöä"</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Antaa sovelluksen muokata sisäisen tallennustilan sisältöä."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"käytä välimuistin tiedostojärjestelmää"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Antaa sovelluksen lukea välimuistin tiedostojärjestelmää ja kirjoittaa sinne."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Työ"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Muu"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Anna PIN-koodi"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Poista lukitus antamalla salasana"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Poista lukitus antamalla PIN-koodi"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Virheellinen PIN-koodi!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Salasana"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Kirjaudu sisään"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Virheellinen käyttäjänimi tai salasana."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Tarkistetaan..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Poista lukitus"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ääni käytössä"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c3fb6eb1f979..194f23f794d4 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -257,6 +257,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permet au support de se connecter à l\'interface de plus haut niveau d\'un mode de saisie. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"Se fixer sur un fond d\'écran"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permet au support de se fixer sur l\'interface de plus haut niveau d\'un fond d\'écran. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir avec l\'administrateur du périphérique"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permet à l\'application d\'envoyer des intentions à l\'administrateur du périphérique. Les applications standard ne devraient jamais avoir recours à cette fonctionnalité."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"Changement d\'orientation de l\'écran"</string> @@ -608,6 +612,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Professionnelle"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Autre"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Saisissez le code PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Saisissez le mot de passe pour procéder au déverrouillage."</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Saisissez le code PIN pour procéder au déverrouillage."</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Le code PIN est incorrect !"</string> @@ -651,6 +657,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Mot de passe"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Se connecter"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nom d\'utilisateur ou mot de passe incorrect."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Vérification..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Débloquer"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Son activé"</string> @@ -1030,4 +1038,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index fe9f319f70fe..43a1c28ec7fd 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -256,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Nositelju omogućuje da se veže uz sučelje najviše razine za metodu unosa. Nikad ne bi trebalo koristiti za uobičajene aplikacije."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"povezano s pozadinskom slikom"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Nositelju omogućuje da se veže uz sučelje najviše razine za pozadinsku sliku. Nikad ne bi trebalo koristiti za uobičajene aplikacije."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcija s administratorom uređaja"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Nositelju omogućuje slanje namjera administratoru uređaja. Nikad ne bi trebalo koristiti za uobičajene aplikacije."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"promjena orijentacije zaslona"</string> @@ -605,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Posao"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Drugo"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Unesite PIN kôd"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Unesite zaporku za otključavanje"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Unesite PIN za otključavanje"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Netočan PIN kôd!"</string> @@ -648,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Zaporka"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Prijava"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nevažeće korisničko ime ili zaporka."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Provjera..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Otključaj"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zvuk je uključen"</string> @@ -1024,4 +1032,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index a090f0bdc226..c4ee0ffa1312 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Repülőgép üzemmód"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Repülőgép üzemmód bekapcsolva"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Repülőgép üzemmód kikapcsolva"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string> <string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Fizetős szolgáltatások"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Lehetővé teszi a használó számára a beviteli módszer legfelső szintű kezelőfelületéhez való csatlakozást. A normál alkalmazások soha nem használják ezt."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"összekapcsolás háttérképpel"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Lehetővé teszi a használó számára, hogy csatlakozzon egy háttérkép legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szüksége."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"az eszközkezelő használata"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Lehetővé teszi a használó 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_setOrientation" msgid="3365947717163866844">"képernyő irányának módosítása"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"az SD-kártya tartalmának módosítása és törlése"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Lehetővé teszi az alkalmazások számára, hogy írjanak az USB-tárra."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Lehetővé teszi egy alkalmazás számára, hogy írjon az SD-kártyára."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"a belső médiatároló tartalmának módosítása és törlése"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"belső tár tartalmának módosítása/törlése"</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Lehetővé teszi az alkalmazások számára, hogy módosítsák a belső tárhely tartalmát."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"hozzáférés a gyorsítótár fájlrendszeréhez"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Lehetővé teszi egy alkalmazás számára a gyorsítótár fájlrendszerének olvasását és írását."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Munkahely"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Egyéb"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Adja meg a PIN-kódot"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"A feloldáshoz írja be a jelszót"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Feloldáshoz írja be a PIN kódot"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Helytelen PIN-kód."</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Jelszó"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Bejelentkezés"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Érvénytelen felhasználónév vagy jelszó."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Ellenőrzés..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Feloldás"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Hang bekapcsolása"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8f738d6fea9a..537ae5fc8e70 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode pesawat"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode pesawat HIDUP"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode pesawat MATI"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Layanan berbayar"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Mengizinkan pemegang mengikat antarmuka tingkat tinggi pada suatu metode masukan. Tidak diperlukan untuk aplikasi normal."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"mengikat ke wallpaper"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Mengizinkan pemegang mengikat antarmuka tingkat tinggi dari suatu wallpaper. Tidak diperlukan untuk aplikasi normal."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"berinteraksi dengan admin perangkat"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Mengizinkan pemegang mengirimkan tujuan kepada administrator perangkat. Tidak diperlukan untuk aplikasi normal."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"ubah orientasi layar"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Kerjaan"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Lainnya"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Masukkan kode PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Masukkan sandi untuk membuka"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Masukkan PIN untuk membuka kunci"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Kode PIN salah!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Sandi"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Masuk"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nama pengguna atau sandi tidak valid."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Memeriksa..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Buka kunci"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Suara hidup"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 887a96d0047b..0d24924fec7d 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servizi che prevedono un costo"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Consente l\'associazione all\'interfaccia principale di un metodo di inserimento. Non dovrebbe essere mai necessario per le normali applicazioni."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"associazione a sfondo"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Consente l\'associazione di uno sfondo all\'interfaccia principale. Non dovrebbe mai essere necessario per le normali applicazioni."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interazione con un amministratore dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Consente l\'invio di intent a un amministratore del dispositivo. L\'autorizzazione non deve mai essere necessaria per le normali applicazioni."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"modifica orientamento dello schermo"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificare/eliminare i contenuti della scheda SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Consente di scrivere nell\'archivio USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Consente a un\'applicazione di scrivere sulla scheda SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modifica/eliminaz. contenuti archivio media int."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Consente a un\'applicazione di modificare i contenuti dell\'archivio media interno."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accesso al filesystem nella cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Consente a un\'applicazione di leggere e scrivere il filesystem nella cache."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"effettuazione/ricezione chiamate Internet"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Lavoro"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Altro"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Inserisci il PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Inserisci password per sbloccare"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Inserisci PIN per sbloccare"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Codice PIN errato."</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Password"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Accedi"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Password o nome utente non valido."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controllo in corso..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Sblocca"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Audio attivato"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index eab8673f62a2..387073c1660b 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"מצב טיסה"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"מצב טיסה מופעל"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string> <string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"שירותים שעולים לך כסף"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"מאפשר למחזיק להכפיף לממשק ברמה עליונה של שיטת קלט. לא אמור להידרש לעולם ביישומים רגילים."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"קשור לטפט"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"מאפשר למחזיק לקשור לממשק ברמה עליונה של טפט. לא אמור להידרש לעולם ביישומים רגילים."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"קיים אינטראקציה עם מנהל מכשיר"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"מאפשר למשתמש לשלוח כוונות למנהל התקן. לא אמור להידרש לעולם ביישומים רגילים."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"שנה את כיוון המסך"</string> @@ -465,8 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"שנה/מחק את התוכן של כרטיס SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"מאפשר ליישום לכתוב לאמצעי אחסון מסוג USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"מאפשר ליישום לכתובת לכרטיס ה-SD."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"שנה/מחק תכנים של מדיית אחסון פנימית"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"מאפשר ליישום לשנות את התכנים של אחסון המדיה הפנימי."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"שנה/מחק תוכן של מדיית אחסון פנימית"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"מאפשר ליישום לשנות את התוכן של מדיית האחסון הפנימית."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"גישה למערכת הקבצים של הקובץ השמור"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"מאפשר ליישום לקרוא ולכתוב במערכת הקבצים של הקובץ השמור."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"בצע/קבל שיחות אינטרנט"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"עבודה"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"אחר"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"הזן קוד PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"הזן סיסמה לביטול הנעילה"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"הזן PIN לביטול נעילה"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"קוד PIN שגוי!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"סיסמה"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"כניסה"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"שם משתמש או סיסמה לא חוקיים."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"בודק..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"בטל נעילה"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"קול פועל"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index c1b9f5ded29e..f9b5c7d46fde 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -257,6 +257,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"入力方法のトップレベルインターフェースに関連付けることを所有者に許可します。通常のアプリケーションにはまったく必要ありません。"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"壁紙にバインド"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"壁紙のトップレベルインターフェースへのバインドを所有者に許可します。通常のアプリケーションでは不要です。"</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"デバイス管理者との通信"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"デバイス管理者へのintentの送信を所有者に許可します。通常のアプリケーションでは不要です。"</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"画面の向きの変更"</string> @@ -608,6 +612,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"勤務先"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"その他"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PINコードを入力"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"ロックを解除するにはパスワードを入力"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"ロックを解除するにはPINを入力"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PINコードが正しくありません。"</string> @@ -651,6 +657,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"パスワード"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ログイン"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ユーザー名またはパスワードが正しくありません。"</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"確認中..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"ロック解除"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"サウンドON"</string> @@ -1030,4 +1038,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index eda018d15cee..5ab96843dbe4 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"비행기 모드"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행기 모드 사용"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행기 모드 사용 안함"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"안전 모드"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"요금이 부과되는 서비스"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"권한을 가진 프로그램이 입력 방법에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 애플리케이션에는 절대로 필요하지 않습니다."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"배경화면 연결"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"권한을 가진 프로그램이 배경화면에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 애플리케이션에는 절대로 필요하지 않습니다."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"기기 관리자와 상호 작용"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"보유자가 기기 관리자에게 인텐트를 보낼 수 있도록 합니다. 일반 애플리케이션에는 절대로 필요하지 않습니다."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"화면 방향 변경"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"SD 카드 콘텐츠 수정/삭제"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"애플리케이션에서 USB 저장소의 정보를 변경할 수 있습니다."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"애플리케이션이 SD 카드에 쓸 수 있도록 합니다."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"내부 미디어 저장소 콘텐츠 수정/삭제"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"애플리케이션이 내부 미디어 저장소의 콘텐츠를 수정할 수 있도록 합니다."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"캐시 파일시스템 액세스"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"애플리케이션이 캐시 파일시스템을 읽고 쓸 수 있도록 합니다."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"인터넷 전화 걸기/받기"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"직장"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"기타"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN 코드 입력"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"잠금을 해제하려면 비밀번호 입력"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"잠금을 해제하려면 PIN 입력"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 코드가 잘못되었습니다."</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"비밀번호"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"로그인"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"확인 중..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"잠금해제"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"사운드 켜기"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index f9f01e42f947..d979c4c0c1bd 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lėktuvo režimas"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ĮJUNGTAS lėktuvo režimas"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"lėktuvo režimas IŠJUNGTAS"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string> <string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Paslaugos, už kurias mokėjote"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Leidžia savininkui susisaistyti su įvesties būdo aukščiausio lygio sąsaja. Neturėtų reikėti įprastoms programoms."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"susaistyti su darbalaukio fonu"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Leidžia savininkui susisaistyti su aukščiausio lygio darbalaukio fono sąsaja. Neturėtų reikėti įprastose programose."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"sąveikauti su įrenginio administratoriumi"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Leidžia savininkui siųsti tikslus įrenginio administratoriui. Neturėtų reikėti įprastose programose."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"keisti ekrano padėtį"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"keisti / ištrinti SD kortelės turinį"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Leidžiama programai įrašyti į USB atmintinę."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Leidžia programai rašyti į SD kortelę."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"keisti / ištrinti vidinės medijos atmintinės turinį"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"keisti / ištr. vid. med. atm. tur."</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Leidžiama programai keisti vidinės medijos atmintinės turinį."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"pasiekti talpyklos failų sistemą"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Leidžia programai skaityti ir rašyti į talpyklos failų sistemą."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Darbas"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Kita"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Įveskite PIN kodą"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Įveskite slaptažodį, kad atrakintumėte"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Jei norite atrakinti, įveskite PIN kodą"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Neteisingas PIN kodas!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Slaptažodis"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Prisijungti"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Neteisingas naudotojo vardas ar slaptažodis."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Tikrinama..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Atblokuoti"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Garsas įjungtas"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 6d25c54599d6..ad108ff734da 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lidojuma režīms"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lidojuma režīms ir IESLĒGTS."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lidojuma režīms ir IZSLĒGTS."</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Maksas pakalpojumi"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Ļauj īpašniekam saistīt ar ievades metodes augšējā līmeņa saskarni. Parastajām lietojumprogrammām nekad nav nepieciešama."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"saistīt ar tapeti"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Ļauj īpašniekam saistīties ar tapetes augšējā līmeņa saskarni. Parastajās lietojumprogrammās nekad nav nepieciešama."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"mijiedarboties ar ierīces administratoru"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Ļauj īpašniekam sūtīt nolūkus ierīces administratoram. Nekad nav nepieciešams parastajām lietojumprogrammām."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"mainīt ekrāna orientāciju"</string> @@ -465,8 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"pārveidot/dzēst SD kartes saturu"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Ļauj lietoj. rakstīt USB kr."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Ļauj lietojumprogrammai rakstīt SD kartē."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"pārveidot/dzēst datu nesēja iekšējās krātuves saturu"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Ļauj lietojumprogrammai pārveidot iekšējas datu nesēja krātuves saturu."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"pārv./dz.datu n.iekš.atm.sat."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Ļauj lietojumprogrammai pārveidot datu nesēja iekšējas atmiņas saturu."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"piekļūt kešatmiņas failu sistēmai"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Ļauj lietojumprogrammai lasīt kešatmiņas failu sistēmu un rakstīt tajā."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"veikt/saņemt interneta zvanus"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Darbs"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Cits"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ievadiet PIN kodu"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Lai atbloķētu, ievadiet paroli."</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Lai atbloķētu, ievadiet PIN"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN kods nav pareizs."</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Parole"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Pierakstīties"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Lietotājvārds vai parole nav derīga."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Notiek pārbaude..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Atbloķēt"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Skaņa ir ieslēgta"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index aed91639f064..5a67d6fbd6fc 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flymodus"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flymodus er på"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flymodus er av"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"Over 100"</string> <string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Betaltjenester"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Lar applikasjonen binde til toppnivågrensesnittet for en inndatametode. Vanlige applikasjoner bør aldri trenge dette."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bind til bakgrunnsbilde"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Lar innehaveren binde det øverste nivået av grensesnittet til en bakgrunnsbilder. Skal ikke være nødvendig for vanlige programmer."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommuniser med enhetsadministrator"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillater innehaveren å sende hensikter til enhetsadministrator. Bør aldri være nødvendig for normale programmer."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"snu skjermen"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"redigere/slette innhold på minnekort"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Prog. skriver til USB-lagr."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Lar applikasjonen skrive til minnekortet."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"endre eller slette innhold på interne medier"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Tillater et program til å endre innholdet i interne medier."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"tilgang til bufrede filer"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillater et program å lese og skrive til bufrede filer."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"foreta/motta Internett-anrop"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbeid"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Annen"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Skriv inn PIN-kode:"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Skriv inn passord for å låse opp"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Skriv inn personlig kode for å låse opp"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Gal PIN-kode!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Passord"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Logg på"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ugyldig brukernavn eller passord."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerer ..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås opp"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd på"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 062caeee53d9..979b9a38cf9a 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegmodus"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegmodus is AAN"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegmodus is UIT"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services waarvoor u moet betalen"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een invoermethode. Nooit vereist voor normale toepassingen."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"verbinden met een achtergrond"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een achtergrond. Nooit vereist voor normale toepassingen."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactie met apparaatbeheer"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Staat de houder toe intenties te verzenden naar een apparaatbeheerder. Nooit vereist voor normale toepassingen."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"schermstand wijzigen"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"inhoud op de SD-kaart aanpassen/verwijderen"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Hiermee kan een toepassing schrijven naar de USB-opslag."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Hiermee kan een toepassing schrijven naar de SD-kaart."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"inh. mediaopsl. wijz./verw."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Hiermee kan een toepassing de inhoud van interne mediaopslag aanpassen."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"het cachebestandssysteem openen"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Staat een toepassing toe het cachebestandssysteem te lezen en te schrijven."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"internetoproepen starten/ontvangen"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Werk"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Overig"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN-code invoeren"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Voer het wachtwoord in om te ontgrendelen"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Voer de PIN-code in om te ontgrendelen"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Onjuiste PIN-code!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Wachtwoord"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Aanmelden"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Gebruikersnaam of wachtwoord ongeldig."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controleren..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ontgrendelen"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Geluid aan"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 868f16873a20..85aeaf453ef3 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Tryb samolotowy"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Tryb samolotowy jest włączony"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Tryb samolotowy jest wyłączony"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string> <string name="android_system_label" msgid="6577375335728551336">"System Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Usługi płatne"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Pozwala na tworzenie powiązania z interfejsem najwyższego poziomu metody wejściowej. To uprawnienie nie powinno być nigdy wymagane przez zwykłe aplikacje."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"powiązanie z tapetą"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Umożliwia posiadaczowi powiązać interfejs najwyższego poziomu dla tapety. Nie powinno być nigdy potrzebne w przypadku zwykłych aplikacji."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcja z administratorem urządzenia"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Zezwala posiadaczowi na wysyłanie informacji o zamiarach do administratora urządzenia. Opcja nie powinna być nigdy potrzebna w przypadku zwykłych aplikacji."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"zmienianie orientacji ekranu"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modyfikowanie/usuwanie zawartości karty SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Umożliwia zapis na nośnik USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Umożliwia aplikacji zapis na karcie SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modyf./usuw. zawartości pam. wewn."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Zezwala aplikacji na modyfikowanie zawartości pamięci wewnętrznej."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"dostęp do systemu plików pamięci podręcznej"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Zezwala aplikacji na odczyt i zapis w systemie plików pamięci podręcznej."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"nawiązywanie/odbieranie połączeń przez internet"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Służbowy"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Inny"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Wprowadź kod PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Wprowadź hasło, aby odblokować"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Wprowadź kod PIN, aby odblokować"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Błędny kod PIN!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Hasło"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj się"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Błędna nazwa użytkownika lub hasło."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Trwa sprawdzanie..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index f306b8dd130d..bd1cb561b780 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo de avião"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está activado"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desactivado"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serviços que implicam pagamento"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite ao titular vincular a interface de nível superior a um método de entrada de som. Nunca deve ser necessário para aplicações normais."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vincular a uma imagem de fundo"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite ao titular vincular a interface de nível superior de uma imagem de fundo. Nunca deverá ser necessário para aplicações normais."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com um administrador do dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite ao titular enviar intenções para um administrador do dispositivo. Nunca deverá ser necessário para aplicações normais."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"mudar orientação do ecrã"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/eliminar conteúdo do cartão SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite que uma aplicação escreva no armaz. USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permite que uma aplicação escreva no cartão SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/eliminar conteúdo de suportes de armazenamento interno"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite à aplicação modificar o conteúdo dos suportes de armazenamento interno."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"aceder ao sistema de ficheiros da cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite a uma aplicação ler e escrever no sistema de ficheiros da cache."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"fazer/receber chamadas pela internet"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Emprego"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Outro"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduzir código PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduza a palavra-passe para desbloquear"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introduza o PIN para desbloquear"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorrecto!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Palavra-passe"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Iniciar sessão"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de utilizador ou palavra-passe inválidos."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"A verificar..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som activado"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 7cd6cc4e1e37..6cf440418fec 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -257,6 +257,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite que o detentor se sujeite à interface de nível superior de um método de entrada. Aplicativos normais não devem precisar disso em momento algum."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sujeitar-se a um plano de fundo"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite que o detentor se sujeite à interface de nível superior de um plano de fundo. Aplicativos normais não devem precisar disso em momento algum."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com o administrador de um dispositivo"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite que o detentor envie tentativas ao administrador de um dispositivo. Não é necessário para aplicativos normais."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"alterar orientação da tela"</string> @@ -608,6 +612,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Comercial"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Outros"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Digite o código PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Digite a senha para desbloquear"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Digite o PIN para desbloquear"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorreto!"</string> @@ -651,6 +657,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Senha"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Fazer login"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de usuário ou senha inválidos."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Verificando..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som ativado"</string> @@ -1030,4 +1038,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index a3d8191a54c1..54fb39efa600 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -259,6 +259,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permetta da sa fixar al nivel d\'interfatscha pli aut dad ina metoda d\'endataziun. Betg previs per applicaziuns normalas."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sa fixar vid in fund davos"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permetta da sa fixar al nivel d\'interfatscha pli aut dad ina metoda d\'endataziun. Betg previs per applicaziuns normalas."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interacziun cun in administratur dad apparats"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permetta al possessur da trametter intenziuns a l\'administratur dal apparat periferic. Betg previs per applicaziuns normalas."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"midar l\'orientaziun dal visur"</string> @@ -636,6 +640,8 @@ <!-- no translation found for sipAddressTypeOther (4408436162950119849) --> <skip /> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Endatar il code PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Endatai il pled-clav per debloccar."</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Endatar il PIN per debloccar"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Code PIN nuncorrect!"</string> @@ -681,6 +687,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Pled-clav"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"S\'annunziar"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Num d\'utilisader u pled-clav nunvalid."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Verifitgar..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Debloccar"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Tun activà"</string> @@ -1089,4 +1097,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 07a62134abb0..52f30c2f2eb7 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mod Avion"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modul Avion este ACTIVAT"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modul avion este DEZACTIVAT"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100 +"</string> <string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistemul Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicii cu plată"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite deţinătorului să se conecteze la interfaţa de nivel superior a unei metode de intrare. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"conectare la o imagine de fundal"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unei imagini de fundal. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interacţionare cu administratorul unui dispozitiv"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"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_setOrientation" msgid="3365947717163866844">"modificare orientare ecran"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificare/ştergere conţinut card SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite unei apl. să scrie în stoc. USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permite unei aplicaţii să scrie pe cardul SD."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificare/ştergere a conţinutului din stocarea media internă"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"mod./şt. con. stoc. media int."</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite unei aplicaţii să modifice conţinutul stocării media interne."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accesare sistem de fişiere cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite unei aplicaţii să scrie şi să citească sistemul de fişiere cache."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Serviciu"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Altul"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduceţi codul PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduceţi parola pentru a debloca"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introduceţi PIN pentru deblocare"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Cod PIN incorect!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Parolă"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Conectaţi-vă"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nume de utilizator sau parolă nevalide."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Se verifică..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Deblocaţi"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sunet activat"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index dfc5d089a23f..46261d18889e 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим полета"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим полета ВКЛЮЧЕН"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим полета ВЫКЛЮЧЕН"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Платные услуги"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Позволяет выполнять привязку к интерфейсу ввода верхнего уровня. Не требуется для обычных приложений."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"связать с фоновым рисунком"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Разрешает выполнять привязку к интерфейсу фонового рисунка верхнего уровня. Не требуется для обычных приложений."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаимодействовать с администратором устройства"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Позволяет владельцу отправлять целевые значения администратору устройства. Никогда не используется обычными приложениями."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"изменять ориентацию экрана"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"изменять/удалять содержимое SD-карты"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Разрешает приложению запись на USB-накопитель."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Разрешает приложению запись на SD-карту"</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"изм./удал. содерж. мультимедиа"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Позволяет приложению изменять содержание внутреннего хранилища мультимедиа."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"получать доступ к кэшу файловой системы"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Разрешает программам доступ для записи и чтения к кэшу файловой системы."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"совершать и принимать интернет-вызовы"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Рабочий"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Другой"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Введите PIN-код"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Введите пароль для разблокировки"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Введите PIN-код для разблокировки"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неверный PIN-код!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Пароль"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Вход"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Неверное имя пользователя или пароль."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Проверка..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Разблокировать"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Вкл. звук"</string> @@ -669,7 +674,7 @@ <string name="js_dialog_before_unload" msgid="1901675448179653089">"Перейти с этой страницы?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Нажмите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остаться на текущей странице."</string> <string name="save_password_label" msgid="6860261758665825069">"Подтвердите"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string> - <string name="autofill_this_form" msgid="1272247532604569872">"Автозап."</string> + <string name="autofill_this_form" msgid="1272247532604569872">"Автозаполнение"</string> <string name="setup_autofill" msgid="8154593408885654044">"Нужна настройка"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> @@ -692,7 +697,7 @@ <string name="save_password_never" msgid="8274330296785855105">"Никогда"</string> <string name="open_permission_deny" msgid="5661861460947222274">"У вас нет разрешения на открытие этой страницы."</string> <string name="text_copied" msgid="4985729524670131385">"Текст скопирован в буфер обмена."</string> - <string name="more_item_label" msgid="4650918923083320495">"Дополнительно"</string> + <string name="more_item_label" msgid="4650918923083320495">"Ещё"</string> <string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string> <string name="menu_space_shortcut_label" msgid="2410328639272162537">"пробел"</string> <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ввод"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index e7bbaf60bc84..0722bc941045 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim V lietadle"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim V lietadle je ZAPNUTÝ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim V lietadle je VYPNUTÝ"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Spoplatnené služby"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania metódy vstupu. Bežné aplikácie by toto nastavenie nemali vôbec využívať."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"väzba na tapetu"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania tapety. Bežné aplikácie by toto nastavenie vôbec nemali využívať."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"komunikovať so správcom zariadenia"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Umožňuje držiteľovi odosielať informácie správcovi zariadenia. Bežné aplikácie by toto oprávnenie nemali nikdy požadovať."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"zmena orientácie obrazovky"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Práca"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Iné"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Zadajte kód PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Zadajte heslo pre odomknutie"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Zadajte kód PIN pre odomknutie"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávny kód PIN"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Heslo"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Prihlásiť sa"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Neplatné používateľské meno alebo heslo."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Prebieha kontrola..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odomknúť"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zapnúť zvuk"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index c6b43025f7d0..1587d2eb5d09 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način za letalo"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Način za letalo je VKLOPLJEN"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način za letalo je IZKLOPLJEN"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100 +"</string> <string name="safeMode" msgid="2788228061547930246">"Varni način"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Plačljive storitve"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Dovoljuje lastniku, da se poveže z vmesnikom načina vnosa najvišje ravni. Tega nikoli ni treba uporabiti za navadne programe."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"povezovanje z ozadjem"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Dovoljuje, da se lastnik poveže z vmesnikom ozadja najvišje ravni. Tega nikoli ni treba uporabiti za navadne programe."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcija s skrbnikom naprave"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Dovoljuje lastniku, da pošlje namere skrbniku naprave. Nikoli se ne uporablja za navadne programe."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"spreminjanje usmerjenosti zaslona"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Služba"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Drugo"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Vnesite kodo PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Vnesite geslo za odklop"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Vnesite PIN za odklepanje"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nepravilna koda PIN."</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Geslo"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Prijava"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Neveljavno uporabniško ime ali geslo."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Preverjanje ..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odkleni"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Vklopi zvok"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 04936853cb09..dcf9f1a8297b 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим рада у авиону"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим рада у авиону је УКЉУЧЕН"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим рада у авиону је ИСКЉУЧЕН"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Android систем"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Услуге које се плаћају"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Омогућава власнику да се обавеже на интерфејс методе уноса највишег нивоа. Обичне апликације никада не би требало да је користе."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"обавезивање на позадину"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Омогућава власнику да се обавеже на интерфејс позадине највишег нивоа. Обичне апликације никада не би требало да је користе."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"интеракција са администратором уређаја"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Омогућава власнику да шаље своје намере администратору уређаја. Обичне апликације никада не би требало да је користе."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"промена положаја екрана"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Посао"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Други"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Унесите PIN кôд"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Унесите лозинку за откључавање"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Унесите PIN да бисте откључали тастатуру"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN кôд је нетачан!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Лозинка"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Пријави ме"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Неважеће корисничко име или лозинка."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Проверавање..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Откључај"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Укључи звук"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index a60e7f9be492..13cd84cca135 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flygplansläge"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flygplansläge är AKTIVERAT"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flygplansläge är INAKTIVERAT"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">">100"</string> <string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tjänster som kostar pengar"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en inmatningsmetod. Ska inte behövas för vanliga program."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"binda till en bakgrund"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en bakgrund. Ska inte behövas för vanliga program."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"arbeta med en enhetsadministratör"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillåter att innehavaren skickar avsikter till en enhetsadministratör. Vanliga program behöver aldrig göra detta."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"ändra bildskärmens rikting"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"ändra/ta bort innehåll på SD-kortet"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Får skriva till USB-enheten."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Tillåter att ett program skriver till SD-kortet."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ändra/ta bort innehåll"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Tillåter att en app ändrar innehållet på den interna lagringsenheten."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"åtkomst till cachefilsystemet"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillåter att ett program läser och skriver till cachefilsystemet."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"ringa/ta emot Internetsamtal"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbete"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Övrigt"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ange PIN-kod"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ange lösenord för att låsa upp"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Ange PIN-kod för att låsa upp"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Fel PIN-kod!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Lösenord"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Logga in"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ogiltigt användarnamn eller lösenord."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerar ..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås upp"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ljud på"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index f192c6dd0883..30a5ee7563cd 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดใช้งานบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string> <string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"บริการที่ต้องเสียค่าใช้จ่าย"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"อนุญาตให้ผู้ถือเชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของวิธีป้อนข้อมูล ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"เชื่อมโยงกับวอลเปเปอร์"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"อนุญาตให้ผู้ถือเชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของวอลเปเปอร์ ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ติดต่อกับผู้ดูแลอุปกรณ์"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"อนุญาตให้ผู้ถือส่งเนื้อหาไปยังโปรแกรมควบคุมอุปกรณ์ ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"เปลี่ยนการวางแนวหน้าจอ"</string> @@ -465,7 +468,7 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"แก้ไข/ลบข้อมูลการ์ด SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"อนุญาตให้แอปพลิเคชันเขียนไปยังที่เก็บข้อมูล USB"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้ไข/ลบเนื้อหาของที่เก็บข้อมูลสื่อภายใน"</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้/ลบเนื้อหาข้อมูลสื่อภายใน"</string> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"อนุญาตให้แอปพลิเคชันแก้ไขเนื้อหาของที่เก็บข้อมูลสื่อภายใน"</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"เข้าถึงระบบไฟล์แคช"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"อนุญาตให้แอปพลิเคชันอ่านและเขียนระบบไฟล์แคช"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"ที่ทำงาน"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"อื่นๆ"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"ป้อนรหัส PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"ป้อนรหัสผ่านเพื่อปลดล็อก"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"ป้อน PIN เพื่อปลดล็อก"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"รหัส PIN ไม่ถูกต้อง!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"รหัสผ่าน"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ลงชื่อเข้าใช้"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"กำลังตรวจสอบ..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"ปลดล็อก"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"เปิดเสียง"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index d42ef2897016..577accb4f7d7 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Naka-ON ang airplane mode"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Naka-OFF ang airplane mode"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Mga serbisyong ginagastusan mo"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Pinapayagan ang holder na sumailalim sa nangungunang antas na interface ng pamamaraan ng pag-input. Hindi dapat kailanmang kailanganin para sa mga normal na application."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sumailalim sa wallpaper"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Pinapayagan ang holder na sumailalim sa interface na nasa nangungunang antas ng wallpaper. Hindi kailanman dapat na kailanganin para sa mga normal na application."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"makipag-ugnay sa tagapangasiwa ng device"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Pinapayagan ang holder na magpadala ng mga intensyon sa administrator ng device. Hindi kailanman dapat kailanganin para sa mga normal na application."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"baguhin ang orientation ng screen"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabaho"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Iba pa"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ipasok ang PIN code"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ipasok ang password upang i-unlock"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Ipasok ang PIN upang i-unlock"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Maling PIN code!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Password"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Mag-sign in"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Di-wastong username o password."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Sinusuri..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"I-unlock"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"I-on ang tunog"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 8b338ddde320..45bc2b26e7f9 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Uçak modu"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçak modu AÇIK"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Uçak modu KAPALI"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string> <string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Size maliyet getiren hizmetler"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tutucunun bir giriş yönteminin en üst düzey arayüzüne bağlanmasına izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bir duvar kağıdına tabi kıl"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Hesap sahibine bir duvar kağıdının en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"bir cihaz yöneticisi ile etkileşimde bulun"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Cihazın sahibinin cihaz yöneticisine amaç göndermesine izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"ekran yönünü değiştir"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"SD kart içeriklerini değiştir/sil"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Uygulamanın USB dep birimine yazmasına izni verir."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Bir uygulamaya SD karta yazma izni verir."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"dahili medya depolama birimi içeriğini değiştir/sil"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Uygulamaya, dahili medya depolama içeriğini değiştirme izni verir."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"önbellek dosya sistemine eriş"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Bir uygulamanın önbellek dosya sisteminde okuma yazma yapmasına izin verir."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"İnternet çağrılar yap/alma"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Diğer"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN kodunu gir"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Kilidi açmak için şifreyi girin"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Kilidi açmak için PIN\'i girin"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Yanlış PIN kodu!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Şifre"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Oturum aç"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Geçersiz kullanıcı adı veya şifre."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrol ediliyor..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilit Aç"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sesi aç"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 6e5fdaa9b5e3..7d5a8f542274 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим польоту"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим польоту ВВІМК."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим польоту ВИМК."</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Служби, які потребують оплати"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Дозволяє власнику прив\'язувати до інтерфейсу верхнього рівня методу введення. Ніколи не потрібний для звичайних програм."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"прив\'зати до фон. мал."</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Дозволяє власнику прив\'язувати до інтерфейсу верхнього рівня фон. малюнка. Ніколи не потрібний для звичайних програм."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаємодіяти з адмін. пристрою"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Дозволяє власнику надсилати цілі адміністратору пристрою. Ніколи не потрібний для звичайних програм."</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"змінювати орієнтацію екрана"</string> @@ -465,8 +468,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"змінювати/видал. вміст карти SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Дозволяє програмі записувати на носій USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Дозволяє програмі записувати на карту SD."</string> - <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змін./видаляти вміст внутр. сховища медіа-файлів"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Дозволяє програмі змінювати вміст внутрішнього сховища медіа-файлів."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змінювати/видаляти вміст внутр. сховища даних"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Дозволяє програмі змінювати вміст внутрішнього сховища даних."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"отр. дост. до файл. сист. кешу"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Дозволяє програмі зчитувати та записувати файлову сист. кешу."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"здійсн./отрим. Інтернет-дзвін."</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Робоча"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Інша"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Введіть PIN-код"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Введіть пароль, щоб розбл."</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Введ. PIN для розблок."</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправильний PIN-код!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Пароль"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Увійти"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Недійсне ім\'я корист. чи пароль."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Перевірка..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Розблок."</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Увімк. звук"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 08c89902572d..9f0a4f547b46 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -151,8 +151,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Chế độ trên máy bay"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Chế độ trên máy bay BẬT"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Chế độ trên máy bay TẮT"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string> <string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Dịch vụ tính tiền của bạn"</string> @@ -256,6 +255,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Cho phép chủ nhân ràng buộc với giao diện cấp cao nhất của phương thức nhập. Không cần thiết cho các ứng dụng thông thường."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"liên kết với hình nền"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Cho phép chủ nhân ràng buộc với giao diện cấp cao nhất của hình nền. Không cần thiết cho các ứng dụng thông thường."</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <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="8714424333082216979">"Cho phép chủ nhân 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_setOrientation" msgid="3365947717163866844">"thay đổi hướng màn hình"</string> @@ -466,7 +469,7 @@ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"C.phép ứ.dụng ghi vào b.nhớ USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Cho phép ứng dụng ghi vào thẻ SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"sửa đổi/xóa nội dung trên bộ nhớ phương tiện cục bộ"</string> - <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Cho phép ứng dụng sửa đổi nội dung của bộ nhớ phương tiện nội bộ."</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Cho phép ứng dụng sửa đổi nội dung của bộ nhớ phương tiện cục bộ."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"truy cập hệ thống tệp bộ nhớ cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Cho phép ứng dụng đọc và ghi hệ thống tệp bộ nhớ cache."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"thực hiện/nhận cuộc gọi qua Internet"</string> @@ -605,6 +608,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Cơ quan"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Khác"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Nhập mã PIN"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Nhập mật khẩu để mở khoá"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Nhập PIN để mở khóa"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Mã PIN không chính xác!"</string> @@ -648,6 +653,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Mật khẩu"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Đăng nhập"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Tên người dùng hoặc mật khẩu không hợp lệ."</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Đang kiểm tra..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Mở khoá"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Bật âm thanh"</string> @@ -1024,4 +1031,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ecfdd63d6a0f..f69f965cd13e 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -257,6 +257,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"允许手机用户绑定至输入法的顶级界面。普通应用程序从不需要使用此权限。"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"绑定到壁纸"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"允许手机用户绑定到壁纸的顶级界面。应该从不需要将此权限授予普通应用程序。"</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"与设备管理器交互"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"允许持有对象将意向发送到设备管理器。普通的应用程序一律无需此权限。"</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"更改屏幕显示方向"</string> @@ -608,6 +612,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"单位"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"其他"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"输入 PIN 码"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"输入密码进行解锁"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"输入 PIN 进行解锁"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 码不正确!"</string> @@ -651,6 +657,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"密码"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"登录"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"用户名或密码无效。"</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"正在检查..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"解锁"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"打开声音"</string> @@ -1030,4 +1038,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 28cb8b2f4ca5..a584cd3bd221 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -152,8 +152,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛航模式"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛航模式為 [關閉]"</string> - <!-- no translation found for status_bar_notification_info_overflow (5833510281787786290) --> - <skip /> + <string name="status_bar_notification_info_overflow" msgid="5833510281787786290">"100+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"需要額外費用的服務。"</string> @@ -257,6 +256,10 @@ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"允許擁有人連結至輸入法的最頂層介面。一般應用程式不需使用此選項。"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"連結至桌布"</string> <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"允許擁有人連結至桌布的最頂層介面,一般應用程式不需使用此選項。"</string> + <!-- no translation found for permlab_bindRemoteViews (5697987759897367099) --> + <skip /> + <!-- no translation found for permdesc_bindRemoteViews (2930855984822926963) --> + <skip /> <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"與裝置管理員互動"</string> <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"允許應用程式將調用請求 (intent) 傳送至裝置管理員;一般應用程式不需使用此選項。"</string> <string name="permlab_setOrientation" msgid="3365947717163866844">"變更螢幕顯示方向"</string> @@ -466,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"修改/刪除 SD 卡的內容"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"允許應用程式寫入 USB 儲存裝置。"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"允許應用程式寫入 SD 卡。"</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"修改/刪除內部媒體儲存裝置內容"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"允許應用程式修改內部媒體儲存裝置內容。"</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"存取快取檔案系統"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"允許應用程式讀取及寫入快取檔案系統。"</string> <string name="permlab_use_sip" msgid="5986952362795870502">"撥打/接聽網路電話"</string> @@ -608,6 +609,8 @@ <string name="sipAddressTypeWork" msgid="6920725730797099047">"公司"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"其他"</string> <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"輸入 PIN 碼"</string> + <!-- no translation found for keyguard_password_entry_touch_hint (7906561917570259833) --> + <skip /> <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"輸入密碼即可解鎖"</string> <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"輸入 PIN 進行解鎖"</string> <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 碼錯誤!"</string> @@ -651,6 +654,8 @@ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"密碼"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"登入"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"使用者名稱或密碼錯誤。"</string> + <!-- no translation found for lockscreen_glogin_account_recovery_hint (8253152905532900548) --> + <skip /> <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"檢查中..."</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"解除封鎖"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"開啟音效"</string> @@ -1030,4 +1035,12 @@ <skip /> <!-- no translation found for sync_do_nothing (8717589462945226869) --> <skip /> + <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> + <skip /> + <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> + <skip /> + <!-- no translation found for vpn_notification_hint_disconnected (4689796928510104200) --> + <skip /> + <!-- no translation found for choose_account_label (4191313562041125787) --> + <skip /> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index c808a07594a7..a404fba6dd66 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -223,6 +223,9 @@ <!-- The preferred right bound for an expandable list child's indicator. --> <attr name="expandableListPreferredChildIndicatorRight" format="dimension" /> + <!-- The preferred item height for dropdown lists. --> + <attr name="dropdownListPreferredItemHeight" format="dimension" /> + <!-- ============= --> <!-- Window styles --> <!-- ============= --> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 1a6f404d62ff..ff9ef59fe215 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -56,8 +56,8 @@ <color name="hint_foreground_light">#808080</color> <color name="highlight_background">#cc475925</color> <color name="highlight_background_inverse">#ccd2e461</color> - <color name="highlighted_text_dark">#cc475925</color> - <color name="highlighted_text_light">#ccd2e461</color> + <color name="highlighted_text_dark">#9983CC39</color> + <color name="highlighted_text_light">#9983CC39</color> <color name="link_text_dark">#5c5cff</color> <color name="link_text_light">#0000ee</color> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 36dec8e4a380..25a43e015223 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1065,19 +1065,20 @@ </style> <style name="TextAppearance.Widget.ActionBar.Title" - parent="@android:style/TextAppearance.Medium.Inverse"> + parent="@android:style/TextAppearance.Medium"> </style> <style name="TextAppearance.Widget.ActionBar.Subtitle" - parent="@android:style/TextAppearance.Small.Inverse"> + parent="@android:style/TextAppearance.Small"> </style> <style name="TextAppearance.Widget.ActionMode.Title" - parent="@android:style/TextAppearance.Medium.Inverse"> + parent="@android:style/TextAppearance.Medium"> </style> <style name="TextAppearance.Widget.ActionMode.Subtitle" - parent="@android:style/TextAppearance.Small.Inverse"> + parent="@android:style/TextAppearance.Small"> + <item name="android:textColor">?android:attr/textColorSecondary</item> </style> <style name="Widget.ActionButton"> @@ -1266,11 +1267,9 @@ </style> <style name="TextAppearance.Holo.Widget.ActionMode.Title" parent="TextAppearance.Widget.ActionMode.Title"> - <item name="android:textColor">?android:attr/textColorPrimary</item> </style> <style name="TextAppearance.Holo.Widget.ActionMode.Subtitle" parent="TextAppearance.Widget.ActionMode.Subtitle"> - <item name="android:textColor">?android:attr/textColorSecondary</item> </style> <style name="TextAppearance.Holo.Widget.Switch" parent="TextAppearance.Holo.Small"> @@ -1369,11 +1368,9 @@ </style> <style name="TextAppearance.Holo.Light.Widget.ActionMode.Title" parent="TextAppearance.Widget.ActionMode.Title"> - <item name="android:textColor">?android:attr/textColorPrimary</item> </style> <style name="TextAppearance.Holo.Light.Widget.ActionMode.Subtitle" parent="TextAppearance.Widget.ActionMode.Subtitle"> - <item name="android:textColor">?android:attr/textColorPrimary</item> </style> <style name="TextAppearance.Holo.Light.WindowTitle"> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 08542bf7f86e..03eca1cc579a 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -95,6 +95,8 @@ <!-- List attributes --> <item name="listPreferredItemHeight">64dip</item> + <item name="dropdownListPreferredItemHeight">64dip</item> + <!-- @hide --> <item name="searchResultListItemHeight">58dip</item> <item name="listDivider">@drawable/divider_horizontal_dark</item> @@ -253,7 +255,7 @@ <item name="actionDropDownStyle">@android:style/Widget.Spinner.DropDown</item> <item name="actionButtonStyle">@android:style/Widget.ActionButton</item> <item name="actionOverflowButtonStyle">@android:style/Widget.ActionButton.Overflow</item> - <item name="actionModeBackground">@android:drawable/action_bar_context_background</item> + <item name="actionModeBackground">@android:drawable/cab_background_dark</item> <item name="actionModeCloseDrawable">@android:drawable/ic_menu_close_clear_cancel</item> <item name="actionModeCutDrawable">@android:drawable/ic_menu_cut_dark</item> <item name="actionModeCopyDrawable">@android:drawable/ic_menu_copy_dark</item> @@ -376,6 +378,8 @@ <item name="actionModeCutDrawable">@android:drawable/ic_menu_cut_light</item> <item name="actionModeCopyDrawable">@android:drawable/ic_menu_copy_light</item> <item name="actionModePasteDrawable">@android:drawable/ic_menu_paste_light</item> + <item name="actionModeBackground">@android:drawable/cab_background_light</item> + <!-- SearchView attributes --> <item name="searchDropdownBackground">@android:drawable/search_dropdown_light</item> <item name="searchViewCloseIcon">@android:drawable/ic_clear_holo_light</item> @@ -813,6 +817,8 @@ <!-- List attributes --> <item name="listPreferredItemHeight">64dip</item> + <item name="dropdownListPreferredItemHeight">48dip</item> + <!-- @hide --> <item name="searchResultListItemHeight">58dip</item> <item name="listDivider">@drawable/list_divider_holo_dark</item> @@ -1084,6 +1090,8 @@ <!-- List attributes --> <item name="listPreferredItemHeight">64dip</item> + <item name="dropdownListPreferredItemHeight">48dip</item> + <!-- @hide --> <item name="searchResultListItemHeight">58dip</item> <item name="listDivider">@drawable/list_divider_holo_light</item> diff --git a/data/fonts/AndroidClock-Solid.ttf b/data/fonts/AndroidClock-Solid.ttf Binary files differnew file mode 100644 index 000000000000..108839e39306 --- /dev/null +++ b/data/fonts/AndroidClock-Solid.ttf diff --git a/data/fonts/AndroidClock.ttf b/data/fonts/AndroidClock.ttf Binary files differindex 03e36cb66903..7b550eeda2d8 100644 --- a/data/fonts/AndroidClock.ttf +++ b/data/fonts/AndroidClock.ttf diff --git a/data/fonts/AndroidClock_Highlight.ttf b/data/fonts/AndroidClock_Highlight.ttf Binary files differindex 8fb31bae8d3a..a95d5482840c 100644 --- a/data/fonts/AndroidClock_Highlight.ttf +++ b/data/fonts/AndroidClock_Highlight.ttf diff --git a/data/keyboards/qwerty.idc b/data/keyboards/qwerty.idc index 129b0bca2b3f..4cf0b84625b2 100644 --- a/data/keyboards/qwerty.idc +++ b/data/keyboards/qwerty.idc @@ -21,3 +21,5 @@ keyboard.characterMap = qwerty keyboard.orientationAware = 1 keyboard.builtIn = 1 +cursor.mode = navigation +cursor.orientationAware = 1 diff --git a/data/keyboards/qwerty2.idc b/data/keyboards/qwerty2.idc index 1a795c6c0be2..2e5a9381d668 100644 --- a/data/keyboards/qwerty2.idc +++ b/data/keyboards/qwerty2.idc @@ -21,3 +21,5 @@ keyboard.characterMap = qwerty2 keyboard.orientationAware = 1 keyboard.builtIn = 1 +cursor.mode = navigation +cursor.orientationAware = 1 diff --git a/include/utils/Functor.h b/include/utils/Functor.h new file mode 100644 index 000000000000..3955bc346079 --- /dev/null +++ b/include/utils/Functor.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2011 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. + */ + +#ifndef ANDROID_FUNCTOR_H +#define ANDROID_FUNCTOR_H + +#include <utils/Errors.h> + +namespace android { + +class Functor { +public: + Functor() {} + virtual ~Functor() {} + virtual status_t operator ()() { return true; } +}; + +}; // namespace android + +#endif // ANDROID_FUNCTOR_H diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index ffd3be470fe6..c2106d49f7e4 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -117,7 +117,8 @@ const char* DisplayList::OP_NAMES[] = { "ResetColorFilter", "SetupColorFilter", "ResetShadow", - "SetupShadow" + "SetupShadow", + "DrawGLFunction" }; DisplayList::DisplayList(const DisplayListRenderer& recorder) { @@ -212,7 +213,8 @@ void DisplayList::init() { mPathHeap = NULL; } -void DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { +bool DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { + bool needsInvalidate = false; TextContainer text; mReader.rewind(); @@ -229,87 +231,165 @@ void DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { int saveCount = renderer.getSaveCount() - 1; while (!mReader.eof()) { int op = mReader.readInt(); - DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); switch (op) { + case DrawGLFunction: { + Functor *functor = (Functor *) getInt(); + DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); + needsInvalidate |= renderer.callDrawGLFunction(functor); + } + break; case AcquireContext: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.acquireContext(); } break; case ReleaseContext: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.releaseContext(); } break; case Save: { - renderer.save(getInt()); + int rendererNum = getInt(); + DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); + renderer.save(rendererNum); } break; case Restore: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.restore(); } break; case RestoreToCount: { - renderer.restoreToCount(saveCount + getInt()); + int restoreCount = saveCount + getInt(); + DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); + renderer.restoreToCount(restoreCount); } break; case SaveLayer: { - renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(), - getPaint(), getInt()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + SkPaint* paint = getPaint(); + int flags = getInt(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, + OP_NAMES[op], f1, f2, f3, f4, paint, flags); + renderer.saveLayer(f1, f2, f3, f4, paint, flags); } break; case SaveLayerAlpha: { - renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(), - getInt(), getInt()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + int alpha = getInt(); + int flags = getInt(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, + OP_NAMES[op], f1, f2, f3, f4, alpha, flags); + renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); } break; case Translate: { - renderer.translate(getFloat(), getFloat()); + float f1 = getFloat(); + float f2 = getFloat(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); + renderer.translate(f1, f2); } break; case Rotate: { - renderer.rotate(getFloat()); + float rotation = getFloat(); + DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); + renderer.rotate(rotation); } break; case Scale: { - renderer.scale(getFloat(), getFloat()); + float sx = getFloat(); + float sy = getFloat(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); + renderer.scale(sx, sy); } break; case Skew: { - renderer.skew(getFloat(), getFloat()); + float sx = getFloat(); + float sy = getFloat(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); + renderer.skew(sx, sy); } break; case SetMatrix: { - renderer.setMatrix(getMatrix()); + SkMatrix* matrix = getMatrix(); + DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); + renderer.setMatrix(matrix); } break; case ConcatMatrix: { - renderer.concatMatrix(getMatrix()); + SkMatrix* matrix = getMatrix(); + DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); + renderer.concatMatrix(matrix); } break; case ClipRect: { - renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(), - (SkRegion::Op) getInt()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + int regionOp = getInt(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], + f1, f2, f3, f4, regionOp); + renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); } break; case DrawDisplayList: { - renderer.drawDisplayList(getDisplayList(), level + 1); + DisplayList* displayList = getDisplayList(); + DISPLAY_LIST_LOGD("%s%s %p, %d", (char*) indent, OP_NAMES[op], + displayList, level + 1); + needsInvalidate |= renderer.drawDisplayList(displayList, level + 1); } break; case DrawLayer: { - renderer.drawLayer((Layer*) getInt(), getFloat(), getFloat(), getPaint()); + Layer* layer = (Layer*) getInt(); + float x = getFloat(); + float y = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], + layer, x, y, paint); + renderer.drawLayer(layer, x, y, paint); } break; case DrawBitmap: { - renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint()); + SkBitmap* bitmap = getBitmap(); + float x = getFloat(); + float y = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], + bitmap, x, y, paint); + renderer.drawBitmap(bitmap, x, y, paint); } break; case DrawBitmapMatrix: { - renderer.drawBitmap(getBitmap(), getMatrix(), getPaint()); + SkBitmap* bitmap = getBitmap(); + SkMatrix* matrix = getMatrix(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], + bitmap, matrix, paint); + renderer.drawBitmap(bitmap, matrix, paint); } break; case DrawBitmapRect: { - renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(), - getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); + SkBitmap* bitmap = getBitmap(); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + float f5 = getFloat(); + float f6 = getFloat(); + float f7 = getFloat(); + float f8 = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", + (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); + renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); } break; case DrawBitmapMesh: { @@ -323,6 +403,7 @@ void DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { bool hasColors = getInt(); int* colors = hasColors ? getInts(colorsCount) : NULL; + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint()); } break; @@ -340,80 +421,148 @@ void DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { yDivs = getInts(yDivsCount); colors = getUInts(numColors); + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount, numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); } break; case DrawColor: { - renderer.drawColor(getInt(), (SkXfermode::Mode) getInt()); + int color = getInt(); + int xferMode = getInt(); + DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); + renderer.drawColor(color, (SkXfermode::Mode) xferMode); } break; case DrawRect: { - renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], + f1, f2, f3, f4, paint); + renderer.drawRect(f1, f2, f3, f4, paint); } break; case DrawRoundRect: { - renderer.drawRoundRect(getFloat(), getFloat(), getFloat(), getFloat(), - getFloat(), getFloat(), getPaint()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + float f5 = getFloat(); + float f6 = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); + renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); } break; case DrawCircle: { - renderer.drawCircle(getFloat(), getFloat(), getFloat(), getPaint()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", + (char*) indent, OP_NAMES[op], f1, f2, f3, paint); + renderer.drawCircle(f1, f2, f3, paint); } break; case DrawOval: { - renderer.drawOval(getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); + renderer.drawOval(f1, f2, f3, f4, paint); } break; case DrawArc: { - renderer.drawArc(getFloat(), getFloat(), getFloat(), getFloat(), - getFloat(), getFloat(), getInt() == 1, getPaint()); + float f1 = getFloat(); + float f2 = getFloat(); + float f3 = getFloat(); + float f4 = getFloat(); + float f5 = getFloat(); + float f6 = getFloat(); + int i1 = getInt(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); + renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); } break; case DrawPath: { - renderer.drawPath(getPath(), getPaint()); + SkPath* path = getPath(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); + renderer.drawPath(path, paint); } break; case DrawLines: { int count = 0; float* points = getFloats(count); + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.drawLines(points, count, getPaint()); } break; case DrawText: { getText(&text); - renderer.drawText(text.text(), text.length(), getInt(), - getFloat(), getFloat(), getPaint()); + int count = getInt(); + float x = getFloat(); + float y = getFloat(); + SkPaint* paint = getPaint(); + DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], + text.text(), text.length(), count, x, y, paint); + renderer.drawText(text.text(), text.length(), count, x, y, paint); } break; case ResetShader: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.resetShader(); } break; case SetupShader: { - renderer.setupShader(getShader()); + SkiaShader* shader = getShader(); + DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); + renderer.setupShader(shader); } break; case ResetColorFilter: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.resetColorFilter(); } break; case SetupColorFilter: { - renderer.setupColorFilter(getColorFilter()); + SkiaColorFilter *colorFilter = getColorFilter(); + DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); + renderer.setupColorFilter(colorFilter); } break; case ResetShadow: { + DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); renderer.resetShadow(); } break; case SetupShadow: { - renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt()); - } - break; + float radius = getFloat(); + float dx = getFloat(); + float dy = getFloat(); + int color = getInt(); + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], + radius, dx, dy, color); + renderer.setupShadow(radius, dx, dy, color); + } + break; + default: + DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", + (char*) indent, OP_NAMES[op]); + break; } } - DISPLAY_LIST_LOGD("%sDone", (char*) indent + 2); + DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate); + return needsInvalidate; } /////////////////////////////////////////////////////////////////////////////// @@ -480,7 +629,8 @@ void DisplayListRenderer::setViewport(int width, int height) { mHeight = height; } -void DisplayListRenderer::prepare(bool opaque) { +void DisplayListRenderer::prepareDirty(float left, float top, + float right, float bottom, bool opaque) { mSnapshot = new Snapshot(mFirstSnapshot, SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); mSaveCount = 1; @@ -493,12 +643,26 @@ void DisplayListRenderer::finish() { OpenGLRenderer::finish(); } +void DisplayListRenderer::interrupt() { + +} +void DisplayListRenderer::resume() { + +} void DisplayListRenderer::acquireContext() { + // TODO: probably noop instead of calling super addOp(DisplayList::AcquireContext); OpenGLRenderer::acquireContext(); } +bool DisplayListRenderer::callDrawGLFunction(Functor *functor) { + addOp(DisplayList::DrawGLFunction); + addInt((int) functor); + return false; // No invalidate needed at record-time +} + void DisplayListRenderer::releaseContext() { + // TODO: probably noop instead of calling super addOp(DisplayList::ReleaseContext); OpenGLRenderer::releaseContext(); } @@ -581,9 +745,10 @@ bool DisplayListRenderer::clipRect(float left, float top, float right, float bot return OpenGLRenderer::clipRect(left, top, right, bottom, op); } -void DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { +bool DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { addOp(DisplayList::DrawDisplayList); addDisplayList(displayList); + return false; } void DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { @@ -684,7 +849,7 @@ void DisplayListRenderer::drawOval(float left, float top, float right, float bot void DisplayListRenderer::drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { - addOp(DisplayList::DrawOval); + addOp(DisplayList::DrawArc); addBounds(left, top, right, bottom); addPoint(startAngle, sweepAngle); addInt(useCenter ? 1 : 0); diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 35bb163f9c62..bab5149b093a 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -28,6 +28,7 @@ #include <SkTSearch.h> #include "OpenGLRenderer.h" +#include "utils/Functor.h" namespace android { namespace uirenderer { @@ -124,13 +125,14 @@ public: SetupColorFilter, ResetShadow, SetupShadow, + DrawGLFunction, }; static const char* OP_NAMES[]; void initFromDisplayListRenderer(const DisplayListRenderer& recorder); - void replay(OpenGLRenderer& renderer, uint32_t level = 0); + bool replay(OpenGLRenderer& renderer, uint32_t level = 0); private: void init(); @@ -239,12 +241,16 @@ public: DisplayList* getDisplayList(); void setViewport(int width, int height); - void prepare(bool opaque); + void prepareDirty(float left, float top, float right, float bottom, bool opaque); void finish(); + bool callDrawGLFunction(Functor *functor); void acquireContext(); void releaseContext(); + void interrupt(); + void resume(); + int save(int flags); void restore(); void restoreToCount(int saveCount); @@ -264,7 +270,7 @@ public: bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); - void drawDisplayList(DisplayList* displayList, uint32_t level = 0); + bool drawDisplayList(DisplayList* displayList, uint32_t level = 0); void drawLayer(Layer* layer, float x, float y, SkPaint* paint); void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 1c89577207c6..36709dcf98c7 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -26,7 +26,7 @@ namespace uirenderer { // Rendering /////////////////////////////////////////////////////////////////////////////// -void LayerRenderer::prepare(bool opaque) { +void LayerRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) { LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->fbo); #if RENDER_LAYERS_AS_REGIONS @@ -35,7 +35,7 @@ void LayerRenderer::prepare(bool opaque) { glBindFramebuffer(GL_FRAMEBUFFER, mLayer->fbo); - OpenGLRenderer::prepare(opaque); + OpenGLRenderer::prepareDirty(0.0f, 0.0f, mLayer->width, mLayer->height, opaque); } void LayerRenderer::finish() { diff --git a/libs/hwui/LayerRenderer.h b/libs/hwui/LayerRenderer.h index 1e398470a082..d2f565e4f307 100644 --- a/libs/hwui/LayerRenderer.h +++ b/libs/hwui/LayerRenderer.h @@ -46,7 +46,7 @@ public: ~LayerRenderer() { } - void prepare(bool opaque); + void prepareDirty(float left, float top, float right, float bottom, bool opaque); void finish(); bool hasLayer(); diff --git a/libs/hwui/OpenGLDebugRenderer.cpp b/libs/hwui/OpenGLDebugRenderer.cpp index 29bcde8e6d28..58d6c26940c7 100644 --- a/libs/hwui/OpenGLDebugRenderer.cpp +++ b/libs/hwui/OpenGLDebugRenderer.cpp @@ -48,10 +48,10 @@ int OpenGLDebugRenderer::saveLayer(float left, float top, float right, float bot return OpenGLRenderer::saveLayer(left, top, right, bottom, p, flags); } -void OpenGLDebugRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { +bool OpenGLDebugRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { mPrimitivesCount++; StopWatch w("drawDisplayList"); - OpenGLRenderer::drawDisplayList(displayList); + return OpenGLRenderer::drawDisplayList(displayList); } void OpenGLDebugRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { diff --git a/libs/hwui/OpenGLDebugRenderer.h b/libs/hwui/OpenGLDebugRenderer.h index aefa7bfa65ba..76e6a2e90b0f 100644 --- a/libs/hwui/OpenGLDebugRenderer.h +++ b/libs/hwui/OpenGLDebugRenderer.h @@ -40,7 +40,7 @@ public: int saveLayer(float left, float top, float right, float bottom, SkPaint* p, int flags); - void drawDisplayList(DisplayList* displayList, uint32_t level = 0); + bool drawDisplayList(DisplayList* displayList, uint32_t level = 0); void drawLayer(Layer* layer, float x, float y, SkPaint* paint); void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index e8dc9f6cfd86..9f491b3d31c1 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -136,6 +136,10 @@ void OpenGLRenderer::setViewport(int width, int height) { } void OpenGLRenderer::prepare(bool opaque) { + prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque); +} + +void OpenGLRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) { mCaches.clearGarbage(); mSnapshot = new Snapshot(mFirstSnapshot, @@ -146,15 +150,14 @@ void OpenGLRenderer::prepare(bool opaque) { glDisable(GL_DITHER); + glEnable(GL_SCISSOR_TEST); + glScissor(left, mSnapshot->height - bottom, right - left, bottom - top); + mSnapshot->setClip(left, top, right, bottom); + if (!opaque) { - glDisable(GL_SCISSOR_TEST); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } - - glEnable(GL_SCISSOR_TEST); - glScissor(0, 0, mWidth, mHeight); - mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); } void OpenGLRenderer::finish() { @@ -213,6 +216,13 @@ void OpenGLRenderer::releaseContext() { resume(); } +bool OpenGLRenderer::callDrawGLFunction(Functor *functor) { + interrupt(); + status_t result = (*functor)(); + resume(); + return (result == 0) ? false : true; +} + /////////////////////////////////////////////////////////////////////////////// // State management /////////////////////////////////////////////////////////////////////////////// @@ -1031,12 +1041,13 @@ void OpenGLRenderer::finishDrawTexture() { // Drawing /////////////////////////////////////////////////////////////////////////////// -void OpenGLRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { +bool OpenGLRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) { // All the usual checks and setup operations (quickReject, setupDraw, etc.) // will be performed by the display list itself if (displayList) { - displayList->replay(*this, level); + return displayList->replay(*this, level); } + return false; } void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { @@ -1202,8 +1213,7 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int const bool pureTranslate = mSnapshot->transform->isPureTranslate(); #if RENDER_LAYERS_AS_REGIONS // Mark the current layer dirty where we are going to draw the patch - if ((mSnapshot->flags & Snapshot::kFlagFboTarget) && - mSnapshot->region && mesh->hasEmptyQuads) { + if (hasLayer() && mesh->hasEmptyQuads) { const size_t count = mesh->quads.size(); for (size_t i = 0; i < count; i++) { const Rect& bounds = mesh->quads.itemAt(i); @@ -1599,18 +1609,18 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { layer->alpha = alpha; layer->mode = mode; - #if RENDER_LAYERS_AS_REGIONS if (!layer->region.isEmpty()) { if (layer->region.isRect()) { const Rect r(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); composeLayerRect(layer, r); } else if (layer->mesh) { + const float a = alpha / 255.0f; const Rect& rect = layer->layer; setupDraw(); setupDrawWithTexture(); - setupDrawColor(alpha, alpha, alpha, alpha); + setupDrawColor(a, a, a, a); setupDrawColorFilter(); setupDrawBlending(layer->blend || layer->alpha < 255, layer->mode, false); setupDrawProgram(); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index eec37501784d..77de1d2270a8 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -27,6 +27,7 @@ #include <SkShader.h> #include <SkXfermode.h> +#include <utils/Functor.h> #include <utils/RefBase.h> #include <utils/Vector.h> @@ -61,13 +62,15 @@ public: virtual void setViewport(int width, int height); - virtual void prepare(bool opaque); + void prepare(bool opaque); + virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque); virtual void finish(); // These two calls must not be recorded in display lists - void interrupt(); - void resume(); + virtual void interrupt(); + virtual void resume(); + virtual bool callDrawGLFunction(Functor *functor); virtual void acquireContext(); virtual void releaseContext(); @@ -95,7 +98,7 @@ public: bool quickReject(float left, float top, float right, float bottom); virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); - virtual void drawDisplayList(DisplayList* displayList, uint32_t level = 0); + virtual bool drawDisplayList(DisplayList* displayList, uint32_t level = 0); virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint); virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); diff --git a/libs/rs/java/tests/src/com/android/rs/test/math.rs b/libs/rs/java/tests/src/com/android/rs/test/math.rs index 02993fe5bb05..8cad82bfd569 100644 --- a/libs/rs/java/tests/src/com/android/rs/test/math.rs +++ b/libs/rs/java/tests/src/com/android/rs/test/math.rs @@ -12,6 +12,31 @@ volatile int2 i2; volatile int3 i3; volatile int4 i4; +volatile uint ui1; +volatile uint2 ui2; +volatile uint3 ui3; +volatile uint4 ui4; + +volatile short s1; +volatile short2 s2; +volatile short3 s3; +volatile short4 s4; + +volatile ushort us1; +volatile ushort2 us2; +volatile ushort3 us3; +volatile ushort4 us4; + +volatile char c1; +volatile char2 c2; +volatile char3 c3; +volatile char4 c4; + +volatile uchar uc1; +volatile uchar2 uc2; +volatile uchar3 uc3; +volatile uchar4 uc4; + #define TEST_FN_FUNC_FN(fnc) \ rsDebug("Testing " #fnc, 0); \ f1 = fnc(f1); \ @@ -168,9 +193,124 @@ static bool test_fp_math(uint32_t index) { return failed; } +#define DECL_INT(prefix) \ +volatile char prefix##_c_1 = 1; \ +volatile char2 prefix##_c_2 = 1; \ +volatile char3 prefix##_c_3 = 1; \ +volatile char4 prefix##_c_4 = 1; \ +volatile uchar prefix##_uc_1 = 1; \ +volatile uchar2 prefix##_uc_2 = 1; \ +volatile uchar3 prefix##_uc_3 = 1; \ +volatile uchar4 prefix##_uc_4 = 1; \ +volatile short prefix##_s_1 = 1; \ +volatile short2 prefix##_s_2 = 1; \ +volatile short3 prefix##_s_3 = 1; \ +volatile short4 prefix##_s_4 = 1; \ +volatile ushort prefix##_us_1 = 1; \ +volatile ushort2 prefix##_us_2 = 1; \ +volatile ushort3 prefix##_us_3 = 1; \ +volatile ushort4 prefix##_us_4 = 1; \ +volatile int prefix##_i_1 = 1; \ +volatile int2 prefix##_i_2 = 1; \ +volatile int3 prefix##_i_3 = 1; \ +volatile int4 prefix##_i_4 = 1; \ +volatile uint prefix##_ui_1 = 1; \ +volatile uint2 prefix##_ui_2 = 1; \ +volatile uint3 prefix##_ui_3 = 1; \ +volatile uint4 prefix##_ui_4 = 1; \ +volatile long prefix##_l_1 = 1; \ +volatile ulong prefix##_ul_1 = 1; + +#define TEST_INT_OP_TYPE(op, type) \ +rsDebug("Testing " #op " for " #type "1", i++); \ +res_##type##_1 = src1_##type##_1 op src2_##type##_1; \ +rsDebug("Testing " #op " for " #type "2", i++); \ +res_##type##_2 = src1_##type##_2 op src2_##type##_2; \ +rsDebug("Testing " #op " for " #type "3", i++); \ +res_##type##_3 = src1_##type##_3 op src2_##type##_3; \ +rsDebug("Testing " #op " for " #type "4", i++); \ +res_##type##_4 = src1_##type##_4 op src2_##type##_4; + +#define TEST_INT_OP(op) \ +TEST_INT_OP_TYPE(op, c) \ +TEST_INT_OP_TYPE(op, uc) \ +TEST_INT_OP_TYPE(op, s) \ +TEST_INT_OP_TYPE(op, us) \ +TEST_INT_OP_TYPE(op, i) \ +TEST_INT_OP_TYPE(op, ui) \ +rsDebug("Testing " #op " for l1", i++); \ +res_l_1 = src1_l_1 op src2_l_1; \ +rsDebug("Testing " #op " for ul1", i++); \ +res_ul_1 = src1_ul_1 op src2_ul_1; + +DECL_INT(res) +DECL_INT(src1) +DECL_INT(src2) + +static bool test_basic_operators() { + bool failed = false; + int i = 0; + + TEST_INT_OP(+); + TEST_INT_OP(-); + TEST_INT_OP(*); + TEST_INT_OP(/); + TEST_INT_OP(%); + TEST_INT_OP(<<); + TEST_INT_OP(>>); + + if (failed) { + rsDebug("test_basic_operators FAILED", 0); + } + else { + rsDebug("test_basic_operators PASSED", 0); + } + + return failed; +} + +#define TEST_CVT(to, from, type) \ +rsDebug("Testing convert from " #from " to " #to, 0); \ +to##1 = from##1; \ +to##2 = convert_##type##2(from##2); \ +to##3 = convert_##type##3(from##3); \ +to##4 = convert_##type##4(from##4); + +#define TEST_CVT_MATRIX(to, type) \ +TEST_CVT(to, c, type); \ +TEST_CVT(to, uc, type); \ +TEST_CVT(to, s, type); \ +TEST_CVT(to, us, type); \ +TEST_CVT(to, i, type); \ +TEST_CVT(to, ui, type); \ +TEST_CVT(to, f, type); \ + +static bool test_convert() { + bool failed = false; + + TEST_CVT_MATRIX(c, char); + TEST_CVT_MATRIX(uc, uchar); + TEST_CVT_MATRIX(s, short); + TEST_CVT_MATRIX(us, ushort); + TEST_CVT_MATRIX(i, int); + TEST_CVT_MATRIX(ui, uint); + TEST_CVT_MATRIX(f, float); + + if (failed) { + rsDebug("test_convert FAILED", 0); + } + else { + rsDebug("test_convert PASSED", 0); + } + + return failed; +} + void math_test(uint32_t index, int test_num) { bool failed = false; + failed |= test_convert(); failed |= test_fp_math(index); + failed |= test_basic_operators(); if (failed) { rsSendToClientBlocking(RS_MSG_TEST_FAILED); diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 3acb62460de0..40cb5c746e47 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -201,9 +201,9 @@ bool Context::initGLThread() { mGL.mExtensions = glGetString(GL_EXTENSIONS); //LOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion); - LOGV("GL Version %s", mGL.mVersion); + //LOGV("GL Version %s", mGL.mVersion); //LOGV("GL Vendor %s", mGL.mVendor); - LOGV("GL Renderer %s", mGL.mRenderer); + //LOGV("GL Renderer %s", mGL.mRenderer); //LOGV("GL Extensions %s", mGL.mExtensions); const char *verptr = NULL; @@ -468,7 +468,6 @@ void * Context::threadProc(void *vrsc) { return NULL; } - rsc->mScriptC.init(rsc); if (rsc->mIsGraphicsContext) { rsc->mStateRaster.init(rsc); rsc->setProgramRaster(NULL); @@ -528,7 +527,7 @@ void * Context::threadProc(void *vrsc) { } void Context::destroyWorkerThreadResources() { - LOGV("destroyWorkerThreadResources 1"); + //LOGV("destroyWorkerThreadResources 1"); if (mIsGraphicsContext) { mRaster.clear(); mFragment.clear(); @@ -544,7 +543,7 @@ void Context::destroyWorkerThreadResources() { mShaderCache.cleanupAll(); } ObjectBase::zeroAllUserRef(this); - LOGV("destroyWorkerThreadResources 2"); + //LOGV("destroyWorkerThreadResources 2"); mExit = true; } @@ -552,7 +551,7 @@ void * Context::helperThreadProc(void *vrsc) { Context *rsc = static_cast<Context *>(vrsc); uint32_t idx = (uint32_t)android_atomic_inc(&rsc->mWorkers.mLaunchCount); - LOGV("RS helperThread starting %p idx=%i", rsc, idx); + //LOGV("RS helperThread starting %p idx=%i", rsc, idx); rsc->mWorkers.mLaunchSignals[idx].init(); rsc->mWorkers.mNativeThreadId[idx] = gettid(); @@ -573,7 +572,7 @@ void * Context::helperThreadProc(void *vrsc) { LOGE("pthread_setspecific %i", status); } - while (rsc->mRunning) { + while (!rsc->mExit) { rsc->mWorkers.mLaunchSignals[idx].wait(); if (rsc->mWorkers.mLaunchCallback) { rsc->mWorkers.mLaunchCallback(rsc->mWorkers.mLaunchData, idx); @@ -582,7 +581,7 @@ void * Context::helperThreadProc(void *vrsc) { rsc->mWorkers.mCompleteSignal.set(); } - LOGV("RS helperThread exiting %p idx=%i", rsc, idx); + //LOGV("RS helperThread exited %p idx=%i", rsc, idx); return NULL; } @@ -730,6 +729,18 @@ Context::~Context() { mIO.shutdown(); int status = pthread_join(mThreadId, &res); + // Cleanup compute threads. + mWorkers.mLaunchData = NULL; + mWorkers.mLaunchCallback = NULL; + mWorkers.mRunningCount = (int)mWorkers.mCount; + for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { + mWorkers.mLaunchSignals[ct].set(); + } + for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { + int status = pthread_join(mWorkers.mThreadId[ct], &res); + } + rsAssert(!mWorkers.mRunningCount); + // Global structure cleanup. pthread_mutex_lock(&gInitMutex); if (mDev) { diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp index eb2af1cda757..3f8854330acf 100644 --- a/libs/rs/rsLocklessFifo.cpp +++ b/libs/rs/rsLocklessFifo.cpp @@ -76,7 +76,8 @@ uint32_t LocklessCommandFifo::getFreeSpace() const { } bool LocklessCommandFifo::isEmpty() const { - return mPut == mGet; + uint32_t p = android_atomic_acquire_load((int32_t *)&mPut); + return ((uint8_t *)p) == mGet; } @@ -155,7 +156,9 @@ const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) { void LocklessCommandFifo::next() { uint32_t bytes = reinterpret_cast<const uint16_t *>(mGet)[1]; - mGet += ((bytes + 3) & ~3) + 4; + + android_atomic_add(((bytes + 3) & ~3) + 4, (int32_t *)&mGet); + //mGet += ((bytes + 3) & ~3) + 4; if (isEmpty()) { mSignalToControl.set(); } diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index eecfa16b43a4..3858e1cfc0de 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -421,21 +421,9 @@ void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len } ScriptCState::ScriptCState() { - mScript.clear(); } ScriptCState::~ScriptCState() { - mScript.clear(); -} - -void ScriptCState::init(Context *rsc) { - clear(rsc); -} - -void ScriptCState::clear(Context *rsc) { - rsAssert(rsc); - mScript.clear(); - mScript.set(new ScriptC(rsc)); } static void* symbolLookup(void* pContext, char const* name) { @@ -608,8 +596,6 @@ namespace android { namespace renderscript { void rsi_ScriptCBegin(Context * rsc) { - ScriptCState *ss = &rsc->mScriptC; - ss->clear(rsc); } void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { @@ -618,8 +604,8 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { char *t = (char *)malloc(len + 1); memcpy(t, text, len); t[len] = 0; - ss->mScript->mEnviroment.mScriptText = t; - ss->mScript->mEnviroment.mScriptTextLength = len; + ss->mScriptText = t; + ss->mScriptLen = len; } @@ -630,17 +616,19 @@ RsScript rsi_ScriptCCreate(Context *rsc, { ScriptCState *ss = &rsc->mScriptC; - ObjectBaseRef<ScriptC> s(ss->mScript); - ss->mScript.clear(); + ScriptC *s = new ScriptC(rsc); + s->mEnviroment.mScriptText = ss->mScriptText; + s->mEnviroment.mScriptTextLength = ss->mScriptLen; + ss->mScriptText = NULL; + ss->mScriptLen = 0; s->incUserRef(); - if (!ss->runCompiler(rsc, s.get(), resName, cacheDir)) { + if (!ss->runCompiler(rsc, s, resName, cacheDir)) { // Error during compile, destroy s and return null. - s->zeroUserRef(); + delete s; return NULL; } - ss->clear(rsc); - return s.get(); + return s; } } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 612e38a3b5aa..7143c671a658 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -76,11 +76,9 @@ public: ScriptCState(); ~ScriptCState(); - ObjectBaseRef<ScriptC> mScript; + char * mScriptText; + size_t mScriptLen; - void init(Context *rsc); - - void clear(Context *rsc); bool runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir); struct SymbolTable_t { @@ -88,7 +86,6 @@ public: void * mPtr; bool threadable; }; - //static SymbolTable_t gSyms[]; static const SymbolTable_t * lookupSymbol(const char *); static const SymbolTable_t * lookupSymbolCL(const char *); static const SymbolTable_t * lookupSymbolGL(const char *); diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp index f550d9870b06..beb4d724e05e 100644 --- a/libs/rs/rsScriptC_Lib.cpp +++ b/libs/rs/rsScriptC_Lib.cpp @@ -305,6 +305,14 @@ int SC_modsi3(int a, int b) { return a % b; } +unsigned int SC_udivsi3(unsigned int a, unsigned int b) { + return a / b; +} + +unsigned int SC_umodsi3(unsigned int a, unsigned int b) { + return a % b; +} + int SC_getAllocation(const void *ptr) { GET_TLS(); const Allocation *alloc = sc->ptrToAllocation(ptr); @@ -363,6 +371,8 @@ void SC_ForEach2(RsScript vs, static ScriptCState::SymbolTable_t gSyms[] = { { "__divsi3", (void *)&SC_divsi3, true }, { "__modsi3", (void *)&SC_modsi3, true }, + { "__udivsi3", (void *)&SC_udivsi3, true }, + { "__umodsi3", (void *)&SC_umodsi3, true }, // allocation { "_Z19rsAllocationGetDimX13rs_allocation", (void *)&SC_allocGetDimX, true }, diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh index f3e0ab04f819..21c0f7b6832a 100644 --- a/libs/rs/scriptc/rs_core.rsh +++ b/libs/rs/scriptc/rs_core.rsh @@ -683,7 +683,7 @@ _RS_STATIC void __attribute__((overloadable)) rsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) { q->w = -q->x*rhs->x - q->y*rhs->y - q->z*rhs->z + q->w*rhs->w; q->x = q->x*rhs->w + q->y*rhs->z - q->z*rhs->y + q->w*rhs->x; - q->y = -q->x*rhs->z + q->y*rhs->w + q->z*rhs->z + q->w*rhs->y; + q->y = -q->x*rhs->z + q->y*rhs->w + q->z*rhs->x + q->w*rhs->y; q->z = q->x*rhs->y - q->y*rhs->x + q->z*rhs->w + q->w*rhs->z; } diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index e404b05e77b6..7312d75707dd 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -721,7 +721,7 @@ public class AudioService extends IAudioService.Stub { if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) { mBluetoothHeadset.stopVoiceRecognition( mBluetoothHeadsetDevice); - mBluetoothHeadset.stopVirtualVoiceCall( + mBluetoothHeadset.stopScoUsingVirtualVoiceCall( mBluetoothHeadsetDevice); } else { clearAllScoClients(mCb, true); @@ -808,7 +808,8 @@ public class AudioService extends IAudioService.Stub { checkScoAudioState(); if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) { mBluetoothHeadset.stopVoiceRecognition(mBluetoothHeadsetDevice); - mBluetoothHeadset.stopVirtualVoiceCall(mBluetoothHeadsetDevice); + mBluetoothHeadset.stopScoUsingVirtualVoiceCall( + mBluetoothHeadsetDevice); } else { clearAllScoClients(cb, true); } @@ -1296,10 +1297,10 @@ public class AudioService extends IAudioService.Stub { state == BluetoothHeadset.STATE_AUDIO_CONNECTED && mScoAudioState == SCO_STATE_INACTIVE) { mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; - mBluetoothHeadset.startVirtualVoiceCall(mBluetoothHeadsetDevice); + mBluetoothHeadset.startScoUsingVirtualVoiceCall(mBluetoothHeadsetDevice); } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED && mScoAudioState == SCO_STATE_ACTIVE_INTERNAL){ - mBluetoothHeadset.stopVirtualVoiceCall(mBluetoothHeadsetDevice); + mBluetoothHeadset.stopScoUsingVirtualVoiceCall(mBluetoothHeadsetDevice); } } } diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 11e27a90cc3e..925f965d6236 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -299,12 +299,16 @@ public class ExifInterface { String lngRef = mAttributes.get(ExifInterface.TAG_GPS_LONGITUDE_REF); if (latValue != null && latRef != null && lngValue != null && lngRef != null) { - output[0] = convertRationalLatLonToFloat(latValue, latRef); - output[1] = convertRationalLatLonToFloat(lngValue, lngRef); - return true; - } else { - return false; + try { + output[0] = convertRationalLatLonToFloat(latValue, latRef); + output[1] = convertRationalLatLonToFloat(lngValue, lngRef); + return true; + } catch (IllegalArgumentException e) { + // if values are not parseable + } } + + return false; } /** @@ -373,12 +377,12 @@ public class ExifInterface { String [] pair; pair = parts[0].split("/"); - int degrees = (int) (Float.parseFloat(pair[0].trim()) - / Float.parseFloat(pair[1].trim())); + double degrees = Double.parseDouble(pair[0].trim()) + / Double.parseDouble(pair[1].trim()); pair = parts[1].split("/"); - int minutes = (int) ((Float.parseFloat(pair[0].trim()) - / Float.parseFloat(pair[1].trim()))); + double minutes = Double.parseDouble(pair[0].trim()) + / Double.parseDouble(pair[1].trim()); pair = parts[2].split("/"); double seconds = Double.parseDouble(pair[0].trim()) @@ -389,10 +393,12 @@ public class ExifInterface { return (float) -result; } return (float) result; - } catch (RuntimeException ex) { - // if for whatever reason we can't parse the lat long then return - // null - return 0f; + } catch (NumberFormatException e) { + // Some of the nubmers are not valid + throw new IllegalArgumentException(); + } catch (ArrayIndexOutOfBoundsException e) { + // Some of the rational does not follow the correct format + throw new IllegalArgumentException(); } } diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java index b0d29a154419..8156439dc73c 100755 --- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java +++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java @@ -30,6 +30,9 @@ import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener; import android.util.Log; import android.util.Pair; import android.view.Surface; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; /** *This class provide Native methods to be used by MediaArtist {@hide} @@ -67,7 +70,10 @@ class MediaArtistNativeHelper { private boolean mExportDone = false; private int mProgressToApp; - + /** + * The resize paint + */ + private static final Paint sResizePaint = new Paint(Paint.FILTER_BITMAP_FLAG); public static final int TASK_LOADING_SETTINGS = 1; @@ -1896,7 +1902,9 @@ class MediaArtistNativeHelper { private void onPreviewProgressUpdate(int progress, boolean isFinished) { if (mPreviewProgressListener != null) { mPreviewProgressListener.onProgress(mVideoEditor, progress, isFinished); - mPreviewProgress = progress; + if (progress != 0) { + mPreviewProgress = progress; + } } } @@ -3836,11 +3844,39 @@ class MediaArtistNativeHelper { throw new IllegalArgumentException(); } - IntBuffer rgb888 = IntBuffer.allocate(width * height * 4); + int newWidth = 0; + int newHeight = 0; + Bitmap tempBitmap = null; + + /* Make width and height as even */ + newWidth = (width + 1) & 0xFFFFFFFE; + newHeight = (height + 1) & 0xFFFFFFFE; + + /* Create a temp bitmap for resized thumbnails */ + if ((newWidth != width) || (newHeight != height)) { + tempBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); + } + + IntBuffer rgb888 = IntBuffer.allocate(newWidth * newHeight * 4); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - nativeGetPixels(inputFile, rgb888.array(), width, height, timeMS); - bitmap.copyPixelsFromBuffer(rgb888); + nativeGetPixels(inputFile, rgb888.array(), newWidth, newHeight, timeMS); + + if ((newWidth == width) && (newHeight == height)) { + bitmap.copyPixelsFromBuffer(rgb888); + } else { + /* Create a temp bitmap to be used for resize */ + tempBitmap.copyPixelsFromBuffer(rgb888); + + /* Create a canvas to resize */ + final Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(tempBitmap, new Rect(0, 0, newWidth, newHeight), + new Rect(0, 0, width, height), + sResizePaint); + } + if (tempBitmap != null) { + tempBitmap.recycle(); + } return bitmap; } @@ -3861,11 +3897,24 @@ class MediaArtistNativeHelper { public Bitmap[] getPixelsList(String filename, int width, int height, long startMs, long endMs, int thumbnailCount) { int[] rgb888 = null; - int thumbnailSize = width * height * 4; - + int thumbnailSize = 0; + int newWidth = 0; + int newHeight = 0; + Bitmap tempBitmap = null; + + /* Make width and height as even */ + newWidth = (width + 1) & 0xFFFFFFFE; + newHeight = (height + 1) & 0xFFFFFFFE; + thumbnailSize = newWidth * newHeight * 4; + + /* Create a temp bitmap for resized thumbnails */ + if ((newWidth != width) || (newHeight != height)) { + tempBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); + } int i = 0; int deltaTime = (int)(endMs - startMs) / thumbnailCount; Bitmap[] bitmap = null; + try { // This may result in out of Memory Error rgb888 = new int[thumbnailSize * thumbnailCount]; @@ -3878,19 +3927,35 @@ class MediaArtistNativeHelper { bitmap = new Bitmap[MAX_THUMBNAIL_PERMITTED]; thumbnailCount = MAX_THUMBNAIL_PERMITTED; } catch (Throwable ex) { - throw new RuntimeException("Memory allocation fails,reduce nos of thumbanail count"); + throw new RuntimeException("Memory allocation fails, thumbnail count too large: "+thumbnailCount); } } IntBuffer tmpBuffer = IntBuffer.allocate(thumbnailSize); - nativeGetPixelsList(filename, rgb888, width, height, deltaTime, thumbnailCount, startMs, + nativeGetPixelsList(filename, rgb888, newWidth, newHeight, deltaTime, thumbnailCount, startMs, endMs); + for (; i < thumbnailCount; i++) { bitmap[i] = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); tmpBuffer.put(rgb888, (i * thumbnailSize), thumbnailSize); tmpBuffer.rewind(); - bitmap[i].copyPixelsFromBuffer(tmpBuffer); + + if ((newWidth == width) && (newHeight == height)) { + bitmap[i].copyPixelsFromBuffer(tmpBuffer); + } else { + /* Copy the out rgb buffer to temp bitmap */ + tempBitmap.copyPixelsFromBuffer(tmpBuffer); + + /* Create a canvas to resize */ + final Canvas canvas = new Canvas(bitmap[i]); + canvas.drawBitmap(tempBitmap, new Rect(0, 0, newWidth, newHeight), + new Rect(0, 0, width, height), + sResizePaint); + } } + if (tempBitmap != null) { + tempBitmap.recycle(); + } return bitmap; } @@ -3940,12 +4005,11 @@ class MediaArtistNativeHelper { } } - public void clearPreviewSurface(Surface surface, int width, int height) { - nativeClearSurface(surface,width,height); + public void clearPreviewSurface(Surface surface) { + nativeClearSurface(surface); } /** Native Methods */ - - public native Properties getMediaProperties(String file) throws IllegalArgumentException, + native Properties getMediaProperties(String file) throws IllegalArgumentException, IllegalStateException, RuntimeException, Exception; /** @@ -3955,7 +4019,7 @@ class MediaArtistNativeHelper { * @throws RuntimeException if an error occurred * @see Version */ - public static native Version getVersion() throws RuntimeException; + private static native Version getVersion() throws RuntimeException; /** * Returns the video thumbnail in an array of integers. Output format is @@ -3972,10 +4036,10 @@ class MediaArtistNativeHelper { * negative * @throws RuntimeException on runtime errors in native code */ - public native int nativeGetPixels(String fileName, int[] pixelArray, int width, int height, + private native int nativeGetPixels(String fileName, int[] pixelArray, int width, int height, long timeMS); - public native int nativeGetPixelsList(String fileName, int[] pixelArray, int width, int height, + private native int nativeGetPixelsList(String fileName, int[] pixelArray, int width, int height, int timeMS, int nosofTN, long startTimeMs, long endTimeMs); /** @@ -3984,12 +4048,12 @@ class MediaArtistNativeHelper { * * @throws IllegalStateException if the method could not be called */ - public native void release() throws IllegalStateException, RuntimeException; + private native void release() throws IllegalStateException, RuntimeException; /* * Clear the preview surface */ - public native void nativeClearSurface(Surface surface, int width, int height); + private native void nativeClearSurface(Surface surface); /** @@ -3998,7 +4062,7 @@ class MediaArtistNativeHelper { * * @throws IllegalStateException if the method could not be called */ - public native void stopEncoding() throws IllegalStateException, RuntimeException; + private native void stopEncoding() throws IllegalStateException, RuntimeException; @@ -4024,12 +4088,12 @@ class MediaArtistNativeHelper { private native void nativeStopPreview(); - public native int nativeGenerateAudioGraph(String pcmFilePath, String outGraphPath, + private native int nativeGenerateAudioGraph(String pcmFilePath, String outGraphPath, int frameDuration, int channels, int sampleCount); - public native int nativeGenerateRawAudio(String InFileName, String PCMFileName); + private native int nativeGenerateRawAudio(String InFileName, String PCMFileName); - public native int nativeGenerateClip(EditSettings editSettings) + private native int nativeGenerateClip(EditSettings editSettings) throws IllegalArgumentException, IllegalStateException, RuntimeException; } diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java index 1c028787bed0..a977b8ed63ca 100755 --- a/media/java/android/media/videoeditor/MediaImageItem.java +++ b/media/java/android/media/videoeditor/MediaImageItem.java @@ -1013,9 +1013,20 @@ public class MediaImageItem extends MediaItem { if (dx > dy) { bitmapWidth = width; - bitmapHeight = Math.round(nativeHeight / dx); + + if (((float)nativeHeight / dx) < (float)height) { + bitmapHeight = (float)Math.ceil(nativeHeight / dx); + } else { // value equals the requested height + bitmapHeight = (float)Math.floor(nativeHeight / dx); + } + } else { - bitmapWidth = Math.round(nativeWidth / dy); + if (((float)nativeWidth / dy) > (float)width) { + bitmapWidth = (float)Math.floor(nativeWidth / dy); + } else { // value equals the requested width + bitmapWidth = (float)Math.ceil(nativeWidth / dy); + } + bitmapHeight = height; } diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java index 5b87d162bc8d..c19725c8370f 100755 --- a/media/java/android/media/videoeditor/VideoEditorImpl.java +++ b/media/java/android/media/videoeditor/VideoEditorImpl.java @@ -1828,9 +1828,6 @@ public class VideoEditorImpl implements VideoEditor { if (surfaceHolder == null) { throw new IllegalArgumentException(); } - Rect frame; - int surfaceWidth; - int surfaceHeight; Surface surface = surfaceHolder.getSurface(); if (surface == null) { @@ -1838,10 +1835,7 @@ public class VideoEditorImpl implements VideoEditor { "Surface could not be retrieved from surface holder"); throw new RuntimeException(); } - frame = surfaceHolder.getSurfaceFrame(); - surfaceWidth = frame.width(); - surfaceHeight = frame.height(); - mMANativeHelper.clearPreviewSurface(surface,surfaceWidth,surfaceHeight); + mMANativeHelper.clearPreviewSurface(surface); } } diff --git a/media/jni/mediaeditor/VideoBrowserMain.c b/media/jni/mediaeditor/VideoBrowserMain.c index 0d40f5638ec6..f54a16eed6b4 100755 --- a/media/jni/mediaeditor/VideoBrowserMain.c +++ b/media/jni/mediaeditor/VideoBrowserMain.c @@ -522,7 +522,7 @@ M4OSA_ERR videoBrowserPrepareFrame(M4OSA_Context pContext, M4OSA_UInt32* pTime) if (M4WAR_VIDEORENDERER_NO_NEW_FRAME == err) { - err = M4NO_ERROR; + return err; } CHECK_ERR(videoBrowserPrepareFrame, err) ; diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp index 1751396ccae8..8ce788b1a042 100755 --- a/media/jni/mediaeditor/VideoEditorMain.cpp +++ b/media/jni/mediaeditor/VideoEditorMain.cpp @@ -261,9 +261,7 @@ videoEditor_generateClip( static void videoEditor_clearSurface(JNIEnv* pEnv, jobject thiz, - jobject surface, - jint width, - jint height); + jobject surface); static JNINativeMethod gManualEditMethods[] = { {"getVersion", "()L"VERSION_CLASS_NAME";", @@ -300,7 +298,7 @@ static JNINativeMethod gManualEditMethods[] = { (int *)videoEditor_generateAudioRawFile }, {"nativeGenerateClip", "(L"EDIT_SETTINGS_CLASS_NAME";)I", (void *)videoEditor_generateClip }, - {"nativeClearSurface", "(Landroid/view/Surface;II)V", + {"nativeClearSurface", "(Landroid/view/Surface;)V", (void *)videoEditor_clearSurface }, }; @@ -428,16 +426,15 @@ static void videoEditor_stopPreview(JNIEnv* pEnv, static void videoEditor_clearSurface(JNIEnv* pEnv, jobject thiz, - jobject surface, - jint width, - jint height) + jobject surface) { bool needToBeLoaded = true; - M4OSA_UInt32 framesizeYuv =0; M4OSA_ERR result = M4NO_ERROR; VideoEditor_renderPreviewFrameStr frameStr; const char* pMessage = NULL; - M4VIFI_ImagePlane *yuvPlane; + // Let the size be QVGA + int width = 320; + int height = 240; ManualEditContext* pContext = M4OSA_NULL; // Get the context. @@ -474,62 +471,7 @@ static void videoEditor_clearSurface(JNIEnv* pEnv, Surface* const p = (Surface*)pEnv->GetIntField(surface, surface_native); sp<Surface> previewSurface = sp<Surface>(p); - /** - * Allocate output YUV planes - */ - yuvPlane = (M4VIFI_ImagePlane*)M4OSA_malloc(3*sizeof(M4VIFI_ImagePlane), M4VS, - (M4OSA_Char*)"videoEditor_clearSurface Output plane YUV"); - if (yuvPlane == M4OSA_NULL) { - VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", - "videoEditor_clearSurface() malloc error for yuv plane"); - pMessage = videoEditJava_getErrorName(M4ERR_ALLOC); - jniThrowException(pEnv, "java/lang/RuntimeException", pMessage); - return ; - } - - framesizeYuv = width * height * 1.5; - yuvPlane[0].u_width = width; - yuvPlane[0].u_height = height; - yuvPlane[0].u_topleft = 0; - yuvPlane[0].u_stride = width; - yuvPlane[0].pac_data = (M4VIFI_UInt8 *)M4OSA_malloc(framesizeYuv, M4VS, - (M4OSA_Char*)"videoEditor pixelArray"); - if (yuvPlane[0].pac_data == M4OSA_NULL) { - VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", - "videoEditor_renderPreviewFrame() malloc error"); - pMessage = videoEditJava_getErrorName(M4ERR_ALLOC); - jniThrowException(pEnv, "java/lang/RuntimeException", pMessage); - return; - } - - /* memset yuvPlane[0].pac_data with 0 for black frame */ - M4OSA_memset((M4OSA_MemAddr8)yuvPlane[0].pac_data,framesizeYuv,0x00); - FILE *p1 = fopen("/mnt/sdcard/black.raw","wb"); - fwrite(yuvPlane[0].pac_data,1,framesizeYuv,p1); - fclose(p1); - - yuvPlane[1].u_width = width>>1; - yuvPlane[1].u_height = height>>1; - yuvPlane[1].u_topleft = 0; - yuvPlane[1].u_stride = width>>1; - yuvPlane[1].pac_data = yuvPlane[0].pac_data - + yuvPlane[0].u_width * yuvPlane[0].u_height; - - M4OSA_memset((M4OSA_MemAddr8)yuvPlane[1].pac_data,yuvPlane[1].u_width * - yuvPlane[1].u_height,128); - yuvPlane[2].u_width = (width)>>1; - yuvPlane[2].u_height = (height)>>1; - yuvPlane[2].u_topleft = 0; - yuvPlane[2].u_stride = (width)>>1; - yuvPlane[2].pac_data = yuvPlane[1].pac_data - + yuvPlane[1].u_width * yuvPlane[1].u_height; - - M4OSA_memset((M4OSA_MemAddr8)yuvPlane[2].pac_data,yuvPlane[2].u_width * - yuvPlane[2].u_height,128); - - /* Fill up the render structure*/ - frameStr.pBuffer = (M4OSA_Void*)yuvPlane[0].pac_data; - + frameStr.pBuffer = M4OSA_NULL; frameStr.timeMs = 0; frameStr.uiSurfaceWidth = width; frameStr.uiSurfaceHeight = height; @@ -539,19 +481,11 @@ static void videoEditor_clearSurface(JNIEnv* pEnv, frameStr.clipBeginCutTime = 0; frameStr.clipEndCutTime = 0; - /*pContext->mPreviewController->setPreviewFrameRenderingMode( - pContext->pEditSettings->\ - pClipList[iCurrentClipIndex]->xVSS.MediaRendering, - pContext->pEditSettings->xVSS.outputVideoSize); - */ - - result = pContext->mPreviewController->renderPreviewFrame(previewSurface, + result = pContext->mPreviewController->clearSurface(previewSurface, &frameStr); videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv, (M4NO_ERROR != result), result); - M4OSA_free((M4OSA_MemAddr32)yuvPlane[0].pac_data); - M4OSA_free((M4OSA_MemAddr32)yuvPlane); } static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 89b3dab46d73..11ac56ce296e 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -378,11 +378,14 @@ status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { } void AwesomePlayer::reset() { + LOGI("reset"); + Mutex::Autolock autoLock(mLock); reset_l(); } void AwesomePlayer::reset_l() { + LOGI("reset_l"); mDisplayWidth = 0; mDisplayHeight = 0; @@ -408,6 +411,10 @@ void AwesomePlayer::reset_l() { } } + if (mFlags & PREPARING) { + LOGI("waiting until preparation is completes."); + } + while (mFlags & PREPARING) { mPreparedCondition.wait(mLock); } @@ -431,6 +438,8 @@ void AwesomePlayer::reset_l() { } mAudioSource.clear(); + LOGI("audio source cleared"); + mTimeSource = NULL; delete mAudioPlayer; @@ -471,6 +480,8 @@ void AwesomePlayer::reset_l() { IPCThreadState::self()->flushCommands(); } + LOGI("video source cleared"); + mDurationUs = -1; mFlags = 0; mExtractorFlags = 0; @@ -487,6 +498,8 @@ void AwesomePlayer::reset_l() { mFileSource.clear(); mBitrate = -1; + + LOGI("reset_l completed"); } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { diff --git a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp index 38778fb3aa71..2bdb3ef18e8d 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp +++ b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp @@ -23,8 +23,8 @@ #include "mp4dec_api.h" #include <OMX_Component.h> +#include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/MediaBufferGroup.h> -#include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> @@ -106,7 +106,7 @@ status_t M4vH263Decoder::start(MetaData *) { int32_t vol_size = 0; if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const uint8_t *)data, size); - CHECK_EQ(esds.InitCheck(), OK); + CHECK_EQ(esds.InitCheck(), (status_t)OK); const void *codec_specific_data; size_t codec_specific_data_size; @@ -185,7 +185,7 @@ status_t M4vH263Decoder::read( ReadOptions::SeekMode mode; if (options && options->getSeekTo(&seekTimeUs, &mode)) { seeking = true; - CHECK_EQ(PVResetVideoDecoder(mHandle), PV_TRUE); + CHECK_EQ((int)PVResetVideoDecoder(mHandle), PV_TRUE); } MediaBuffer *inputBuffer = NULL; @@ -223,19 +223,28 @@ status_t M4vH263Decoder::read( return UNKNOWN_ERROR; } - int32_t width, height; - PVGetVideoDimensions(mHandle, &width, &height); - if (width != mWidth || height != mHeight) { + int32_t disp_width, disp_height; + PVGetVideoDimensions(mHandle, &disp_width, &disp_height); + + int32_t buf_width, buf_height; + PVGetBufferDimensions(mHandle, &buf_width, &buf_height); + + if (buf_width != mWidth || buf_height != mHeight) { ++mNumSamplesOutput; // The client will never get to see this frame. inputBuffer->release(); inputBuffer = NULL; - mWidth = width; - mHeight = height; + mWidth = buf_width; + mHeight = buf_height; mFormat->setInt32(kKeyWidth, mWidth); mFormat->setInt32(kKeyHeight, mHeight); + CHECK_LE(disp_width, buf_width); + CHECK_LE(disp_height, buf_height); + + mFormat->setRect(kKeyCropRect, 0, 0, disp_width - 1, disp_height - 1); + return INFO_FORMAT_CHANGED; } diff --git a/media/libstagefright/codecs/m4v_h263/dec/include/mp4dec_api.h b/media/libstagefright/codecs/m4v_h263/dec/include/mp4dec_api.h index ef09900f7fb2..24a50ceaddf1 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/include/mp4dec_api.h +++ b/media/libstagefright/codecs/m4v_h263/dec/include/mp4dec_api.h @@ -159,6 +159,7 @@ extern "C" Bool PVDecodeVopBody(VideoDecControls *decCtrl, int32 buffer_size[]); void PVDecPostProcess(VideoDecControls *decCtrl, uint8 *outputYUV); OSCL_IMPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *display_width, int32 *display_height); + OSCL_IMPORT_REF void PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *buf_width, int32 *buf_height); OSCL_IMPORT_REF void PVSetPostProcType(VideoDecControls *decCtrl, int mode); uint32 PVGetVideoTimeStamp(VideoDecControls *decoderControl); int PVGetDecBitrate(VideoDecControls *decCtrl); diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/pvdec_api.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/pvdec_api.cpp index 0c354d9d76d6..844bd14050bd 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/src/pvdec_api.cpp +++ b/media/libstagefright/codecs/m4v_h263/dec/src/pvdec_api.cpp @@ -722,6 +722,12 @@ OSCL_EXPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *disp *display_height = video->displayHeight; } +OSCL_EXPORT_REF void PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *width, int32 *height) { + VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData; + *width = video->width; + *height = video->height; +} + /* ======================================================================== */ /* Function : PVGetVideoTimeStamp() */ /* Date : 04/27/2000, 08/29/2000 */ diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp index eca9ed69a23b..733de92bf6b1 100644 --- a/media/libstagefright/matroska/MatroskaExtractor.cpp +++ b/media/libstagefright/matroska/MatroskaExtractor.cpp @@ -707,6 +707,12 @@ void MatroskaExtractor::addTracks() { for (size_t index = 0; index < tracks->GetTracksCount(); ++index) { const mkvparser::Track *track = tracks->GetTrackByIndex(index); + if (track == NULL) { + // Apparently this is currently valid (if unexpected) behaviour + // of the mkv parser lib. + continue; + } + const char *const codecID = track->GetCodecId(); LOGV("codec id = %s", codecID); LOGV("codec name = %s", track->GetCodecNameAsUTF8()); diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_input_methods_item.xml b/packages/SystemUI/res/layout-xlarge/status_bar_input_methods_item.xml index 3028a426a87d..3fef7e078cac 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_input_methods_item.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_input_methods_item.xml @@ -47,12 +47,11 @@ android:id="@+id/item_radio" android:layout_width="30dip" android:layout_height="wrap_content" - android:layout_marginRight="11dip" android:focusable="false" android:clickable="false" /> <ImageView android:id="@+id/item_icon" - android:layout_width="wrap_content" + android:layout_width="@android:dimen/app_icon_size" android:layout_height="wrap_content" android:scaleType="fitCenter" /> <LinearLayout diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml index 5a41421d1bf0..faae62cb501e 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml @@ -88,13 +88,12 @@ android:id="@+id/network_text" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_marginTop="12dp" android:layout_marginRight="6dip" android:layout_marginLeft="6dip" android:gravity="center" android:singleLine="true" android:visibility="gone" - android:textSize="14dip" + android:textSize="16sp" android:textColor="#606060" /> diff --git a/packages/SystemUI/res/values-bg-xlarge/strings.xml b/packages/SystemUI/res/values-bg-xlarge/strings.xml index 8dd6d7cb99bc..9ddb662b140c 100644 --- a/packages/SystemUI/res/values-bg-xlarge/strings.xml +++ b/packages/SystemUI/res/values-bg-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Изчистване на всичко"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Изч. на вс."</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Няма връзка с интернет"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: има връзка"</string> </resources> diff --git a/packages/SystemUI/res/values-ca-xlarge/strings.xml b/packages/SystemUI/res/values-ca-xlarge/strings.xml index 289a2a361df8..26b46518ae2d 100644 --- a/packages/SystemUI/res/values-ca-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ca-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Esborra-ho tot"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Esborra-ho"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"No connexió Internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: connectat"</string> </resources> diff --git a/packages/SystemUI/res/values-cs-xlarge/strings.xml b/packages/SystemUI/res/values-cs-xlarge/strings.xml index b25779275dc0..47a9e5c3178b 100644 --- a/packages/SystemUI/res/values-cs-xlarge/strings.xml +++ b/packages/SystemUI/res/values-cs-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Vymazat vše"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Žádné připojení"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: připojeno"</string> </resources> diff --git a/packages/SystemUI/res/values-da-xlarge/strings.xml b/packages/SystemUI/res/values-da-xlarge/strings.xml index 78107abcfc4a..c99afbdf7375 100644 --- a/packages/SystemUI/res/values-da-xlarge/strings.xml +++ b/packages/SystemUI/res/values-da-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Ryd alt"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Ingen internetforb."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi er forbundet"</string> </resources> diff --git a/packages/SystemUI/res/values-el-xlarge/strings.xml b/packages/SystemUI/res/values-el-xlarge/strings.xml index 41f61e21af79..bbf7637448d4 100644 --- a/packages/SystemUI/res/values-el-xlarge/strings.xml +++ b/packages/SystemUI/res/values-el-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Διαγ. όλων"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Χωρίς σύνδ. σε Διαδ."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: συνδέθηκε"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml index 5c9c6fc80325..00b951ef08b8 100644 --- a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml +++ b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml @@ -1,18 +1,25 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- XL xlarge --> - <string name="status_bar_clear_all_button" msgid="4341545325987974494">"Eliminar todos"</string> - <!-- XL --> - <string name="status_bar_no_notifications_title" msgid="2492933749414725897">"No tienes notificaciones"</string> - <!-- XL --> - <string name="status_bar_settings_rotation_lock" msgid="9125161825884157545">"Bloquear orient. de pant."</string> - <!-- XL --> - <string name="recent_tasks_app_label" msgid="5550538721034982973">"Google Apps"</string> - <!-- XL --> - <string name="bluetooth_tethered" msgid="8017158699581472359">"Bluetooth anclado"</string> - <!-- XL xlarge --> - <string name="status_bar_settings_signal_meter_disconnected" msgid="4866302415753953027">"Sin conexión a Internet"</string> - <!-- XL xlarge --> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="3832182580451976589">"Wi-Fi conectado"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Eliminar todos"</string> + <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Sin conexión a Int."</string> + <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"WiFi conectado"</string> </resources> diff --git a/packages/SystemUI/res/values-es-xlarge/strings.xml b/packages/SystemUI/res/values-es-xlarge/strings.xml index 935fdbc3165f..a544f791ee9e 100644 --- a/packages/SystemUI/res/values-es-xlarge/strings.xml +++ b/packages/SystemUI/res/values-es-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Borrar todo"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Sin conexión a Internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Con conexión WiFi"</string> </resources> diff --git a/packages/SystemUI/res/values-hu-xlarge/strings.xml b/packages/SystemUI/res/values-hu-xlarge/strings.xml index d49266f1bba6..debf90640df6 100644 --- a/packages/SystemUI/res/values-hu-xlarge/strings.xml +++ b/packages/SystemUI/res/values-hu-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Az összes törlése"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Össz.törl."</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nincs internetkapcs."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi csatlakozva"</string> </resources> diff --git a/packages/SystemUI/res/values-it-xlarge/strings.xml b/packages/SystemUI/res/values-it-xlarge/strings.xml index 3b1e302aeee1..9130b8dc7542 100644 --- a/packages/SystemUI/res/values-it-xlarge/strings.xml +++ b/packages/SystemUI/res/values-it-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Canc. tutto"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"No connessione Internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: connesso"</string> </resources> diff --git a/packages/SystemUI/res/values-ko-xlarge/strings.xml b/packages/SystemUI/res/values-ko-xlarge/strings.xml index 4962b5e618b3..8c489783468a 100644 --- a/packages/SystemUI/res/values-ko-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ko-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"모두 지우기"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"인터넷에 연결되지 않음"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi 연결됨"</string> </resources> diff --git a/packages/SystemUI/res/values-lt-xlarge/strings.xml b/packages/SystemUI/res/values-lt-xlarge/strings.xml index f9b3ac159e86..d3c8fce5a826 100644 --- a/packages/SystemUI/res/values-lt-xlarge/strings.xml +++ b/packages/SystemUI/res/values-lt-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Išvalyti viską"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Išv. viską"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nėra interneto ryšio"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Prisijungta prie „Wi-Fi“"</string> </resources> diff --git a/packages/SystemUI/res/values-lv-xlarge/strings.xml b/packages/SystemUI/res/values-lv-xlarge/strings.xml index af3423fa6db2..9bc9aa6e4344 100644 --- a/packages/SystemUI/res/values-lv-xlarge/strings.xml +++ b/packages/SystemUI/res/values-lv-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Notīrīt visu"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Notīr.visu"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nav interneta sav."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Izv. sav. ar Wi-Fi"</string> </resources> diff --git a/packages/SystemUI/res/values-nb-xlarge/strings.xml b/packages/SystemUI/res/values-nb-xlarge/strings.xml index 726b06167c57..d236f1896bd3 100644 --- a/packages/SystemUI/res/values-nb-xlarge/strings.xml +++ b/packages/SystemUI/res/values-nb-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Tøm alt"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Ingen Int.-tilkobl."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: tilkoblet"</string> </resources> diff --git a/packages/SystemUI/res/values-nl-xlarge/strings.xml b/packages/SystemUI/res/values-nl-xlarge/strings.xml index b2946aecfe56..eee7e3556072 100644 --- a/packages/SystemUI/res/values-nl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-nl-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Wissen"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Geen internetverb."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Verbonden via Wi-Fi"</string> </resources> diff --git a/packages/SystemUI/res/values-pl-xlarge/strings.xml b/packages/SystemUI/res/values-pl-xlarge/strings.xml index 8642ea418390..e223b84aa41c 100644 --- a/packages/SystemUI/res/values-pl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pl-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Wyczyść wszystko"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Brak połączenia internetowego"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: połączono"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml index 8ddb2b112eff..7df815ca2ac1 100644 --- a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Limpar tudo"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Sem ligação internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi ligado"</string> </resources> diff --git a/packages/SystemUI/res/values-ro-xlarge/strings.xml b/packages/SystemUI/res/values-ro-xlarge/strings.xml index 07badf41760d..e6296cddafcb 100644 --- a/packages/SystemUI/res/values-ro-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ro-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Ştergeţi-le pe toate"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Şterg. tot"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Fără conex. internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi conectat"</string> </resources> diff --git a/packages/SystemUI/res/values-ru-xlarge/strings.xml b/packages/SystemUI/res/values-ru-xlarge/strings.xml index 001f95c88528..5c26e909a4ef 100644 --- a/packages/SystemUI/res/values-ru-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ru-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Удалить все"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Нет подключения"</string> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: подключено"</string> + <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi подкл."</string> </resources> diff --git a/packages/SystemUI/res/values-sl-xlarge/strings.xml b/packages/SystemUI/res/values-sl-xlarge/strings.xml index ef50a6795ab6..fcc65debef51 100644 --- a/packages/SystemUI/res/values-sl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-sl-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Počisti vse"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Izbriši vse"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Brez inter. povez."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi – povezano"</string> </resources> diff --git a/packages/SystemUI/res/values-sv-xlarge/strings.xml b/packages/SystemUI/res/values-sv-xlarge/strings.xml index 9379451a59ff..db85ee1dba04 100644 --- a/packages/SystemUI/res/values-sv-xlarge/strings.xml +++ b/packages/SystemUI/res/values-sv-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Ta bort alla"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Ingen Internetansl."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi-ansluten"</string> </resources> diff --git a/packages/SystemUI/res/values-th-xlarge/strings.xml b/packages/SystemUI/res/values-th-xlarge/strings.xml index fb4cbae43fdc..428e9ab60937 100644 --- a/packages/SystemUI/res/values-th-xlarge/strings.xml +++ b/packages/SystemUI/res/values-th-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"ล้างทั้งหมด"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"ล้างหมด"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"ไม่มีการเชื่อมต่ออินเทอร์เน็ต"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"เชื่อมต่อ Wi-Fi แล้ว"</string> </resources> diff --git a/packages/SystemUI/res/values-tl-xlarge/strings.xml b/packages/SystemUI/res/values-tl-xlarge/strings.xml index 3560c9636334..25584b19726b 100644 --- a/packages/SystemUI/res/values-tl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-tl-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"I-clear ang lahat"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"I-clear lahat"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Wala net connection"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Konektado ang WiFi"</string> </resources> diff --git a/packages/SystemUI/res/values-tr-xlarge/strings.xml b/packages/SystemUI/res/values-tr-xlarge/strings.xml index f7d20b5e4bfd..fa937c398f9c 100644 --- a/packages/SystemUI/res/values-tr-xlarge/strings.xml +++ b/packages/SystemUI/res/values-tr-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Tümünü temizle"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"İnternet bağlnts yok"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Kablosuz bağlandı"</string> </resources> diff --git a/packages/SystemUI/res/values-uk-xlarge/strings.xml b/packages/SystemUI/res/values-uk-xlarge/strings.xml index 47242a688f7c..864cb0c14d6e 100644 --- a/packages/SystemUI/res/values-uk-xlarge/strings.xml +++ b/packages/SystemUI/res/values-uk-xlarge/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Очистити все"</string> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Очист. все"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Інтернет не під\'єдн."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi під\'єднано"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml index 6a8ef52a61aa..82f757e5fdb6 100644 --- a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <string name="status_bar_clear_all_button" msgid="4722520806446512408">"全部清除"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"沒有網路連線"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi 已連線"</string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java index a3ccef998099..06c789c7a4e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java @@ -36,9 +36,12 @@ import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.TextView; +import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import com.android.systemui.R; @@ -47,9 +50,10 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O private static final String TAG = "InputMethodsPanel"; private final InputMethodManager mImm; - private final HashMap<InputMethodInfo, List<InputMethodSubtype>> + private final TreeMap<InputMethodInfo, List<InputMethodSubtype>> mEnabledInputMethodAndSubtypesCache = - new HashMap<InputMethodInfo, List<InputMethodSubtype>>(); + new TreeMap<InputMethodInfo, List<InputMethodSubtype>>( + new InputMethodComparator()); private final HashMap<View, Pair<InputMethodInfo, InputMethodSubtype>> mRadioViewAndImiMap = new HashMap<View, Pair<InputMethodInfo, InputMethodSubtype>>(); @@ -61,6 +65,21 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O private String mEnabledInputMethodAndSubtypesCacheStr; private View mConfigureImeShortcut; + private class InputMethodComparator implements Comparator<InputMethodInfo> { + public int compare(InputMethodInfo imi1, InputMethodInfo imi2) { + if (imi2 == null) return 0; + if (imi1 == null) return 1; + if (mPackageManager != null) { + CharSequence imiId1 = imi1.loadLabel(mPackageManager); + CharSequence imiId2 = imi2.loadLabel(mPackageManager); + if (imiId1 != null && imiId2 != null) { + return imiId1.toString().compareTo(imiId2.toString()); + } + } + return imi1.getId().compareTo(imi2.getId()); + } + } + public InputMethodsPanel(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -190,8 +209,8 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O mRadioViewAndImiMap.clear(); mPackageManager = mContext.getPackageManager(); - HashMap<InputMethodInfo, List<InputMethodSubtype>> enabledIMIs - = getEnabledInputMethodAndSubtypeList(); + Map<InputMethodInfo, List<InputMethodSubtype>> enabledIMIs = + getEnabledInputMethodAndSubtypeList(); // TODO: Sort by alphabet and mode. Set<InputMethodInfo> cachedImiSet = enabledIMIs.keySet(); for (InputMethodInfo imi: cachedImiSet) { @@ -278,7 +297,7 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O } } - private HashMap<InputMethodInfo, List<InputMethodSubtype>> + private TreeMap<InputMethodInfo, List<InputMethodSubtype>> getEnabledInputMethodAndSubtypeList() { String newEnabledIMIs = Settings.Secure.getString( mContext.getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index e26b8eaf53e3..954993063f38 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -81,7 +81,7 @@ public class TabletStatusBar extends StatusBar implements public static final int MAX_NOTIFICATION_ICONS = 5; // IME switcher icon is big and occupy width of two icons - public static final int MAX_NOTIFICATION_ICONS_IME_BUTTON_VISIBLE = MAX_NOTIFICATION_ICONS - 2; + public static final int MAX_NOTIFICATION_ICONS_IME_BUTTON_VISIBLE = MAX_NOTIFICATION_ICONS - 1; public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000; public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001; @@ -860,11 +860,8 @@ public class TabletStatusBar extends StatusBar implements if (DEBUG) { Slog.d(TAG, (visible?"showing":"hiding") + " the IME button"); } - int oldVisibility = mInputMethodSwitchButton.getVisibility(); mInputMethodSwitchButton.setIMEButtonVisible(token, visible); - if (oldVisibility != mInputMethodSwitchButton.getVisibility()) { - updateNotificationIcons(); - } + updateNotificationIcons(); mInputMethodsPanel.setImeToken(token); mBackButton.setImageResource( visible ? R.drawable.ic_sysbar_back_ime : R.drawable.ic_sysbar_back); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 67e0e67bd95b..9b5c42e158a3 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -389,6 +389,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), false, this); resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.WINDOW_ORIENTATION_LISTENER_LOG), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.POINTER_LOCATION), false, this); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.DEFAULT_INPUT_METHOD), false, this); @@ -759,6 +761,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateOrientationListenerLp(); } + mOrientationListener.setLogEnabled( + Settings.System.getInt(resolver, + Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, 0) != 0); + if (mSystemReady) { int pointerLocation = Settings.System.getInt(resolver, Settings.System.POINTER_LOCATION, 0); @@ -2492,18 +2498,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mSeascapeRotation; case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE: //return either landscape rotation based on the sensor - mOrientationListener.setAllow180Rotation( - isLandscapeOrSeascape(Surface.ROTATION_180)); return getCurrentLandscapeRotation(lastRotation); case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT: - mOrientationListener.setAllow180Rotation( - !isLandscapeOrSeascape(Surface.ROTATION_180)); return getCurrentPortraitRotation(lastRotation); } - mOrientationListener.setAllow180Rotation(mAllowAllRotations || - orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); - // case for nosensor meaning ignore sensor and consider only lid // or orientation sensor disabled //or case.unspecified @@ -2519,7 +2518,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mUserRotation; } else { if (useSensorForOrientationLp(orientation)) { - return mOrientationListener.getCurrentRotation(lastRotation); + // Disable 180 degree rotation unless allowed by default for the device + // or explicitly requested by the application. + int rotation = mOrientationListener.getCurrentRotation(lastRotation); + if (rotation == Surface.ROTATION_180 + && !mAllowAllRotations + && orientation != ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) { + return lastRotation; + } + return rotation; } return Surface.ROTATION_0; } diff --git a/preloaded-classes b/preloaded-classes index ca2e6ed30ca1..378085342054 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -1839,94 +1839,94 @@ org.apache.http.protocol.RequestUserAgent org.apache.http.util.ByteArrayBuffer org.apache.http.util.CharArrayBuffer org.apache.http.util.LangUtils -org.bouncycastle.asn1.ASN1Choice -org.bouncycastle.asn1.ASN1Collection -org.bouncycastle.asn1.ASN1Collection$ASN1CollectionEnumeration -org.bouncycastle.asn1.ASN1Encodable -org.bouncycastle.asn1.ASN1EncodableVector -org.bouncycastle.asn1.ASN1InputStream -org.bouncycastle.asn1.ASN1Null -org.bouncycastle.asn1.ASN1Object -org.bouncycastle.asn1.ASN1OctetString -org.bouncycastle.asn1.ASN1OctetStringParser -org.bouncycastle.asn1.ASN1OutputStream -org.bouncycastle.asn1.ASN1Sequence -org.bouncycastle.asn1.ASN1SequenceParser -org.bouncycastle.asn1.ASN1Set -org.bouncycastle.asn1.ASN1StreamParser -org.bouncycastle.asn1.ASN1TaggedObject -org.bouncycastle.asn1.ASN1TaggedObjectParser -org.bouncycastle.asn1.BERTaggedObjectParser -org.bouncycastle.asn1.DERBitString -org.bouncycastle.asn1.DERBoolean -org.bouncycastle.asn1.DEREncodable -org.bouncycastle.asn1.DEREncodableVector -org.bouncycastle.asn1.DERFactory -org.bouncycastle.asn1.DERIA5String -org.bouncycastle.asn1.DERInteger -org.bouncycastle.asn1.DERNull -org.bouncycastle.asn1.DERObject -org.bouncycastle.asn1.DERObjectIdentifier -org.bouncycastle.asn1.DEROctetString -org.bouncycastle.asn1.DEROctetStringParser -org.bouncycastle.asn1.DEROutputStream -org.bouncycastle.asn1.DERPrintableString -org.bouncycastle.asn1.DERSequence -org.bouncycastle.asn1.DERSequenceParser -org.bouncycastle.asn1.DERSet -org.bouncycastle.asn1.DERString -org.bouncycastle.asn1.DERT61String -org.bouncycastle.asn1.DERTaggedObject -org.bouncycastle.asn1.DERTags -org.bouncycastle.asn1.DERUTCTime -org.bouncycastle.asn1.DERUTF8String -org.bouncycastle.asn1.DERUniversalString -org.bouncycastle.asn1.DefiniteLengthInputStream -org.bouncycastle.asn1.IndefiniteLengthInputStream -org.bouncycastle.asn1.LimitedInputStream -org.bouncycastle.asn1.OIDTokenizer -org.bouncycastle.asn1.OrderedTable -org.bouncycastle.asn1.bc.BCObjectIdentifiers -org.bouncycastle.asn1.iana.IANAObjectIdentifiers -org.bouncycastle.asn1.nist.NISTObjectIdentifiers -org.bouncycastle.asn1.oiw.OIWObjectIdentifiers -org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers -org.bouncycastle.asn1.x509.AlgorithmIdentifier -org.bouncycastle.asn1.x509.BasicConstraints -org.bouncycastle.asn1.x509.SubjectPublicKeyInfo -org.bouncycastle.asn1.x509.TBSCertificateStructure -org.bouncycastle.asn1.x509.Time -org.bouncycastle.asn1.x509.X509CertificateStructure -org.bouncycastle.asn1.x509.X509Extension -org.bouncycastle.asn1.x509.X509Extensions -org.bouncycastle.asn1.x509.X509Name -org.bouncycastle.asn1.x509.X509NameElementList -org.bouncycastle.asn1.x509.X509ObjectIdentifiers -org.bouncycastle.asn1.x9.X9ObjectIdentifiers -org.bouncycastle.crypto.Digest -org.bouncycastle.crypto.ExtendedDigest -org.bouncycastle.crypto.Mac -org.bouncycastle.crypto.digests.OpenSSLDigest -org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1 -org.bouncycastle.crypto.macs.HMac -org.bouncycastle.jce.ProviderConfigurationPermission -org.bouncycastle.jce.interfaces.BCKeyStore -org.bouncycastle.jce.interfaces.ConfigurableProvider -org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier -org.bouncycastle.jce.provider.BouncyCastleProvider -org.bouncycastle.jce.provider.BouncyCastleProvider$1 -org.bouncycastle.jce.provider.JDKKeyStore -org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry -org.bouncycastle.jce.provider.JDKX509CertificateFactory -org.bouncycastle.jce.provider.PEMUtil -org.bouncycastle.jce.provider.PKCS12BagAttributeCarrierImpl -org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi -org.bouncycastle.jce.provider.ProviderUtil -org.bouncycastle.jce.provider.X509CertificateObject -org.bouncycastle.jce.provider.asymmetric.ECMappings -org.bouncycastle.jce.provider.symmetric.AESMappings -org.bouncycastle.util.Strings -org.bouncycastle.util.io.Streams +com.android.org.bouncycastle.asn1.ASN1Choice +com.android.org.bouncycastle.asn1.ASN1Collection +com.android.org.bouncycastle.asn1.ASN1Collection$ASN1CollectionEnumeration +com.android.org.bouncycastle.asn1.ASN1Encodable +com.android.org.bouncycastle.asn1.ASN1EncodableVector +com.android.org.bouncycastle.asn1.ASN1InputStream +com.android.org.bouncycastle.asn1.ASN1Null +com.android.org.bouncycastle.asn1.ASN1Object +com.android.org.bouncycastle.asn1.ASN1OctetString +com.android.org.bouncycastle.asn1.ASN1OctetStringParser +com.android.org.bouncycastle.asn1.ASN1OutputStream +com.android.org.bouncycastle.asn1.ASN1Sequence +com.android.org.bouncycastle.asn1.ASN1SequenceParser +com.android.org.bouncycastle.asn1.ASN1Set +com.android.org.bouncycastle.asn1.ASN1StreamParser +com.android.org.bouncycastle.asn1.ASN1TaggedObject +com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser +com.android.org.bouncycastle.asn1.BERTaggedObjectParser +com.android.org.bouncycastle.asn1.DERBitString +com.android.org.bouncycastle.asn1.DERBoolean +com.android.org.bouncycastle.asn1.DEREncodable +com.android.org.bouncycastle.asn1.DEREncodableVector +com.android.org.bouncycastle.asn1.DERFactory +com.android.org.bouncycastle.asn1.DERIA5String +com.android.org.bouncycastle.asn1.DERInteger +com.android.org.bouncycastle.asn1.DERNull +com.android.org.bouncycastle.asn1.DERObject +com.android.org.bouncycastle.asn1.DERObjectIdentifier +com.android.org.bouncycastle.asn1.DEROctetString +com.android.org.bouncycastle.asn1.DEROctetStringParser +com.android.org.bouncycastle.asn1.DEROutputStream +com.android.org.bouncycastle.asn1.DERPrintableString +com.android.org.bouncycastle.asn1.DERSequence +com.android.org.bouncycastle.asn1.DERSequenceParser +com.android.org.bouncycastle.asn1.DERSet +com.android.org.bouncycastle.asn1.DERString +com.android.org.bouncycastle.asn1.DERT61String +com.android.org.bouncycastle.asn1.DERTaggedObject +com.android.org.bouncycastle.asn1.DERTags +com.android.org.bouncycastle.asn1.DERUTCTime +com.android.org.bouncycastle.asn1.DERUTF8String +com.android.org.bouncycastle.asn1.DERUniversalString +com.android.org.bouncycastle.asn1.DefiniteLengthInputStream +com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream +com.android.org.bouncycastle.asn1.LimitedInputStream +com.android.org.bouncycastle.asn1.OIDTokenizer +com.android.org.bouncycastle.asn1.OrderedTable +com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers +com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers +com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers +com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers +com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers +com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier +com.android.org.bouncycastle.asn1.x509.BasicConstraints +com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo +com.android.org.bouncycastle.asn1.x509.TBSCertificateStructure +com.android.org.bouncycastle.asn1.x509.Time +com.android.org.bouncycastle.asn1.x509.X509CertificateStructure +com.android.org.bouncycastle.asn1.x509.X509Extension +com.android.org.bouncycastle.asn1.x509.X509Extensions +com.android.org.bouncycastle.asn1.x509.X509Name +com.android.org.bouncycastle.asn1.x509.X509NameElementList +com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers +com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers +com.android.org.bouncycastle.crypto.Digest +com.android.org.bouncycastle.crypto.ExtendedDigest +com.android.org.bouncycastle.crypto.Mac +com.android.org.bouncycastle.crypto.digests.OpenSSLDigest +com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1 +com.android.org.bouncycastle.crypto.macs.HMac +com.android.org.bouncycastle.jce.ProviderConfigurationPermission +com.android.org.bouncycastle.jce.interfaces.BCKeyStore +com.android.org.bouncycastle.jce.interfaces.ConfigurableProvider +com.android.org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier +com.android.org.bouncycastle.jce.provider.BouncyCastleProvider +com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$1 +com.android.org.bouncycastle.jce.provider.JDKKeyStore +com.android.org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry +com.android.org.bouncycastle.jce.provider.JDKX509CertificateFactory +com.android.org.bouncycastle.jce.provider.PEMUtil +com.android.org.bouncycastle.jce.provider.PKCS12BagAttributeCarrierImpl +com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi +com.android.org.bouncycastle.jce.provider.ProviderUtil +com.android.org.bouncycastle.jce.provider.X509CertificateObject +com.android.org.bouncycastle.jce.provider.asymmetric.ECMappings +com.android.org.bouncycastle.jce.provider.symmetric.AESMappings +com.android.org.bouncycastle.util.Strings +com.android.org.bouncycastle.util.io.Streams org.xml.sax.Attributes org.xml.sax.ContentHandler org.xml.sax.Locator diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 21c1e8146218..0147b1ac3794 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -1356,14 +1356,27 @@ public class InputMethodManagerService extends IInputMethodManager.Stub public boolean switchToLastInputMethod(IBinder token) { synchronized (mMethodMap) { - Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked(); - if (lastIme != null) { - InputMethodInfo imi = mMethodMap.get(lastIme.first); - if (imi != null) { - setInputMethodWithSubtypeId(token, lastIme.first, getSubtypeIdFromHashCode( - imi, Integer.valueOf(lastIme.second))); - return true; + final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked(); + if (lastIme == null) return false; + final InputMethodInfo lastImi = mMethodMap.get(lastIme.first); + if (lastImi == null) return false; + + final boolean imiIdIsSame = lastImi.getId().equals(mCurMethodId); + final int lastSubtypeHash = Integer.valueOf(lastIme.second); + // If the last IME is the same as the current IME and the last subtype is not defined, + // there is no need to switch to the last IME. + if (imiIdIsSame && lastSubtypeHash == NOT_A_SUBTYPE_ID) return false; + + int currentSubtypeHash = mCurrentSubtype == null ? NOT_A_SUBTYPE_ID + : mCurrentSubtype.hashCode(); + if (!imiIdIsSame || lastSubtypeHash != currentSubtypeHash) { + if (DEBUG) { + Slog.d(TAG, "Switch to: " + lastImi.getId() + ", " + lastIme.second + ", from: " + + mCurMethodId + ", " + currentSubtypeHash); } + setInputMethodWithSubtypeId(token, lastIme.first, getSubtypeIdFromHashCode( + lastImi, lastSubtypeHash)); + return true; } return false; } diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 059c0b86410a..5806de223a3b 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -2087,7 +2087,7 @@ class PackageManagerService extends IPackageManager.Stub { return (List<ResolveInfo>) mActivities.queryIntentForPackage(intent, resolvedType, flags, pkg.activities); } - return null; + return new ArrayList<ResolveInfo>(); } } diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index eeb224c75964..2c8403c82751 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -677,8 +677,7 @@ public class WindowManagerService extends IWindowManager.Stub // stop intercepting input mDragState.unregister(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); // free our resources and drop all the object references mDragState.reset(); @@ -2382,6 +2381,8 @@ public class WindowManagerService extends IWindowManager.Stub res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE; } + mInputMonitor.setUpdateInputWindowsNeededLw(); + boolean focusChanged = false; if (win.canReceiveKeys()) { focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS, @@ -2404,7 +2405,7 @@ public class WindowManagerService extends IWindowManager.Stub if (focusChanged) { finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/); } - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); if (localLOGV) Slog.v( TAG, "New client " + client.asBinder() @@ -2484,7 +2485,7 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); if (win.mAppToken != null) { win.mAppToken.updateReportedVisibilityLocked(); } @@ -2600,8 +2601,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } private static void logSurface(WindowState w, String msg, RuntimeException where) { @@ -2851,8 +2851,7 @@ public class WindowManagerService extends IWindowManager.Stub outSurface.release(); } } catch (Exception e) { - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); Slog.w(TAG, "Exception thrown when creating surface for client " + client + " (" + win.mAttrs.getTitle() + ")", @@ -2996,8 +2995,7 @@ public class WindowManagerService extends IWindowManager.Stub inTouchMode = mInTouchMode; - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } if (configChanged) { @@ -3380,8 +3378,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } else { Slog.w(TAG, "Attempted to remove non-existing token: " + token); } @@ -4042,7 +4039,7 @@ public class WindowManagerService extends IWindowManager.Stub false /*updateInputWindows*/); performLayoutAndPlaceSurfacesLocked(); } - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } } @@ -4479,8 +4476,9 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); mLayoutNeeded = true; + mInputMonitor.setUpdateInputWindowsNeededLw(); performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } Binder.restoreCallingIdentity(origId); } @@ -4517,13 +4515,14 @@ public class WindowManagerService extends IWindowManager.Stub pos = reAddAppWindowsLocked(pos, wtoken); if (updateFocusAndLayout) { + mInputMonitor.setUpdateInputWindowsNeededLw(); if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/)) { assignLayersLocked(); } mLayoutNeeded = true; performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } } @@ -4549,13 +4548,14 @@ public class WindowManagerService extends IWindowManager.Stub } } + mInputMonitor.setUpdateInputWindowsNeededLw(); if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/)) { assignLayersLocked(); } mLayoutNeeded = true; performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); //dump(); } @@ -5909,8 +5909,8 @@ public class WindowManagerService extends IWindowManager.Stub } /* Updates the cached window information provided to the input dispatcher. */ - public void updateInputWindowsLw() { - if (!mUpdateInputWindowsNeeded) { + public void updateInputWindowsLw(boolean force) { + if (!force && !mUpdateInputWindowsNeeded) { return; } mUpdateInputWindowsNeeded = false; @@ -6060,7 +6060,7 @@ public class WindowManagerService extends IWindowManager.Stub setUpdateInputWindowsNeededLw(); if (updateInputWindows) { - updateInputWindowsLw(); + updateInputWindowsLw(false /*force*/); } } } @@ -6088,8 +6088,7 @@ public class WindowManagerService extends IWindowManager.Stub } window.paused = true; - setUpdateInputWindowsNeededLw(); - updateInputWindowsLw(); + updateInputWindowsLw(true /*force*/); } } @@ -6100,8 +6099,7 @@ public class WindowManagerService extends IWindowManager.Stub } window.paused = false; - setUpdateInputWindowsNeededLw(); - updateInputWindowsLw(); + updateInputWindowsLw(true /*force*/); } } @@ -6577,15 +6575,13 @@ public class WindowManagerService extends IWindowManager.Stub // the actual drag event dispatch stuff in the dragstate mDragState.register(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); if (!mInputManager.transferTouchFocus(callingWin.mInputChannel, mDragState.mServerChannel)) { Slog.e(TAG, "Unable to transfer touch focus"); mDragState.unregister(); mDragState = null; - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); return false; } @@ -9183,8 +9179,7 @@ public class WindowManagerService extends IWindowManager.Stub // !!! TODO: ANR the app that has failed to start the drag in time if (mDragState != null) { mDragState.unregister(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); mDragState.reset(); mDragState = null; } @@ -9584,7 +9579,7 @@ public class WindowManagerService extends IWindowManager.Stub // Window frames may have changed. Tell the input dispatcher about it. mInputMonitor.setUpdateInputWindowsNeededLw(); if (updateInputWindows) { - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } return mPolicy.finishLayoutLw(); @@ -10858,8 +10853,7 @@ public class WindowManagerService extends IWindowManager.Stub } // Finally update all input windows now that the window changes have stabilized. - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); setHoldScreenLocked(holdScreen != null); if (screenBrightness < 0 || screenBrightness > 1.0f) { diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index dd9db9a2b059..26c7e711c393 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -31,6 +31,7 @@ import android.net.ConnectivityManager; import android.net.InterfaceConfiguration; import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; +import android.net.LinkProperties; import android.net.NetworkInfo; import android.os.Binder; import android.os.Environment; @@ -1219,7 +1220,20 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } protected String findActiveUpstreamIface() { // check for what iface we can use - if none found switch to error. - IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); + IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); + IConnectivityManager cm = IConnectivityManager.Stub.asInterface(b); + + try { + LinkProperties defaultProp = cm.getActiveLinkProperties(); + if (defaultProp != null) { + String iface = defaultProp.getInterfaceName(); + for(String regex : mUpstreamIfaceRegexs) { + if (iface.matches(regex)) return iface; + } + } + } catch (RemoteException e) { } + + b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); String[] ifaces = new String[0]; @@ -1390,7 +1404,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } break; case CMD_UPSTREAM_CHANGED: - mTryCell = WAIT_FOR_NETWORK_TO_SETTLE; + // need to try DUN immediately if Wifi goes down + mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; chooseUpstreamType(mTryCell); mTryCell = !mTryCell; break; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 694af70cf8fd..291ebc57043c 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2170,8 +2170,6 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); - LOGD("screenshot: FBO created, status=0x%x", status); - if (status == GL_FRAMEBUFFER_COMPLETE_OES) { // invert everything, b/c glReadPixel() below will invert the FB @@ -2187,8 +2185,6 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT); - LOGD("screenshot: glClear() issued"); - const Vector< sp<LayerBase> >& layers(mVisibleLayersSortedByZ); const size_t count = layers.size(); for (size_t i=0 ; i<count ; ++i) { @@ -2199,8 +2195,6 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, } } - LOGD("screenshot: All layers rendered"); - // XXX: this is needed on tegra glScissor(0, 0, sw, sh); @@ -2215,10 +2209,6 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, new MemoryHeapBase(size, 0, "screen-capture") ); void* const ptr = base->getBase(); if (ptr) { - - LOGD("screenshot: about to call glReadPixels(0,0,%d,%d,...,%p)", - sw, sh, ptr); - // capture the screen with glReadPixels() glReadPixels(0, 0, sw, sh, GL_RGBA, GL_UNSIGNED_BYTE, ptr); if (glGetError() == GL_NO_ERROR) { @@ -2231,9 +2221,6 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, } else { result = NO_MEMORY; } - - LOGD("screenshot: glReadPixels() returned %s", strerror(result)); - } glEnable(GL_SCISSOR_TEST); glViewport(0, 0, hw_w, hw_h); @@ -2244,18 +2231,14 @@ status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, result = BAD_VALUE; } - LOGD("screenshot: about to release FBO resources"); - // release FBO resources glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); glDeleteRenderbuffersOES(1, &tname); glDeleteFramebuffersOES(1, &name); - LOGD("screenshot: about to call compositionComplete()"); - hw.compositionComplete(); - LOGD("screenshot: result = %s", strerror(result)); + LOGD("screenshot: result = %s", result<0 ? strerror(result) : "OK"); return result; } diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 719e5b43dfe7..43fae69d3c62 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -774,13 +774,23 @@ public final class CallManager { boolean allLinesTaken = hasActiveCall && hasHoldingCall; Call.State fgCallState = getActiveFgCallState(); - return (serviceState != ServiceState.STATE_POWER_OFF + boolean result = (serviceState != ServiceState.STATE_POWER_OFF && !hasRingingCall && !allLinesTaken && ((fgCallState == Call.State.ACTIVE) || (fgCallState == Call.State.IDLE) || (fgCallState == Call.State.DISCONNECTED))); - } + + if (result == false) { + Log.d(LOG_TAG, "canDial serviceState=" + serviceState + + " hasRingingCall=" + hasRingingCall + + " hasActiveCall=" + hasActiveCall + + " hasHoldingCall=" + hasHoldingCall + + " allLinesTaken=" + allLinesTaken + + " fgCallState=" + fgCallState); + } + return result; + } /** * Whether or not the phone can do explicit call transfer in the current diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java index 9c4fa975bec0..3ea491133ccc 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java @@ -158,10 +158,6 @@ public class TestShellActivity extends Activity implements LayoutTestController // WebView::setJsFlags is noop in JSC build. mWebView.setJsFlags("--expose_gc"); - // Always send multitouch events to Webkit since the layout test - // is only for the Webkit not the browser's UI. - mWebView.setDeferMultiTouch(true); - mHandler = new AsyncHandler(); Intent intent = getIntent(); diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java index ce546ec4e791..d9f5dd4b169b 100644 --- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java +++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java @@ -372,7 +372,6 @@ public class LayoutTestsExecutor extends Activity { webView.setTouchInterval(-1); webView.clearCache(true); - webView.setDeferMultiTouch(true); WebSettings webViewSettings = webView.getSettings(); webViewSettings.setAppCacheEnabled(true); diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml index 61f8e1a8fac1..2895b69f6f0a 100644 --- a/tests/HwAccelerationTest/AndroidManifest.xml +++ b/tests/HwAccelerationTest/AndroidManifest.xml @@ -18,7 +18,7 @@ package="com.android.test.hwui"> <uses-permission android:name="android.permission.INTERNET" /> - <uses-sdk android:minSdkVersion="Honeycomb" /> + <uses-sdk android:minSdkVersion="11" /> <application android:label="HwUi" diff --git a/tests/HwAccelerationTest/default.properties b/tests/HwAccelerationTest/default.properties index 5a8ea5003d83..da2dcdd13172 100644 --- a/tests/HwAccelerationTest/default.properties +++ b/tests/HwAccelerationTest/default.properties @@ -8,4 +8,4 @@ # project structure. # Project target. -target=android-Froyo +target=android-Honeycomb diff --git a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java new file mode 100644 index 000000000000..3946a2f5d66f --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2011 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.view; + +import com.android.layoutlib.bridge.android.BridgeInflater; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.util.AttributeSet; + +import java.io.IOException; + +/** + * Delegate used to provide new implementation of a select few methods of {@link LayoutInflater} + * + * Through the layoutlib_create tool, the original methods of LayoutInflater have been replaced + * by calls to methods of the same name in this delegate class. + * + */ +public class LayoutInflater_Delegate { + + /** + * Recursive method used to descend down the xml hierarchy and instantiate + * views, instantiate their children, and then call onFinishInflate(). + */ + /*package*/ static void rInflate(LayoutInflater thisInflater, + XmlPullParser parser, View parent, final AttributeSet attrs, + boolean finishInflate) throws XmlPullParserException, IOException { + + if (finishInflate == false) { + // this is a merge rInflate! + if (thisInflater instanceof BridgeInflater) { + ((BridgeInflater) thisInflater).setIsInMerge(true); + } + } + + // ---- START DEFAULT IMPLEMENTATION. + + final int depth = parser.getDepth(); + int type; + + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { + + if (type != XmlPullParser.START_TAG) { + continue; + } + + final String name = parser.getName(); + + if (LayoutInflater.TAG_REQUEST_FOCUS.equals(name)) { + thisInflater.parseRequestFocus(parser, parent); + } else if (LayoutInflater.TAG_INCLUDE.equals(name)) { + if (parser.getDepth() == 0) { + throw new InflateException("<include /> cannot be the root element"); + } + thisInflater.parseInclude(parser, parent, attrs); + } else if (LayoutInflater.TAG_MERGE.equals(name)) { + throw new InflateException("<merge /> must be the root element"); + } else { + final View view = thisInflater.createViewFromTag(parent, name, attrs); + final ViewGroup viewGroup = (ViewGroup) parent; + final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs); + thisInflater.rInflate(parser, view, attrs, true); + viewGroup.addView(view, params); + } + } + + if (finishInflate) parent.onFinishInflate(); + + // ---- END DEFAULT IMPLEMENTATION. + + if (finishInflate == false) { + // this is a merge rInflate! + if (thisInflater instanceof BridgeInflater) { + ((BridgeInflater) thisInflater).setIsInMerge(false); + } + } + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java index 7fa6fdf893dc..465bf1d956f8 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java @@ -18,6 +18,7 @@ package com.android.layoutlib.bridge.android; import com.android.ide.common.rendering.api.IProjectCallback; import com.android.ide.common.rendering.api.LayoutLog; +import com.android.ide.common.rendering.api.MergeCookie; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; @@ -41,6 +42,7 @@ import java.io.FileReader; public final class BridgeInflater extends LayoutInflater { private final IProjectCallback mProjectCallback; + private boolean mIsInMerge = false; /** * List of class prefixes which are tried first by default. @@ -211,8 +213,6 @@ public final class BridgeInflater extends LayoutInflater { return null; } - - private void setupViewInContext(View view, AttributeSet attrs) { if (getContext() instanceof BridgeContext) { BridgeContext bc = (BridgeContext) getContext(); @@ -222,9 +222,11 @@ public final class BridgeInflater extends LayoutInflater { // get the view key Object viewKey = parser.getViewCookie(); - // if there's no view key and the depth is 1 (ie this is the first tag), + // if there's no view key and the depth is 1 (ie this is the first tag), or 2 + // (this is first item in included merge layout) // look for a previous parser in the context, and check if this one has a viewkey. - if (viewKey == null && parser.getDepth() == 1) { + int testDepth = mIsInMerge ? 2 : 1; + if (viewKey == null && parser.getDepth() == testDepth) { BridgeXmlBlockParser previousParser = bc.getPreviousParser(); if (previousParser != null) { viewKey = previousParser.getViewCookie(); @@ -232,12 +234,21 @@ public final class BridgeInflater extends LayoutInflater { } if (viewKey != null) { + if (testDepth == 2) { + // include-merge case + viewKey = new MergeCookie(viewKey); + } + bc.addViewKey(view, viewKey); } } } } + public void setIsInMerge(boolean isInMerge) { + mIsInMerge = isInMerge; + } + @Override public LayoutInflater cloneInContext(Context newContext) { return new BridgeInflater(this, newContext); diff --git a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java index 23b7e9414a41..0ff1925678dc 100644 --- a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java +++ b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java @@ -104,7 +104,12 @@ public class TestDelegates extends TestCase { parameters); // check that the method is static - assertTrue((delegateMethod.getModifiers() & Modifier.STATIC) == Modifier.STATIC); + assertTrue( + String.format( + "Delegate method %1$s for class %2$s is not static", + delegateMethod.getName(), + originalClass.getName()), + (delegateMethod.getModifiers() & Modifier.STATIC) == Modifier.STATIC); } catch (NoSuchMethodException e) { // compute a full class name that's long but not too long. StringBuilder sb = new StringBuilder(originalMethod.getName() + "("); diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index 4198006c5218..e3c5b4be95e8 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -96,8 +96,9 @@ public final class CreateInfo implements ICreateInfo { private final static String[] DELEGATE_METHODS = new String[] { "android.app.Fragment#instantiate", //(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;", "android.os.Handler#sendMessageAtTime", + "android.view.LayoutInflater#rInflate", "android.view.View#isInEditMode", - "com.android.internal.util.XmlUtils#convertValueToInt" + "com.android.internal.util.XmlUtils#convertValueToInt", // TODO: comment out once DelegateClass is working // "android.content.res.Resources$Theme#obtainStyledAttributes", }; diff --git a/tools/orientationplot/README.txt b/tools/orientationplot/README.txt new file mode 100644 index 000000000000..0143510a9beb --- /dev/null +++ b/tools/orientationplot/README.txt @@ -0,0 +1,87 @@ +This directory contains a simple python script for visualizing +the behavior of the WindowOrientationListener. + + +PREREQUISITES +------------- + +1. Python 2.6 +2. numpy +3. matplotlib + + +USAGE +----- + +The tool works by scaping the debug log output from WindowOrientationListener +for interesting data and then plotting it. + +1. Enable the Window Orientation Listener debugging data log using the + Development Settings in the Dev Tools application (Development.apk). + +2. Plug in the device. Ensure that it is the only device plugged in + since this script is of very little brain and will get confused otherwise. + +3. Run "orientationplot.py". + +4. When finished, remember to disable the debug log output since it is quite verbose! + + +WHAT IT ALL MEANS +----------------- + +The tool displays several time series graphs that plot the output of the +WindowOrientationListener. Here you can see the raw accelerometer data, +filtered accelerometer data, measured tilt and orientation angle, confidence +intervals for the proposed orientation and accelerometer latency. + +Things to look for: + +1. Ensure the filtering is not too aggressive. If the filter cut-off frequency is + less than about 1Hz, then the filtered accelorometer data becomes too smooth + and the latency for orientation detection goes up. One way to observe this + is by holding the device vertically in one orientation then sharply turning + it 90 degrees to a different orientation. Compared the rapid changes in the + raw accelerometer data with the smoothed out filtered data. If the filtering + is too aggressive, the filter response may lag by hundreds of milliseconds. + +2. Ensure that there is an appropriate gap between adjacent orientation angles + for hysteresis. Try holding the device in one orientation and slowly turning + it 90 degrees. Note that the confidence intervals will all drop to 0 at some + point in between the two orientations; that is the gap. The gap should be + observed between all adjacent pairs of orientations when turning the device + in either direction. + + Next try holding the device in one orientation and rapidly turning it end + over end to a midpoint about 45 degrees between two opposing orientations. + There should be no gap observed initially. The algorithm should pick one + of the orientations and settle into it (since it is obviously quite + different from the original orientation of the device). However, once it + settles, the confidence values should start trending to 0 again because + the measured orientation angle is now within the gap between the new + orientation and the adjacent orientation. + + In other words, the hysteresis gap applies only when the measured orientation + angle (say, 45 degrees) is between the current orientation's ideal angle + (say, 0 degrees) and an adjacent orientation's ideal angle (say, 90 degrees). + +3. Accelerometer jitter. The accelerometer latency graph displays the interval + between sensor events as reported by the SensorEvent.timestamp field. It + should be a fairly constant 60ms. If the latency jumps around wildly or + greatly exceeds 60ms then there is a problem with the accelerometer or the + sensor manager. + +4. The orientation angle is not measured when the tilt is too close to 90 or -90 + degrees (refer to MAX_TILT constant). Consequently, you should expect there + to be no data. Likewise, all dependent calculations are suppressed in this case + so there will be no orientation proposal either. + +5. Each orientation has its own bound on allowable tilt angles. It's a good idea to + verify that these limits are being enforced by gradually varying the tilt of + the device until it is inside/outside the limit for each orientation. + +6. Orientation changes should be significantly harder when the device is held + overhead. People reading on tablets in bed often have their head turned + a little to the side, or they hold the device loosely so its orientation + can be a bit unusual. The tilt is a good indicator of whether the device is + overhead. diff --git a/tools/orientationplot/orientationplot.py b/tools/orientationplot/orientationplot.py new file mode 100755 index 000000000000..07449d4d2bc9 --- /dev/null +++ b/tools/orientationplot/orientationplot.py @@ -0,0 +1,451 @@ +#!/usr/bin/env python2.6 +# +# Copyright (C) 2011 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. +# + +# +# Plots debug log output from WindowOrientationListener. +# See README.txt for details. +# + +import numpy as np +import matplotlib.pyplot as plot +import subprocess +import re +import fcntl +import os +import errno +import bisect +from datetime import datetime, timedelta + +# Parameters. +timespan = 15 # seconds total span shown +scrolljump = 5 # seconds jump when scrolling +timeticks = 1 # seconds between each time tick + +# Non-blocking stream wrapper. +class NonBlockingStream: + def __init__(self, stream): + fcntl.fcntl(stream, fcntl.F_SETFL, os.O_NONBLOCK) + self.stream = stream + self.buffer = '' + self.pos = 0 + + def readline(self): + while True: + index = self.buffer.find('\n', self.pos) + if index != -1: + result = self.buffer[self.pos:index] + self.pos = index + 1 + return result + + self.buffer = self.buffer[self.pos:] + self.pos = 0 + try: + chunk = os.read(self.stream.fileno(), 4096) + except OSError, e: + if e.errno == errno.EAGAIN: + return None + raise e + if len(chunk) == 0: + if len(self.buffer) == 0: + raise(EOFError) + else: + result = self.buffer + self.buffer = '' + self.pos = 0 + return result + self.buffer += chunk + +# Plotter +class Plotter: + def __init__(self, adbout): + self.adbout = adbout + + self.fig = plot.figure(1) + self.fig.suptitle('Window Orientation Listener', fontsize=12) + self.fig.set_dpi(96) + self.fig.set_size_inches(16, 12, forward=True) + + self.raw_acceleration_x = self._make_timeseries() + self.raw_acceleration_y = self._make_timeseries() + self.raw_acceleration_z = self._make_timeseries() + self.raw_acceleration_axes = self._add_timeseries_axes( + 1, 'Raw Acceleration', 'm/s^2', [-20, 20], + yticks=range(-15, 16, 5)) + self.raw_acceleration_line_x = self._add_timeseries_line( + self.raw_acceleration_axes, 'x', 'red') + self.raw_acceleration_line_y = self._add_timeseries_line( + self.raw_acceleration_axes, 'y', 'green') + self.raw_acceleration_line_z = self._add_timeseries_line( + self.raw_acceleration_axes, 'z', 'blue') + self._add_timeseries_legend(self.raw_acceleration_axes) + + shared_axis = self.raw_acceleration_axes + + self.filtered_acceleration_x = self._make_timeseries() + self.filtered_acceleration_y = self._make_timeseries() + self.filtered_acceleration_z = self._make_timeseries() + self.magnitude = self._make_timeseries() + self.filtered_acceleration_axes = self._add_timeseries_axes( + 2, 'Filtered Acceleration', 'm/s^2', [-20, 20], + sharex=shared_axis, + yticks=range(-15, 16, 5)) + self.filtered_acceleration_line_x = self._add_timeseries_line( + self.filtered_acceleration_axes, 'x', 'red') + self.filtered_acceleration_line_y = self._add_timeseries_line( + self.filtered_acceleration_axes, 'y', 'green') + self.filtered_acceleration_line_z = self._add_timeseries_line( + self.filtered_acceleration_axes, 'z', 'blue') + self.magnitude_line = self._add_timeseries_line( + self.filtered_acceleration_axes, 'magnitude', 'orange', linewidth=2) + self._add_timeseries_legend(self.filtered_acceleration_axes) + + self.tilt_angle = self._make_timeseries() + self.tilt_angle_axes = self._add_timeseries_axes( + 3, 'Tilt Angle', 'degrees', [-105, 105], + sharex=shared_axis, + yticks=range(-90, 91, 30)) + self.tilt_angle_line = self._add_timeseries_line( + self.tilt_angle_axes, 'tilt', 'black') + self._add_timeseries_legend(self.tilt_angle_axes) + + self.orientation_angle = self._make_timeseries() + self.orientation_angle_axes = self._add_timeseries_axes( + 4, 'Orientation Angle', 'degrees', [-25, 375], + sharex=shared_axis, + yticks=range(0, 361, 45)) + self.orientation_angle_line = self._add_timeseries_line( + self.orientation_angle_axes, 'orientation', 'black') + self._add_timeseries_legend(self.orientation_angle_axes) + + self.actual_orientation = self._make_timeseries() + self.proposed_orientation = self._make_timeseries() + self.orientation_axes = self._add_timeseries_axes( + 5, 'Actual / Proposed Orientation and Confidence', 'rotation', [-1, 4], + sharex=shared_axis, + yticks=range(0, 4)) + self.actual_orientation_line = self._add_timeseries_line( + self.orientation_axes, 'actual', 'black', linewidth=2) + self.proposed_orientation_line = self._add_timeseries_line( + self.orientation_axes, 'proposed', 'purple', linewidth=3) + self._add_timeseries_legend(self.orientation_axes) + + self.confidence = [[self._make_timeseries(), self._make_timeseries()] for i in range(0, 4)] + self.confidence_polys = [] + + self.combined_confidence = self._make_timeseries() + self.orientation_confidence = self._make_timeseries() + self.tilt_confidence = self._make_timeseries() + self.magnitude_confidence = self._make_timeseries() + self.confidence_axes = self._add_timeseries_axes( + 6, 'Proposed Orientation Confidence Factors', 'confidence', [-0.1, 1.1], + sharex=shared_axis, + yticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0]) + self.combined_confidence_line = self._add_timeseries_line( + self.confidence_axes, 'combined', 'purple', linewidth=2) + self.orientation_confidence_line = self._add_timeseries_line( + self.confidence_axes, 'orientation', 'black') + self.tilt_confidence_line = self._add_timeseries_line( + self.confidence_axes, 'tilt', 'brown') + self.magnitude_confidence_line = self._add_timeseries_line( + self.confidence_axes, 'magnitude', 'orange') + self._add_timeseries_legend(self.confidence_axes) + + self.sample_latency = self._make_timeseries() + self.sample_latency_axes = self._add_timeseries_axes( + 7, 'Accelerometer Sampling Latency', 'ms', [-10, 500], + sharex=shared_axis, + yticks=range(0, 500, 100)) + self.sample_latency_line = self._add_timeseries_line( + self.sample_latency_axes, 'latency', 'black') + self._add_timeseries_legend(self.sample_latency_axes) + + self.timer = self.fig.canvas.new_timer(interval=100) + self.timer.add_callback(lambda: self.update()) + self.timer.start() + + self.timebase = None + self._reset_parse_state() + + # Initialize a time series. + def _make_timeseries(self): + return [[], []] + + # Add a subplot to the figure for a time series. + def _add_timeseries_axes(self, index, title, ylabel, ylim, yticks, sharex=None): + num_graphs = 7 + height = 0.9 / num_graphs + top = 0.95 - height * index + axes = self.fig.add_axes([0.1, top, 0.8, height], + xscale='linear', + xlim=[0, timespan], + ylabel=ylabel, + yscale='linear', + ylim=ylim, + sharex=sharex) + axes.text(0.02, 0.02, title, transform=axes.transAxes, fontsize=10, fontweight='bold') + axes.set_xlabel('time (s)', fontsize=10, fontweight='bold') + axes.set_ylabel(ylabel, fontsize=10, fontweight='bold') + axes.set_xticks(range(0, timespan + 1, timeticks)) + axes.set_yticks(yticks) + axes.grid(True) + + for label in axes.get_xticklabels(): + label.set_fontsize(9) + for label in axes.get_yticklabels(): + label.set_fontsize(9) + + return axes + + # Add a line to the axes for a time series. + def _add_timeseries_line(self, axes, label, color, linewidth=1): + return axes.plot([], label=label, color=color, linewidth=linewidth)[0] + + # Add a legend to a time series. + def _add_timeseries_legend(self, axes): + axes.legend( + loc='upper left', + bbox_to_anchor=(1.01, 1), + borderpad=0.1, + borderaxespad=0.1, + prop={'size': 10}) + + # Resets the parse state. + def _reset_parse_state(self): + self.parse_raw_acceleration_x = None + self.parse_raw_acceleration_y = None + self.parse_raw_acceleration_z = None + self.parse_filtered_acceleration_x = None + self.parse_filtered_acceleration_y = None + self.parse_filtered_acceleration_z = None + self.parse_magnitude = None + self.parse_tilt_angle = None + self.parse_orientation_angle = None + self.parse_proposed_orientation = None + self.parse_combined_confidence = None + self.parse_orientation_confidence = None + self.parse_tilt_confidence = None + self.parse_magnitude_confidence = None + self.parse_actual_orientation = None + self.parse_confidence = None + self.parse_sample_latency = None + + # Update samples. + def update(self): + timeindex = 0 + while True: + try: + line = self.adbout.readline() + except EOFError: + plot.close() + return + if line is None: + break + print line + + try: + timestamp = self._parse_timestamp(line) + except ValueError, e: + continue + if self.timebase is None: + self.timebase = timestamp + delta = timestamp - self.timebase + timeindex = delta.seconds + delta.microseconds * 0.000001 + + if line.find('Raw acceleration vector:') != -1: + self.parse_raw_acceleration_x = self._get_following_number(line, 'x=') + self.parse_raw_acceleration_y = self._get_following_number(line, 'y=') + self.parse_raw_acceleration_z = self._get_following_number(line, 'z=') + + if line.find('Filtered acceleration vector:') != -1: + self.parse_filtered_acceleration_x = self._get_following_number(line, 'x=') + self.parse_filtered_acceleration_y = self._get_following_number(line, 'y=') + self.parse_filtered_acceleration_z = self._get_following_number(line, 'z=') + + if line.find('magnitude=') != -1: + self.parse_magnitude = self._get_following_number(line, 'magnitude=') + + if line.find('tiltAngle=') != -1: + self.parse_tilt_angle = self._get_following_number(line, 'tiltAngle=') + + if line.find('orientationAngle=') != -1: + self.parse_orientation_angle = self._get_following_number(line, 'orientationAngle=') + + if line.find('Proposal:') != -1: + self.parse_proposed_orientation = self._get_following_number(line, 'proposedOrientation=') + self.parse_combined_confidence = self._get_following_number(line, 'combinedConfidence=') + self.parse_orientation_confidence = self._get_following_number(line, 'orientationConfidence=') + self.parse_tilt_confidence = self._get_following_number(line, 'tiltConfidence=') + self.parse_magnitude_confidence = self._get_following_number(line, 'magnitudeConfidence=') + + if line.find('Result:') != -1: + self.parse_actual_orientation = self._get_following_number(line, 'rotation=') + self.parse_confidence = self._get_following_array_of_numbers(line, 'confidence=') + self.parse_sample_latency = self._get_following_number(line, 'timeDeltaMS=') + + for i in range(0, 4): + if self.parse_confidence is not None: + self._append(self.confidence[i][0], timeindex, i) + self._append(self.confidence[i][1], timeindex, i + self.parse_confidence[i]) + else: + self._append(self.confidence[i][0], timeindex, None) + self._append(self.confidence[i][1], timeindex, None) + + self._append(self.raw_acceleration_x, timeindex, self.parse_raw_acceleration_x) + self._append(self.raw_acceleration_y, timeindex, self.parse_raw_acceleration_y) + self._append(self.raw_acceleration_z, timeindex, self.parse_raw_acceleration_z) + self._append(self.filtered_acceleration_x, timeindex, self.parse_filtered_acceleration_x) + self._append(self.filtered_acceleration_y, timeindex, self.parse_filtered_acceleration_y) + self._append(self.filtered_acceleration_z, timeindex, self.parse_filtered_acceleration_z) + self._append(self.magnitude, timeindex, self.parse_magnitude) + self._append(self.tilt_angle, timeindex, self.parse_tilt_angle) + self._append(self.orientation_angle, timeindex, self.parse_orientation_angle) + self._append(self.actual_orientation, timeindex, self.parse_actual_orientation) + self._append(self.proposed_orientation, timeindex, self.parse_proposed_orientation) + self._append(self.combined_confidence, timeindex, self.parse_combined_confidence) + self._append(self.orientation_confidence, timeindex, self.parse_orientation_confidence) + self._append(self.tilt_confidence, timeindex, self.parse_tilt_confidence) + self._append(self.magnitude_confidence, timeindex, self.parse_magnitude_confidence) + self._append(self.sample_latency, timeindex, self.parse_sample_latency) + self._reset_parse_state() + + # Scroll the plots. + if timeindex > timespan: + bottom = int(timeindex) - timespan + scrolljump + self.timebase += timedelta(seconds=bottom) + self._scroll(self.raw_acceleration_x, bottom) + self._scroll(self.raw_acceleration_y, bottom) + self._scroll(self.raw_acceleration_z, bottom) + self._scroll(self.filtered_acceleration_x, bottom) + self._scroll(self.filtered_acceleration_y, bottom) + self._scroll(self.filtered_acceleration_z, bottom) + self._scroll(self.magnitude, bottom) + self._scroll(self.tilt_angle, bottom) + self._scroll(self.orientation_angle, bottom) + self._scroll(self.actual_orientation, bottom) + self._scroll(self.proposed_orientation, bottom) + self._scroll(self.combined_confidence, bottom) + self._scroll(self.orientation_confidence, bottom) + self._scroll(self.tilt_confidence, bottom) + self._scroll(self.magnitude_confidence, bottom) + self._scroll(self.sample_latency, bottom) + for i in range(0, 4): + self._scroll(self.confidence[i][0], bottom) + self._scroll(self.confidence[i][1], bottom) + + # Redraw the plots. + self.raw_acceleration_line_x.set_data(self.raw_acceleration_x) + self.raw_acceleration_line_y.set_data(self.raw_acceleration_y) + self.raw_acceleration_line_z.set_data(self.raw_acceleration_z) + self.filtered_acceleration_line_x.set_data(self.filtered_acceleration_x) + self.filtered_acceleration_line_y.set_data(self.filtered_acceleration_y) + self.filtered_acceleration_line_z.set_data(self.filtered_acceleration_z) + self.magnitude_line.set_data(self.magnitude) + self.tilt_angle_line.set_data(self.tilt_angle) + self.orientation_angle_line.set_data(self.orientation_angle) + self.actual_orientation_line.set_data(self.actual_orientation) + self.proposed_orientation_line.set_data(self.proposed_orientation) + self.combined_confidence_line.set_data(self.combined_confidence) + self.orientation_confidence_line.set_data(self.orientation_confidence) + self.tilt_confidence_line.set_data(self.tilt_confidence) + self.magnitude_confidence_line.set_data(self.magnitude_confidence) + self.sample_latency_line.set_data(self.sample_latency) + + for poly in self.confidence_polys: + poly.remove() + self.confidence_polys = [] + for i in range(0, 4): + self.confidence_polys.append(self.orientation_axes.fill_between(self.confidence[i][0][0], + self.confidence[i][0][1], self.confidence[i][1][1], + facecolor='goldenrod', edgecolor='goldenrod')) + + self.fig.canvas.draw_idle() + + # Scroll a time series. + def _scroll(self, timeseries, bottom): + bottom_index = bisect.bisect_left(timeseries[0], bottom) + del timeseries[0][:bottom_index] + del timeseries[1][:bottom_index] + for i, timeindex in enumerate(timeseries[0]): + timeseries[0][i] = timeindex - bottom + + # Extract a word following the specified prefix. + def _get_following_word(self, line, prefix): + prefix_index = line.find(prefix) + if prefix_index == -1: + return None + start_index = prefix_index + len(prefix) + delim_index = line.find(',', start_index) + if delim_index == -1: + return line[start_index:] + else: + return line[start_index:delim_index] + + # Extract a number following the specified prefix. + def _get_following_number(self, line, prefix): + word = self._get_following_word(line, prefix) + if word is None: + return None + return float(word) + + # Extract an array of numbers following the specified prefix. + def _get_following_array_of_numbers(self, line, prefix): + prefix_index = line.find(prefix + '[') + if prefix_index == -1: + return None + start_index = prefix_index + len(prefix) + 1 + delim_index = line.find(']', start_index) + if delim_index == -1: + return None + + result = [] + while start_index < delim_index: + comma_index = line.find(', ', start_index, delim_index) + if comma_index == -1: + result.append(float(line[start_index:delim_index])) + break; + result.append(float(line[start_index:comma_index])) + start_index = comma_index + 2 + return result + + # Add a value to a time series. + def _append(self, timeseries, timeindex, number): + timeseries[0].append(timeindex) + timeseries[1].append(number) + + # Parse the logcat timestamp. + # Timestamp has the form '01-21 20:42:42.930' + def _parse_timestamp(self, line): + return datetime.strptime(line[0:18], '%m-%d %H:%M:%S.%f') + +# Notice +print "Window Orientation Listener plotting tool" +print "-----------------------------------------\n" +print "Please turn on the Window Orientation Listener logging in Development Settings." + +# Start adb. +print "Starting adb logcat.\n" + +adb = subprocess.Popen(['adb', 'logcat', '-s', '-v', 'time', 'WindowOrientationListener:V'], + stdout=subprocess.PIPE) +adbout = NonBlockingStream(adb.stdout) + +# Prepare plotter. +plotter = Plotter(adbout) +plotter.update() + +# Main loop. +plot.show() |